/* ---------------------------------------------------------------------------- * send an ArtDmx packet */ void artnet_sendDmxPacket(void) { static unsigned char sequence = 1; /* prepare artnet Dmx packet */ struct artnet_dmx *msg = (struct artnet_dmx *) &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; memset(msg, 0, sizeof(struct artnet_dmx)); strncpy_P((char *) msg->id, artnet_ID, 8); msg->opcode = OP_OUTPUT; msg->versionH = 0; msg->version = PROTOCOL_VERSION; msg->sequence = sequence++; if (sequence == 0) sequence = 1; msg->physical = 1; msg->universe = ((artnet_subNet << 4) | artnet_inputUniverse); msg->lengthHi = HI8(DMX_STORAGE_CHANNELS); msg->length = LO8(DMX_STORAGE_CHANNELS); for (uint8_t i = 0; i < DMX_STORAGE_CHANNELS; i++) msg->dataStart[i] = get_dmx_channel_slot(artnet_inputUniverse, i, artnet_conn_id); /* send packet to artnet_outputTarget */ artnet_send(&artnet_outputTarget, sizeof(struct artnet_dmx) + DMX_STORAGE_CHANNELS); }
/* ---------------------------------------------------------------------------- * send an ArtPollReply packet */ void artnet_sendPollReply(const uip_ipaddr_t *dest) { /* prepare artnet PollReply packet */ struct artnet_pollreply *msg = (struct artnet_pollreply *) &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; memset(msg, 0, sizeof(struct artnet_pollreply)); ARTNET_DEBUG("PollReply allocated\n"); strncpy_P((char *) msg->id, artnet_ID, 8); msg->opcode = OP_POLLREPLY; msg->versionInfoH = (FIRMWARE_VERSION >> 8) & 0xFF; msg->versionInfo = FIRMWARE_VERSION & 0xFF; msg->subSwitchH = 0; msg->subSwitch = artnet_subNet & 15; /* Report as 'AvrArtNode' http://www.dmxcontrol.de/wiki/Art-Net-Node_f%C3%BCr_25_Euro */ msg->oem = 0x08b1; msg->ubeaVersion = 0; msg->status = 0; /* Report as Manufacturer "ESTA" http://tsp.plasa.org/tsp/working_groups/CP/mfctrIDs.php */ msg->estaMan = 0xFFFF; strcpy(msg->shortName, artnet_shortName); strcpy(msg->longName, artnet_longName); sprintf(msg->nodeReport, "#%04X [%04u] e6ArtNode is ready", artnet_status, (unsigned int) artnet_pollReplyCounter); msg->numPortsH = 0; msg->numPorts = 1; if (artnet_dmxDirection == 1) msg->portTypes[0] = PORT_TYPE_DMX_INPUT; else msg->portTypes[0] = PORT_TYPE_DMX_OUTPUT; if (artnet_dmxDirection != 1) msg->goodInput[0] = (1 << 3); else if (artnet_dmxChannels > 0) msg->goodInput[0] |= (1 << 7); msg->goodOutput[0] = (1 << 1); if (artnet_dmxTransmitting == TRUE) msg->goodOutput[0] |= (1 << 7); msg->swin[0] = (artnet_subNet & 15) * 16 | (artnet_inputUniverse & 15); msg->swout[0] = (artnet_subNet & 15) * 16 | (artnet_outputUniverse & 15); msg->style = STYLE_NODE; memcpy(msg->mac, uip_ethaddr.addr, 6); /* send packet to dest */ artnet_send(dest, sizeof(struct artnet_pollreply)); }
/* ---------------------------------------------------------------------------- * send an ArtPollReply packet */ void artnet_sendPollReply(void) { /* prepare artnet PollReply packet */ struct artnet_pollreply *msg = (struct artnet_pollreply *) &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; memset(msg, 0, sizeof(struct artnet_pollreply)); ARTNET_DEBUG("PollReply allocated\n"); msg->id[0] = 'A'; msg->id[1] = 'r'; msg->id[2] = 't'; msg->id[3] = '-'; msg->id[4] = 'N'; msg->id[5] = 'e'; msg->id[6] = 't'; msg->opcode = OP_POLLREPLY; memcpy (msg->addr.ip, uip_hostaddr, 4); msg->addr.port = artnet_port; msg->versionInfoH = (FIRMWARE_VERSION >> 8) & 0xFF; msg->versionInfo = FIRMWARE_VERSION & 0xFF; msg->subSwitchH = 0; msg->subSwitch = artnet_subNet & 15; msg->oem = (unsigned short)OEM_ID; msg->ubeaVersion = 0; msg->status = 0; msg->estaMan = 'D' * 256 + 'P'; strcpy(msg->shortName, artnet_shortName); strcpy(msg->longName, artnet_longName); sprintf(msg->nodeReport, "#%04X [%04u] AvrArtNode is ready", artnet_status, artnet_pollReplyCounter); msg->numPortsH = 0; msg->numPorts = 1; if (artnet_dmxDirection == 1) { msg->portTypes[0] = PORT_TYPE_DMX_INPUT; } else { msg->portTypes[0] = PORT_TYPE_DMX_OUTPUT; } if (artnet_dmxDirection != 1) { msg->goodInput[0] = (1 << 3); } else { if (artnet_dmxChannels > 0) { msg->goodInput[0] |= (1 << 7); } } msg->goodOutput[0] = (1 << 1); if (artnet_dmxTransmitting == TRUE) { msg->goodOutput[0] |= (1 << 7); } msg->swin[0] = (artnet_subNet & 15) * 16 | (artnet_inputUniverse1 & 15); msg->swout[0] = (artnet_subNet & 15) * 16 | (artnet_outputUniverse1 & 15); msg->style = STYLE_NODE; memcpy (msg->mac, uip_ethaddr.addr, 6); /* broadcast the packet */ artnet_send(sizeof(struct artnet_pollreply)); }