DMX512, RDM send/recv library http://mbed.org/users/okini3939/notebook/dmx512
Dependents: dmx_test ArtNodeLED SPK-DVIMXR SPK-DMXer ... more
DMX512 send/recv library
DMX512 is protocol for lighting.
調光プロトコル DMX512 を送受信するライブラリです。
see: http://mbed.org/users/okini3939/notebook/dmx512/
LPC1114 support is thanks to Stanly Chen
DMX.h
- Committer:
- okini3939
- Date:
- 2017-10-20
- Revision:
- 19:ae8fd2ba7c53
- Parent:
- 18:69d65ca92bcc
File content as of revision 19:ae8fd2ba7c53:
/* * DMX512, RDM send/recv library * Copyright (c) 2017 Hiroshi Suga * Released under the MIT License: http://mbed.org/license/mit */ /** @file * @brief DMX512 send/recv */ #ifndef __DMX_H__ #define __DMX_H__ #define RDM_ENABLE #include "mbed.h" #include "RawSerial.h" #ifdef RDM_ENABLE #include "RDM.h" #endif //#define DMX_UART_DIRECT #define DMX_SIZE 512 #define DMX_START_CODE 0 #define RDM_START_CODE E120_SC_RDM #define RDM_SUB_CODE E120_SC_SUB_MESSAGE #define XMIT_TX 1 #define XMIT_RX 0 #define DMX_TIME_BREAK 100 // 100us (88us-1s) #define DMX_TIME_MAB 12 // 12us (8us-1s) #define DMX_TIME_MBB 200 // 10us (0-1s) #define RDM_TIME_DELAY 100 enum DMX_MODE { DMX_MODE_BEGIN, DMX_MODE_START, DMX_MODE_BREAK, DMX_MODE_MAB, DMX_MODE_DATA, DMX_MODE_ERROR, DMX_MODE_STOP, DMX_MODE_RDMSUB, DMX_MODE_RDM, }; #ifdef RDM_ENABLE struct RDM_DATA { // uint8_t StartCode; uint8_t SubStartCode; uint8_t Length; uint8_t DestID[6]; uint8_t SourceID[6]; uint8_t TransactionNo; uint8_t ResponseType; uint8_t MessageCount; uint16_t SubDev; uint8_t CmdClass; uint16_t Parameter; uint8_t DataLength; uint8_t Data[231]; } __attribute__((packed)); #endif /** DMX512 class (sender/client) */ class DMX { public: /** init DMX class * @param p_tx TX serial port (p9, p13, p28) * @param p_rx RX serial port (p10, p14, p27) * @param p_re data enable/~receive enable */ DMX (PinName p_tx, PinName p_rx, PinName p_xmit = NC); /** Send the data * @param addr DMX data address (0-511) * @param data DMX data (0-255) */ void put (int addr, int data); /** Send the data * @param buf DMX data buffer * @param addr DMX data address * @param len data length */ void put (unsigned char *buf, int addr = 0, int len = DMX_SIZE); /** Send the data * @param addr DMX data address (0-511) * @return DMX data (0-255) */ int get (int addr); /** Send the data * @param buf DMX data buffer * @param addr DMX data address * @param len data length */ void get (unsigned char *buf, int addr = 0, int len = DMX_SIZE); /** Start DMX send operation */ void start (); /** Stop DMX send operation */ void stop (); /** Clear DMX data */ void clear (); int isReceived (); int isSent (); unsigned char *getRxBuffer (); unsigned char *getTxBuffer (); int setTimingParameters (int breaktime, int mab, int mbb); #ifdef RDM_ENABLE void pollRdm (); int sendRdmMsg (struct RDM_DATA *rdm, int CmdClass, unsigned char *data, int len); int sendRdmMsg (unsigned char *dest, int CmdClass, int Parameter, int Type, unsigned char *data, int len, int block = 0); void attachRdmCallback (void (*handler)(struct RDM_DATA *), char *uid); int sendRdmDiscMute (unsigned char *dest, int mute); int rdmDiscovery (unsigned char *buf, int size); #endif protected: void int_timer (); void int_tx (); void int_rx (); // Serial _dmx; RawSerial _dmx; DigitalOut *_xmit; Timeout timeout01; volatile DMX_MODE mode_tx, mode_rx; volatile int addr_tx, addr_rx; unsigned char data_tx[DMX_SIZE]; unsigned char data_rx[DMX_SIZE]; volatile int is_received, is_sent, is_rdm_received; int time_break, time_mab, time_mbb; #ifdef RDM_ENABLE volatile int mode_rdm; unsigned char rdm_uid[6]; int rdm_mute, rdm_msgcount, rdm_transno; unsigned char data_rdm[64]; unsigned char found_uid[6]; unsigned char *buf_uid; int buf_uid_count, buf_uid_size; int calcCrc (unsigned char *buf, int len, int offset = RDM_START_CODE); void rdmStart (int block = 0); void rdmWaitResponse (int ms); int sendRdmDiscResponse (struct RDM_DATA *rdm); int sendRdmDiscMuteResponse (struct RDM_DATA *rdm); void int_rdm (); int sendRdmDiscovery (uint64_t uid_begin, uint64_t uid_end); int rdmDiscoverySub (uint64_t uid_begin, uint64_t uid_end, int ttl); void (*cb_RdmParser)(struct RDM_DATA *rdm); #endif private: #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088) LPC_UART_TypeDef *_uart; #elif defined(TARGET_LPC11UXX) LPC_USART_Type *_uart; #elif defined(TARGET_LPC11XX) LPC_UART_TypeDef *_uart; #else #error "this CPU not supported." #endif }; #endif