http://mbed.org/users/okini3939/notebook/art-net/

Dependents:   ArtNode ArtNode DMXStation ArtNodeLED ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DmxArtNet.h Source File

DmxArtNet.h

Go to the documentation of this file.
00001 /*
00002  * Control Art-Net from freepascal & delphi
00003  * (c) Rowan Maclachlan (hippy) rowanmac@optusnet.com.au [15d/01m/06y]
00004  *
00005  * Free for personal not-for-profit use only, please contact me if you are
00006  * using it in a commercial product, as i would like a copy :)
00007  *
00008  * http://members.westnet.com.au/rowanmac/
00009  *
00010  * for mbed ported by Suga 2011, 2017
00011  */
00012 
00013 /** @file
00014  */
00015 
00016 #ifndef _DmxArtNet_H_
00017 #define _DmxArtNet_H_
00018 
00019 #include "mbed.h"
00020 #include "rtos.h"
00021 #include "EthernetInterface.h"
00022 
00023 #ifndef DMX_SIZE
00024 #define DMX_SIZE 512
00025 #endif
00026 
00027 //#define ArtMaxUniv 16 // Universe
00028 #define ArtMaxUniv 4 // Universe
00029 
00030 //#define SizeRecvBuffer (530*4)
00031 //#define SizeRecvBuffer 560
00032 #define SizeRecvBuffer 1024
00033 
00034 // Art-Net Standard Stuff
00035 #define ArtHeaderID     "Art-Net" // packet header
00036 #define ArtUDPPort      0x1936 // UDP port 6454 for Art-Net
00037 #define ArtVersion      14    // Art-Net version
00038 
00039 // Art-Net OpCodes - defines type of packet
00040 #define OP_Output       0x5000 //Art-Net DMX Packet 'Output'
00041 #define OP_Poll         0x2000 // ArtPoll
00042 #define OP_PollReply    0x2100 // ArtPoll Reply
00043 #define OP_Address      0x6000 // ArtAddress
00044 
00045 #define OP_OpTodRequest 0x8000 
00046 #define OP_OpTodData    0x8100 
00047 #define OP_OpTodControl 0x8200 
00048 #define OP_OpRdm        0x8300 
00049 #define OP_OpRdmSub     0x8400 
00050 
00051 #define OP_IpProg       0xf800 // IpProg
00052 #define OP_IpProgReply  0xf900 // IpProgReply
00053 
00054 #define StyleNode       0
00055 #define StyleServer     1
00056 
00057 #define STR_LongName    "MbedArtNode - By Suga (2017), Rowan Maclachlan (2005)"
00058 #define STR_ShortName   "MbedArtNode"
00059 #define OEM_ID          0x7ff7
00060 
00061 #define OP_Poll_TalkToMe_SendMeDiag     (1<<2)
00062 #define OP_Poll_TalkToMe_DiagUnicast    (1<<3)
00063 #define OP_Poll_TalkToMe_DisableVLC     (1<<4)
00064 
00065 #define OP_PollRep_GoodIn_ReceiveError  (1<<2)
00066 #define OP_PollRep_GoodIn_Disabled      (1<<3)
00067 #define OP_PollRep_GoodIn_DmxText       (1<<4)
00068 #define OP_PollRep_GoodIn_DmxSip        (1<<5)
00069 #define OP_PollRep_GoodIn_DmxTest       (1<<6)
00070 #define OP_PollRep_GoodIn_Received      (1<<7)
00071 
00072 #define OP_PollRep_GoodOut_sACN         (1<<0)
00073 #define OP_PollRep_GoodOut_ModeLTP      (1<<1)
00074 #define OP_PollRep_GoodOut_ShortDetected (1<<2)
00075 #define OP_PollRep_GoodOut_MergeArtNet  (1<<3)
00076 #define OP_PollRep_GoodOut_DmxText      (1<<4)
00077 #define OP_PollRep_GoodOut_DmxSip       (1<<5)
00078 #define OP_PollRep_GoodOut_DmxTest      (1<<6)
00079 #define OP_PollRep_GoodOut_Transmitted  (1<<7)
00080 
00081 #define OP_IpProg_Command_ProgPort      (1<<0)
00082 #define OP_IpProg_Command_ProgNetmask   (1<<1)
00083 #define OP_IpProg_Command_ProgIpaddress (1<<2)
00084 #define OP_IpProg_Command_Prog3Param    (1<<3)
00085 #define OP_IpProg_Command_EnableDhcp    (1<<6)
00086 #define OP_IpProg_Command_EnableProg    (1<<7)
00087 
00088 
00089 // a DMX universe
00090 //#define DMXArray = array[0..511] of byte;
00091 
00092 struct ArtAddr {
00093      unsigned char IP[4]; // ip addess 0.1.2.3
00094      unsigned short Port;
00095 } __attribute__((packed));
00096 
00097 struct ArtPacketHeader {
00098      char ID[8];
00099      unsigned short OpCode; // 0x5000
00100 } __attribute__((packed));
00101 
00102 
00103 // dmx transport packet
00104 struct ArtDMX_Packet {
00105      char ID[8];
00106      unsigned short OpCode; // 0x5000
00107      unsigned char VersionH; // 0
00108      unsigned char Version; // 14
00109      unsigned char Sequence; // 0
00110      unsigned char Physical; // 0
00111      unsigned short Universes;
00112      unsigned short Length; // size of data segment
00113      unsigned char Data[DMX_SIZE]; // data segment
00114 } __attribute__((packed));
00115 
00116 struct ArtPoll_Packet {
00117      char ID[8];
00118      unsigned short OpCode; // 0x2000
00119      unsigned char VersionH; // 0
00120      unsigned char Version; // 14
00121      unsigned char TalkToMe; // 0
00122      unsigned char Priority;
00123 } __attribute__((packed));
00124 
00125 // a responce to a artpoll packet
00126 struct ArtPollReply_Packet {
00127      char ID[8];
00128      unsigned short OpCode; // 0x2100
00129      struct ArtAddr Addr; // our ip address
00130      unsigned char VersionH;
00131      unsigned char Version;
00132      unsigned char NetSwitch;
00133      unsigned char SubSwitch;
00134      unsigned short OEM;
00135      char UbeaVersion;
00136      char Status;
00137      unsigned short EstaMan;
00138      char ShortName[18];
00139      char LongName[64];
00140      char NodeReport[64];
00141      unsigned char NumPortsH;
00142      unsigned char NumPorts;
00143      unsigned char PortType[4];
00144      unsigned char GoodInput[4];
00145      unsigned char GoodOutput[4];
00146      unsigned char Swin[4];
00147      unsigned char Swout[4];
00148      unsigned char SwVideo;
00149      unsigned char SwMacro;
00150      unsigned char SwRemote;
00151      unsigned char Spare[3]; // three spare bytes
00152      unsigned char Style;
00153      unsigned char Mac[6];
00154      unsigned char BindIp[4];
00155      unsigned char BindIndex;
00156      unsigned char Status2;
00157      unsigned char Padding[26]; // padding
00158 } __attribute__((packed));
00159 
00160 struct ArtIpProg_Packet {
00161      char ID[8];
00162      unsigned short OpCode; // 0xf800
00163      unsigned char VersionH; // 0
00164      unsigned char Version; // 14
00165      unsigned char Filler1;
00166      unsigned char Filler2;
00167      unsigned char Command;
00168      unsigned char Filler4;
00169      unsigned char ProgIp[4];
00170      unsigned char ProgSm[4];
00171      unsigned char ProgPortH;
00172      unsigned char ProgPort;
00173      unsigned char Padding[8];
00174 } __attribute__((packed));
00175 
00176 struct ArtIpProgReply_Packet {
00177      char ID[8];
00178      unsigned short OpCode; // 0xf900
00179      unsigned char VersionH; // 0
00180      unsigned char Version; // 14
00181      unsigned char Filler1;
00182      unsigned char Filler2;
00183      unsigned char Filler3;
00184      unsigned char Filler4;
00185      unsigned char ProgIp[4];
00186      unsigned char ProgSm[4];
00187      unsigned char ProgPortH;
00188      unsigned char ProgPort;
00189      unsigned char Status;
00190      unsigned char Padding[7];
00191 } __attribute__((packed));
00192 
00193 struct ArtAddress_Packet {
00194      char ID[8];
00195      unsigned short OpCode; // 0x6000
00196      unsigned char VersionH;
00197      unsigned char Version;
00198      unsigned char NetSwitch;
00199      unsigned char BindIndex;
00200      char ShortName[18];
00201      char LongName[64];
00202      unsigned char Swin[4];
00203      unsigned char Swout[4];
00204      unsigned char SubSwitch;
00205      unsigned char SwVideo;
00206      unsigned char Command;
00207 } __attribute__((packed));
00208 
00209 struct ArtTodRequest_Packet {
00210      char ID[8];
00211      unsigned short OpCode; // 0x8300
00212      unsigned char VersionH;
00213      unsigned char Version;
00214      unsigned char Filler1;
00215      unsigned char Filler2;
00216      char Spare[7];
00217      char Net;
00218      char Command;
00219      char AddCount;
00220      char Address[32];
00221 } __attribute__((packed));
00222 
00223 struct ArtTodData_Packet {
00224      char ID[8];
00225      unsigned short OpCode; // 0x8300
00226      unsigned char VersionH;
00227      unsigned char Version;
00228      unsigned char RdmVersion;
00229      unsigned char Port;
00230      char Spare[6];
00231      char BindIndex;
00232      char Net;
00233      char CommandResponse;
00234      char Address;
00235      char UidTotalH;
00236      char UidTotalL;
00237      char BlockCount;
00238      char UidCount;
00239      char ToD[6];
00240 } __attribute__((packed));
00241 
00242 struct ArtTodControl_Packet {
00243      char ID[8];
00244      unsigned short OpCode; // 0x8300
00245      unsigned char VersionH;
00246      unsigned char Version;
00247      unsigned char Filler1;
00248      unsigned char Filler2;
00249      char Spare[7];
00250      char Net;
00251      char Command;
00252      char Address;
00253 } __attribute__((packed));
00254 
00255 struct ArtRdm_Packet {
00256      char ID[8];
00257      unsigned short OpCode; // 0x8300
00258      unsigned char VersionH;
00259      unsigned char Version;
00260      unsigned char RdmVersion;
00261      unsigned char Filler2;
00262      char Spare[7];
00263      char Net;
00264      char Command;
00265      char Address;
00266      char RdmPacket[];
00267 } __attribute__((packed));
00268 
00269 struct ArtRdmSub_Packet {
00270      char ID[8];
00271      unsigned short OpCode; // 0x8400
00272      unsigned char VersionH;
00273      unsigned char Version;
00274      unsigned char RdmVersion;
00275      unsigned char Filler2;
00276      char uid[6];
00277      char Spare1;
00278      char CommandClass;
00279      short ParameterId;
00280      short SubDevice;
00281      short SubCount;
00282      char Spare[4];
00283      short data[];
00284 } __attribute__((packed));
00285 
00286 
00287 struct ArtPorts_Config {
00288      unsigned char PortType[ArtMaxUniv];
00289      unsigned char GoodInput[ArtMaxUniv];
00290      unsigned char GoodOutput[ArtMaxUniv];
00291      unsigned char Swin[ArtMaxUniv];
00292      unsigned char Swout[ArtMaxUniv];
00293 };
00294 
00295 /** DmxArtNet class
00296  */
00297 class DmxArtNet {
00298 public:
00299     unsigned short NetSwitch;
00300     char BindIpAddress[16]; // Local IP Address to bind onto
00301     char BCastAddress[16]; // address to broadcast on
00302     char SubNetMask[16], DGateWay[16];
00303     int UdpPort, OemId;
00304 
00305     DmxArtNet ();
00306 
00307     /** create network socket, setup for NetworkWork
00308      * @return true if socket creation succeded
00309      */
00310     int Init();
00311 
00312     /** socket shutdown
00313      */
00314     void Done();
00315 
00316     /** last error
00317      * @retval 0 ok
00318      */
00319     int LastError() {
00320         return LError;
00321     }
00322     /** returns descrip of last error
00323      * @return descrip of last error
00324      */
00325     char *LastErrorString() {
00326         return LErrorString;
00327     }
00328     /** clear error
00329      */
00330     void ClearError();
00331 
00332     /** Send
00333      * send an array [0..511] of (length) bytes representing the dmx you want to send to
00334      * univ[0..15] ,  physical is info only, can be the universe number or port of device
00335      */
00336     int Send_ArtDmx(int univ, int physical, char *data, int length);
00337     /** execute often
00338      * returns true if something happened
00339      * @return 1 something happened
00340      */
00341     int Work();
00342 /*
00343     void WorkAddress (ArtAddress_Packet *address);
00344     void WorkIpProg (ArtIpProg_Packet *ipprog);
00345 */
00346     unsigned char *DmxIn[ArtMaxUniv]; // Recieved ArtDMX, 16 Dmx Arrays
00347     volatile int LastRecievedUniverse; // the number of the last recieved universe
00348 
00349     struct ArtPollReply_Packet ArtPollReply; // a response to ArtPoll
00350                                       // contains many variables you may set
00351     struct ArtPorts_Config ArtPorts;
00352 
00353     void InitArtPollReplyDefaults();
00354     int SendArtPollReply();
00355     int SendArtIpProgReply();
00356     int SendArtTodData (int n);
00357 
00358     void attach (void (*handler)(struct ArtPacketHeader *, int));
00359 
00360     void bcast(char *dest, char *ipaddr, char *netmask);
00361 
00362 private:
00363     UDPSocket _art; // the network socket
00364     struct ArtPacketHeader ArtHead; // packet header
00365     struct ArtDMX_Packet ArtDMX; // an Art-Net DMX Packet
00366     struct ArtPoll_Packet ArtPoll; // an Art-Poll Packet
00367     unsigned char buf[SizeRecvBuffer]; // a temp buffer
00368     struct ArtAddr localaddr;
00369     int LError;
00370     char LErrorString[40];
00371 
00372     int makeword16 (int lsb, int msb);
00373 
00374     void Init_ArtDMX();
00375     void SocketErrorOccured(char *proc);
00376 
00377     static void task_UDPSocket (void const *arg);
00378     void on_UDPSocketEvent ();
00379 
00380     void (*cb_ArtParser)(struct ArtPacketHeader *art, int len);
00381 
00382     Endpoint RemoteSin;
00383     volatile int rxlen;
00384     Thread *thread;
00385 };
00386 #endif