示例#1
0
文件: artnet.c 项目: AnDann/ethersex
/* ----------------------------------------------------------------------------
 * 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);
}
示例#2
0
文件: artnet.c 项目: AnDann/ethersex
/* ----------------------------------------------------------------------------
 * 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));
}
示例#3
0
/* ----------------------------------------------------------------------------
 * 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));
}