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;
32
_state_duration_done( 0 ),
34
_send_interim( false ),
35
_ignore_next_unpress( false )
40
void Button::set_event_times( int event_times[] )
42
_event_times = event_times;
46
void Button::set_press_mode( bool send_interim )
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;
56
_send_interim = send_interim;
49
63
unsigned long millis = ::millis();
52
66
bool state = digitalRead( _pin )? false : true;
53
67
if( state != _state )
69
// if we're not sending interim presses, we care about when the button
71
if( !_send_interim && !state )
73
// are we being told to ignore the next unpress?
74
if( _ignore_next_unpress )
75
_ignore_next_unpress = false;
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++ )
82
// if this event is in the future, we can stop looking
83
if( _state_millis < (unsigned long)_event_times[ a ] )
87
_pending_event = a + 1;
56
94
_state_millis = millis;
95
_state_duration_done = 0;
60
// if button has been pressed for any amount of time
61
if( state && _state_millis < millis )
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 )
63
102
// calculate new duration for this state
64
103
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++ )
105
// check through events to see if the button has been pressed long
106
// enough to trigger one
107
for( int a = 0; _event_times[ a ]; a++ )
71
109
// if this event is in the future, we can stop looking
72
if( duration < (unsigned long)i->first )
110
if( duration < (unsigned long)_event_times[ a ] )
75
// if this event happened since the previous update, we
77
if( _state_duration < (unsigned long)i->first )
78
_event_id = i->second;
113
// if this event happened since the previous update, trigger it
114
if( _state_duration_done < (unsigned long)_event_times[ a ] )
115
_pending_event = a + 1;
81
118
// update the duration we've accounted for
82
_state_duration = duration;
119
_state_duration_done = duration;
89
int Button::get_triggered_event()
124
int Button::get_event()
126
int event = _pending_event;