/* || @description || | Return the bitRead(state,CURRENT) of the switch || # || || @return true if button is pressed */ bool Button::isPressed(void) { //save the previous value bitWrite(state,PREVIOUS,bitRead(state,CURRENT)); //get the current status of the pin if (digitalRead(pin) == mode) { //currently the button is not pressed bitWrite(state,CURRENT,false); } else { //currently the button is pressed bitWrite(state,CURRENT,true); } //handle state changes if (bitRead(state,CURRENT) != bitRead(state,PREVIOUS)) { //the state changed to PRESSED if (bitRead(state,CURRENT) == true) { numberOfPresses++; if (cb_onPress) { cb_onPress(*this); } //fire the onPress event pressedStartTime = millis(); //start timing triggeredHoldEvent = false; } else //the state changed to RELEASED { if (cb_onRelease) { cb_onRelease(*this); } //fire the onRelease event if (cb_onClick) { cb_onClick(*this); } //fire the onClick event AFTER the onRelease //reset states (for timing and for event triggering) pressedStartTime = -1; } //note that the state changed bitWrite(state,CHANGED,true); } else { //note that the state did not change bitWrite(state,CHANGED,false); //should we trigger a onHold event? if (pressedStartTime!=-1 && !triggeredHoldEvent) { if (millis()-pressedStartTime > holdEventThreshold) { if (cb_onHold) { cb_onHold(*this); triggeredHoldEvent = true; } } } } return bitRead(state,CURRENT); }
/* || @description || | Read and write states; issue callbacks || # || || @return true if button is pressed */ void Button::process(void) { //save the previous value bitWrite(state,PREVIOUS,bitRead(state,CURRENT)); //get the current status of the pin if (digitalRead(pin) == mode) { //currently the button is not pressed bitWrite(state,CURRENT,false); } else { //currently the button is pressed bitWrite(state,CURRENT,true); } //handle state changes if (bitRead(state,CURRENT) != bitRead(state,PREVIOUS)) { unsigned int interval = millis() - debounceStartTime; // if(debounceMode){ // Serial.print("debounceStartTime: "); // Serial.print(debounceStartTime); // Serial.print("\tdebounceDuration: "); // Serial.println(debounceDuration); // Serial.println(interval); // } if(debounceMode && interval < debounceDuration){ // not enough time has passed; ignore return; } // Serial.println("state changed"); debounceStartTime = millis(); //the state changed to PRESSED if (bitRead(state,CURRENT) == true) { numberOfPresses++; if (cb_onPress) { cb_onPress(*this); } //fire the onPress event pressedStartTime = millis(); //start timing triggeredHoldEvent = false; } else //the state changed to RELEASED { if (cb_onRelease) { cb_onRelease(*this); } //fire the onRelease event if (cb_onClick) { cb_onClick(*this); } //fire the onClick event AFTER the onRelease //reset states (for timing and for event triggering) pressedStartTime = -1; } //note that the state changed bitWrite(state,CHANGED,true); } else { //note that the state did not change bitWrite(state,CHANGED,false); //should we trigger an onHold event? if (pressedStartTime!=-1 && !triggeredHoldEvent) { if (millis()-pressedStartTime > holdEventThreshold) { if (cb_onHold) { cb_onHold(*this); triggeredHoldEvent = true; } } } } }