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

Revision:
19:ae8fd2ba7c53
Parent:
18:69d65ca92bcc
--- 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;