Navigation Menu

Skip to content

Commit

Permalink
Code cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
cbdevnet committed Aug 17, 2016
1 parent 5f1ec2c commit 55910b8
Show file tree
Hide file tree
Showing 8 changed files with 124 additions and 162 deletions.
1 change: 1 addition & 0 deletions TODO
Expand Up @@ -5,3 +5,4 @@ Implement rotation speed
Fine-tune the need for flood-filling the color buffer / compositing the gobo (most updates only concern the position)
Fix pixmap clearing when moving from big to small gobo
Mask-repeat for prism?
Manpage
198 changes: 82 additions & 116 deletions artnet.c
Expand Up @@ -4,74 +4,76 @@
#include <arpa/inet.h>
#include "endian.h"

void *get_in_addr(const struct sockaddr *sa) {
return sa->sa_family == AF_INET
? (void *) &(((struct sockaddr_in*)sa)->sin_addr)
: (void *) &(((struct sockaddr_in6*)sa)->sin6_addr);
}

ArtNetPacket create_artnet_packet(ART_OPCODE op) {
char* artnet_packet_type(uint16_t opcode){
switch(opcode){
case ART_OP_POLL:
return "ArtPoll";
case ART_OP_POLL_REPLY:
return "ArtPollReply";
case ART_OP_DIAG_DATA:
return "ArtDiagData";
case ART_OP_COMMAND:
return "ArtCommand";
case ART_OP_OUTPUT:
return "ArtOutput";
case ART_OP_NZS:
return "ArtNZS";
case ART_OP_SYNC:
return "ArtSync";
case ART_OP_ADDRESS:
return "ArtAddress";
case ART_OP_INPUT:
return "ArtInput";
}

ArtNetPacket art = {
.opcode = op,
.protVerHi = PROT_VER_HI,
.protVerLo = PROT_VER_LO
};
return "Unknown";
}

memcpy(art.id, ART_ID, 8);
void artnet_packet_init(ArtNetPacket* pkt, ART_OPCODE op, size_t pkt_len) {
memset(pkt, 0, pkt_len);
pkt->opcode = op;
pkt->protVerHi = ART_PROT_VER_HI;
pkt->protVerLo = ART_PROT_VER_LO;

return art;
memcpy(pkt->id, ART_ID, 8);
}

void print_dmx_output(uint8_t data[], int length) {
int i;
int j = 0;
int k = 0;

printf("%2d: ", k);

for (i = 0; i < length; i++) {
if (j < 10) {
printf(" %3d", data[i]);
j++;
} else {
j = 1;
k++;
printf("\n%2d: %3d", k, data[i]);
int i = 0;
for(i = 0; i < length; i++){
if(i % ART_DEBUG_LINE_LEN == 0){
if(i != 0){
printf("\n");
}
printf("%d: ", i / ART_DEBUG_LINE_LEN);
}
printf(" %3d", data[i]);
}
printf("\n");
}

int get_node_address(CONFIG* config, uint8_t address[4]) {
//TODO get ip address
//TODO return node ipv4 address
memset(address, 0, 4);

return 0;
}

int get_mac_address(CONFIG* config, uint8_t mac[8]) {
//TODO get mac address
//TODO return node mac address
memset(mac, 0, 8);

return 0;
}

int artnet_artpoll_handler(CONFIG* config, char* buf, const struct sockaddr* src, socklen_t src_len) {
char addr[INET6_ADDRSTRLEN];
//ArtPollPacket* artPoll = (ArtPollPacket*) buf;
printf("Got packet from: %s\n",
inet_ntop(src->sa_family, get_in_addr(src), addr, sizeof(addr)));

int artnet_artpoll_handler(CONFIG* config, uint8_t* buf, const struct sockaddr* src, socklen_t src_len) {
struct sockaddr_in bcast = {
.sin_family = AF_INET,
.sin_port = htons(ART_NET_PORT),
.sin_addr = {
.s_addr = htonl(INADDR_BROADCAST)
}
};
socklen_t bcast_len = sizeof(bcast);

socklen_t bcast_len = sizeof(bcast);
memset(bcast.sin_zero, 0, sizeof(bcast.sin_zero));

ArtPollReplyPacket artReply = {
Expand Down Expand Up @@ -130,135 +132,99 @@ int artnet_artpoll_handler(CONFIG* config, char* buf, const struct sockaddr* src
memset(artReply.shortName, 0, 18);
memset(artReply.filler, 0, 26);

memcpy(artReply.shortName, "XLaser", 6);
memcpy(artReply.longName, "XLaser - Whatever", 17);
memcpy(artReply.shortName, SHORTNAME, strlen(SHORTNAME));
memcpy(artReply.longName, XLASER_VERSION, strlen(XLASER_VERSION));

get_node_address(config, artReply.address);
get_mac_address(config, artReply.mac);

ssize_t len = sizeof(artReply);
ssize_t sended = 0;
ssize_t bytes_sent = 0;


printf("send %d bytes.\n", (int) len);
printf("Sent %zd bytes\n", len);
char* sendbuf = (char*) &artReply;
while (len > 0) {
sended = sendto(config->sockfd, sendbuf, len, 0, (struct sockaddr*) &bcast, bcast_len);
if (sended < 0) {
bytes_sent = sendto(config->sockfd, sendbuf, len, 0, (struct sockaddr*) &bcast, bcast_len);
if (bytes_sent < 0) {
perror("art_poll");
return -1;
}

sendbuf += sended;
len -= sended;
sendbuf += bytes_sent;
len -= bytes_sent;
}

return 0;
}

int artnet_output_handler(CONFIG* config, char* buf) {

ArtDmxPacket* art = (ArtDmxPacket*) buf;
int artnet_output_handler(CONFIG* config, ArtNetPacket* packet) {
ArtDmxPacket* dmx_packet = (ArtDmxPacket*)packet;

art->length = be16toh(art->length);
printf("sequence: %d\n", art->sequence);
dmx_packet->length = be16toh(dmx_packet->length);
/*printf("sequence: %d\n", art->sequence);
printf("physical: %d\n", art->physical);
printf("subUni: %d\n", art->subUni);
printf("net: %d\n", art->net);
printf("data length: %d\n", art->length);
printf("data length: %d\n", art->length);*/
/* print_dmx_output(art->data, art->length) */


if (art->net != config->art_net) {
printf("not my net.\n");
if (dmx_packet->net != config->art_net) {
fprintf(stderr, "Data for another net, ignoring\n");
return 0;
}

if (art->subUni != config->art_subUni) {
printf("not my subUniverse.\n");
if (dmx_packet->subUni != config->art_subUni) {
fprintf(stderr, "Data for another subuniverse, ignoring\n");
return 0;
}

if (config->dmx_address + DMX_CHANNELS > art->length) {
fprintf(stderr, "dmx_address is too high for received data\n");
if (config->dmx_address + DMX_CHANNELS > dmx_packet->length) {
fprintf(stderr, "Payload does not include data for local address\n");
return -1;
}
printf("dmx_address: %d\n", config->dmx_address);

if (config->dmx_address == 0) {
config->dmx_address = 1;
}

memcpy(config->dmx_channels, art->data + config->dmx_address - 1, DMX_CHANNELS);

memcpy(config->dmx_channels, dmx_packet->data + config->dmx_address - 1, DMX_CHANNELS);
print_dmx_output(config->dmx_channels, DMX_CHANNELS);


return 0;
}

int artnet_handler(CONFIG* config) {
uint8_t data_buffer[ART_INTERNAL_READ_BUFFER];
struct sockaddr_storage src_addr;
socklen_t src_len = sizeof src_addr;
ArtNetPacket* art_packet = NULL;

char buf[1024];

struct sockaddr src;
socklen_t srclen = sizeof src;

ssize_t bytes = recvfrom(config->sockfd, &buf, 1024, 0, &src, &srclen);
ssize_t bytes_read = recvfrom(config->sockfd, &data_buffer, ART_INTERNAL_READ_BUFFER, 0, (struct sockaddr*)&src_addr, &src_len);

if (bytes < 0) {
fprintf(stderr, "Error in recvfrom.\n");
if(bytes_read < 0){
perror("recvfrom");
return -1;
} else if (bytes < 8) {
fprintf(stderr, "Packet too small (%zu bytes). Ignore.\n", bytes);
}
else if(bytes_read < 8){
fprintf(stderr, "Ignoring packet of length %zu\n", bytes_read);
return 0;
}

ArtNetPacket* art = (ArtNetPacket*) &buf;

if (memcmp(art->id, ART_ID, 8)) {
fprintf(stderr, "Not an artnet packet. Ignore.\n");
art_packet = (ArtNetPacket*)data_buffer;
if(memcmp(art_packet->id, ART_ID, 8)) {
fprintf(stderr, "Header check failed, ignoring\n");
return 0;
}

printf("Found artnet package :)\n");
printf("protVerHi: %d\nprotVerLo: %d\n", art->protVerHi, art->protVerLo);

char* opcode_str;
switch(art->opcode) {
printf("Handling %s type data\n", artnet_packet_type(art_packet->opcode));
//printf("protVerHi: %d\nprotVerLo: %d\n", art_packet->protVerHi, art_packet->protVerLo);
switch(art_packet->opcode) {
case ART_OP_POLL:
opcode_str = "ArtNetPoll";
artnet_artpoll_handler(config, (char*) &buf, &src, srclen);
break;
case ART_OP_POLL_REPLY:
opcode_str = "ArtNetPollReply";
break;
case ART_OP_DIAG_DATA:
opcode_str = "ArtNetDiagData";
break;
case ART_OP_COMMAND:
opcode_str = "ArtNetCommand";
artnet_artpoll_handler(config, data_buffer, (struct sockaddr*)&src_addr, src_len);
break;
case ART_OP_OUTPUT:
opcode_str = "ArtNetOutput";
artnet_output_handler(config, (char*) &buf);
break;
case ART_OP_NZS:
opcode_str = "ArtNetNZS";
break;
case ART_OP_SYNC:
opcode_str = "ArtNetSync";
break;
case ART_OP_ADDRESS:
opcode_str = "ArtNetAddress";
break;
case ART_OP_INPUT:
opcode_str = "ArtNetInput";
break;
default:
opcode_str = "Unkown";
artnet_output_handler(config, art_packet);
break;
}
printf("It's a %s packet.\n", opcode_str);

return 0;
}


0 comments on commit 55910b8

Please sign in to comment.