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

Dependents:   ArtNode ArtNode DMXStation ArtNodeLED ... more

DmxArtNet.h

Committer:
okini3939
Date:
2011-09-29
Revision:
1:c59dc374fc64
Parent:
0:629617d401de
Child:
2:0753f1ed1dec

File content as of revision 1:c59dc374fc64:

/*
 * 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));

/** DmxArtNet class
 */
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;
};