http://mbed.org/users/okini3939/notebook/art-net/
Dependents: ArtNode ArtNode DMXStation ArtNodeLED ... more
DmxArtNet.h
- Committer:
- okini3939
- Date:
- 2019-09-13
- Revision:
- 3:89aa639c946a
- Parent:
- 2:0753f1ed1dec
File content as of revision 3:89aa639c946a:
/* * Control Art-Net from freepascal & delphi * (c) Rowan Maclachlan (hippy) rowanmac@optusnet.com.au [15d/01m/06y] * * Free for personal not-for-profit use only, please contact me if you are * using it in a commercial product, as i would like a copy :) * * http://members.westnet.com.au/rowanmac/ * * for mbed ported by Suga 2011, 2017 */ /** @file */ #ifndef _DmxArtNet_H_ #define _DmxArtNet_H_ #include "mbed.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 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 // 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_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 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 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 //#define DMXArray = array[0..511] of byte; struct ArtAddr { unsigned char IP[4]; // ip addess 0.1.2.3 unsigned short Port; } __attribute__((packed)); struct ArtPacketHeader { char ID[8]; unsigned short OpCode; // 0x5000 } __attribute__((packed)); // dmx transport packet struct ArtDMX_Packet { char ID[8]; unsigned short OpCode; // 0x5000 unsigned char VersionH; // 0 unsigned char Version; // 14 unsigned char Sequence; // 0 unsigned char Physical; // 0 unsigned short Universes; unsigned short Length; // size of data segment unsigned char Data[DMX_SIZE]; // data segment } __attribute__((packed)); struct ArtPoll_Packet { char ID[8]; 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; // 0x2100 struct ArtAddr Addr; // our ip address unsigned char VersionH; unsigned char Version; unsigned char NetSwitch; unsigned char SubSwitch; unsigned short OEM; char UbeaVersion; char Status; unsigned short EstaMan; char ShortName[18]; char LongName[64]; char NodeReport[64]; unsigned char NumPortsH; unsigned char NumPorts; unsigned char PortType[4]; unsigned char GoodInput[4]; unsigned char GoodOutput[4]; unsigned char Swin[4]; unsigned char Swout[4]; unsigned char SwVideo; unsigned char SwMacro; unsigned char SwRemote; unsigned char Spare[3]; // three spare bytes unsigned char Style; unsigned char Mac[6]; 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: 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 */ int Init(); /** socket shutdown */ void Done(); /** last error * @retval 0 ok */ int LastError() { return LError; } /** returns descrip of last error * @return descrip of last error */ char *LastErrorString() { return LErrorString; } /** clear error */ void ClearError(); /** 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 */ int Send_ArtDmx(int univ, int physical, char *data, int length); /** execute often * returns true if something happened * @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 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 struct ArtPacketHeader ArtHead; // packet header struct ArtDMX_Packet ArtDMX; // an Art-Net DMX Packet struct ArtPoll_Packet ArtPoll; // an Art-Poll Packet unsigned char buf[SizeRecvBuffer]; // a temp buffer struct ArtAddr localaddr; int LError; char LErrorString[40]; int makeword16 (int lsb, int msb); void Init_ArtDMX(); void SocketErrorOccured(char *proc); static void task_UDPSocket (void const *arg); void on_UDPSocketEvent (); void (*cb_ArtParser)(struct ArtPacketHeader *art, int len); Endpoint RemoteSin; volatile int rxlen; Thread *thread; }; #endif