Driver to control leds one at a time or in group

Dependents:   handling_leds leds toggle writing ... more

Revision:
0:ea0715867677
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Hotboards_leds.cpp	Sat Feb 27 23:35:58 2016 +0000
@@ -0,0 +1,172 @@
+/*
+  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 );
+}