DMX512, RDM send/recv library http://mbed.org/users/okini3939/notebook/dmx512

Dependents:   dmx_test ArtNodeLED SPK-DVIMXR SPK-DMXer ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DMX.h Source File

DMX.h

Go to the documentation of this file.
00001 /*
00002  * DMX512, RDM send/recv library
00003  * Copyright (c) 2017 Hiroshi Suga
00004  * Released under the MIT License: http://mbed.org/license/mit
00005  */
00006 
00007 /** @file
00008  * @brief DMX512 send/recv
00009  */
00010  
00011 #ifndef __DMX_H__
00012 #define __DMX_H__
00013 
00014 #define RDM_ENABLE
00015 
00016 #include "mbed.h"
00017 #include "RawSerial.h"
00018 
00019 #ifdef RDM_ENABLE
00020 #include "RDM.h"
00021 #endif
00022 
00023 //#define DMX_UART_DIRECT
00024 
00025 #define DMX_SIZE        512
00026 #define DMX_START_CODE  0
00027 
00028 #define RDM_START_CODE  E120_SC_RDM
00029 #define RDM_SUB_CODE    E120_SC_SUB_MESSAGE
00030 #define XMIT_TX         1
00031 #define XMIT_RX         0
00032 
00033 #define DMX_TIME_BREAK  100 // 100us (88us-1s)
00034 #define DMX_TIME_MAB    12 // 12us (8us-1s)
00035 #define DMX_TIME_MBB    200 // 10us (0-1s)
00036 #define RDM_TIME_DELAY  100
00037 
00038 enum DMX_MODE {
00039     DMX_MODE_BEGIN,
00040     DMX_MODE_START,
00041     DMX_MODE_BREAK,
00042     DMX_MODE_MAB,
00043     DMX_MODE_DATA,
00044     DMX_MODE_ERROR,
00045     DMX_MODE_STOP,
00046     DMX_MODE_RDMSUB,
00047     DMX_MODE_RDM,
00048 };
00049 
00050 #ifdef RDM_ENABLE
00051 struct RDM_DATA {
00052 //    uint8_t StartCode;
00053     uint8_t SubStartCode;
00054     uint8_t Length;
00055     uint8_t DestID[6];
00056     uint8_t SourceID[6];
00057     uint8_t TransactionNo;
00058     uint8_t ResponseType;
00059     uint8_t MessageCount;
00060     uint16_t SubDev;
00061     uint8_t CmdClass;
00062     uint16_t Parameter;
00063     uint8_t DataLength;
00064     uint8_t Data[231];
00065 } __attribute__((packed));
00066 #endif
00067 
00068 /** DMX512 class (sender/client)
00069  */
00070 class DMX {
00071 public:
00072     /** init DMX class
00073      * @param p_tx TX serial port (p9, p13, p28)
00074      * @param p_rx RX serial port (p10, p14, p27)
00075      * @param p_re data enable/~receive enable
00076      */
00077     DMX (PinName p_tx, PinName p_rx, PinName p_xmit = NC); 
00078 
00079     /** Send the data
00080      * @param addr DMX data address (0-511)
00081      * @param data DMX data (0-255)
00082      */
00083     void put (int addr, int data);
00084     /** Send the data
00085      * @param buf DMX data buffer
00086      * @param addr DMX data address
00087      * @param len data length
00088      */
00089     void put (unsigned char *buf, int addr = 0, int len = DMX_SIZE);
00090 
00091     /** Send the data
00092      * @param addr DMX data address (0-511)
00093      * @return DMX data (0-255)
00094      */
00095     int get (int addr);
00096     /** Send the data
00097      * @param buf DMX data buffer
00098      * @param addr DMX data address
00099      * @param len data length
00100      */
00101     void get (unsigned char *buf, int addr = 0, int len = DMX_SIZE);
00102 
00103     /** Start DMX send operation
00104      */
00105     void start ();
00106     /** Stop DMX send operation
00107      */
00108     void stop ();
00109     /** Clear DMX data
00110      */
00111     void clear ();
00112 
00113     int isReceived ();
00114     int isSent ();
00115     unsigned char *getRxBuffer ();
00116     unsigned char *getTxBuffer ();
00117     int setTimingParameters (int breaktime, int mab, int mbb);
00118 
00119 #ifdef RDM_ENABLE
00120     void pollRdm ();
00121     int sendRdmMsg (struct RDM_DATA *rdm, int CmdClass, unsigned char *data, int len);
00122     int sendRdmMsg (unsigned char *dest, int CmdClass, int Parameter, int Type, unsigned char *data, int len, int block = 0);
00123     void attachRdmCallback (void (*handler)(struct RDM_DATA *), char *uid);
00124 
00125     int sendRdmDiscMute (unsigned char *dest, int mute);
00126     int rdmDiscovery (unsigned char *buf, int size);
00127 #endif
00128 
00129 protected:
00130 
00131     void int_timer ();
00132     void int_tx ();
00133     void int_rx ();
00134 
00135 //    Serial _dmx;
00136     RawSerial _dmx;
00137     DigitalOut *_xmit;
00138     Timeout timeout01;
00139     volatile DMX_MODE mode_tx, mode_rx;
00140     volatile int addr_tx, addr_rx;
00141     unsigned char data_tx[DMX_SIZE];
00142     unsigned char data_rx[DMX_SIZE];
00143     volatile int is_received, is_sent, is_rdm_received;
00144     int time_break, time_mab, time_mbb;
00145 
00146 #ifdef RDM_ENABLE
00147     volatile int mode_rdm;
00148     unsigned char rdm_uid[6];
00149     int rdm_mute, rdm_msgcount, rdm_transno;
00150     unsigned char data_rdm[64];
00151     unsigned char found_uid[6];
00152     unsigned char *buf_uid;
00153     int buf_uid_count, buf_uid_size;
00154 
00155     int calcCrc (unsigned char *buf, int len, int offset = RDM_START_CODE);
00156     void rdmStart (int block = 0);
00157     void rdmWaitResponse (int ms);
00158     int sendRdmDiscResponse (struct RDM_DATA *rdm);
00159     int sendRdmDiscMuteResponse (struct RDM_DATA *rdm);
00160 
00161     void int_rdm ();
00162     int sendRdmDiscovery (uint64_t uid_begin, uint64_t uid_end);
00163     int rdmDiscoverySub (uint64_t uid_begin, uint64_t uid_end, int ttl);
00164 
00165     void (*cb_RdmParser)(struct RDM_DATA *rdm);
00166 #endif
00167 
00168 private:
00169 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088)
00170     LPC_UART_TypeDef *_uart;
00171 #elif defined(TARGET_LPC11UXX)
00172     LPC_USART_Type *_uart;
00173 #elif defined(TARGET_LPC11XX)
00174     LPC_UART_TypeDef *_uart;
00175 #else
00176 #error "this CPU not supported."
00177 #endif
00178 
00179 };
00180 
00181 #endif