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:
Mon Jan 11 06:17:04 2016 +0000
Revision:
18:69d65ca92bcc
Parent:
17:c9198630ba05
Child:
19:ae8fd2ba7c53
fix isReceived, isSent

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:cbff6bf41542 1 /*
okini3939 0:cbff6bf41542 2 * DMX512 send/recv library
okini3939 6:9e7b4eeac6ec 3 * Copyright (c) 2013 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 0:cbff6bf41542 11 #include "mbed.h"
okini3939 0:cbff6bf41542 12 #include "DMX.h"
okini3939 0:cbff6bf41542 13
okini3939 5:72039cd4c874 14 DMX::DMX (PinName p_tx, PinName p_rx) : _dmx(p_tx, p_rx) {
okini3939 0:cbff6bf41542 15
okini3939 12:1f176eee2d28 16 clear();
okini3939 4:dd0544c80096 17 // mode_tx = DMX_MODE_BEGIN;
okini3939 4:dd0544c80096 18 mode_tx = DMX_MODE_STOP;
okini3939 0:cbff6bf41542 19 mode_rx = DMX_MODE_BEGIN;
okini3939 18:69d65ca92bcc 20 is_received = 0;
okini3939 18:69d65ca92bcc 21 is_sent = 0;
okini3939 16:4eeb749806e5 22 memset(data_tx, 0, sizeof(data_tx));
okini3939 16:4eeb749806e5 23 memset(data_rx, 0, sizeof(data_rx));
okini3939 18:69d65ca92bcc 24 time_break = DMX_TIME_BREAK;
okini3939 18:69d65ca92bcc 25 time_mab = DMX_TIME_MAB;
okini3939 18:69d65ca92bcc 26 time_mbb = DMX_TIME_MBB;
okini3939 0:cbff6bf41542 27
okini3939 5:72039cd4c874 28 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 11:cb132e066057 29 if (p_rx == P0_3) {
okini3939 11:cb132e066057 30 _uart = (LPC_UART_TypeDef*)LPC_UART0;
okini3939 11:cb132e066057 31 NVIC_SetPriority(UART0_IRQn, 1);
okini3939 0:cbff6bf41542 32 } else
okini3939 0:cbff6bf41542 33 if (p_rx == p14) {
okini3939 8:d4a45bba41d2 34 _uart = (LPC_UART_TypeDef*)LPC_UART1;
okini3939 0:cbff6bf41542 35 NVIC_SetPriority(UART1_IRQn, 1);
okini3939 0:cbff6bf41542 36 } else
okini3939 0:cbff6bf41542 37 if (p_rx == p27) {
okini3939 8:d4a45bba41d2 38 _uart = LPC_UART2;
okini3939 0:cbff6bf41542 39 NVIC_SetPriority(UART2_IRQn, 1);
okini3939 11:cb132e066057 40 } else
okini3939 11:cb132e066057 41 if (p_rx == p10) {
okini3939 11:cb132e066057 42 _uart = LPC_UART3;
okini3939 11:cb132e066057 43 NVIC_SetPriority(UART3_IRQn, 1);
okini3939 0:cbff6bf41542 44 }
okini3939 13:9841af9ac344 45 #elif defined(TARGET_LPC4088)
okini3939 16:4eeb749806e5 46 if (p_rx == p10 || p_rx == P0_26 || p_rx == P4_29) {
okini3939 13:9841af9ac344 47 _uart = LPC_UART3;
okini3939 13:9841af9ac344 48 NVIC_SetPriority(UART3_IRQn, 1);
okini3939 13:9841af9ac344 49 } else
okini3939 13:9841af9ac344 50 if (p_rx == p31) {
okini3939 13:9841af9ac344 51 _uart = (LPC_UART_TypeDef*)LPC_UART4;
okini3939 13:9841af9ac344 52 NVIC_SetPriority(UART4_IRQn, 1);
okini3939 16:4eeb749806e5 53 } else
okini3939 16:4eeb749806e5 54 if (p_rx == P0_3) {
okini3939 16:4eeb749806e5 55 _uart = LPC_UART0;
okini3939 16:4eeb749806e5 56 NVIC_SetPriority(UART0_IRQn, 1);
okini3939 16:4eeb749806e5 57 } else
okini3939 16:4eeb749806e5 58 if (p_rx == P0_16 || p_rx == P2_1 || p_rx == P3_17) {
okini3939 16:4eeb749806e5 59 _uart = (LPC_UART_TypeDef*)LPC_UART1;
okini3939 16:4eeb749806e5 60 NVIC_SetPriority(UART1_IRQn, 1);
okini3939 16:4eeb749806e5 61 } else
okini3939 16:4eeb749806e5 62 if (p_rx == P0_11 || p_rx == P2_9 || p_rx == P4_23) {
okini3939 16:4eeb749806e5 63 _uart = LPC_UART2;
okini3939 16:4eeb749806e5 64 NVIC_SetPriority(UART2_IRQn, 1);
okini3939 13:9841af9ac344 65 }
okini3939 15:4ea4a31c7609 66 #elif defined(TARGET_LPC11UXX)
okini3939 5:72039cd4c874 67 if (p_rx == p10) {
okini3939 8:d4a45bba41d2 68 _uart = LPC_USART;
okini3939 5:72039cd4c874 69 NVIC_SetPriority(UART_IRQn, 1);
okini3939 5:72039cd4c874 70 }
stanly88 10:b748aab8404c 71 #elif defined(TARGET_LPC11XX)
okini3939 11:cb132e066057 72 // LPC1114 support by Stanly Chen
stanly88 10:b748aab8404c 73 if (p_rx == P1_6) {
okini3939 13:9841af9ac344 74 _uart = (LPC_UART_TypeDef*)UART_0;
stanly88 10:b748aab8404c 75 NVIC_SetPriority(UART_IRQn, 1);
stanly88 10:b748aab8404c 76 }
okini3939 5:72039cd4c874 77 #endif
okini3939 0:cbff6bf41542 78
okini3939 5:72039cd4c874 79 _dmx.baud(250000);
okini3939 5:72039cd4c874 80 _dmx.format(8, Serial::None, 2);
okini3939 5:72039cd4c874 81 _dmx.attach(this, &DMX::int_rx, Serial::RxIrq);
okini3939 0:cbff6bf41542 82
okini3939 4:dd0544c80096 83 // timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN);
okini3939 0:cbff6bf41542 84 }
okini3939 0:cbff6bf41542 85
okini3939 6:9e7b4eeac6ec 86 void DMX::put (int addr, int data) {
okini3939 6:9e7b4eeac6ec 87 if (addr < 0 || addr >= DMX_SIZE) return;
okini3939 6:9e7b4eeac6ec 88 data_tx[addr] = data;
okini3939 0:cbff6bf41542 89 }
okini3939 0:cbff6bf41542 90
okini3939 6:9e7b4eeac6ec 91 void DMX::put (unsigned char *buf, int addr, int len) {
okini3939 6:9e7b4eeac6ec 92 if (addr < 0 || addr >= DMX_SIZE) return;
okini3939 6:9e7b4eeac6ec 93 if (len > DMX_SIZE - addr) len = DMX_SIZE - addr;
okini3939 6:9e7b4eeac6ec 94 memcpy(&data_tx[addr], buf, len);
okini3939 6:9e7b4eeac6ec 95 }
okini3939 6:9e7b4eeac6ec 96
okini3939 6:9e7b4eeac6ec 97 int DMX::get (int addr) {
okini3939 6:9e7b4eeac6ec 98 if (addr < 0 || addr >= DMX_SIZE) return -1;
okini3939 6:9e7b4eeac6ec 99 return data_rx[addr];
okini3939 6:9e7b4eeac6ec 100 }
okini3939 6:9e7b4eeac6ec 101
okini3939 6:9e7b4eeac6ec 102 void DMX::get (unsigned char *buf, int addr, int len) {
okini3939 6:9e7b4eeac6ec 103 if (addr < 0 || addr >= DMX_SIZE) return;
okini3939 6:9e7b4eeac6ec 104 if (len > DMX_SIZE - addr) len = DMX_SIZE - addr;
okini3939 6:9e7b4eeac6ec 105 memcpy(buf, &data_rx[addr], len);
okini3939 0:cbff6bf41542 106 }
okini3939 0:cbff6bf41542 107
okini3939 0:cbff6bf41542 108 void DMX::int_timer () {
okini3939 0:cbff6bf41542 109
okini3939 0:cbff6bf41542 110 switch (mode_tx) {
okini3939 0:cbff6bf41542 111 case DMX_MODE_BEGIN:
okini3939 0:cbff6bf41542 112 // Break Time
okini3939 0:cbff6bf41542 113 timeout01.detach();
okini3939 8:d4a45bba41d2 114 _uart->LCR |= (1 << 6);
okini3939 0:cbff6bf41542 115 mode_tx = DMX_MODE_BREAK;
okini3939 18:69d65ca92bcc 116 timeout01.attach_us(this, &DMX::int_timer, time_break);
okini3939 0:cbff6bf41542 117 break;
okini3939 0:cbff6bf41542 118
okini3939 0:cbff6bf41542 119 case DMX_MODE_BREAK:
okini3939 0:cbff6bf41542 120 // Mark After Break
okini3939 0:cbff6bf41542 121 timeout01.detach();
okini3939 8:d4a45bba41d2 122 _uart->LCR &= ~(1 << 6);
okini3939 0:cbff6bf41542 123 mode_tx = DMX_MODE_MAB;
okini3939 18:69d65ca92bcc 124 timeout01.attach_us(this, &DMX::int_timer, time_mab);
okini3939 0:cbff6bf41542 125 break;
okini3939 0:cbff6bf41542 126
okini3939 0:cbff6bf41542 127 case DMX_MODE_MAB:
okini3939 0:cbff6bf41542 128 // Start code
okini3939 0:cbff6bf41542 129 timeout01.detach();
okini3939 0:cbff6bf41542 130 addr_tx = 0;
okini3939 0:cbff6bf41542 131 mode_tx = DMX_MODE_DATA;
okini3939 5:72039cd4c874 132 _dmx.attach(this, &DMX::int_tx, Serial::TxIrq);
okini3939 2:d7677060f8eb 133 #ifdef DMX_UART_DIRECT
okini3939 9:e687f321c428 134 while(!(_uart->LSR & (1<<5)));
okini3939 9:e687f321c428 135 _uart->THR = DMX_START_CODE;
okini3939 2:d7677060f8eb 136 #else
okini3939 9:e687f321c428 137 _dmx.putc(DMX_START_CODE);
okini3939 2:d7677060f8eb 138 #endif
okini3939 0:cbff6bf41542 139 break;
okini3939 0:cbff6bf41542 140 }
okini3939 0:cbff6bf41542 141 }
okini3939 0:cbff6bf41542 142
okini3939 0:cbff6bf41542 143 void DMX::int_tx () {
okini3939 0:cbff6bf41542 144 // Data
okini3939 0:cbff6bf41542 145 if (mode_tx == DMX_MODE_DATA) {
okini3939 0:cbff6bf41542 146 if (addr_tx < DMX_SIZE) {
okini3939 1:f0d988e15810 147 #ifdef DMX_UART_DIRECT
okini3939 8:d4a45bba41d2 148 _uart->THR = (uint8_t)data_tx[addr_tx];
okini3939 0:cbff6bf41542 149 #else
okini3939 5:72039cd4c874 150 _dmx.putc(data_tx[addr_tx]);
okini3939 0:cbff6bf41542 151 #endif
okini3939 0:cbff6bf41542 152 addr_tx ++;
okini3939 0:cbff6bf41542 153 } else {
okini3939 5:72039cd4c874 154 _dmx.attach(0, Serial::TxIrq);
okini3939 0:cbff6bf41542 155 mode_tx = DMX_MODE_BEGIN;
okini3939 0:cbff6bf41542 156 is_sent = 1;
okini3939 18:69d65ca92bcc 157 timeout01.attach_us(this, &DMX::int_timer, time_mbb);
okini3939 0:cbff6bf41542 158 }
okini3939 0:cbff6bf41542 159 }
okini3939 0:cbff6bf41542 160 }
okini3939 0:cbff6bf41542 161
okini3939 0:cbff6bf41542 162 void DMX::int_rx () {
okini3939 0:cbff6bf41542 163 int flg, dat;
okini3939 0:cbff6bf41542 164
okini3939 8:d4a45bba41d2 165 flg = _uart->LSR;
okini3939 1:f0d988e15810 166 #ifdef DMX_UART_DIRECT
okini3939 8:d4a45bba41d2 167 dat = _uart->RBR;
okini3939 1:f0d988e15810 168 #else
okini3939 5:72039cd4c874 169 dat = _dmx.getc();
okini3939 1:f0d988e15810 170 #endif
okini3939 0:cbff6bf41542 171
okini3939 0:cbff6bf41542 172 if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) {
okini3939 0:cbff6bf41542 173 // Break Time
okini3939 15:4ea4a31c7609 174 if (addr_rx >= 24 && mode_rx == DMX_MODE_DATA) {
okini3939 18:69d65ca92bcc 175 is_received = 1;
okini3939 0:cbff6bf41542 176 }
okini3939 0:cbff6bf41542 177 mode_rx = DMX_MODE_BREAK;
okini3939 0:cbff6bf41542 178 return;
okini3939 0:cbff6bf41542 179 }
okini3939 0:cbff6bf41542 180
okini3939 0:cbff6bf41542 181 if (mode_rx == DMX_MODE_BREAK) {
okini3939 0:cbff6bf41542 182
okini3939 0:cbff6bf41542 183 // Start Code
okini3939 9:e687f321c428 184 if (dat == DMX_START_CODE) {
okini3939 0:cbff6bf41542 185 addr_rx = 0;
okini3939 0:cbff6bf41542 186 mode_rx = DMX_MODE_DATA;
okini3939 0:cbff6bf41542 187 } else {
okini3939 0:cbff6bf41542 188 mode_rx = DMX_MODE_ERROR;
okini3939 0:cbff6bf41542 189 }
okini3939 0:cbff6bf41542 190
okini3939 0:cbff6bf41542 191 } else
okini3939 0:cbff6bf41542 192 if (mode_rx == DMX_MODE_DATA) {
okini3939 0:cbff6bf41542 193
okini3939 0:cbff6bf41542 194 // Data
okini3939 0:cbff6bf41542 195 data_rx[addr_rx] = dat;
okini3939 0:cbff6bf41542 196 addr_rx ++;
okini3939 0:cbff6bf41542 197
okini3939 0:cbff6bf41542 198 if (addr_rx >= DMX_SIZE) {
okini3939 18:69d65ca92bcc 199 is_received = 1;
okini3939 0:cbff6bf41542 200 mode_rx = DMX_MODE_BEGIN;
okini3939 0:cbff6bf41542 201 }
okini3939 0:cbff6bf41542 202 }
okini3939 0:cbff6bf41542 203 }
okini3939 0:cbff6bf41542 204
okini3939 4:dd0544c80096 205 void DMX::start () {
okini3939 4:dd0544c80096 206 if (mode_tx == DMX_MODE_STOP) {
okini3939 4:dd0544c80096 207 mode_tx = DMX_MODE_BEGIN;
okini3939 4:dd0544c80096 208 is_sent = 0;
okini3939 18:69d65ca92bcc 209 timeout01.attach_us(this, &DMX::int_timer, time_mbb);
okini3939 4:dd0544c80096 210 }
okini3939 4:dd0544c80096 211 }
okini3939 4:dd0544c80096 212
okini3939 4:dd0544c80096 213 void DMX::stop () {
okini3939 5:72039cd4c874 214 _dmx.attach(0, Serial::TxIrq);
okini3939 3:2eb66b4d99bd 215 timeout01.detach();
okini3939 4:dd0544c80096 216 mode_tx = DMX_MODE_STOP;
okini3939 3:2eb66b4d99bd 217 }
okini3939 12:1f176eee2d28 218
okini3939 12:1f176eee2d28 219 void DMX::clear () {
okini3939 12:1f176eee2d28 220 int i;
okini3939 12:1f176eee2d28 221
okini3939 12:1f176eee2d28 222 for (i = 0; i < DMX_SIZE; i ++) {
okini3939 12:1f176eee2d28 223 data_tx[i] = 0;
okini3939 12:1f176eee2d28 224 data_rx[i] = 0;
okini3939 12:1f176eee2d28 225 }
okini3939 12:1f176eee2d28 226 }
okini3939 17:c9198630ba05 227
okini3939 18:69d65ca92bcc 228 int DMX::isReceived (){
okini3939 18:69d65ca92bcc 229 int r = is_received;
okini3939 18:69d65ca92bcc 230 is_received = 0;
okini3939 17:c9198630ba05 231 return r;
okini3939 17:c9198630ba05 232 }
okini3939 17:c9198630ba05 233
okini3939 17:c9198630ba05 234 int DMX::isSent () {
okini3939 17:c9198630ba05 235 int r = is_sent;
okini3939 17:c9198630ba05 236 is_sent = 0;
okini3939 17:c9198630ba05 237 return r;
okini3939 17:c9198630ba05 238 }
okini3939 17:c9198630ba05 239
okini3939 17:c9198630ba05 240 unsigned char *DMX::getRxBuffer () {
okini3939 17:c9198630ba05 241 return data_rx;
okini3939 17:c9198630ba05 242 }
okini3939 17:c9198630ba05 243
okini3939 17:c9198630ba05 244 unsigned char *DMX::getTxBuffer () {
okini3939 17:c9198630ba05 245 return data_tx;
okini3939 17:c9198630ba05 246 }
okini3939 18:69d65ca92bcc 247
okini3939 18:69d65ca92bcc 248 int DMX::setTimingParameters (int breaktime, int mab, int mbb) {
okini3939 18:69d65ca92bcc 249 if (breaktime < 88 || breaktime > 1000000) return -1;
okini3939 18:69d65ca92bcc 250 if (mab < 8 || mab > 1000000) return -1;
okini3939 18:69d65ca92bcc 251 if (mbb < 0 || mbb > 1000000) return -1;
okini3939 18:69d65ca92bcc 252
okini3939 18:69d65ca92bcc 253 time_break = breaktime;
okini3939 18:69d65ca92bcc 254 time_mab = mab;
okini3939 18:69d65ca92bcc 255 time_mbb = mbb;
okini3939 18:69d65ca92bcc 256 return 0;
okini3939 18:69d65ca92bcc 257 }