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
Diff: DMX.h
- Revision:
- 19:ae8fd2ba7c53
- Parent:
- 18:69d65ca92bcc
diff -r 69d65ca92bcc -r ae8fd2ba7c53 DMX.h --- a/DMX.h Mon Jan 11 06:17:04 2016 +0000 +++ b/DMX.h Fri Oct 20 00:44:06 2017 +0000 @@ -1,6 +1,6 @@ /* - * DMX512 send/recv library - * Copyright (c) 2013 Hiroshi Suga + * DMX512, RDM send/recv library + * Copyright (c) 2017 Hiroshi Suga * Released under the MIT License: http://mbed.org/license/mit */ @@ -8,20 +8,32 @@ * @brief DMX512 send/recv */ -#ifndef DMX_H -#define DMX_H +#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, @@ -31,8 +43,28 @@ 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 { @@ -40,8 +72,9 @@ /** 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); + DMX (PinName p_tx, PinName p_rx, PinName p_xmit = NC); /** Send the data * @param addr DMX data address (0-511) @@ -83,6 +116,16 @@ 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 (); @@ -91,14 +134,37 @@ // 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]; - int is_received, is_sent; + 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;