27
27
Button::Button( int pin )
30
_state( digitalRead( pin )? false : true ),
31
_state_millis( ::millis() ),
34
_last_real_state( false ),
35
_millis_real_state( 0 )
47
49
unsigned long millis = ::millis();
49
// get state and check for change
50
bool state = digitalRead( _pin )? false : true;
54
_state_millis = millis;
53
bool real_state = digitalRead( _pin )? false : true;
55
// if real state has changed, reset the timer
56
if( real_state != _last_real_state ) {
57
_last_real_state = real_state;
58
_millis_real_state = millis;
58
// if button has been pressed for any amount of time
59
if( state && millis > _state_millis )
61
// work out current state; if the real state timer has elapsed, set our
62
// state to real state
64
if( _last_real_state != state && millis - _millis_real_state > 15 )
65
state = _last_real_state;
67
// if the button is pressed
61
// calculate new duration for this state
62
unsigned long duration = millis - _state_millis;
64
// check through events to see if the button has been
65
// pressed long enough to trigger one
70
// if it has just been pressed, record the time now and reset how much
71
// of the press we have already generated events for
73
_millis_state = millis;
77
// calculate time that has elapsed in total this press
78
unsigned long elapsed = millis - _millis_state;
80
// look through the events to see if any need to be triggered
66
81
for( int a = 0; _event_times[ a ]; a++ )
68
// if this event is in the future, we can stop looking
69
if( duration < (unsigned long)_event_times[ a ] )
72
// if this event happened since the previous update, we
74
if( _state_duration < (unsigned long)_event_times[ a ] )
75
_pending_event = a + 1;
83
// if this event is in the future, stop
84
if( (unsigned)_event_times[ a ] > elapsed ) break;
86
// if this event has already been triggered, skip
87
if( (unsigned)_event_times[ a ] <= _millis_done ) continue;
90
_pending_event = a + 1;
78
// update the duration we've accounted for
79
_state_duration = duration;
93
// update the amount of press we have processed
94
_millis_done = elapsed;