Dependents:   ArtnetDMX

Files at this revision

API Documentation at this revision

Comitter:
Ayrton_L
Date:
Mon May 23 14:26:06 2016 +0000
Parent:
5:256845339155
Commit message:
latest stable state

Changed in this revision

DMX.cpp Show annotated file Show diff for this revision Revisions of this file
DMX.h Show annotated file Show diff for this revision Revisions of this file
diff -r 256845339155 -r 622a294f70ab DMX.cpp
--- a/DMX.cpp	Fri Mar 18 00:44:16 2016 +0000
+++ b/DMX.cpp	Mon May 23 14:26:06 2016 +0000
@@ -1,122 +1,112 @@
 #include "DMX.h"
 
-DMX::DMX(PinName pin) : _pin(pin) 
-{
-    this->I32_m_BreakTime = 88;
-    this->I32_m_MABTime = 8;
-    this->I32_m_StartCodeTime = 44;
-    this->I32_m_BitTime = 4;
-    this->I32_m_ChannelCounter = 0;
-    this->I32_m_BitCounter = 0;
-    uint32_t i;
-    for(i = 0; i < 512; i++)
-    {
-        this->I8_m_Data[i] = 60;
-    }
-    this->_pin = 0;   
-    return;
-}
-
-DMX::~DMX()
+DMX::DMX (PinName p_tx, PinName p_rx) : _dmx(p_tx, p_rx) 
 {
-    delete[] &I32_m_BreakTime;
-    delete[] &I32_m_MABTime;
-    delete[] &I32_m_StartCodeTime;
-    delete[] &I32_m_BitTime;
-    delete[] &_pin;
-    delete[] &I8_m_Data;
-    return;
-}
+    uint32_t I32_Teller;
+    
+    for (I32_Teller = 0; I32_Teller < 512; I32_Teller++) 
+    {
+        I8_Data[I32_Teller] = 0;
+    }
+    
+    ZendStatus = STOP;
+    if (p_tx == p9) 
+    {
+      _uart = LPC_UART3;
+      NVIC_SetPriority(UART3_IRQn, 1);
+    } 
+    else if (p_tx == p13) 
+    {
+      _uart = (LPC_UART_TypeDef*)LPC_UART1;
+      NVIC_SetPriority(UART1_IRQn, 1);
+    } 
+    else if (p_tx == p28) 
+    {
+      _uart = LPC_UART2;
+      NVIC_SetPriority(UART2_IRQn, 1);
+    }
+    _dmx.baud(250000);
+    _dmx.format(8, Serial::None, 2);                                                                // 8 databits, 2 stopbits
 
-void DMX::V_SendDMX()
-{
-    _pin = 0;
-    wait_us(88);
-    DMX::V_SendMAB();
-}
-
-void DMX::V_SendMAB()
-{
-    _pin = 1;
-    wait_us(8);
-    DMX::V_SendSC();
 }
 
