http://mbed.org/users/okini3939/notebook/art-net/
Dependents: ArtNode ArtNode DMXStation ArtNodeLED ... more
DmxArtNet.h@3:89aa639c946a, 2019-09-13 (annotated)
- Committer:
- okini3939
- Date:
- Fri Sep 13 08:03:40 2019 +0000
- Revision:
- 3:89aa639c946a
- Parent:
- 2:0753f1ed1dec
bug fix;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:629617d401de | 1 | /* |
okini3939 | 0:629617d401de | 2 | * Control Art-Net from freepascal & delphi |
okini3939 | 0:629617d401de | 3 | * (c) Rowan Maclachlan (hippy) rowanmac@optusnet.com.au [15d/01m/06y] |
okini3939 | 0:629617d401de | 4 | * |
okini3939 | 0:629617d401de | 5 | * Free for personal not-for-profit use only, please contact me if you are |
okini3939 | 0:629617d401de | 6 | * using it in a commercial product, as i would like a copy :) |
okini3939 | 0:629617d401de | 7 | * |
okini3939 | 0:629617d401de | 8 | * http://members.westnet.com.au/rowanmac/ |
okini3939 | 0:629617d401de | 9 | * |
okini3939 | 2:0753f1ed1dec | 10 | * for mbed ported by Suga 2011, 2017 |
okini3939 | 0:629617d401de | 11 | */ |
okini3939 | 0:629617d401de | 12 | |
okini3939 | 0:629617d401de | 13 | /** @file |
okini3939 | 0:629617d401de | 14 | */ |
okini3939 | 0:629617d401de | 15 | |
okini3939 | 2:0753f1ed1dec | 16 | #ifndef _DmxArtNet_H_ |
okini3939 | 2:0753f1ed1dec | 17 | #define _DmxArtNet_H_ |
okini3939 | 2:0753f1ed1dec | 18 | |
okini3939 | 0:629617d401de | 19 | #include "mbed.h" |
okini3939 | 2:0753f1ed1dec | 20 | #include "rtos.h" |
okini3939 | 2:0753f1ed1dec | 21 | #include "EthernetInterface.h" |
okini3939 | 2:0753f1ed1dec | 22 | |
okini3939 | 2:0753f1ed1dec | 23 | #ifndef DMX_SIZE |
okini3939 | 2:0753f1ed1dec | 24 | #define DMX_SIZE 512 |
okini3939 | 2:0753f1ed1dec | 25 | #endif |
okini3939 | 0:629617d401de | 26 | |
okini3939 | 0:629617d401de | 27 | //#define ArtMaxUniv 16 // Universe |
okini3939 | 0:629617d401de | 28 | #define ArtMaxUniv 4 // Universe |
okini3939 | 0:629617d401de | 29 | |
okini3939 | 0:629617d401de | 30 | //#define SizeRecvBuffer (530*4) |
okini3939 | 2:0753f1ed1dec | 31 | //#define SizeRecvBuffer 560 |
okini3939 | 2:0753f1ed1dec | 32 | #define SizeRecvBuffer 1024 |
okini3939 | 0:629617d401de | 33 | |
okini3939 | 0:629617d401de | 34 | // Art-Net Standard Stuff |
okini3939 | 2:0753f1ed1dec | 35 | #define ArtHeaderID "Art-Net" // packet header |
okini3939 | 2:0753f1ed1dec | 36 | #define ArtUDPPort 0x1936 // UDP port 6454 for Art-Net |
okini3939 | 2:0753f1ed1dec | 37 | #define ArtVersion 14 // Art-Net version |
okini3939 | 0:629617d401de | 38 | |
okini3939 | 0:629617d401de | 39 | // Art-Net OpCodes - defines type of packet |
okini3939 | 2:0753f1ed1dec | 40 | #define OP_Output 0x5000 //Art-Net DMX Packet 'Output' |
okini3939 | 2:0753f1ed1dec | 41 | #define OP_Poll 0x2000 // ArtPoll |
okini3939 | 2:0753f1ed1dec | 42 | #define OP_PollReply 0x2100 // ArtPoll Reply |
okini3939 | 2:0753f1ed1dec | 43 | #define OP_Address 0x6000 // ArtAddress |
okini3939 | 2:0753f1ed1dec | 44 | |
okini3939 | 2:0753f1ed1dec | 45 | #define OP_OpTodRequest 0x8000 |
okini3939 | 2:0753f1ed1dec | 46 | #define OP_OpTodData 0x8100 |
okini3939 | 2:0753f1ed1dec | 47 | #define OP_OpTodControl 0x8200 |
okini3939 | 2:0753f1ed1dec | 48 | #define OP_OpRdm 0x8300 |
okini3939 | 2:0753f1ed1dec | 49 | #define OP_OpRdmSub 0x8400 |
okini3939 | 2:0753f1ed1dec | 50 | |
okini3939 | 2:0753f1ed1dec | 51 | #define OP_IpProg 0xf800 // IpProg |
okini3939 | 2:0753f1ed1dec | 52 | #define OP_IpProgReply 0xf900 // IpProgReply |
okini3939 | 2:0753f1ed1dec | 53 | |
okini3939 | 2:0753f1ed1dec | 54 | #define StyleNode 0 |
okini3939 | 2:0753f1ed1dec | 55 | #define StyleServer 1 |
okini3939 | 2:0753f1ed1dec | 56 | |
okini3939 | 2:0753f1ed1dec | 57 | #define STR_LongName "MbedArtNode - By Suga (2017), Rowan Maclachlan (2005)" |
okini3939 | 2:0753f1ed1dec | 58 | #define STR_ShortName "MbedArtNode" |
okini3939 | 2:0753f1ed1dec | 59 | #define OEM_ID 0x7ff7 |
okini3939 | 0:629617d401de | 60 | |
okini3939 | 2:0753f1ed1dec | 61 | #define OP_Poll_TalkToMe_SendMeDiag (1<<2) |
okini3939 | 2:0753f1ed1dec | 62 | #define OP_Poll_TalkToMe_DiagUnicast (1<<3) |
okini3939 | 2:0753f1ed1dec | 63 | #define OP_Poll_TalkToMe_DisableVLC (1<<4) |
okini3939 | 2:0753f1ed1dec | 64 | |
okini3939 | 2:0753f1ed1dec | 65 | #define OP_PollRep_GoodIn_ReceiveError (1<<2) |
okini3939 | 2:0753f1ed1dec | 66 | #define OP_PollRep_GoodIn_Disabled (1<<3) |
okini3939 | 2:0753f1ed1dec | 67 | #define OP_PollRep_GoodIn_DmxText (1<<4) |
okini3939 | 2:0753f1ed1dec | 68 | #define OP_PollRep_GoodIn_DmxSip (1<<5) |
okini3939 | 2:0753f1ed1dec | 69 | #define OP_PollRep_GoodIn_DmxTest (1<<6) |
okini3939 | 2:0753f1ed1dec | 70 | #define OP_PollRep_GoodIn_Received (1<<7) |
okini3939 | 0:629617d401de | 71 | |
okini3939 | 2:0753f1ed1dec | 72 | #define OP_PollRep_GoodOut_sACN (1<<0) |
okini3939 | 2:0753f1ed1dec | 73 | #define OP_PollRep_GoodOut_ModeLTP (1<<1) |
okini3939 | 2:0753f1ed1dec | 74 | #define OP_PollRep_GoodOut_ShortDetected (1<<2) |
okini3939 | 2:0753f1ed1dec | 75 | #define OP_PollRep_GoodOut_MergeArtNet (1<<3) |
okini3939 | 2:0753f1ed1dec | 76 | #define OP_PollRep_GoodOut_DmxText (1<<4) |
okini3939 | 2:0753f1ed1dec | 77 | #define OP_PollRep_GoodOut_DmxSip (1<<5) |
okini3939 | 2:0753f1ed1dec | 78 | #define OP_PollRep_GoodOut_DmxTest (1<<6) |
okini3939 | 2:0753f1ed1dec | 79 | #define OP_PollRep_GoodOut_Transmitted (1<<7) |
okini3939 | 2:0753f1ed1dec | 80 | |
okini3939 | 2:0753f1ed1dec | 81 | #define OP_IpProg_Command_ProgPort (1<<0) |
okini3939 | 2:0753f1ed1dec | 82 | #define OP_IpProg_Command_ProgNetmask (1<<1) |
okini3939 | 2:0753f1ed1dec | 83 | #define OP_IpProg_Command_ProgIpaddress (1<<2) |
okini3939 | 2:0753f1ed1dec | 84 | #define OP_IpProg_Command_Prog3Param (1<<3) |
okini3939 | 2:0753f1ed1dec | 85 | #define OP_IpProg_Command_EnableDhcp (1<<6) |
okini3939 | 2:0753f1ed1dec | 86 | #define OP_IpProg_Command_EnableProg (1<<7) |
okini3939 | 0:629617d401de | 87 | |
okini3939 | 0:629617d401de | 88 | |
okini3939 | 0:629617d401de | 89 | // a DMX universe |
okini3939 | 0:629617d401de | 90 | //#define DMXArray = array[0..511] of byte; |
okini3939 | 0:629617d401de | 91 | |
okini3939 | 0:629617d401de | 92 | struct ArtAddr { |
okini3939 | 0:629617d401de | 93 | unsigned char IP[4]; // ip addess 0.1.2.3 |
okini3939 | 0:629617d401de | 94 | unsigned short Port; |
okini3939 | 0:629617d401de | 95 | } __attribute__((packed)); |
okini3939 | 0:629617d401de | 96 | |
okini3939 | 0:629617d401de | 97 | struct ArtPacketHeader { |
okini3939 | 0:629617d401de | 98 | char ID[8]; |
okini3939 | 0:629617d401de | 99 | unsigned short OpCode; // 0x5000 |
okini3939 | 0:629617d401de | 100 | } __attribute__((packed)); |
okini3939 | 0:629617d401de | 101 | |
okini3939 | 0:629617d401de | 102 | |
okini3939 | 0:629617d401de | 103 | // dmx transport packet |
okini3939 | 0:629617d401de | 104 | struct ArtDMX_Packet { |
okini3939 | 0:629617d401de | 105 | char ID[8]; |
okini3939 | 0:629617d401de | 106 | unsigned short OpCode; // 0x5000 |
okini3939 | 0:629617d401de | 107 | unsigned char VersionH; // 0 |
okini3939 | 0:629617d401de | 108 | unsigned char Version; // 14 |
okini3939 | 0:629617d401de | 109 | unsigned char Sequence; // 0 |
okini3939 | 0:629617d401de | 110 | unsigned char Physical; // 0 |
okini3939 | 0:629617d401de | 111 | unsigned short Universes; |
okini3939 | 0:629617d401de | 112 | unsigned short Length; // size of data segment |
okini3939 | 2:0753f1ed1dec | 113 | unsigned char Data[DMX_SIZE]; // data segment |
okini3939 | 0:629617d401de | 114 | } __attribute__((packed)); |
okini3939 | 0:629617d401de | 115 | |
okini3939 | 0:629617d401de | 116 | struct ArtPoll_Packet { |
okini3939 | 0:629617d401de | 117 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 118 | unsigned short OpCode; // 0x2000 |
okini3939 | 0:629617d401de | 119 | unsigned char VersionH; // 0 |
okini3939 | 0:629617d401de | 120 | unsigned char Version; // 14 |
okini3939 | 0:629617d401de | 121 | unsigned char TalkToMe; // 0 |
okini3939 | 2:0753f1ed1dec | 122 | unsigned char Priority; |
okini3939 | 0:629617d401de | 123 | } __attribute__((packed)); |
okini3939 | 0:629617d401de | 124 | |
okini3939 | 0:629617d401de | 125 | // a responce to a artpoll packet |
okini3939 | 0:629617d401de | 126 | struct ArtPollReply_Packet { |
okini3939 | 0:629617d401de | 127 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 128 | unsigned short OpCode; // 0x2100 |
okini3939 | 0:629617d401de | 129 | struct ArtAddr Addr; // our ip address |
okini3939 | 0:629617d401de | 130 | unsigned char VersionH; |
okini3939 | 0:629617d401de | 131 | unsigned char Version; |
okini3939 | 2:0753f1ed1dec | 132 | unsigned char NetSwitch; |
okini3939 | 0:629617d401de | 133 | unsigned char SubSwitch; |
okini3939 | 0:629617d401de | 134 | unsigned short OEM; |
okini3939 | 0:629617d401de | 135 | char UbeaVersion; |
okini3939 | 0:629617d401de | 136 | char Status; |
okini3939 | 0:629617d401de | 137 | unsigned short EstaMan; |
okini3939 | 0:629617d401de | 138 | char ShortName[18]; |
okini3939 | 0:629617d401de | 139 | char LongName[64]; |
okini3939 | 0:629617d401de | 140 | char NodeReport[64]; |
okini3939 | 0:629617d401de | 141 | unsigned char NumPortsH; |
okini3939 | 0:629617d401de | 142 | unsigned char NumPorts; |
okini3939 | 0:629617d401de | 143 | unsigned char PortType[4]; |
okini3939 | 0:629617d401de | 144 | unsigned char GoodInput[4]; |
okini3939 | 0:629617d401de | 145 | unsigned char GoodOutput[4]; |
okini3939 | 0:629617d401de | 146 | unsigned char Swin[4]; |
okini3939 | 0:629617d401de | 147 | unsigned char Swout[4]; |
okini3939 | 0:629617d401de | 148 | unsigned char SwVideo; |
okini3939 | 0:629617d401de | 149 | unsigned char SwMacro; |
okini3939 | 0:629617d401de | 150 | unsigned char SwRemote; |
okini3939 | 0:629617d401de | 151 | unsigned char Spare[3]; // three spare bytes |
okini3939 | 0:629617d401de | 152 | unsigned char Style; |
okini3939 | 0:629617d401de | 153 | unsigned char Mac[6]; |
okini3939 | 2:0753f1ed1dec | 154 | unsigned char BindIp[4]; |
okini3939 | 2:0753f1ed1dec | 155 | unsigned char BindIndex; |
okini3939 | 2:0753f1ed1dec | 156 | unsigned char Status2; |
okini3939 | 2:0753f1ed1dec | 157 | unsigned char Padding[26]; // padding |
okini3939 | 2:0753f1ed1dec | 158 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 159 | |
okini3939 | 2:0753f1ed1dec | 160 | struct ArtIpProg_Packet { |
okini3939 | 2:0753f1ed1dec | 161 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 162 | unsigned short OpCode; // 0xf800 |
okini3939 | 2:0753f1ed1dec | 163 | unsigned char VersionH; // 0 |
okini3939 | 2:0753f1ed1dec | 164 | unsigned char Version; // 14 |
okini3939 | 2:0753f1ed1dec | 165 | unsigned char Filler1; |
okini3939 | 2:0753f1ed1dec | 166 | unsigned char Filler2; |
okini3939 | 2:0753f1ed1dec | 167 | unsigned char Command; |
okini3939 | 2:0753f1ed1dec | 168 | unsigned char Filler4; |
okini3939 | 2:0753f1ed1dec | 169 | unsigned char ProgIp[4]; |
okini3939 | 2:0753f1ed1dec | 170 | unsigned char ProgSm[4]; |
okini3939 | 2:0753f1ed1dec | 171 | unsigned char ProgPortH; |
okini3939 | 2:0753f1ed1dec | 172 | unsigned char ProgPort; |
okini3939 | 2:0753f1ed1dec | 173 | unsigned char Padding[8]; |
okini3939 | 2:0753f1ed1dec | 174 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 175 | |
okini3939 | 2:0753f1ed1dec | 176 | struct ArtIpProgReply_Packet { |
okini3939 | 2:0753f1ed1dec | 177 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 178 | unsigned short OpCode; // 0xf900 |
okini3939 | 2:0753f1ed1dec | 179 | unsigned char VersionH; // 0 |
okini3939 | 2:0753f1ed1dec | 180 | unsigned char Version; // 14 |
okini3939 | 2:0753f1ed1dec | 181 | unsigned char Filler1; |
okini3939 | 2:0753f1ed1dec | 182 | unsigned char Filler2; |
okini3939 | 2:0753f1ed1dec | 183 | unsigned char Filler3; |
okini3939 | 2:0753f1ed1dec | 184 | unsigned char Filler4; |
okini3939 | 2:0753f1ed1dec | 185 | unsigned char ProgIp[4]; |
okini3939 | 2:0753f1ed1dec | 186 | unsigned char ProgSm[4]; |
okini3939 | 2:0753f1ed1dec | 187 | unsigned char ProgPortH; |
okini3939 | 2:0753f1ed1dec | 188 | unsigned char ProgPort; |
okini3939 | 2:0753f1ed1dec | 189 | unsigned char Status; |
okini3939 | 2:0753f1ed1dec | 190 | unsigned char Padding[7]; |
okini3939 | 2:0753f1ed1dec | 191 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 192 | |
okini3939 | 2:0753f1ed1dec | 193 | struct ArtAddress_Packet { |
okini3939 | 2:0753f1ed1dec | 194 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 195 | unsigned short OpCode; // 0x6000 |
okini3939 | 2:0753f1ed1dec | 196 | unsigned char VersionH; |
okini3939 | 2:0753f1ed1dec | 197 | unsigned char Version; |
okini3939 | 2:0753f1ed1dec | 198 | unsigned char NetSwitch; |
okini3939 | 2:0753f1ed1dec | 199 | unsigned char BindIndex; |
okini3939 | 2:0753f1ed1dec | 200 | char ShortName[18]; |
okini3939 | 2:0753f1ed1dec | 201 | char LongName[64]; |
okini3939 | 2:0753f1ed1dec | 202 | unsigned char Swin[4]; |
okini3939 | 2:0753f1ed1dec | 203 | unsigned char Swout[4]; |
okini3939 | 2:0753f1ed1dec | 204 | unsigned char SubSwitch; |
okini3939 | 2:0753f1ed1dec | 205 | unsigned char SwVideo; |
okini3939 | 2:0753f1ed1dec | 206 | unsigned char Command; |
okini3939 | 2:0753f1ed1dec | 207 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 208 | |
okini3939 | 2:0753f1ed1dec | 209 | struct ArtTodRequest_Packet { |
okini3939 | 2:0753f1ed1dec | 210 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 211 | unsigned short OpCode; // 0x8300 |
okini3939 | 2:0753f1ed1dec | 212 | unsigned char VersionH; |
okini3939 | 2:0753f1ed1dec | 213 | unsigned char Version; |
okini3939 | 2:0753f1ed1dec | 214 | unsigned char Filler1; |
okini3939 | 2:0753f1ed1dec | 215 | unsigned char Filler2; |
okini3939 | 2:0753f1ed1dec | 216 | char Spare[7]; |
okini3939 | 2:0753f1ed1dec | 217 | char Net; |
okini3939 | 2:0753f1ed1dec | 218 | char Command; |
okini3939 | 2:0753f1ed1dec | 219 | char AddCount; |
okini3939 | 2:0753f1ed1dec | 220 | char Address[32]; |
okini3939 | 0:629617d401de | 221 | } __attribute__((packed)); |
okini3939 | 0:629617d401de | 222 | |
okini3939 | 2:0753f1ed1dec | 223 | struct ArtTodData_Packet { |
okini3939 | 2:0753f1ed1dec | 224 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 225 | unsigned short OpCode; // 0x8300 |
okini3939 | 2:0753f1ed1dec | 226 | unsigned char VersionH; |
okini3939 | 2:0753f1ed1dec | 227 | unsigned char Version; |
okini3939 | 2:0753f1ed1dec | 228 | unsigned char RdmVersion; |
okini3939 | 2:0753f1ed1dec | 229 | unsigned char Port; |
okini3939 | 2:0753f1ed1dec | 230 | char Spare[6]; |
okini3939 | 2:0753f1ed1dec | 231 | char BindIndex; |
okini3939 | 2:0753f1ed1dec | 232 | char Net; |
okini3939 | 2:0753f1ed1dec | 233 | char CommandResponse; |
okini3939 | 2:0753f1ed1dec | 234 | char Address; |
okini3939 | 2:0753f1ed1dec | 235 | char UidTotalH; |
okini3939 | 2:0753f1ed1dec | 236 | char UidTotalL; |
okini3939 | 2:0753f1ed1dec | 237 | char BlockCount; |
okini3939 | 2:0753f1ed1dec | 238 | char UidCount; |
okini3939 | 2:0753f1ed1dec | 239 | char ToD[6]; |
okini3939 | 2:0753f1ed1dec | 240 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 241 | |
okini3939 | 2:0753f1ed1dec | 242 | struct ArtTodControl_Packet { |
okini3939 | 2:0753f1ed1dec | 243 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 244 | unsigned short OpCode; // 0x8300 |
okini3939 | 2:0753f1ed1dec | 245 | unsigned char VersionH; |
okini3939 | 2:0753f1ed1dec | 246 | unsigned char Version; |
okini3939 | 2:0753f1ed1dec | 247 | unsigned char Filler1; |
okini3939 | 2:0753f1ed1dec | 248 | unsigned char Filler2; |
okini3939 | 2:0753f1ed1dec | 249 | char Spare[7]; |
okini3939 | 2:0753f1ed1dec | 250 | char Net; |
okini3939 | 2:0753f1ed1dec | 251 | char Command; |
okini3939 | 2:0753f1ed1dec | 252 | char Address; |
okini3939 | 2:0753f1ed1dec | 253 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 254 | |
okini3939 | 2:0753f1ed1dec | 255 | struct ArtRdm_Packet { |
okini3939 | 2:0753f1ed1dec | 256 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 257 | unsigned short OpCode; // 0x8300 |
okini3939 | 2:0753f1ed1dec | 258 | unsigned char VersionH; |
okini3939 | 2:0753f1ed1dec | 259 | unsigned char Version; |
okini3939 | 2:0753f1ed1dec | 260 | unsigned char RdmVersion; |
okini3939 | 2:0753f1ed1dec | 261 | unsigned char Filler2; |
okini3939 | 2:0753f1ed1dec | 262 | char Spare[7]; |
okini3939 | 2:0753f1ed1dec | 263 | char Net; |
okini3939 | 2:0753f1ed1dec | 264 | char Command; |
okini3939 | 2:0753f1ed1dec | 265 | char Address; |
okini3939 | 2:0753f1ed1dec | 266 | char RdmPacket[]; |
okini3939 | 2:0753f1ed1dec | 267 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 268 | |
okini3939 | 2:0753f1ed1dec | 269 | struct ArtRdmSub_Packet { |
okini3939 | 2:0753f1ed1dec | 270 | char ID[8]; |
okini3939 | 2:0753f1ed1dec | 271 | unsigned short OpCode; // 0x8400 |
okini3939 | 2:0753f1ed1dec | 272 | unsigned char VersionH; |
okini3939 | 2:0753f1ed1dec | 273 | unsigned char Version; |
okini3939 | 2:0753f1ed1dec | 274 | unsigned char RdmVersion; |
okini3939 | 2:0753f1ed1dec | 275 | unsigned char Filler2; |
okini3939 | 2:0753f1ed1dec | 276 | char uid[6]; |
okini3939 | 2:0753f1ed1dec | 277 | char Spare1; |
okini3939 | 2:0753f1ed1dec | 278 | char CommandClass; |
okini3939 | 2:0753f1ed1dec | 279 | short ParameterId; |
okini3939 | 2:0753f1ed1dec | 280 | short SubDevice; |
okini3939 | 2:0753f1ed1dec | 281 | short SubCount; |
okini3939 | 2:0753f1ed1dec | 282 | char Spare[4]; |
okini3939 | 2:0753f1ed1dec | 283 | short data[]; |
okini3939 | 2:0753f1ed1dec | 284 | } __attribute__((packed)); |
okini3939 | 2:0753f1ed1dec | 285 | |
okini3939 | 2:0753f1ed1dec | 286 | |
okini3939 | 2:0753f1ed1dec | 287 | struct ArtPorts_Config { |
okini3939 | 2:0753f1ed1dec | 288 | unsigned char PortType[ArtMaxUniv]; |
okini3939 | 2:0753f1ed1dec | 289 | unsigned char GoodInput[ArtMaxUniv]; |
okini3939 | 2:0753f1ed1dec | 290 | unsigned char GoodOutput[ArtMaxUniv]; |
okini3939 | 2:0753f1ed1dec | 291 | unsigned char Swin[ArtMaxUniv]; |
okini3939 | 2:0753f1ed1dec | 292 | unsigned char Swout[ArtMaxUniv]; |
okini3939 | 2:0753f1ed1dec | 293 | }; |
okini3939 | 2:0753f1ed1dec | 294 | |
okini3939 | 1:c59dc374fc64 | 295 | /** DmxArtNet class |
okini3939 | 1:c59dc374fc64 | 296 | */ |
okini3939 | 0:629617d401de | 297 | class DmxArtNet { |
okini3939 | 0:629617d401de | 298 | public: |
okini3939 | 2:0753f1ed1dec | 299 | unsigned short NetSwitch; |
okini3939 | 2:0753f1ed1dec | 300 | char BindIpAddress[16]; // Local IP Address to bind onto |
okini3939 | 2:0753f1ed1dec | 301 | char BCastAddress[16]; // address to broadcast on |
okini3939 | 2:0753f1ed1dec | 302 | char SubNetMask[16], DGateWay[16]; |
okini3939 | 2:0753f1ed1dec | 303 | int UdpPort, OemId; |
okini3939 | 2:0753f1ed1dec | 304 | |
okini3939 | 2:0753f1ed1dec | 305 | DmxArtNet (); |
okini3939 | 0:629617d401de | 306 | |
okini3939 | 0:629617d401de | 307 | /** create network socket, setup for NetworkWork |
okini3939 | 0:629617d401de | 308 | * @return true if socket creation succeded |
okini3939 | 0:629617d401de | 309 | */ |
okini3939 | 0:629617d401de | 310 | int Init(); |
okini3939 | 0:629617d401de | 311 | |
okini3939 | 0:629617d401de | 312 | /** socket shutdown |
okini3939 | 0:629617d401de | 313 | */ |
okini3939 | 0:629617d401de | 314 | void Done(); |
okini3939 | 0:629617d401de | 315 | |
okini3939 | 0:629617d401de | 316 | /** last error |
okini3939 | 0:629617d401de | 317 | * @retval 0 ok |
okini3939 | 0:629617d401de | 318 | */ |
okini3939 | 0:629617d401de | 319 | int LastError() { |
okini3939 | 0:629617d401de | 320 | return LError; |
okini3939 | 0:629617d401de | 321 | } |
okini3939 | 0:629617d401de | 322 | /** returns descrip of last error |
okini3939 | 0:629617d401de | 323 | * @return descrip of last error |
okini3939 | 0:629617d401de | 324 | */ |
okini3939 | 0:629617d401de | 325 | char *LastErrorString() { |
okini3939 | 0:629617d401de | 326 | return LErrorString; |
okini3939 | 0:629617d401de | 327 | } |
okini3939 | 0:629617d401de | 328 | /** clear error |
okini3939 | 0:629617d401de | 329 | */ |
okini3939 | 0:629617d401de | 330 | void ClearError(); |
okini3939 | 0:629617d401de | 331 | |
okini3939 | 0:629617d401de | 332 | /** Send |
okini3939 | 0:629617d401de | 333 | * send an array [0..511] of (length) bytes representing the dmx you want to send to |
okini3939 | 0:629617d401de | 334 | * univ[0..15] , physical is info only, can be the universe number or port of device |
okini3939 | 0:629617d401de | 335 | */ |
okini3939 | 0:629617d401de | 336 | int Send_ArtDmx(int univ, int physical, char *data, int length); |
okini3939 | 0:629617d401de | 337 | /** execute often |
okini3939 | 0:629617d401de | 338 | * returns true if something happened |
okini3939 | 0:629617d401de | 339 | * @return 1 something happened |
okini3939 | 0:629617d401de | 340 | */ |
okini3939 | 0:629617d401de | 341 | int Work(); |
okini3939 | 2:0753f1ed1dec | 342 | /* |
okini3939 | 2:0753f1ed1dec | 343 | void WorkAddress (ArtAddress_Packet *address); |
okini3939 | 2:0753f1ed1dec | 344 | void WorkIpProg (ArtIpProg_Packet *ipprog); |
okini3939 | 2:0753f1ed1dec | 345 | */ |
okini3939 | 0:629617d401de | 346 | unsigned char *DmxIn[ArtMaxUniv]; // Recieved ArtDMX, 16 Dmx Arrays |
okini3939 | 2:0753f1ed1dec | 347 | volatile int LastRecievedUniverse; // the number of the last recieved universe |
okini3939 | 0:629617d401de | 348 | |
okini3939 | 0:629617d401de | 349 | struct ArtPollReply_Packet ArtPollReply; // a response to ArtPoll |
okini3939 | 0:629617d401de | 350 | // contains many variables you may set |
okini3939 | 2:0753f1ed1dec | 351 | struct ArtPorts_Config ArtPorts; |
okini3939 | 0:629617d401de | 352 | |
okini3939 | 0:629617d401de | 353 | void InitArtPollReplyDefaults(); |
okini3939 | 0:629617d401de | 354 | int SendArtPollReply(); |
okini3939 | 2:0753f1ed1dec | 355 | int SendArtIpProgReply(); |
okini3939 | 2:0753f1ed1dec | 356 | int SendArtTodData (int n); |
okini3939 | 2:0753f1ed1dec | 357 | |
okini3939 | 2:0753f1ed1dec | 358 | void attach (void (*handler)(struct ArtPacketHeader *, int)); |
okini3939 | 2:0753f1ed1dec | 359 | |
okini3939 | 2:0753f1ed1dec | 360 | void bcast(char *dest, char *ipaddr, char *netmask); |
okini3939 | 0:629617d401de | 361 | |
okini3939 | 0:629617d401de | 362 | private: |
okini3939 | 0:629617d401de | 363 | UDPSocket _art; // the network socket |
okini3939 | 0:629617d401de | 364 | struct ArtPacketHeader ArtHead; // packet header |
okini3939 | 0:629617d401de | 365 | struct ArtDMX_Packet ArtDMX; // an Art-Net DMX Packet |
okini3939 | 0:629617d401de | 366 | struct ArtPoll_Packet ArtPoll; // an Art-Poll Packet |
okini3939 | 0:629617d401de | 367 | unsigned char buf[SizeRecvBuffer]; // a temp buffer |
okini3939 | 0:629617d401de | 368 | struct ArtAddr localaddr; |
okini3939 | 0:629617d401de | 369 | int LError; |
okini3939 | 2:0753f1ed1dec | 370 | char LErrorString[40]; |
okini3939 | 0:629617d401de | 371 | |
okini3939 | 0:629617d401de | 372 | int makeword16 (int lsb, int msb); |
okini3939 | 0:629617d401de | 373 | |
okini3939 | 0:629617d401de | 374 | void Init_ArtDMX(); |
okini3939 | 0:629617d401de | 375 | void SocketErrorOccured(char *proc); |
okini3939 | 0:629617d401de | 376 | |
okini3939 | 2:0753f1ed1dec | 377 | static void task_UDPSocket (void const *arg); |
okini3939 | 2:0753f1ed1dec | 378 | void on_UDPSocketEvent (); |
okini3939 | 2:0753f1ed1dec | 379 | |
okini3939 | 2:0753f1ed1dec | 380 | void (*cb_ArtParser)(struct ArtPacketHeader *art, int len); |
okini3939 | 0:629617d401de | 381 | |
okini3939 | 2:0753f1ed1dec | 382 | Endpoint RemoteSin; |
okini3939 | 0:629617d401de | 383 | volatile int rxlen; |
okini3939 | 2:0753f1ed1dec | 384 | Thread *thread; |
okini3939 | 0:629617d401de | 385 | }; |
okini3939 | 2:0753f1ed1dec | 386 | #endif |