DMX Library for STM devices

Dependents:   DISCO-F746NG_DMX-Test

Fork of DMX by Suga koubou

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);
 }