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.cpp@19:ae8fd2ba7c53, 2017-10-20 (annotated)
- 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?
User | Revision | Line number | New 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 | 0:cbff6bf41542 | 11 | #include "mbed.h" |
okini3939 | 0:cbff6bf41542 | 12 | #include "DMX.h" |
okini3939 | 0:cbff6bf41542 | 13 | |
okini3939 | 19:ae8fd2ba7c53 | 14 | |
okini3939 | 19:ae8fd2ba7c53 | 15 | DMX::DMX (PinName p_tx, PinName p_rx, PinName p_xmit) : _dmx(p_tx, p_rx) { |
okini3939 | 0:cbff6bf41542 | 16 | |
okini3939 | 19:ae8fd2ba7c53 | 17 | if (p_xmit == NC) { |
okini3939 | 19:ae8fd2ba7c53 | 18 | _xmit = NULL; |
okini3939 | 19:ae8fd2ba7c53 | 19 | } else { |
okini3939 | 19:ae8fd2ba7c53 | 20 | _xmit = new DigitalOut(p_xmit, XMIT_RX); |
okini3939 | 19:ae8fd2ba7c53 | 21 | } |
okini3939 | 12:1f176eee2d28 | 22 | clear(); |
okini3939 | 4:dd0544c80096 | 23 | // mode_tx = DMX_MODE_BEGIN; |
okini3939 | 4:dd0544c80096 | 24 | mode_tx = DMX_MODE_STOP; |
okini3939 | 0:cbff6bf41542 | 25 | mode_rx = DMX_MODE_BEGIN; |
okini3939 | 18:69d65ca92bcc | 26 | is_received = 0; |
okini3939 | 18:69d65ca92bcc | 27 | is_sent = 0; |
okini3939 | 16:4eeb749806e5 | 28 | memset(data_tx, 0, sizeof(data_tx)); |
okini3939 | 16:4eeb749806e5 | 29 | memset(data_rx, 0, sizeof(data_rx)); |
okini3939 | 18:69d65ca92bcc | 30 | time_break = DMX_TIME_BREAK; |
okini3939 | 18:69d65ca92bcc | 31 | time_mab = DMX_TIME_MAB; |
okini3939 | 18:69d65ca92bcc | 32 | time_mbb = DMX_TIME_MBB; |
okini3939 | 0:cbff6bf41542 | 33 | |
okini3939 | 19:ae8fd2ba7c53 | 34 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 35 | mode_rdm = 0; |
okini3939 | 19:ae8fd2ba7c53 | 36 | rdm_mute = 0; |
okini3939 | 19:ae8fd2ba7c53 | 37 | rdm_msgcount = 0; |
okini3939 | 19:ae8fd2ba7c53 | 38 | rdm_transno = 0; |
okini3939 | 19:ae8fd2ba7c53 | 39 | cb_RdmParser = NULL; |
okini3939 | 19:ae8fd2ba7c53 | 40 | buf_uid_size = 0; |
okini3939 | 19:ae8fd2ba7c53 | 41 | #endif |
okini3939 | 19:ae8fd2ba7c53 | 42 | |
okini3939 | 5:72039cd4c874 | 43 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) |
okini3939 | 11:cb132e066057 | 44 | if (p_rx == P0_3) { |
okini3939 | 11:cb132e066057 | 45 | _uart = (LPC_UART_TypeDef*)LPC_UART0; |
okini3939 | 11:cb132e066057 | 46 | NVIC_SetPriority(UART0_IRQn, 1); |
okini3939 | 0:cbff6bf41542 | 47 | } else |
okini3939 | 0:cbff6bf41542 | 48 | if (p_rx == p14) { |
okini3939 | 8:d4a45bba41d2 | 49 | _uart = (LPC_UART_TypeDef*)LPC_UART1; |
okini3939 | 0:cbff6bf41542 | 50 | NVIC_SetPriority(UART1_IRQn, 1); |
okini3939 | 0:cbff6bf41542 | 51 | } else |
okini3939 | 0:cbff6bf41542 | 52 | if (p_rx == p27) { |
okini3939 | 8:d4a45bba41d2 | 53 | _uart = LPC_UART2; |
okini3939 | 0:cbff6bf41542 | 54 | NVIC_SetPriority(UART2_IRQn, 1); |
okini3939 | 11:cb132e066057 | 55 | } else |
okini3939 | 11:cb132e066057 | 56 | if (p_rx == p10) { |
okini3939 | 11:cb132e066057 | 57 | _uart = LPC_UART3; |
okini3939 | 11:cb132e066057 | 58 | NVIC_SetPriority(UART3_IRQn, 1); |
okini3939 | 0:cbff6bf41542 | 59 | } |
okini3939 | 13:9841af9ac344 | 60 | #elif defined(TARGET_LPC4088) |
okini3939 | 16:4eeb749806e5 | 61 | if (p_rx == p10 || p_rx == P0_26 || p_rx == P4_29) { |
okini3939 | 13:9841af9ac344 | 62 | _uart = LPC_UART3; |
okini3939 | 13:9841af9ac344 | 63 | NVIC_SetPriority(UART3_IRQn, 1); |
okini3939 | 13:9841af9ac344 | 64 | } else |
okini3939 | 13:9841af9ac344 | 65 | if (p_rx == p31) { |
okini3939 | 13:9841af9ac344 | 66 | _uart = (LPC_UART_TypeDef*)LPC_UART4; |
okini3939 | 13:9841af9ac344 | 67 | NVIC_SetPriority(UART4_IRQn, 1); |
okini3939 | 16:4eeb749806e5 | 68 | } else |
okini3939 | 16:4eeb749806e5 | 69 | if (p_rx == P0_3) { |
okini3939 | 16:4eeb749806e5 | 70 | _uart = LPC_UART0; |
okini3939 | 16:4eeb749806e5 | 71 | NVIC_SetPriority(UART0_IRQn, 1); |
okini3939 | 16:4eeb749806e5 | 72 | } else |
okini3939 | 16:4eeb749806e5 | 73 | if (p_rx == P0_16 || p_rx == P2_1 || p_rx == P3_17) { |
okini3939 | 16:4eeb749806e5 | 74 | _uart = (LPC_UART_TypeDef*)LPC_UART1; |
okini3939 | 16:4eeb749806e5 | 75 | NVIC_SetPriority(UART1_IRQn, 1); |
okini3939 | 16:4eeb749806e5 | 76 | } else |
okini3939 | 16:4eeb749806e5 | 77 | if (p_rx == P0_11 || p_rx == P2_9 || p_rx == P4_23) { |
okini3939 | 16:4eeb749806e5 | 78 | _uart = LPC_UART2; |
okini3939 | 16:4eeb749806e5 | 79 | NVIC_SetPriority(UART2_IRQn, 1); |
okini3939 | 13:9841af9ac344 | 80 | } |
okini3939 | 15:4ea4a31c7609 | 81 | #elif defined(TARGET_LPC11UXX) |
okini3939 | 5:72039cd4c874 | 82 | if (p_rx == p10) { |
okini3939 | 8:d4a45bba41d2 | 83 | _uart = LPC_USART; |
okini3939 | 5:72039cd4c874 | 84 | NVIC_SetPriority(UART_IRQn, 1); |
okini3939 | 5:72039cd4c874 | 85 | } |
stanly88 | 10:b748aab8404c | 86 | #elif defined(TARGET_LPC11XX) |
okini3939 | 11:cb132e066057 | 87 | // LPC1114 support by Stanly Chen |
stanly88 | 10:b748aab8404c | 88 | if (p_rx == P1_6) { |
okini3939 | 13:9841af9ac344 | 89 | _uart = (LPC_UART_TypeDef*)UART_0; |
stanly88 | 10:b748aab8404c | 90 | NVIC_SetPriority(UART_IRQn, 1); |
stanly88 | 10:b748aab8404c | 91 | } |
okini3939 | 5:72039cd4c874 | 92 | #endif |
okini3939 | 0:cbff6bf41542 | 93 | |
okini3939 | 5:72039cd4c874 | 94 | _dmx.baud(250000); |
okini3939 | 5:72039cd4c874 | 95 | _dmx.format(8, Serial::None, 2); |
okini3939 | 5:72039cd4c874 | 96 | _dmx.attach(this, &DMX::int_rx, Serial::RxIrq); |
okini3939 | 0:cbff6bf41542 | 97 | |
okini3939 | 4:dd0544c80096 | 98 | // timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN); |
okini3939 | 0:cbff6bf41542 | 99 | } |
okini3939 | 0:cbff6bf41542 | 100 | |
okini3939 | 6:9e7b4eeac6ec | 101 | void DMX::put (int addr, int data) { |
okini3939 | 6:9e7b4eeac6ec | 102 | if (addr < 0 || addr >= DMX_SIZE) return; |
okini3939 | 6:9e7b4eeac6ec | 103 | data_tx[addr] = data; |
okini3939 | 0:cbff6bf41542 | 104 | } |
okini3939 | 0:cbff6bf41542 | 105 | |
okini3939 | 6:9e7b4eeac6ec | 106 | void DMX::put (unsigned char *buf, int addr, int len) { |
okini3939 | 6:9e7b4eeac6ec | 107 | if (addr < 0 || addr >= DMX_SIZE) return; |
okini3939 | 6:9e7b4eeac6ec | 108 | if (len > DMX_SIZE - addr) len = DMX_SIZE - addr; |
okini3939 | 6:9e7b4eeac6ec | 109 | memcpy(&data_tx[addr], buf, len); |
okini3939 | 6:9e7b4eeac6ec | 110 | } |
okini3939 | 6:9e7b4eeac6ec | 111 | |
okini3939 | 6:9e7b4eeac6ec | 112 | int DMX::get (int addr) { |
okini3939 | 6:9e7b4eeac6ec | 113 | if (addr < 0 || addr >= DMX_SIZE) return -1; |
okini3939 | 6:9e7b4eeac6ec | 114 | return data_rx[addr]; |
okini3939 | 6:9e7b4eeac6ec | 115 | } |
okini3939 | 6:9e7b4eeac6ec | 116 | |
okini3939 | 6:9e7b4eeac6ec | 117 | void DMX::get (unsigned char *buf, int addr, int len) { |
okini3939 | 6:9e7b4eeac6ec | 118 | if (addr < 0 || addr >= DMX_SIZE) return; |
okini3939 | 6:9e7b4eeac6ec | 119 | if (len > DMX_SIZE - addr) len = DMX_SIZE - addr; |
okini3939 | 6:9e7b4eeac6ec | 120 | memcpy(buf, &data_rx[addr], len); |
okini3939 | 0:cbff6bf41542 | 121 | } |
okini3939 | 0:cbff6bf41542 | 122 | |
okini3939 | 0:cbff6bf41542 | 123 | void DMX::int_timer () { |
okini3939 | 0:cbff6bf41542 | 124 | |
okini3939 | 0:cbff6bf41542 | 125 | switch (mode_tx) { |
okini3939 | 0:cbff6bf41542 | 126 | case DMX_MODE_BEGIN: |
okini3939 | 0:cbff6bf41542 | 127 | // Break Time |
okini3939 | 0:cbff6bf41542 | 128 | timeout01.detach(); |
okini3939 | 19:ae8fd2ba7c53 | 129 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 130 | if (mode_rdm && _xmit) _xmit->write(XMIT_TX); |
okini3939 | 19:ae8fd2ba7c53 | 131 | #endif |
okini3939 | 8:d4a45bba41d2 | 132 | _uart->LCR |= (1 << 6); |
okini3939 | 0:cbff6bf41542 | 133 | mode_tx = DMX_MODE_BREAK; |
okini3939 | 18:69d65ca92bcc | 134 | timeout01.attach_us(this, &DMX::int_timer, time_break); |
okini3939 | 0:cbff6bf41542 | 135 | break; |
okini3939 | 0:cbff6bf41542 | 136 | |
okini3939 | 0:cbff6bf41542 | 137 | case DMX_MODE_BREAK: |
okini3939 | 0:cbff6bf41542 | 138 | // Mark After Break |
okini3939 | 0:cbff6bf41542 | 139 | timeout01.detach(); |
okini3939 | 8:d4a45bba41d2 | 140 | _uart->LCR &= ~(1 << 6); |
okini3939 | 0:cbff6bf41542 | 141 | mode_tx = DMX_MODE_MAB; |
okini3939 | 18:69d65ca92bcc | 142 | timeout01.attach_us(this, &DMX::int_timer, time_mab); |
okini3939 | 0:cbff6bf41542 | 143 | break; |
okini3939 | 0:cbff6bf41542 | 144 | |
okini3939 | 0:cbff6bf41542 | 145 | case DMX_MODE_MAB: |
okini3939 | 0:cbff6bf41542 | 146 | // Start code |
okini3939 | 0:cbff6bf41542 | 147 | timeout01.detach(); |
okini3939 | 0:cbff6bf41542 | 148 | addr_tx = 0; |
okini3939 | 0:cbff6bf41542 | 149 | mode_tx = DMX_MODE_DATA; |
okini3939 | 2:d7677060f8eb | 150 | #ifdef DMX_UART_DIRECT |
okini3939 | 9:e687f321c428 | 151 | while(!(_uart->LSR & (1<<5))); |
okini3939 | 19:ae8fd2ba7c53 | 152 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 153 | if (mode_rdm) { |
okini3939 | 19:ae8fd2ba7c53 | 154 | _uart->THR = RDM_START_CODE; |
okini3939 | 19:ae8fd2ba7c53 | 155 | } else { |
okini3939 | 19:ae8fd2ba7c53 | 156 | _uart->THR = DMX_START_CODE; |
okini3939 | 19:ae8fd2ba7c53 | 157 | } |
okini3939 | 19:ae8fd2ba7c53 | 158 | #else |
okini3939 | 9:e687f321c428 | 159 | _uart->THR = DMX_START_CODE; |
okini3939 | 19:ae8fd2ba7c53 | 160 | #endif // RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 161 | #else |
okini3939 | 19:ae8fd2ba7c53 | 162 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 163 | if (mode_rdm) { |
okini3939 | 19:ae8fd2ba7c53 | 164 | _dmx.putc(RDM_START_CODE); |
okini3939 | 19:ae8fd2ba7c53 | 165 | } else { |
okini3939 | 19:ae8fd2ba7c53 | 166 | _dmx.putc(DMX_START_CODE); |
okini3939 | 19:ae8fd2ba7c53 | 167 | } |
okini3939 | 2:d7677060f8eb | 168 | #else |
okini3939 | 9:e687f321c428 | 169 | _dmx.putc(DMX_START_CODE); |
okini3939 | 19:ae8fd2ba7c53 | 170 | #endif // RDM_ENABLE |
okini3939 | 2:d7677060f8eb | 171 | #endif |
okini3939 | 19:ae8fd2ba7c53 | 172 | _dmx.attach(this, &DMX::int_tx, Serial::TxIrq); |
okini3939 | 0:cbff6bf41542 | 173 | break; |
okini3939 | 0:cbff6bf41542 | 174 | } |
okini3939 | 0:cbff6bf41542 | 175 | } |
okini3939 | 0:cbff6bf41542 | 176 | |
okini3939 | 0:cbff6bf41542 | 177 | void DMX::int_tx () { |
okini3939 | 0:cbff6bf41542 | 178 | // Data |
okini3939 | 0:cbff6bf41542 | 179 | if (mode_tx == DMX_MODE_DATA) { |
okini3939 | 19:ae8fd2ba7c53 | 180 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 181 | if (mode_rdm && addr_tx < data_rdm[1] + 1) { |
okini3939 | 19:ae8fd2ba7c53 | 182 | // RDM data |
okini3939 | 19:ae8fd2ba7c53 | 183 | _dmx.putc(data_rdm[addr_tx]); |
okini3939 | 19:ae8fd2ba7c53 | 184 | addr_tx ++; |
okini3939 | 19:ae8fd2ba7c53 | 185 | } else |
okini3939 | 19:ae8fd2ba7c53 | 186 | if (!mode_rdm && addr_tx < DMX_SIZE) { |
okini3939 | 19:ae8fd2ba7c53 | 187 | #else |
okini3939 | 0:cbff6bf41542 | 188 | if (addr_tx < DMX_SIZE) { |
okini3939 | 19:ae8fd2ba7c53 | 189 | #endif // RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 190 | // DMX data |
okini3939 | 1:f0d988e15810 | 191 | #ifdef DMX_UART_DIRECT |
okini3939 | 8:d4a45bba41d2 | 192 | _uart->THR = (uint8_t)data_tx[addr_tx]; |
okini3939 | 0:cbff6bf41542 | 193 | #else |
okini3939 | 5:72039cd4c874 | 194 | _dmx.putc(data_tx[addr_tx]); |
okini3939 | 0:cbff6bf41542 | 195 | #endif |
okini3939 | 0:cbff6bf41542 | 196 | addr_tx ++; |
okini3939 | 0:cbff6bf41542 | 197 | } else { |
okini3939 | 19:ae8fd2ba7c53 | 198 | _dmx.attach(0, Serial::TxIrq); // disable |
okini3939 | 0:cbff6bf41542 | 199 | mode_tx = DMX_MODE_BEGIN; |
okini3939 | 0:cbff6bf41542 | 200 | is_sent = 1; |
okini3939 | 19:ae8fd2ba7c53 | 201 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 202 | if (mode_rdm) { |
okini3939 | 19:ae8fd2ba7c53 | 203 | if (_xmit) _xmit->write(XMIT_RX); |
okini3939 | 19:ae8fd2ba7c53 | 204 | mode_rdm = 0; |
okini3939 | 19:ae8fd2ba7c53 | 205 | mode_tx = DMX_MODE_STOP; |
okini3939 | 19:ae8fd2ba7c53 | 206 | } else { |
okini3939 | 19:ae8fd2ba7c53 | 207 | timeout01.attach_us(this, &DMX::int_timer, time_mbb); |
okini3939 | 19:ae8fd2ba7c53 | 208 | } |
okini3939 | 19:ae8fd2ba7c53 | 209 | #else |
okini3939 | 18:69d65ca92bcc | 210 | timeout01.attach_us(this, &DMX::int_timer, time_mbb); |
okini3939 | 19:ae8fd2ba7c53 | 211 | #endif // RDM_ENABLE |
okini3939 | 0:cbff6bf41542 | 212 | } |
okini3939 | 0:cbff6bf41542 | 213 | } |
okini3939 | 0:cbff6bf41542 | 214 | } |
okini3939 | 0:cbff6bf41542 | 215 | |
okini3939 | 0:cbff6bf41542 | 216 | void DMX::int_rx () { |
okini3939 | 0:cbff6bf41542 | 217 | int flg, dat; |
okini3939 | 0:cbff6bf41542 | 218 | |
okini3939 | 8:d4a45bba41d2 | 219 | flg = _uart->LSR; |
okini3939 | 1:f0d988e15810 | 220 | #ifdef DMX_UART_DIRECT |
okini3939 | 8:d4a45bba41d2 | 221 | dat = _uart->RBR; |
okini3939 | 1:f0d988e15810 | 222 | #else |
okini3939 | 5:72039cd4c874 | 223 | dat = _dmx.getc(); |
okini3939 | 1:f0d988e15810 | 224 | #endif |
okini3939 | 0:cbff6bf41542 | 225 | |
okini3939 | 0:cbff6bf41542 | 226 | if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) { |
okini3939 | 0:cbff6bf41542 | 227 | // Break Time |
okini3939 | 19:ae8fd2ba7c53 | 228 | if (is_rdm_received) { |
okini3939 | 19:ae8fd2ba7c53 | 229 | return; |
okini3939 | 19:ae8fd2ba7c53 | 230 | } else |
okini3939 | 15:4ea4a31c7609 | 231 | if (addr_rx >= 24 && mode_rx == DMX_MODE_DATA) { |
okini3939 | 18:69d65ca92bcc | 232 | is_received = 1; |
okini3939 | 0:cbff6bf41542 | 233 | } |
okini3939 | 0:cbff6bf41542 | 234 | mode_rx = DMX_MODE_BREAK; |
okini3939 | 0:cbff6bf41542 | 235 | return; |
okini3939 | 0:cbff6bf41542 | 236 | } |
okini3939 | 0:cbff6bf41542 | 237 | |
okini3939 | 0:cbff6bf41542 | 238 | if (mode_rx == DMX_MODE_BREAK) { |
okini3939 | 0:cbff6bf41542 | 239 | |
okini3939 | 0:cbff6bf41542 | 240 | // Start Code |
okini3939 | 9:e687f321c428 | 241 | if (dat == DMX_START_CODE) { |
okini3939 | 0:cbff6bf41542 | 242 | addr_rx = 0; |
okini3939 | 0:cbff6bf41542 | 243 | mode_rx = DMX_MODE_DATA; |
okini3939 | 19:ae8fd2ba7c53 | 244 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 245 | } else |
okini3939 | 19:ae8fd2ba7c53 | 246 | if (dat == RDM_START_CODE) { |
okini3939 | 19:ae8fd2ba7c53 | 247 | addr_rx = 0; |
okini3939 | 19:ae8fd2ba7c53 | 248 | mode_rx = DMX_MODE_RDM; |
okini3939 | 19:ae8fd2ba7c53 | 249 | #endif |
okini3939 | 0:cbff6bf41542 | 250 | } else { |
okini3939 | 0:cbff6bf41542 | 251 | mode_rx = DMX_MODE_ERROR; |
okini3939 | 0:cbff6bf41542 | 252 | } |
okini3939 | 0:cbff6bf41542 | 253 | |
okini3939 | 0:cbff6bf41542 | 254 | } else |
okini3939 | 0:cbff6bf41542 | 255 | if (mode_rx == DMX_MODE_DATA) { |
okini3939 | 0:cbff6bf41542 | 256 | |
okini3939 | 0:cbff6bf41542 | 257 | // Data |
okini3939 | 0:cbff6bf41542 | 258 | data_rx[addr_rx] = dat; |
okini3939 | 0:cbff6bf41542 | 259 | addr_rx ++; |
okini3939 | 0:cbff6bf41542 | 260 | |
okini3939 | 0:cbff6bf41542 | 261 | if (addr_rx >= DMX_SIZE) { |
okini3939 | 18:69d65ca92bcc | 262 | is_received = 1; |
okini3939 | 0:cbff6bf41542 | 263 | mode_rx = DMX_MODE_BEGIN; |
okini3939 | 0:cbff6bf41542 | 264 | } |
okini3939 | 19:ae8fd2ba7c53 | 265 | |
okini3939 | 19:ae8fd2ba7c53 | 266 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 267 | } else |
okini3939 | 19:ae8fd2ba7c53 | 268 | if (mode_rx == DMX_MODE_RDM) { |
okini3939 | 19:ae8fd2ba7c53 | 269 | |
okini3939 | 19:ae8fd2ba7c53 | 270 | // Rdm |
okini3939 | 19:ae8fd2ba7c53 | 271 | data_rx[addr_rx] = dat; |
okini3939 | 19:ae8fd2ba7c53 | 272 | addr_rx ++; |
okini3939 | 19:ae8fd2ba7c53 | 273 | |
okini3939 | 19:ae8fd2ba7c53 | 274 | if (addr_rx >= 2 && addr_rx >= data_rx[1] + 1) { |
okini3939 | 19:ae8fd2ba7c53 | 275 | is_rdm_received = 1; |
okini3939 | 19:ae8fd2ba7c53 | 276 | mode_rx = DMX_MODE_BEGIN; |
okini3939 | 19:ae8fd2ba7c53 | 277 | } else |
okini3939 | 19:ae8fd2ba7c53 | 278 | if (addr_rx >= sizeof(data_rdm)) { |
okini3939 | 19:ae8fd2ba7c53 | 279 | mode_rx = DMX_MODE_ERROR; |
okini3939 | 19:ae8fd2ba7c53 | 280 | } |
okini3939 | 19:ae8fd2ba7c53 | 281 | #endif |
okini3939 | 0:cbff6bf41542 | 282 | } |
okini3939 | 0:cbff6bf41542 | 283 | } |
okini3939 | 0:cbff6bf41542 | 284 | |
okini3939 | 4:dd0544c80096 | 285 | void DMX::start () { |
okini3939 | 4:dd0544c80096 | 286 | if (mode_tx == DMX_MODE_STOP) { |
okini3939 | 19:ae8fd2ba7c53 | 287 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 288 | if (_xmit) _xmit->write(XMIT_TX); |
okini3939 | 19:ae8fd2ba7c53 | 289 | #endif |
okini3939 | 4:dd0544c80096 | 290 | mode_tx = DMX_MODE_BEGIN; |
okini3939 | 4:dd0544c80096 | 291 | is_sent = 0; |
okini3939 | 18:69d65ca92bcc | 292 | timeout01.attach_us(this, &DMX::int_timer, time_mbb); |
okini3939 | 4:dd0544c80096 | 293 | } |
okini3939 | 4:dd0544c80096 | 294 | } |
okini3939 | 4:dd0544c80096 | 295 | |
okini3939 | 4:dd0544c80096 | 296 | void DMX::stop () { |
okini3939 | 5:72039cd4c874 | 297 | _dmx.attach(0, Serial::TxIrq); |
okini3939 | 3:2eb66b4d99bd | 298 | timeout01.detach(); |
okini3939 | 4:dd0544c80096 | 299 | mode_tx = DMX_MODE_STOP; |
okini3939 | 19:ae8fd2ba7c53 | 300 | #ifdef RDM_ENABLE |
okini3939 | 19:ae8fd2ba7c53 | 301 | if (_xmit) _xmit->write(XMIT_RX); |
okini3939 | 19:ae8fd2ba7c53 | 302 | #endif |
okini3939 | 3:2eb66b4d99bd | 303 | } |
okini3939 | 12:1f176eee2d28 | 304 | |
okini3939 | 12:1f176eee2d28 | 305 | void DMX::clear () { |
okini3939 | 12:1f176eee2d28 | 306 | int i; |
okini3939 | 12:1f176eee2d28 | 307 | |
okini3939 | 12:1f176eee2d28 | 308 | for (i = 0; i < DMX_SIZE; i ++) { |
okini3939 | 12:1f176eee2d28 | 309 | data_tx[i] = 0; |
okini3939 | 12:1f176eee2d28 | 310 | data_rx[i] = 0; |
okini3939 | 12:1f176eee2d28 | 311 | } |
okini3939 | 12:1f176eee2d28 | 312 | } |
okini3939 | 17:c9198630ba05 | 313 | |
okini3939 | 18:69d65ca92bcc | 314 | int DMX::isReceived (){ |
okini3939 | 18:69d65ca92bcc | 315 | int r = is_received; |
okini3939 | 18:69d65ca92bcc | 316 | is_received = 0; |
okini3939 | 17:c9198630ba05 | 317 | return r; |
okini3939 | 17:c9198630ba05 | 318 | } |
okini3939 | 17:c9198630ba05 | 319 | |
okini3939 | 17:c9198630ba05 | 320 | int DMX::isSent () { |
okini3939 | 17:c9198630ba05 | 321 | int r = is_sent; |
okini3939 | 17:c9198630ba05 | 322 | is_sent = 0; |
okini3939 | 17:c9198630ba05 | 323 | return r; |
okini3939 | 17:c9198630ba05 | 324 | } |
okini3939 | 17:c9198630ba05 | 325 | |
okini3939 | 17:c9198630ba05 | 326 | unsigned char *DMX::getRxBuffer () { |
okini3939 | 17:c9198630ba05 | 327 | return data_rx; |
okini3939 | 17:c9198630ba05 | 328 | } |
okini3939 | 17:c9198630ba05 | 329 | |
okini3939 | 17:c9198630ba05 | 330 | unsigned char *DMX::getTxBuffer () { |
okini3939 | 17:c9198630ba05 | 331 | return data_tx; |
okini3939 | 17:c9198630ba05 | 332 | } |
okini3939 | 18:69d65ca92bcc | 333 | |
okini3939 | 18:69d65ca92bcc | 334 | int DMX::setTimingParameters (int breaktime, int mab, int mbb) { |
okini3939 | 18:69d65ca92bcc | 335 | if (breaktime < 88 || breaktime > 1000000) return -1; |
okini3939 | 18:69d65ca92bcc | 336 | if (mab < 8 || mab > 1000000) return -1; |
okini3939 | 18:69d65ca92bcc | 337 | if (mbb < 0 || mbb > 1000000) return -1; |
okini3939 | 18:69d65ca92bcc | 338 | |
okini3939 | 18:69d65ca92bcc | 339 | time_break = breaktime; |
okini3939 | 18:69d65ca92bcc | 340 | time_mab = mab; |
okini3939 | 18:69d65ca92bcc | 341 | time_mbb = mbb; |
okini3939 | 18:69d65ca92bcc | 342 | return 0; |
okini3939 | 18:69d65ca92bcc | 343 | } |