DMX Library for STM devices
Dependents: DISCO-F746NG_DMX-Test
Fork of DMX by
Diff: DMX.cpp
- Revision:
- 17:b87addd12d20
- Parent:
- 16:4eeb749806e5
- Child:
- 18:e5e5eca21b4a
--- a/DMX.cpp Thu Aug 20 09:21:28 2015 +0000 +++ b/DMX.cpp Sat Dec 12 13:16:07 2015 +0000 @@ -11,100 +11,80 @@ #include "mbed.h" #include "DMX.h" -DMX::DMX (PinName p_tx, PinName p_rx) : _dmx(p_tx, p_rx) { - - clear(); -// mode_tx = DMX_MODE_BEGIN; - mode_tx = DMX_MODE_STOP; - mode_rx = DMX_MODE_BEGIN; - is_recived = 0; - is_sent = 0; - memset(data_tx, 0, sizeof(data_tx)); - memset(data_rx, 0, sizeof(data_rx)); +// pragma does'nt work? +#pragma GCC diagnostic ignored "-Wreorder" -#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) - if (p_rx == P0_3) { - _uart = (LPC_UART_TypeDef*)LPC_UART0; - NVIC_SetPriority(UART0_IRQn, 1); - } else - if (p_rx == p14) { - _uart = (LPC_UART_TypeDef*)LPC_UART1; - NVIC_SetPriority(UART1_IRQn, 1); - } else - if (p_rx == p27) { - _uart = LPC_UART2; - NVIC_SetPriority(UART2_IRQn, 1); - } else - if (p_rx == p10) { - _uart = LPC_UART3; - NVIC_SetPriority(UART3_IRQn, 1); - } -#elif defined(TARGET_LPC4088) - if (p_rx == p10 || p_rx == P0_26 || p_rx == P4_29) { - _uart = LPC_UART3; - NVIC_SetPriority(UART3_IRQn, 1); - } else - if (p_rx == p31) { - _uart = (LPC_UART_TypeDef*)LPC_UART4; - NVIC_SetPriority(UART4_IRQn, 1); - } else - if (p_rx == P0_3) { - _uart = LPC_UART0; - NVIC_SetPriority(UART0_IRQn, 1); - } else - if (p_rx == P0_16 || p_rx == P2_1 || p_rx == P3_17) { - _uart = (LPC_UART_TypeDef*)LPC_UART1; - NVIC_SetPriority(UART1_IRQn, 1); - } else - if (p_rx == P0_11 || p_rx == P2_9 || p_rx == P4_23) { - _uart = LPC_UART2; - NVIC_SetPriority(UART2_IRQn, 1); - } -#elif defined(TARGET_LPC11UXX) - if (p_rx == p10) { - _uart = LPC_USART; - NVIC_SetPriority(UART_IRQn, 1); - } -#elif defined(TARGET_LPC11XX) - // LPC1114 support by Stanly Chen - if (p_rx == P1_6) { - _uart = (LPC_UART_TypeDef*)UART_0; - NVIC_SetPriority(UART_IRQn, 1); - } -#endif +DMX::DMX (PinName p_tx, PinName p_rx, unsigned int size) : + _dmx(p_tx, p_rx), + myDMXSize(size), + is_recived(0), + is_sent(0), + mode_tx(DMX_MODE_STOP), + mode_rx(DMX_MODE_BEGIN) +{ + data_tx = new char[myDMXSize]; + data_rx = new char[myDMXSize]; + + clear(); - _dmx.baud(250000); - _dmx.format(8, Serial::None, 2); - _dmx.attach(this, &DMX::int_rx, Serial::RxIrq); + _uart = new DUMMY_UART_TypeDef; +// NVIC_SetPriority(UART_IRQn, 1); -// timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN); + _dmx.baud(250000); + _dmx.format(8, Serial::None, 2); + _dmx.attach(this, &DMX::int_rx, Serial::RxIrq); +} + +DMX::~DMX() +{ + delete _uart; + delete[] data_tx; + delete[] data_rx; } -void DMX::put (int addr, int data) { - if (addr < 0 || addr >= DMX_SIZE) return; - data_tx[addr] = data; +void DMX::put(int addr, int data) +{ + if(addr < 0 || addr >= myDMXSize) + return; + data_tx[addr] = data; } -void DMX::put (unsigned char *buf, int addr, int len) { - if (addr < 0 || addr >= DMX_SIZE) return; - if (len > DMX_SIZE - addr) len = DMX_SIZE - addr; - memcpy(&data_tx[addr], buf, len); +void DMX::put(unsigned char *buf, int addr, int len) +{ + if(!len) + len = myDMXSize; + + if(addr < 0 || addr >= myDMXSize) + return; + if(len > myDMXSize - addr) + len = myDMXSize - addr; + memcpy(&data_tx[addr], buf, len); } -int DMX::get (int addr) { - if (addr < 0 || addr >= DMX_SIZE) return -1; - return data_rx[addr]; +int DMX::get(int addr) +{ + if(addr < 0 || addr >= myDMXSize) + return -1; + + return data_rx[addr]; } -void DMX::get (unsigned char *buf, int addr, int len) { - if (addr < 0 || addr >= DMX_SIZE) return; - if (len > DMX_SIZE - addr) len = DMX_SIZE - addr; - memcpy(buf, &data_rx[addr], len); +void DMX::get(unsigned char *buf, int addr, int len) +{ + if(!len) + len = myDMXSize; + + if(addr < 0 || addr >= myDMXSize) + return; + if(len > myDMXSize - addr) + len = myDMXSize - addr; + memcpy(buf, &data_rx[addr], len); } -void DMX::int_timer () { - - switch (mode_tx) { +void DMX::int_timer() +{ + switch(mode_tx) + { case DMX_MODE_BEGIN: // Break Time timeout01.detach(); @@ -134,90 +114,102 @@ _dmx.putc(DMX_START_CODE); #endif break; + } +} + +void DMX::int_tx() +{ + // Data + if(mode_tx == DMX_MODE_DATA) + { + if(addr_tx < myDMXSize) + { +#ifdef DMX_UART_DIRECT + _uart->THR = (uint8_t)data_tx[addr_tx]; +#else + _dmx.putc(data_tx[addr_tx]); +#endif + addr_tx ++; } + else + { + _dmx.attach(0, Serial::TxIrq); + mode_tx = DMX_MODE_BEGIN; + is_sent = 1; + timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN); + } + } } -void DMX::int_tx () { - // Data - if (mode_tx == DMX_MODE_DATA) { - if (addr_tx < DMX_SIZE) { +void DMX::int_rx() +{ + int flg, dat; + + flg = _uart->LSR; #ifdef DMX_UART_DIRECT - _uart->THR = (uint8_t)data_tx[addr_tx]; + dat = _uart->RBR; #else - _dmx.putc(data_tx[addr_tx]); -#endif - addr_tx ++; - } else { - _dmx.attach(0, Serial::TxIrq); - mode_tx = DMX_MODE_BEGIN; - is_sent = 1; - timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN); - } - } -} - -void DMX::int_rx () { - int flg, dat; - - flg = _uart->LSR; -#ifdef DMX_UART_DIRECT - dat = _uart->RBR; -#else - dat = _dmx.getc(); + dat = _dmx.getc(); #endif - if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) { - // Break Time - if (addr_rx >= 24 && mode_rx == DMX_MODE_DATA) { - is_recived = 1; - } - mode_rx = DMX_MODE_BREAK; - return; + if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) + { + // Break Time + if(addr_rx >= 24 && mode_rx == DMX_MODE_DATA) + { + is_recived = 1; + } + mode_rx = DMX_MODE_BREAK; + return; + } + + if(mode_rx == DMX_MODE_BREAK) + { + // Start Code + if (dat == DMX_START_CODE) + { + addr_rx = 0; + mode_rx = DMX_MODE_DATA; + } + else + { + mode_rx = DMX_MODE_ERROR; } - if (mode_rx == DMX_MODE_BREAK) { - - // Start Code - if (dat == DMX_START_CODE) { - addr_rx = 0; - mode_rx = DMX_MODE_DATA; - } else { - mode_rx = DMX_MODE_ERROR; - } + } + else if(mode_rx == DMX_MODE_DATA) + { + // Data + data_rx[addr_rx] = dat; + addr_rx ++; - } else - if (mode_rx == DMX_MODE_DATA) { - - // Data - data_rx[addr_rx] = dat; - addr_rx ++; - - if (addr_rx >= DMX_SIZE) { - is_recived = 1; - mode_rx = DMX_MODE_BEGIN; - } + if (addr_rx >= myDMXSize) + { + is_recived = 1; + mode_rx = DMX_MODE_BEGIN; } + } } -void DMX::start () { - if (mode_tx == DMX_MODE_STOP) { - mode_tx = DMX_MODE_BEGIN; - is_sent = 0; - timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN); - } +void DMX::start() +{ + if (mode_tx == DMX_MODE_STOP) + { + mode_tx = DMX_MODE_BEGIN; + is_sent = 0; + timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN); + } } -void DMX::stop () { - _dmx.attach(0, Serial::TxIrq); - timeout01.detach(); - mode_tx = DMX_MODE_STOP; +void DMX::stop() +{ + _dmx.attach(0, Serial::TxIrq); + timeout01.detach(); + mode_tx = DMX_MODE_STOP; } -void DMX::clear () { - int i; - - for (i = 0; i < DMX_SIZE; i ++) { - data_tx[i] = 0; - data_rx[i] = 0; - } +void DMX::clear() +{ + memset(data_tx, 0, myDMXSize); + memset(data_rx, 0, myDMXSize); }