/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock
56 by edam
updated software to include drawing abstraction infrastructure
1
#include <Arduino.h>
2
#include <button.h>
3
4
5
Button::Button( int pin )
6
	:
7
	_pin( pin ),
8
	_last_state( digitalRead( pin )? true : false ),
9
	_last_millis( millis() )
10
{
11
}
12
13
14
void Button::add_event_at( int duration, int event_id )
15
{
16
	_press_events[ duration ] = event_id;
17
}
18
19
20
int Button::update()
21
{
22
	// reset event
23
	_event_id = 0;
24
25
	// get time
26
	int millis = ::millis();
27
28
	// get state and check for change
29
	bool state = digitalRead( _pin )? true : false;
30
	if( state != _last_state )
31
	{
32
		// if the button has become unpressed
33
		if( !state )
34
		{
35
			// check through events to see if it had been pressed long enough
36
			// to trigger one
37
			int duration = millis - _last_millis;
38
			for( std::map< int, int >::iterator i = _press_events.begin();
39
				 i != _press_events.end(); i++ )
40
			{
41
				if( duration > i->first )
42
					_event_id = i->second;
43
				else
44
					break;
45
			}
46
		}
47
48
		// update last state
49
		_last_state = state;
50
		_last_millis = millis;
51
	}
52
53
	return _event_id;
54
}
55
56
57
int Button::get_triggered_event()
58
{
59
	return _event_id;
60
}