http://mbed.org/users/okini3939/notebook/art-net/
Dependents: ArtNode ArtNode DMXStation ArtNodeLED ... more
DmxArtNet.h
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
Generated on Thu Jul 14 2022 05:23:18 by 1.7.2