/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock
58 by edam
removed Bounce library and updated/fixed new code
1
/*
2
 * button.cc
3
 *
4
 * Copyright (C) 2011 Tim Marston <tim@ed.am> and Dan Marston.
5
 *
6
 * This file is part of propeller-clock (hereafter referred to as "this
7
 * program"). See http://ed.am/dev/software/arduino/propeller-clock for more
8
 * information.
9
 *
10
 * This program is free software: you can redistribute it and/or modify
11
 * it under the terms of the GNU Lesser General Public License as published
12
 * by the Free Software Foundation, either version 3 of the License, or
13
 * (at your option) any later version.
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU Lesser General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Lesser General Public License
21
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
 */
56 by edam
updated software to include drawing abstraction infrastructure
23
#include <Arduino.h>
24
#include <button.h>
25
26
27
Button::Button( int pin )
28
	:
29
	_pin( pin ),
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
30
	_state( false ),
31
	_state_millis( 0 ),
32
	_state_duration_done( 0 ),
33
	_pending_event( 0 ),
34
	_send_interim( false ),
35
	_ignore_next_unpress( false )
59 by edam
removed ulibc, fixed button, added text rendering
36
{
37
}
38
39
40
void Button::set_event_times( int event_times[] )
41
{
42
	_event_times = event_times;
43
}
44
45
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
46
void Button::set_press_mode( bool send_interim )
47
{
48
	// if the button is down and we're switching from sending interim presses
49
	// to not sending interim presses, we need to ignore the next unpress, or
50
	// this button press may trigger events while being presses *and* events
51
	// when it is unpressed.
52
	if( _state && _send_interim && !send_interim )
53
		_ignore_next_unpress = true;
54
55
	// set mode
56
	_send_interim = send_interim;
57
}
58
59
59 by edam
removed ulibc, fixed button, added text rendering
60
void Button::update()
61
{
56 by edam
updated software to include drawing abstraction infrastructure
62
	// get time
58 by edam
removed Bounce library and updated/fixed new code
63
	unsigned long millis = ::millis();
56 by edam
updated software to include drawing abstraction infrastructure
64
65
	// get state and check for change
58 by edam
removed Bounce library and updated/fixed new code
66
	bool state = digitalRead( _pin )? false : true;
67
	if( state != _state )
68
	{
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
69
		// if we're not sending interim presses, we care about when the button
70
		// is being unpressed
71
		if( !_send_interim && !state )
72
		{
73
			// are we being told to ignore the next unpress?
74
			if( _ignore_next_unpress )
75
				_ignore_next_unpress = false;
76
			else
77
			{
78
				// check through events to see if the button was pressed long
79
				// enough to trigger one
80
				for( int a = 0; _event_times[ a ]; a++ )
81
				{
82
					// if this event is in the future, we can stop looking
83
					if( _state_millis < (unsigned long)_event_times[ a ] )
84
						break;
85
					
86
					// trigger it
87
					_pending_event = a + 1;
88
				}
89
			}
90
		}
91
		
92
		// reset state
58 by edam
removed Bounce library and updated/fixed new code
93
		_state = state;
94
		_state_millis = millis;
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
95
		_state_duration_done = 0;
58 by edam
removed Bounce library and updated/fixed new code
96
	}
97
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
98
	// if we are sending interim presses, we care about all the time that the
99
	// button is being pressed
100
	if( _send_interim && state )
58 by edam
removed Bounce library and updated/fixed new code
101
	{
102
		// calculate new duration for this state
103
		unsigned long duration = millis - _state_millis;
104
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
105
		// check through events to see if the button has been pressed long
106
		// enough to trigger one
59 by edam
removed ulibc, fixed button, added text rendering
107
		for( int a = 0; _event_times[ a ]; a++ )
56 by edam
updated software to include drawing abstraction infrastructure
108
		{
58 by edam
removed Bounce library and updated/fixed new code
109
			// if this event is in the future, we can stop looking
59 by edam
removed ulibc, fixed button, added text rendering
110
			if( duration < (unsigned long)_event_times[ a ] )
58 by edam
removed Bounce library and updated/fixed new code
111
				break;
112
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
113
			// if this event happened since the previous update, trigger it
114
			if( _state_duration_done < (unsigned long)_event_times[ a ] )
59 by edam
removed ulibc, fixed button, added text rendering
115
				_pending_event = a + 1;
56 by edam
updated software to include drawing abstraction infrastructure
116
		}
117
58 by edam
removed Bounce library and updated/fixed new code
118
		// update the duration we've accounted for
76 by edam
switch button to no interim presses during settings mode; added NVRAM support
119
		_state_duration_done = duration;
56 by edam
updated software to include drawing abstraction infrastructure
120
	}
121
}
122
123
59 by edam
removed ulibc, fixed button, added text rendering
124
int Button::get_event()
56 by edam
updated software to include drawing abstraction infrastructure
125
{
59 by edam
removed ulibc, fixed button, added text rendering
126
	int event = _pending_event;
127
	_pending_event = 0;
128
	return event;
56 by edam
updated software to include drawing abstraction infrastructure
129
}