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

Committer:
okini3939
Date:
Fri Oct 20 00:44:06 2017 +0000
Revision:
19:ae8fd2ba7c53
Parent:
18:69d65ca92bcc
supported RDM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:cbff6bf41542 1 /*
okini3939 19:ae8fd2ba7c53 2 * DMX512, RDM send/recv library
okini3939 19:ae8fd2ba7c53 3 * Copyright (c) 2017 Hiroshi Suga
okini3939 0:cbff6bf41542 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:cbff6bf41542 5 */
okini3939 0:cbff6bf41542 6
okini3939 7:16d6874076dd 7 /** @file
okini3939 0:cbff6bf41542 8 * @brief DMX512 send/recv
okini3939 0:cbff6bf41542 9 */
okini3939 0:cbff6bf41542 10
okini3939 19:ae8fd2ba7c53 11 #ifndef __DMX_H__
okini3939 19:ae8fd2ba7c53 12 #define __DMX_H__
okini3939 19:ae8fd2ba7c53 13
okini3939 19:ae8fd2ba7c53 14 #define RDM_ENABLE
okini3939 0:cbff6bf41542 15
okini3939 0:cbff6bf41542 16 #include "mbed.h"
okini3939 14:cef8749fd54d 17 #include "RawSerial.h"
okini3939 0:cbff6bf41542 18
okini3939 19:ae8fd2ba7c53 19 #ifdef RDM_ENABLE
okini3939 19:ae8fd2ba7c53 20 #include "RDM.h"
okini3939 19:ae8fd2ba7c53 21 #endif
okini3939 19:ae8fd2ba7c53 22
okini3939 18:69d65ca92bcc 23 //#define DMX_UART_DIRECT
okini3939 0:cbff6bf41542 24
okini3939 18:69d65ca92bcc 25 #define DMX_SIZE 512
okini3939 18:69d65ca92bcc 26 #define DMX_START_CODE 0
okini3939 18:69d65ca92bcc 27
okini3939 19:ae8fd2ba7c53 28 #define RDM_START_CODE E120_SC_RDM
okini3939 19:ae8fd2ba7c53 29 #define RDM_SUB_CODE E120_SC_SUB_MESSAGE
okini3939 19:ae8fd2ba7c53 30 #define XMIT_TX 1
okini3939 19:ae8fd2ba7c53 31 #define XMIT_RX 0
okini3939 19:ae8fd2ba7c53 32
okini3939 18:69d65ca92bcc 33 #define DMX_TIME_BREAK 100 // 100us (88us-1s)
okini3939 18:69d65ca92bcc 34 #define DMX_TIME_MAB 12 // 12us (8us-1s)
okini3939 18:69d65ca92bcc 35 #define DMX_TIME_MBB 200 // 10us (0-1s)
okini3939 19:ae8fd2ba7c53 36 #define RDM_TIME_DELAY 100
okini3939 0:cbff6bf41542 37
okini3939 0:cbff6bf41542 38 enum DMX_MODE {
okini3939 0:cbff6bf41542 39 DMX_MODE_BEGIN,
okini3939 0:cbff6bf41542 40 DMX_MODE_START,
okini3939 0:cbff6bf41542 41 DMX_MODE_BREAK,
okini3939 0:cbff6bf41542 42 DMX_MODE_MAB,
okini3939 0:cbff6bf41542 43 DMX_MODE_DATA,
okini3939 0:cbff6bf41542 44 DMX_MODE_ERROR,
okini3939 4:dd0544c80096 45 DMX_MODE_STOP,
okini3939 19:ae8fd2ba7c53 46 DMX_MODE_RDMSUB,
okini3939 19:ae8fd2ba7c53 47 DMX_MODE_RDM,
okini3939 0:cbff6bf41542 48 };
okini3939 0:cbff6bf41542 49
okini3939 19:ae8fd2ba7c53 50 #ifdef RDM_ENABLE
okini3939 19:ae8fd2ba7c53 51 struct RDM_DATA {
okini3939 19:ae8fd2ba7c53 52 // uint8_t StartCode;
okini3939 19:ae8fd2ba7c53 53 uint8_t SubStartCode;
okini3939 19:ae8fd2ba7c53 54 uint8_t Length;
okini3939 19:ae8fd2ba7c53 55 uint8_t DestID[6];
okini3939 19:ae8fd2ba7c53 56 uint8_t SourceID[6];
okini3939 19:ae8fd2ba7c53 57 uint8_t TransactionNo;
okini3939 19:ae8fd2ba7c53 58 uint8_t ResponseType;
okini3939 19:ae8fd2ba7c53 59 uint8_t MessageCount;
okini3939 19:ae8fd2ba7c53 60 uint16_t SubDev;
okini3939 19:ae8fd2ba7c53 61 uint8_t CmdClass;
okini3939 19:ae8fd2ba7c53 62 uint16_t Parameter;
okini3939 19:ae8fd2ba7c53 63 uint8_t DataLength;
okini3939 19:ae8fd2ba7c53 64 uint8_t Data[231];
okini3939 19:ae8fd2ba7c53 65 } __attribute__((packed));
okini3939 19:ae8fd2ba7c53 66 #endif
okini3939 19:ae8fd2ba7c53 67
okini3939 0:cbff6bf41542 68 /** DMX512 class (sender/client)
okini3939 0:cbff6bf41542 69 */
okini3939 0:cbff6bf41542 70 class DMX {
okini3939 0:cbff6bf41542 71 public:
okini3939 0:cbff6bf41542 72 /** init DMX class
okini3939 0:cbff6bf41542 73 * @param p_tx TX serial port (p9, p13, p28)
okini3939 0:cbff6bf41542 74 * @param p_rx RX serial port (p10, p14, p27)
okini3939 19:ae8fd2ba7c53 75 * @param p_re data enable/~receive enable
okini3939 0:cbff6bf41542 76 */
okini3939 19:ae8fd2ba7c53 77 DMX (PinName p_tx, PinName p_rx, PinName p_xmit = NC);
okini3939 0:cbff6bf41542 78
okini3939 6:9e7b4eeac6ec 79 /** Send the data
okini3939 6:9e7b4eeac6ec 80 * @param addr DMX data address (0-511)
okini3939 0:cbff6bf41542 81 * @param data DMX data (0-255)
okini3939 0:cbff6bf41542 82 */
okini3939 6:9e7b4eeac6ec 83 void put (int addr, int data);
okini3939 6:9e7b4eeac6ec 84 /** Send the data
okini3939 6:9e7b4eeac6ec 85 * @param buf DMX data buffer
okini3939 6:9e7b4eeac6ec 86 * @param addr DMX data address
okini3939 6:9e7b4eeac6ec 87 * @param len data length
okini3939 6:9e7b4eeac6ec 88 */
okini3939 6:9e7b4eeac6ec 89 void put (unsigned char *buf, int addr = 0, int len = DMX_SIZE);
okini3939 0:cbff6bf41542 90
okini3939 6:9e7b4eeac6ec 91 /** Send the data
okini3939 7:16d6874076dd 92 * @param addr DMX data address (0-511)
okini3939 0:cbff6bf41542 93 * @return DMX data (0-255)
okini3939 0:cbff6bf41542 94 */
okini3939 6:9e7b4eeac6ec 95 int get (int addr);
okini3939 6:9e7b4eeac6ec 96 /** Send the data
okini3939 6:9e7b4eeac6ec 97 * @param buf DMX data buffer
okini3939 6:9e7b4eeac6ec 98 * @param addr DMX data address
okini3939 6:9e7b4eeac6ec 99 * @param len data length
okini3939 6:9e7b4eeac6ec 100 */
okini3939 6:9e7b4eeac6ec 101 void get (unsigned char *buf, int addr = 0, int len = DMX_SIZE);
okini3939 0:cbff6bf41542 102
okini3939 6:9e7b4eeac6ec 103 /** Start DMX send operation
okini3939 4:dd0544c80096 104 */
okini3939 4:dd0544c80096 105 void start ();
okini3939 6:9e7b4eeac6ec 106 /** Stop DMX send operation
okini3939 4:dd0544c80096 107 */
okini3939 4:dd0544c80096 108 void stop ();
okini3939 12:1f176eee2d28 109 /** Clear DMX data
okini3939 12:1f176eee2d28 110 */
okini3939 12:1f176eee2d28 111 void clear ();
okini3939 3:2eb66b4d99bd 112
okini3939 18:69d65ca92bcc 113 int isReceived ();
okini3939 17:c9198630ba05 114 int isSent ();
okini3939 17:c9198630ba05 115 unsigned char *getRxBuffer ();
okini3939 17:c9198630ba05 116 unsigned char *getTxBuffer ();
okini3939 18:69d65ca92bcc 117 int setTimingParameters (int breaktime, int mab, int mbb);
okini3939 0:cbff6bf41542 118
okini3939 19:ae8fd2ba7c53 119 #ifdef RDM_ENABLE
okini3939 19:ae8fd2ba7c53 120 void pollRdm ();
okini3939 19:ae8fd2ba7c53 121 int sendRdmMsg (struct RDM_DATA *rdm, int CmdClass, unsigned char *data, int len);
okini3939 19:ae8fd2ba7c53 122 int sendRdmMsg (unsigned char *dest, int CmdClass, int Parameter, int Type, unsigned char *data, int len, int block = 0);
okini3939 19:ae8fd2ba7c53 123 void attachRdmCallback (void (*handler)(struct RDM_DATA *), char *uid);
okini3939 19:ae8fd2ba7c53 124
okini3939 19:ae8fd2ba7c53 125 int sendRdmDiscMute (unsigned char *dest, int mute);
okini3939 19:ae8fd2ba7c53 126 int rdmDiscovery (unsigned char *buf, int size);
okini3939 19:ae8fd2ba7c53 127 #endif
okini3939 19:ae8fd2ba7c53 128
okini3939 0:cbff6bf41542 129 protected:
okini3939 0:cbff6bf41542 130
okini3939 0:cbff6bf41542 131 void int_timer ();
okini3939 0:cbff6bf41542 132 void int_tx ();
okini3939 0:cbff6bf41542 133 void int_rx ();
okini3939 0:cbff6bf41542 134
okini3939 14:cef8749fd54d 135 // Serial _dmx;
okini3939 13:9841af9ac344 136 RawSerial _dmx;
okini3939 19:ae8fd2ba7c53 137 DigitalOut *_xmit;
okini3939 0:cbff6bf41542 138 Timeout timeout01;
okini3939 6:9e7b4eeac6ec 139 volatile DMX_MODE mode_tx, mode_rx;
okini3939 6:9e7b4eeac6ec 140 volatile int addr_tx, addr_rx;
okini3939 6:9e7b4eeac6ec 141 unsigned char data_tx[DMX_SIZE];
okini3939 6:9e7b4eeac6ec 142 unsigned char data_rx[DMX_SIZE];
okini3939 19:ae8fd2ba7c53 143 volatile int is_received, is_sent, is_rdm_received;
okini3939 18:69d65ca92bcc 144 int time_break, time_mab, time_mbb;
okini3939 6:9e7b4eeac6ec 145
okini3939 19:ae8fd2ba7c53 146 #ifdef RDM_ENABLE
okini3939 19:ae8fd2ba7c53 147 volatile int mode_rdm;
okini3939 19:ae8fd2ba7c53 148 unsigned char rdm_uid[6];
okini3939 19:ae8fd2ba7c53 149 int rdm_mute, rdm_msgcount, rdm_transno;
okini3939 19:ae8fd2ba7c53 150 unsigned char data_rdm[64];
okini3939 19:ae8fd2ba7c53 151 unsigned char found_uid[6];
okini3939 19:ae8fd2ba7c53 152 unsigned char *buf_uid;
okini3939 19:ae8fd2ba7c53 153 int buf_uid_count, buf_uid_size;
okini3939 19:ae8fd2ba7c53 154
okini3939 19:ae8fd2ba7c53 155 int calcCrc (unsigned char *buf, int len, int offset = RDM_START_CODE);
okini3939 19:ae8fd2ba7c53 156 void rdmStart (int block = 0);
okini3939 19:ae8fd2ba7c53 157 void rdmWaitResponse (int ms);
okini3939 19:ae8fd2ba7c53 158 int sendRdmDiscResponse (struct RDM_DATA *rdm);
okini3939 19:ae8fd2ba7c53 159 int sendRdmDiscMuteResponse (struct RDM_DATA *rdm);
okini3939 19:ae8fd2ba7c53 160
okini3939 19:ae8fd2ba7c53 161 void int_rdm ();
okini3939 19:ae8fd2ba7c53 162 int sendRdmDiscovery (uint64_t uid_begin, uint64_t uid_end);
okini3939 19:ae8fd2ba7c53 163 int rdmDiscoverySub (uint64_t uid_begin, uint64_t uid_end, int ttl);
okini3939 19:ae8fd2ba7c53 164
okini3939 19:ae8fd2ba7c53 165 void (*cb_RdmParser)(struct RDM_DATA *rdm);
okini3939 19:ae8fd2ba7c53 166 #endif
okini3939 19:ae8fd2ba7c53 167
okini3939 6:9e7b4eeac6ec 168 private:
okini3939 13:9841af9ac344 169 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) || defined(TARGET_LPC4088)
okini3939 8:d4a45bba41d2 170 LPC_UART_TypeDef *_uart;
okini3939 15:4ea4a31c7609 171 #elif defined(TARGET_LPC11UXX)
okini3939 8:d4a45bba41d2 172 LPC_USART_Type *_uart;
stanly88 10:b748aab8404c 173 #elif defined(TARGET_LPC11XX)
stanly88 10:b748aab8404c 174 LPC_UART_TypeDef *_uart;
okini3939 13:9841af9ac344 175 #else
okini3939 13:9841af9ac344 176 #error "this CPU not supported."
okini3939 5:72039cd4c874 177 #endif
okini3939 0:cbff6bf41542 178
okini3939 0:cbff6bf41542 179 };
okini3939 0:cbff6bf41542 180
okini3939 0:cbff6bf41542 181 #endif