27
27
Button::Button( int pin )
30
_state( digitalRead( pin )? false : true ),
31
_state_millis( ::millis() ),
37
void Button::add_event_at( int duration, int event_id )
39
_press_events[ duration ] = event_id;
35
_send_interim( true ),
36
_ignore_next_unpress( false )
41
void Button::set_event_times( int event_times[] )
43
_event_times = event_times;
47
void Button::set_press_mode( bool send_interim )
49
// if the button is down and we're switching from sending interim presses
50
// to not sending interim presses, we need to ignore the next unpress, or
51
// this button press may trigger events while being presses *and* events
52
// when it is unpressed.
53
if( _state_last && _send_interim && !send_interim )
54
_ignore_next_unpress = true;
57
_send_interim = send_interim;
49
64
unsigned long millis = ::millis();
51
// get state and check for change
52
67
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++ )
69
// if the button is pressed
72
// if it has just been pressed, record the time now and reset how much
73
// of the press we have already generated events for
75
_millis_state = millis;
79
// calculate time that has elapsed in total this press
80
unsigned long elapsed = millis - _millis_state;
82
// look through the events to see if any need to be triggered
83
for( int a = 0; _event_times[ a ]; a++ )
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;
85
// if this event is in the future, stop
86
if( (unsigned)_event_times[ a ] > elapsed ) break;
88
// if this event has already been triggered, skip
89
if( (unsigned)_event_times[ a ] <= _millis_done ) continue;
93
_pending_event = a + 1;
95
_interim_event = a + 1;
81
// update the duration we've accounted for
82
_state_duration = duration;
98
// update the amount of press we have processed
99
_millis_done = elapsed;
102
// if the button has just become unpressed and we're not sending interim
103
// events, we'll need to trigger it now
104
if( !state && _state_last && !_send_interim )
106
// unless we're being told not to, trigger any interim events
107
if( _ignore_next_unpress )
108
_ignore_next_unpress = false;
110
_pending_event = _interim_event;
112
// clear any interim event
89
int Button::get_triggered_event()
121
int Button::get_event()
123
int event = _pending_event;