http://mbed.org/users/okini3939/notebook/art-net/
Dependents: ArtNode ArtNode DMXStation ArtNodeLED ... more
Diff: DmxArtNet.h
- Revision:
- 2:0753f1ed1dec
- Parent:
- 1:c59dc374fc64
--- a/DmxArtNet.h Thu Sep 29 16:42:34 2011 +0000 +++ b/DmxArtNet.h Fri Sep 13 06:16:58 2019 +0000 @@ -7,37 +7,83 @@ * * http://members.westnet.com.au/rowanmac/ * - * for mbed ported by Suga 2011 + * for mbed ported by Suga 2011, 2017 */ /** @file */ +#ifndef _DmxArtNet_H_ +#define _DmxArtNet_H_ + #include "mbed.h" -#include "EthernetNetIf.h" -#include "UDPSocket.h" +#include "rtos.h" +#include "EthernetInterface.h" + +#ifndef DMX_SIZE +#define DMX_SIZE 512 +#endif //#define ArtMaxUniv 16 // Universe #define ArtMaxUniv 4 // Universe //#define SizeRecvBuffer (530*4) -#define SizeRecvBuffer 700 +//#define SizeRecvBuffer 560 +#define SizeRecvBuffer 1024 // Art-Net Standard Stuff -#define ArtHeaderID "Art-Net" // packet header -#define ArtUDPPort 0x1936 // UDP port 6454 for Art-Net -#define ArtVersion 14 // Art-Net version +#define ArtHeaderID "Art-Net" // packet header +#define ArtUDPPort 0x1936 // UDP port 6454 for Art-Net +#define ArtVersion 14 // Art-Net version // Art-Net OpCodes - defines type of packet -#define OP_Output 0x5000 //Art-Net DMX Packet 'Output' -#define OP_Poll 0x2000 // ArtPoll -#define OP_PollReply 0x2100 // ArtPoll Reply +#define OP_Output 0x5000 //Art-Net DMX Packet 'Output' +#define OP_Poll 0x2000 // ArtPoll +#define OP_PollReply 0x2100 // ArtPoll Reply +#define OP_Address 0x6000 // ArtAddress + +#define OP_OpTodRequest 0x8000 +#define OP_OpTodData 0x8100 +#define OP_OpTodControl 0x8200 +#define OP_OpRdm 0x8300 +#define OP_OpRdmSub 0x8400 + +#define OP_IpProg 0xf800 // IpProg +#define OP_IpProgReply 0xf900 // IpProgReply + +#define StyleNode 0 +#define StyleServer 1 + +#define STR_LongName "MbedArtNode - By Suga (2017), Rowan Maclachlan (2005)" +#define STR_ShortName "MbedArtNode" +#define OEM_ID 0x7ff7 -#define StyleNode 0 -#define StyleServer 1 +#define OP_Poll_TalkToMe_SendMeDiag (1<<2) +#define OP_Poll_TalkToMe_DiagUnicast (1<<3) +#define OP_Poll_TalkToMe_DisableVLC (1<<4) + +#define OP_PollRep_GoodIn_ReceiveError (1<<2) +#define OP_PollRep_GoodIn_Disabled (1<<3) +#define OP_PollRep_GoodIn_DmxText (1<<4) +#define OP_PollRep_GoodIn_DmxSip (1<<5) +#define OP_PollRep_GoodIn_DmxTest (1<<6) +#define OP_PollRep_GoodIn_Received (1<<7) -#define STR_LongName "MbedArtNode - By Suga (2011), Rowan Maclachlan (2005)" -#define STR_ShortName "MbedArtNode" +#define OP_PollRep_GoodOut_sACN (1<<0) +#define OP_PollRep_GoodOut_ModeLTP (1<<1) +#define OP_PollRep_GoodOut_ShortDetected (1<<2) +#define OP_PollRep_GoodOut_MergeArtNet (1<<3) +#define OP_PollRep_GoodOut_DmxText (1<<4) +#define OP_PollRep_GoodOut_DmxSip (1<<5) +#define OP_PollRep_GoodOut_DmxTest (1<<6) +#define OP_PollRep_GoodOut_Transmitted (1<<7) + +#define OP_IpProg_Command_ProgPort (1<<0) +#define OP_IpProg_Command_ProgNetmask (1<<1) +#define OP_IpProg_Command_ProgIpaddress (1<<2) +#define OP_IpProg_Command_Prog3Param (1<<3) +#define OP_IpProg_Command_EnableDhcp (1<<6) +#define OP_IpProg_Command_EnableProg (1<<7) // a DMX universe @@ -64,25 +110,26 @@ unsigned char Physical; // 0 unsigned short Universes; unsigned short Length; // size of data segment - unsigned char Data[512]; // data segment + unsigned char Data[DMX_SIZE]; // data segment } __attribute__((packed)); struct ArtPoll_Packet { char ID[8]; - unsigned short OpCode; // 0x5000 + unsigned short OpCode; // 0x2000 unsigned char VersionH; // 0 unsigned char Version; // 14 unsigned char TalkToMe; // 0 + unsigned char Priority; } __attribute__((packed)); // a responce to a artpoll packet struct ArtPollReply_Packet { char ID[8]; - unsigned short OpCode; // 0x2000 + unsigned short OpCode; // 0x2100 struct ArtAddr Addr; // our ip address unsigned char VersionH; unsigned char Version; - unsigned char SubSwitchH; + unsigned char NetSwitch; unsigned char SubSwitch; unsigned short OEM; char UbeaVersion; @@ -104,15 +151,158 @@ unsigned char Spare[3]; // three spare bytes unsigned char Style; unsigned char Mac[6]; - unsigned char Padding[32]; // padding + unsigned char BindIp[4]; + unsigned char BindIndex; + unsigned char Status2; + unsigned char Padding[26]; // padding +} __attribute__((packed)); + +struct ArtIpProg_Packet { + char ID[8]; + unsigned short OpCode; // 0xf800 + unsigned char VersionH; // 0 + unsigned char Version; // 14 + unsigned char Filler1; + unsigned char Filler2; + unsigned char Command; + unsigned char Filler4; + unsigned char ProgIp[4]; + unsigned char ProgSm[4]; + unsigned char ProgPortH; + unsigned char ProgPort; + unsigned char Padding[8]; +} __attribute__((packed)); + +struct ArtIpProgReply_Packet { + char ID[8]; + unsigned short OpCode; // 0xf900 + unsigned char VersionH; // 0 + unsigned char Version; // 14 + unsigned char Filler1; + unsigned char Filler2; + unsigned char Filler3; + unsigned char Filler4; + unsigned char ProgIp[4]; + unsigned char ProgSm[4]; + unsigned char ProgPortH; + unsigned char ProgPort; + unsigned char Status; + unsigned char Padding[7]; +} __attribute__((packed)); + +struct ArtAddress_Packet { + char ID[8]; + unsigned short OpCode; // 0x6000 + unsigned char VersionH; + unsigned char Version; + unsigned char NetSwitch; + unsigned char BindIndex; + char ShortName[18]; + char LongName[64]; + unsigned char Swin[4]; + unsigned char Swout[4]; + unsigned char SubSwitch; + unsigned char SwVideo; + unsigned char Command; +} __attribute__((packed)); + +struct ArtTodRequest_Packet { + char ID[8]; + unsigned short OpCode; // 0x8300 + unsigned char VersionH; + unsigned char Version; + unsigned char Filler1; + unsigned char Filler2; + char Spare[7]; + char Net; + char Command; + char AddCount; + char Address[32]; } __attribute__((packed)); +struct ArtTodData_Packet { + char ID[8]; + unsigned short OpCode; // 0x8300 + unsigned char VersionH; + unsigned char Version; + unsigned char RdmVersion; + unsigned char Port; + char Spare[6]; + char BindIndex; + char Net; + char CommandResponse; + char Address; + char UidTotalH; + char UidTotalL; + char BlockCount; + char UidCount; + char ToD[6]; +} __attribute__((packed)); + +struct ArtTodControl_Packet { + char ID[8]; + unsigned short OpCode; // 0x8300 + unsigned char VersionH; + unsigned char Version; + unsigned char Filler1; + unsigned char Filler2; + char Spare[7]; + char Net; + char Command; + char Address; +} __attribute__((packed)); + +struct ArtRdm_Packet { + char ID[8]; + unsigned short OpCode; // 0x8300 + unsigned char VersionH; + unsigned char Version; + unsigned char RdmVersion; + unsigned char Filler2; + char Spare[7]; + char Net; + char Command; + char Address; + char RdmPacket[]; +} __attribute__((packed)); + +struct ArtRdmSub_Packet { + char ID[8]; + unsigned short OpCode; // 0x8400 + unsigned char VersionH; + unsigned char Version; + unsigned char RdmVersion; + unsigned char Filler2; + char uid[6]; + char Spare1; + char CommandClass; + short ParameterId; + short SubDevice; + short SubCount; + char Spare[4]; + short data[]; +} __attribute__((packed)); + + +struct ArtPorts_Config { + unsigned char PortType[ArtMaxUniv]; + unsigned char GoodInput[ArtMaxUniv]; + unsigned char GoodOutput[ArtMaxUniv]; + unsigned char Swin[ArtMaxUniv]; + unsigned char Swout[ArtMaxUniv]; +}; + /** DmxArtNet class */ class DmxArtNet { public: - IpAddr BindIpAddress; // Local IP Address to bind onto - IpAddr BCastAddress; // address to broadcast on + unsigned short NetSwitch; + char BindIpAddress[16]; // Local IP Address to bind onto + char BCastAddress[16]; // address to broadcast on + char SubNetMask[16], DGateWay[16]; + int UdpPort, OemId; + + DmxArtNet (); /** create network socket, setup for NetworkWork * @return true if socket creation succeded @@ -139,13 +329,6 @@ */ void ClearError(); - /** recieve our own packets - * @return recieve our own packets - */ - int loopback() { - return net_loopback; - } - /** Send * send an array [0..511] of (length) bytes representing the dmx you want to send to * univ[0..15] , physical is info only, can be the universe number or port of device @@ -156,15 +339,25 @@ * @return 1 something happened */ int Work(); - +/* + void WorkAddress (ArtAddress_Packet *address); + void WorkIpProg (ArtIpProg_Packet *ipprog); +*/ unsigned char *DmxIn[ArtMaxUniv]; // Recieved ArtDMX, 16 Dmx Arrays - int LastRecievedUniverse; // the number of the last recieved universe + volatile int LastRecievedUniverse; // the number of the last recieved universe struct ArtPollReply_Packet ArtPollReply; // a response to ArtPoll // contains many variables you may set + struct ArtPorts_Config ArtPorts; void InitArtPollReplyDefaults(); int SendArtPollReply(); + int SendArtIpProgReply(); + int SendArtTodData (int n); + + void attach (void (*handler)(struct ArtPacketHeader *, int)); + + void bcast(char *dest, char *ipaddr, char *netmask); private: UDPSocket _art; // the network socket @@ -174,17 +367,20 @@ unsigned char buf[SizeRecvBuffer]; // a temp buffer struct ArtAddr localaddr; int LError; - char LErrorString[80]; + char LErrorString[40]; int makeword16 (int lsb, int msb); void Init_ArtDMX(); void SocketErrorOccured(char *proc); - void on_UDPSocketEvent (UDPSocketEvent e); + static void task_UDPSocket (void const *arg); + void on_UDPSocketEvent (); + + void (*cb_ArtParser)(struct ArtPacketHeader *art, int len); - int net_loopback; // if true, then listen to our own packets - // is crap and does not work - Host RemoteSin; + Endpoint RemoteSin; volatile int rxlen; + Thread *thread; }; +#endif