-void DMX::V_SendSC()
-{
-    _pin = 0;
-    wait_us(44);
-    DMX::V_SendData();;
+void DMX::V_PutData (int addr, int data) {
+    if ((addr < 0) or (addr >= 512)) 
+    {
+        return;
+    }
+    I8_Data[addr] = data;
 }
 
-void DMX::V_SendData()
+void DMX::V_InitTimer() 
 {
-    if(I32_m_BitCounter == 0)
-    {
-        _pin = 0;
-        I32_m_BitCounter++;
-        wait_us(4);
-        DMX::V_SendData();
-    }
-    else if(I32_m_BitCounter == 9 )
-    {
-        _pin = 1;
-        I32_m_BitCounter = 0;
-        I32_m_ChannelCounter++;
-        wait_us(8);
-        DMX::V_SendData();
-    }
-    else
+    switch (ZendStatus) 
     {
-        if(I32_m_ChannelCounter < 512)
+        case BEGIN:
         {
-            if(I8_m_Data[I32_m_ChannelCounter] & 0x01 == 0x01)
-            {
-                _pin = 1;
-            }
-            else if(I8_m_Data[I32_m_ChannelCounter] & 0x01 == 0x00)
-            {
-                _pin =0;
-            }
-            I8_m_Data[I32_m_ChannelCounter] = I8_m_Data[I32_m_ChannelCounter] >> 1;
-            I32_m_BitCounter++;
-            wait_us(4);
-            DMX::V_SendData();
-        }
-        else
-        {
-            I32_m_ChannelCounter = 0;
-            I32_m_BitCounter = 0;
+            T_Timer.detach();
+            _uart->LCR |= (1 << 6);
+            ZendStatus = BREAK;
+            T_Timer.attach_us(this, &DMX::V_InitTimer, BREAK);
+            break;
         }
         
+        case BREAK:
+        {
+            T_Timer.detach();
+            _uart->LCR &= ~(1 << 6);
+            ZendStatus = MAB;
+            T_Timer.attach_us(this, &DMX::V_InitTimer, MAB);
+            break;
+        }
+        case MAB:
+        {
+            T_Timer.detach();
+            I32_m_Addr = 0;
+            ZendStatus = DATA;
+            _dmx.attach(this, &DMX::V_InitSend, Serial::TxIrq);
+            while(!(_uart->LSR & (1<<5)));
+            _uart->THR = 0;                                                         //startcode 0 => Algemene startcode voor dimmer (eigenlijk alles dus wat gewone dmx betreft)
+            break;
+        }
+        default:
+        {
+            printf("Error: DMX StATUS NIET GEKEND");
+            break;
+        }
     }
 }
 
-void DMX::V_SetBreak(uint32_t I32_BreakTime)
+void DMX::V_InitSend() 
 {
-    I32_m_BreakTime = I32_BreakTime;
-}
-
-void DMX::V_SetMAB(uint32_t I32_MABTime)
-{
-    I32_m_MABTime = I32_MABTime;
+    if (ZendStatus == DATA) 
+    {
+        if (I32_m_Addr < 512) 
+        {
+            _uart->THR = I8_Data[I32_m_Addr];
+            I32_m_Addr++;
+        } 
+        else 
+        {
+            _dmx.attach(0, Serial::TxIrq);                                                  //TxIrq Interrupt zetten om serieel te verzenden :)
+            ZendStatus = BEGIN;
+            T_Timer.attach_us(this, &DMX::V_InitTimer, 10);
+        }
+    }
 }
 
-void DMX::V_SetSC(uint32_t I32_StartCodeTime)
+void DMX::V_Start() 
 {
-    I32_m_StartCodeTime = I32_StartCodeTime;
+    if (ZendStatus == STOP) 
+    {
+        ZendStatus = BEGIN;
+        T_Timer.attach_us(this, &DMX::V_InitTimer, 10);
+    }
 }
 
-void DMX::V_SetBitTime(uint32_t I32_BitTime)
-{
-    I32_m_BitTime = I32_BitTime;
-}
-
-void DMX::V_SetData(uint8_t I8_Data[512])
+void DMX::V_Stop () 
 {
-    uint32_t i;
-    for(i = 0; i < 512; i++)
-    {
-        I8_m_Data[i] = I8_Data[i];
-    }
+    _dmx.attach(NULL, Serial::TxIrq);                                                          //dmx stoppen doorinterrupt te laten verwijzen naar NULL-pointer
+    T_Timer.detach();
+    ZendStatus = STOP;
 }
diff -r 256845339155 -r 622a294f70ab DMX.h
--- a/DMX.h	Fri Mar 18 00:44:16 2016 +0000
+++ b/DMX.h	Mon May 23 14:26:06 2016 +0000
@@ -1,33 +1,38 @@
 #ifndef DMX_H
 #define DMX_H
+
 #include "mbed.h"
-class DMX
+
+enum DMX_STATUS {
+    BEGIN,
+    START,
+    BREAK,
+    MAB,
+    DATA,
+    STOP,
+};
+
+class DMX 
 {
     public:
-        DMX(PinName pin);
-        ~DMX();
+        DMX (PinName p_tx, PinName p_rx); 
+        void V_PutData(int addr, int data);
         
-        void V_SetBreak(uint32_t I32_BreakTime);
-        void V_SetMAB(uint32_t I32_MABTime);
-        void V_SetSC(uint32_t I32_StartCodeTime);
-        void V_SetBitTime(uint32_t I32_BitTime);
-        void V_SetData(uint8_t I8_Data[512]);
-        
-        void V_SendDMX();
-        
+        void V_Start ();
+        void V_Stop ();
+    
     private:
-        DigitalOut _pin;
-        uint32_t I32_m_BreakTime;
-        uint32_t I32_m_MABTime;
-        uint32_t I32_m_StartCodeTime;
-        uint32_t I32_m_BitTime;
-        uint32_t I32_m_ChannelCounter;
-        uint32_t I32_m_BitCounter;
+        
+        Serial _dmx;                                                //seriele poort / uart voor dmx gebruiken
+        Timeout T_Timer;   
+        LPC_UART_TypeDef *_uart;                                    //definitie om uart te kunnen gebruiken als cross fucntie gebruik
         
-        uint8_t I8_m_Data[512];
-        
-        void V_SendMAB();
-        void V_SendSC();
-        void V_SendData();
+        void V_InitTimer();
+        void V_InitSend ();
+    
+        volatile DMX_STATUS ZendStatus;
+        volatile uint32_t I32_m_Addr;
+        uint8_t I8_Data[512];
 };
+
 #endif
\ No newline at end of file