DMX512, RDM send/recv library http://mbed.org/users/okini3939/notebook/dmx512
Dependents: dmx_test ArtNodeLED SPK-DVIMXR SPK-DMXer ... more
DMX.h
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
Generated on Sat Jul 16 2022 01:56:41 by 1.7.2