Ayrton Leyssens / DMX

Dependents:   ArtnetDMX

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DMX.cpp Source File

DMX.cpp

00001 #include "DMX.h"
00002 
00003 DMX::DMX (PinName p_tx, PinName p_rx) : _dmx(p_tx, p_rx) 
00004 {
00005     uint32_t I32_Teller;
00006     
00007     for (I32_Teller = 0; I32_Teller < 512; I32_Teller++) 
00008     {
00009         I8_Data[I32_Teller] = 0;
00010     }
00011     
00012     ZendStatus = STOP;
00013     if (p_tx == p9) 
00014     {
00015       _uart = LPC_UART3;
00016       NVIC_SetPriority(UART3_IRQn, 1);
00017     } 
00018     else if (p_tx == p13) 
00019     {
00020       _uart = (LPC_UART_TypeDef*)LPC_UART1;
00021       NVIC_SetPriority(UART1_IRQn, 1);
00022     } 
00023     else if (p_tx == p28) 
00024     {
00025       _uart = LPC_UART2;
00026       NVIC_SetPriority(UART2_IRQn, 1);
00027     }
00028     _dmx.baud(250000);
00029     _dmx.format(8, Serial::None, 2);                                                                // 8 databits, 2 stopbits
00030 
00031 }
00032 
00033 void DMX::V_PutData (int addr, int data) {
00034     if ((addr < 0) or (addr >= 512)) 
00035     {
00036         return;
00037     }
00038     I8_Data[addr] = data;
00039 }
00040 
00041 void DMX::V_InitTimer() 
00042 {
00043     switch (ZendStatus) 
00044     {
00045         case BEGIN:
00046         {
00047             T_Timer.detach();
00048             _uart->LCR |= (1 << 6);
00049             ZendStatus = BREAK;
00050             T_Timer.attach_us(this, &DMX::V_InitTimer, BREAK);
00051             break;
00052         }
00053         
00054         case BREAK:
00055         {
00056             T_Timer.detach();
00057             _uart->LCR &= ~(1 << 6);
00058             ZendStatus = MAB;
00059             T_Timer.attach_us(this, &DMX::V_InitTimer, MAB);
00060             break;
00061         }
00062         case MAB:
00063         {
00064             T_Timer.detach();
00065             I32_m_Addr = 0;
00066             ZendStatus = DATA;
00067             _dmx.attach(this, &DMX::V_InitSend, Serial::TxIrq);
00068             while(!(_uart->LSR & (1<<5)));
00069             _uart->THR = 0;                                                         //startcode 0 => Algemene startcode voor dimmer (eigenlijk alles dus wat gewone dmx betreft)
00070             break;
00071         }
00072         default:
00073         {
00074             printf("Error: DMX StATUS NIET GEKEND");
00075             break;
00076         }
00077     }
00078 }
00079 
00080 void DMX::V_InitSend() 
00081 {
00082     if (ZendStatus == DATA) 
00083     {
00084         if (I32_m_Addr < 512) 
00085         {
00086             _uart->THR = I8_Data[I32_m_Addr];
00087             I32_m_Addr++;
00088         } 
00089         else 
00090         {
00091             _dmx.attach(0, Serial::TxIrq);                                                  //TxIrq Interrupt zetten om serieel te verzenden :)
00092             ZendStatus = BEGIN;
00093             T_Timer.attach_us(this, &DMX::V_InitTimer, 10);
00094         }
00095     }
00096 }
00097 
00098 void DMX::V_Start() 
00099 {
00100     if (ZendStatus == STOP) 
00101     {
00102         ZendStatus = BEGIN;
00103         T_Timer.attach_us(this, &DMX::V_InitTimer, 10);
00104     }
00105 }
00106 
00107 void DMX::V_Stop () 
00108 {
00109     _dmx.attach(NULL, Serial::TxIrq);                                                          //dmx stoppen doorinterrupt te laten verwijzen naar NULL-pointer
00110     T_Timer.detach();
00111     ZendStatus = STOP;
00112 }