4
* Copyright (C) 2011 Tim Marston <tim@ed.am> and Dan Marston.
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
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.
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.
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/>.
23
1
#include <Arduino.h>
27
5
Button::Button( int pin )
30
_state( digitalRead( pin )? false : true ),
31
_state_millis( ::millis() ),
8
_last_state( digitalRead( pin )? true : false ),
9
_last_millis( millis() )
49
unsigned long millis = ::millis();
26
int millis = ::millis();
51
28
// get state and check for change
52
bool state = digitalRead( _pin )? false : true;
56
_state_millis = millis;
60
// if button has been pressed for any amount of time
61
if( state && _state_millis < millis )
63
// calculate new duration for this state
64
unsigned long duration = millis - _state_millis;
66
// check through events to see if the button has been
67
// pressed long enough to trigger one
68
for( std::map< int, int >::iterator i = _press_events.begin();
69
i != _press_events.end(); i++ )
29
bool state = digitalRead( _pin )? true : false;
30
if( state != _last_state )
32
// if the button has become unpressed
71
// if this event is in the future, we can stop looking
72
if( duration < (unsigned long)i->first )
75
// if this event happened since the previous update, we
77
if( _state_duration < (unsigned long)i->first )
78
_event_id = i->second;
35
// check through events to see if it had been pressed long enough
37
int duration = millis - _last_millis;
38
for( std::map< int, int >::iterator i = _press_events.begin();
39
i != _press_events.end(); i++ )
41
if( duration > i->first )
42
_event_id = i->second;
81
// update the duration we've accounted for
82
_state_duration = duration;
50
_last_millis = millis;