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

Dependents:   ArtNode ArtNode DMXStation ArtNodeLED ... more

Revision:
0:629617d401de
Child:
1:c59dc374fc64
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DmxArtNet.h	Thu Sep 29 15:46:43 2011 +0000
@@ -0,0 +1,189 @@
+/*
+ * 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
+ */
+
+/** @file
+ */
+
+#include "mbed.h"
+#include "EthernetNetIf.h"
+#include "UDPSocket.h"
+
+//#define ArtMaxUniv 16 // Universe
+#define ArtMaxUniv 4 // Universe
+
+//#define SizeRecvBuffer (530*4)
+#define SizeRecvBuffer 700
+
+// 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 StyleNode 0
+#define StyleServer 1
+
+#define STR_LongName "MbedArtNode - By Suga (2011), Rowan Maclachlan (2005)"
+#define STR_ShortName "MbedArtNode"
+
+
+// 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[512]; // data segment
+} __attribute__((packed));
+
+struct ArtPoll_Packet {
+     char ID[8];
+     unsigned short OpCode; // 0x5000
+     unsigned char VersionH; // 0
+     unsigned char Version; // 14
+     unsigned char TalkToMe; // 0
+} __attribute__((packed));
+
+// a responce to a artpoll packet
+struct ArtPollReply_Packet {
+     char ID[8];
+     unsigned short OpCode; // 0x2000
+     struct ArtAddr Addr; // our ip address
+     unsigned char VersionH;
+     unsigned char Version;
+     unsigned char SubSwitchH;
+     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 Padding[32]; // padding
+} __attribute__((packed));
+
+
+class DmxArtNet {
+public:
+    IpAddr BindIpAddress; // Local IP Address to bind onto
+    IpAddr BCastAddress; // address to broadcast on
+
+    /** 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();
+
+    /** 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
+     */
+    int Send_ArtDmx(int univ, int physical, char *data, int length);
+    /** execute often
+     * returns true if something happened
+     * @return 1 something happened
+     */
+    int Work();
+
+    unsigned char *DmxIn[ArtMaxUniv]; // Recieved ArtDMX, 16 Dmx Arrays
+    int LastRecievedUniverse; // the number of the last recieved universe
+
+    struct ArtPollReply_Packet ArtPollReply; // a response to ArtPoll
+                                      // contains many variables you may set
+
+    void InitArtPollReplyDefaults();
+    int SendArtPollReply();
+
+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[80];
+
+    int makeword16 (int lsb, int msb);
+
+    void Init_ArtDMX();
+    void SocketErrorOccured(char *proc);
+
+    void on_UDPSocketEvent (UDPSocketEvent e);
+
+    int net_loopback; // if true, then listen to our own packets
+                      // is crap and does not work
+    Host RemoteSin;
+    volatile int rxlen;
+};