Driver to control leds one at a time or in group

Dependents:   handling_leds leds toggle writing ... more

Hotboards_leds.cpp

Committer:
Hotboards
Date:
2016-02-27
Revision:
0:ea0715867677

File content as of revision 0:ea0715867677:

/*
  Hotboards_leds.cpp - Driver to control leds one at a time or in group
  Hotboards leds board (http://hotboards.org)
  Created by Diego Perez, January 16, 2016.
  Released into the public domain.
*/

#include "Hotboards_leds.h"

#define bitRead( var, bit )           (((var) >> (bit)) & 0x01)
#define bitWrite( var, bit, val )     (val) ? (var) |= (1<<(bit)) : (var) &= ~(1<<(bit))

Hotboards_leds::Hotboards_leds( PinName led0, bool on )
{
    _leds = 1;
    _state = 0;
    _on = on;
    begin( 0, led0 );
}

Hotboards_leds::Hotboards_leds( PinName led1, PinName led0, bool on )
{
    _leds = 2;
    _state = 0;
    _on = on;
    begin( 0, led0 );
    begin( 1, led1 );
}

Hotboards_leds::Hotboards_leds( PinName led2, PinName led1, PinName led0, bool on )
{
    _leds = 3;
    _state = 0;
    _on = on;
    begin( 0, led0 );
    begin( 1, led1 );
    begin( 2, led2 );
}

Hotboards_leds::Hotboards_leds( PinName led3, PinName led2, PinName led1, PinName led0, bool on )
{
    _leds = 4;
    _state = 0;
    _on = on;
    begin( 0, led0 );
    begin( 1, led1 );
    begin( 2, led2 );
    begin( 3, led3 );
}

Hotboards_leds::Hotboards_leds( PinName led4, PinName led3, PinName led2, PinName led1, PinName led0, bool on )
{
    _leds = 5;
    _state = 0;
    _on = on;
    begin( 0, led0 );
    begin( 1, led1 );
    begin( 2, led2 );
    begin( 3, led3 );
    begin( 4, led4 );
}

Hotboards_leds::Hotboards_leds( PinName led5, PinName led4, PinName led3, PinName led2, PinName led1, PinName led0, bool on )
{
    _leds = 6;
    _state = 0;
    _on = on;
    begin( 0, led0 );
    begin( 1, led1 );
    begin( 2, led2 );
    begin( 3, led3 );
    begin( 4, led4 );
    begin( 5, led5 );
}

Hotboards_leds::Hotboards_leds( PinName led6, PinName led5, PinName led4, PinName led3, PinName led2, PinName led1, PinName led0, bool on )
{
    _leds = 7;
    _state =  0;
    _on = on;
    begin( 0, led0 );
    begin( 1, led1 );
    begin( 2, led2 );
    begin( 3, led3 );
    begin( 4, led4 );
    begin( 5, led5 );
    begin( 6, led6 );
}

Hotboards_leds::Hotboards_leds( PinName led7, PinName led6, PinName led5, PinName led4, PinName led3, PinName led2, PinName led1, PinName led0, bool on )
{
    _leds = 8;
    _state = 0;
    _on = on;
    begin( 0, led0 );
    begin( 1, led1 );
    begin( 2, led2 );
    begin( 3, led3 );
    begin( 4, led4 );
    begin( 5, led5 );
    begin( 6, led6 );
    begin( 7, led7 );
}

void Hotboards_leds::turnOn( uint8_t led )
{
    bitWrite( _state, led, _on );
    _pin[ led ]->write( bitRead( _state, led ) );
    //_pin[ led ]->write( 1 );
}
void Hotboards_leds::turnOff( uint8_t led )
{
    bitWrite( _state, led, !_on );
    _pin[ led ]->write( bitRead( _state, led ) );
    //_pin[ led ]->write( 0 );
}

void Hotboards_leds::toggle( uint8_t led )
{
    if( bitRead( _state, led ) == _on )
    {
        turnOff( led );
    }
    else
    {
        turnOn( led );
    }
}

uint8_t Hotboards_leds::read( uint8_t led )
{
    uint8_t i;
    uint8_t val = 0;

    if( led == 0xff )
    {
        for( i=0 ; i<_leds ; i++ )
        {
            bitWrite( val, i, bitRead( _state, i ) );
        }
    }
    else
    {
        val = bitRead( _state, led );
    }
    return val;
}

void Hotboards_leds::write( uint8_t val )
{
    uint8_t i;
    for( i=0 ; i<_leds ; i++ )
    {
        if( bitRead( val, i ) )
        {
            turnOn( i );
        }
        else
        {
            turnOff( i );
        }
    }
}

void Hotboards_leds::begin( uint8_t led, PinName pin )
{
    // set the digital outpout that holds the led
    _pin[ led ] = new DigitalOut( pin );
    // turn off led (as initial state)
    bitWrite( _state, led, !_on );
    _pin[ led ]->write( !_on );
}