Driver to read switches, one at a time or an entire dip-sw
Dependents: input dip_switch dipsw_change input ... more
Diff: Hotboards_switches.cpp
- Revision:
- 0:8e569e04a0fb
- Child:
- 1:dfb1302f847d
diff -r 000000000000 -r 8e569e04a0fb Hotboards_switches.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Hotboards_switches.cpp Sun Feb 28 01:32:55 2016 +0000
@@ -0,0 +1,164 @@
+/*
+ Hotboards_switches.cpp - Driver to control interrupts
+ Hotboards Dip-switch board (http://hotboards.org)
+ Created by Diego Perez, January 16, 2016.
+ Released into the public domain.
+*/
+
+#include "Hotboards_switches.h"
+
+#define bitRead( var, bit ) (((var) >> (bit)) & 0x01)
+#define bitWrite( var, bit, val ) (val) ? (var) |= (1<<(bit)) : (var) &= ~(1<<(bit))
+
+Hotboards_switches::Hotboards_switches( PinName sw0, bool close )
+{
+ _sws = 1;
+ _close = close;
+ begin( 0, sw0 );
+}
+
+Hotboards_switches::Hotboards_switches( PinName sw1, PinName sw0, bool close )
+{
+ _sws = 2;
+ _close = close;
+ begin( 0, sw0 );
+ begin( 1, sw1 );
+}
+
+Hotboards_switches::Hotboards_switches( PinName sw2, PinName sw1, PinName sw0, bool close )
+{
+ _sws = 3;
+ _close = close;
+ begin( 0, sw0 );
+ begin( 1, sw1 );
+ begin( 2, sw2 );
+}
+
+Hotboards_switches::Hotboards_switches( PinName sw3, PinName sw2, PinName sw1, PinName sw0, bool close )
+{
+ _sws = 4;
+ _close = close;
+ begin( 0, sw0 );
+ begin( 1, sw1 );
+ begin( 2, sw2 );
+ begin( 3, sw3 );
+}
+
+Hotboards_switches::Hotboards_switches( PinName sw4, PinName sw3, PinName sw2, PinName sw1, PinName sw0, bool close )
+{
+ _sws = 5;
+ _close = close;
+ begin( 0, sw0 );
+ begin( 1, sw1 );
+ begin( 2, sw2 );
+ begin( 3, sw3 );
+ begin( 4, sw4 );
+}
+
+Hotboards_switches::Hotboards_switches( PinName sw5, PinName sw4, PinName sw3, PinName sw2, PinName sw1, PinName sw0, bool close )
+{
+ _sws = 6;
+ _close = close;
+ begin( 0, sw0 );
+ begin( 1, sw1 );
+ begin( 2, sw2 );
+ begin( 3, sw3 );
+ begin( 4, sw4 );
+ begin( 5, sw5 );
+}
+
+Hotboards_switches::Hotboards_switches( PinName sw6, PinName sw5, PinName sw4, PinName sw3, PinName sw2, PinName sw1, PinName sw0, bool close )
+{
+ _sws = 7;
+ _close = close;
+ begin( 0, sw0 );
+ begin( 1, sw1 );
+ begin( 2, sw2 );
+ begin( 3, sw3 );
+ begin( 4, sw4 );
+ begin( 5, sw5 );
+ begin( 6, sw6 );
+}
+
+Hotboards_switches::Hotboards_switches( PinName sw7, PinName sw6, PinName sw5, PinName sw4, PinName sw3, PinName sw2, PinName sw1, PinName sw0, bool close )
+{
+ _sws = 8;
+ _close = close;
+ begin( 0, sw0 );
+ begin( 1, sw1 );
+ begin( 2, sw2 );
+ begin( 3, sw3 );
+ begin( 4, sw4 );
+ begin( 5, sw5 );
+ begin( 6, sw6 );
+ begin( 7, sw7 );
+}
+
+uint8_t Hotboards_switches::read( uint8_t sw )
+{
+ uint8_t i;
+ uint8_t val = 0;
+
+ if( sw == 0xff )
+ {
+ for( i=0 ; i<_sws ; i++ )
+ {
+ bitWrite( val, i, readSw( i ) );
+ }
+ }
+ else
+ {
+ val = readSw( sw );
+ }
+ return val;
+}
+
+bool Hotboards_switches::hasItChange( uint8_t sw )
+{
+ uint8_t i;
+ bool isChanged = 0;
+
+ if( sw == 0xff )
+ {
+ for( i=0 ; i<_sws ; i++ )
+ {
+ isChanged |= hasItChangeSw( i );
+ }
+ }
+ else
+ {
+ isChanged = hasItChangeSw( sw );
+ }
+
+ return isChanged;
+}
+
+void Hotboards_switches::begin( uint8_t sw, PinName pin )
+{
+ _sw[ sw ] = new DigitalIn( pin );;
+}
+
+bool Hotboards_switches::readSw( uint8_t sw )
+{
+ bool val = _sw[ sw ];
+ if( _close == 0 ) val = !val;
+ return val;
+}
+
+bool Hotboards_switches::hasItChangeSw( uint8_t sw )
+{
+ bool swState;
+ bool isChanged = 0;
+ // leemos el boton de la tarjeta
+ swState = read( sw );
+
+ // comparemos el estado actual con la anterior lectura
+ if( swState != bitRead( _lastSwState, sw ) )
+ {
+ // si el estado cambio esque recien se presiono
+ isChanged = 1;
+ }
+ // respaldamos el esatdo actual para compararlo la siguiente vez que preguntemos
+ bitWrite( _lastSwState, sw, swState );
+ return isChanged;
+}
Hotboards switch