Revision 6:622a294f70ab, committed 2016-05-23
- Comitter:
- Ayrton_L
- Date:
- Mon May 23 14:26:06 2016 +0000
- Parent:
- 5:256845339155
- Commit message:
- latest stable state
Changed in this revision
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