syndilights/open-lighting-architecture/libartnet-1.1.0/artnet/packets.h

391 lines
8.3 KiB
C

/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* packets.h
* Datagram definitions for libartnet
* Copyright (C) 2004-2005 Simon Newton
*/
#ifndef ARTNET_PACKETS_H
#define ARTNET_PACKETS_H
#include <sys/types.h>
#include <stdint.h>
#ifndef WIN32
#include <netinet/in.h>
#endif
#include <artnet/common.h>
enum { ARTNET_MAX_RDM_ADCOUNT = 32 };
enum { ARTNET_MAX_UID_COUNT = 200 };
// according to the rdm spec, this should be 278 bytes
// we'll set to 512 here, the firmware datagram is still bigger
enum { ARTNET_MAX_RDM_DATA = 512 };
enum { ARTNET_FIRMWARE_SIZE = 512 };
enum artnet_packet_type_e {
ARTNET_POLL = 0x2000,
ARTNET_REPLY = 0x2100,
ARTNET_DMX = 0x5000,
ARTNET_ADDRESS = 0x6000,
ARTNET_INPUT = 0x7000,
ARTNET_TODREQUEST = 0x8000,
ARTNET_TODDATA = 0x8100,
ARTNET_TODCONTROL = 0x8200,
ARTNET_RDM = 0x8300,
ARTNET_VIDEOSTEUP = 0xa010,
ARTNET_VIDEOPALETTE = 0xa020,
ARTNET_VIDEODATA = 0xa040,
ARTNET_MACMASTER = 0xf000,
ARTNET_MACSLAVE = 0xf100,
ARTNET_FIRMWAREMASTER = 0xf200,
ARTNET_FIRMWAREREPLY = 0xf300,
ARTNET_IPPROG = 0xf800,
ARTNET_IPREPLY = 0xf900,
ARTNET_MEDIA = 0x9000,
ARTNET_MEDIAPATCH = 0x9200,
ARTNET_MEDIACONTROLREPLY = 0x9300
}__attribute__((packed));
typedef enum artnet_packet_type_e artnet_packet_type_t;
struct artnet_poll_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t ttm;
uint8_t pad;
} __attribute__((packed));
typedef struct artnet_poll_s artnet_poll_t;
struct artnet_reply_s {
uint8_t id[8];
uint16_t opCode;
uint8_t ip[4];
uint16_t port;
uint8_t verH;
uint8_t ver;
uint8_t subH;
uint8_t sub;
uint8_t oemH;
uint8_t oem;
uint8_t ubea;
uint8_t status;
uint8_t etsaman[2];
uint8_t shortname[ARTNET_SHORT_NAME_LENGTH];
uint8_t longname[ARTNET_LONG_NAME_LENGTH];
uint8_t nodereport[ARTNET_REPORT_LENGTH];
uint8_t numbportsH;
uint8_t numbports;
uint8_t porttypes[ARTNET_MAX_PORTS];
uint8_t goodinput[ARTNET_MAX_PORTS];
uint8_t goodoutput[ARTNET_MAX_PORTS];
uint8_t swin[ARTNET_MAX_PORTS];
uint8_t swout[ARTNET_MAX_PORTS];
uint8_t swvideo;
uint8_t swmacro;
uint8_t swremote;
uint8_t sp1;
uint8_t sp2;
uint8_t sp3;
uint8_t style;
uint8_t mac[ARTNET_MAC_SIZE];
uint8_t filler[32];
} __attribute__((packed));
typedef struct artnet_reply_s artnet_reply_t;
struct artnet_ipprog_s {
uint8_t id[8];
uint16_t OpCode;
uint8_t ProVerH;
uint8_t ProVer;
uint8_t Filler1;
uint8_t Filler2;
uint8_t Command;
uint8_t Filler4;
uint8_t ProgIpHi;
uint8_t ProgIp2;
uint8_t ProgIp1;
uint8_t ProgIpLo;
uint8_t ProgSmHi;
uint8_t ProgSm2;
uint8_t ProgSm1;
uint8_t ProgSmLo;
uint8_t ProgPortHi;
uint8_t ProgPortLo;
uint8_t Spare1;
uint8_t Spare2;
uint8_t Spare3;
uint8_t Spare4;
uint8_t Spare5;
uint8_t Spare6;
uint8_t Spare7;
uint8_t Spare8;
} __attribute__((packed));
typedef struct artnet_ipprog_s artnet_ipprog_t;
struct artnet_ipprog_reply_s {
uint8_t id[8];
uint16_t OpCode;
uint8_t ProVerH;
uint8_t ProVer;
uint8_t Filler1;
uint8_t Filler2;
uint8_t Filler3;
uint8_t Filler4;
uint8_t ProgIpHi;
uint8_t ProgIp2;
uint8_t ProgIp1;
uint8_t ProgIpLo;
uint8_t ProgSmHi;
uint8_t ProgSm2;
uint8_t ProgSm1;
uint8_t ProgSmLo;
uint8_t ProgPortHi;
uint8_t ProgPortLo;
uint8_t Spare1;
uint8_t Spare2;
uint8_t Spare3;
uint8_t Spare4;
uint8_t Spare5;
uint8_t Spare6;
uint8_t Spare7;
uint8_t Spare8;
} __attribute__((packed));
typedef struct artnet_ipprog_reply_s artnet_ipprog_reply_t;
struct artnet_address_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t filler1;
uint8_t filler2;
uint8_t shortname[ARTNET_SHORT_NAME_LENGTH];
uint8_t longname[ARTNET_LONG_NAME_LENGTH];
uint8_t swin[ARTNET_MAX_PORTS];
uint8_t swout[ARTNET_MAX_PORTS];
uint8_t subnet;
uint8_t swvideo;
uint8_t command;
} __attribute__((packed));
typedef struct artnet_address_s artnet_address_t;
struct artnet_dmx_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t sequence;
uint8_t physical;
uint16_t universe;
uint8_t lengthHi;
uint8_t length;
uint8_t data[ARTNET_DMX_LENGTH];
} __attribute__((packed));
typedef struct artnet_dmx_s artnet_dmx_t;
struct artnet_input_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t filler1;
uint8_t filler2;
uint8_t numbportsH;
uint8_t numbports;
uint8_t input[ARTNET_MAX_PORTS];
} __attribute__((packed));
typedef struct artnet_input_s artnet_input_t;
struct artnet_todrequest_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t filler1;
uint8_t filler2;
uint8_t spare1;
uint8_t spare2;
uint8_t spare3;
uint8_t spare4;
uint8_t spare5;
uint8_t spare6;
uint8_t spare7;
uint8_t spare8;
uint8_t command;
uint8_t adCount;
uint8_t address[ARTNET_MAX_RDM_ADCOUNT];
} __attribute__((packed));
typedef struct artnet_todrequest_s artnet_todrequest_t;
struct artnet_toddata_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t rdmVer;
uint8_t port;
uint8_t spare1;
uint8_t spare2;
uint8_t spare3;
uint8_t spare4;
uint8_t spare5;
uint8_t spare6;
uint8_t spare7;
uint8_t spare8;
uint8_t cmdRes;
uint8_t address;
uint8_t uidTotalHi;
uint8_t uidTotal;
uint8_t blockCount;
uint8_t uidCount;
uint8_t tod[ARTNET_MAX_UID_COUNT][ARTNET_RDM_UID_WIDTH];
} __attribute__((packed));
typedef struct artnet_toddata_s artnet_toddata_t;
struct artnet_firmware_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t filler1;
uint8_t filler2;
uint8_t type;
uint8_t blockId;
uint8_t length[4];
uint8_t spare[20];
uint16_t data[ARTNET_FIRMWARE_SIZE ];
} __attribute__((packed));
typedef struct artnet_firmware_s artnet_firmware_t;
struct artnet_todcontrol_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t filler1;
uint8_t filler2;
uint8_t spare1;
uint8_t spare2;
uint8_t spare3;
uint8_t spare4;
uint8_t spare5;
uint8_t spare6;
uint8_t spare7;
uint8_t spare8;
uint8_t cmd;
uint8_t address;
} __attribute__((packed));
typedef struct artnet_todcontrol_s artnet_todcontrol_t;
struct artnet_rdm_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t rdmVer;
uint8_t filler2;
uint8_t spare1;
uint8_t spare2;
uint8_t spare3;
uint8_t spare4;
uint8_t spare5;
uint8_t spare6;
uint8_t spare7;
uint8_t spare8;
uint8_t cmd;
uint8_t address;
uint8_t data[ARTNET_MAX_RDM_DATA];
} __attribute__((packed));
typedef struct artnet_rdm_s artnet_rdm_t;
struct artnet_firmware_reply_s {
uint8_t id[8];
uint16_t opCode;
uint8_t verH;
uint8_t ver;
uint8_t filler1;
uint8_t filler2;
uint8_t type;
uint8_t spare[21];
} __attribute__((packed));
typedef struct artnet_firmware_reply_s artnet_firmware_reply_t;
// union of all artnet packets
typedef union {
artnet_poll_t ap;
artnet_reply_t ar;
artnet_ipprog_t aip;
artnet_address_t addr;
artnet_dmx_t admx;
artnet_input_t ainput;
artnet_todrequest_t todreq;
artnet_toddata_t toddata;
artnet_firmware_t firmware;
artnet_firmware_reply_t firmwarer;
artnet_todcontrol_t todcontrol;
artnet_rdm_t rdm;
} artnet_packet_union_t;
// a packet, containing data, length, type and a src/dst address
typedef struct {
int length;
struct in_addr from;
struct in_addr to;
artnet_packet_type_t type;
artnet_packet_union_t data;
} artnet_packet_t;
typedef artnet_packet_t *artnet_packet;
#endif