Written by Ayrton Leyssens DMX library, bitbang method for LPC1768

Dependents:   ArtnetDMX

DMX.cpp

Committer:
Ayrton_L
Date:
2016-03-18
Revision:
5:256845339155
Parent:
4:54754f9736f1
Child:
6:622a294f70ab

File content as of revision 5:256845339155:

#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()
{
    delete[] &I32_m_BreakTime;
    delete[] &I32_m_MABTime;
    delete[] &I32_m_StartCodeTime;
    delete[] &I32_m_BitTime;
    delete[] &_pin;
    delete[] &I8_m_Data;
    return;
}

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_SendData()
{
    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
    {
        if(I32_m_ChannelCounter < 512)
        {
            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;
        }
        
    }
}

void DMX::V_SetBreak(uint32_t I32_BreakTime)
{
    I32_m_BreakTime = I32_BreakTime;
}

void DMX::V_SetMAB(uint32_t I32_MABTime)
{
    I32_m_MABTime = I32_MABTime;
}

void DMX::V_SetSC(uint32_t I32_StartCodeTime)
{
    I32_m_StartCodeTime = I32_StartCodeTime;
}

void DMX::V_SetBitTime(uint32_t I32_BitTime)
{
    I32_m_BitTime = I32_BitTime;
}

void DMX::V_SetData(uint8_t I8_Data[512])
{
    uint32_t i;
    for(i = 0; i < 512; i++)
    {
        I8_m_Data[i] = I8_Data[i];
    }
}