unsigned long powerButton_triggeredMillis = 0; unsigned long powerButton_lastPressedMillis = 0; unsigned long powerButton_disableMillis = 0; unsigned int powerButton_execLoopAfter = 250; unsigned int powerButton_disableAfterAction = 1500; unsigned int powerButton_pressDurationMin_shortHoldAction = 250; unsigned int powerButton_pressDurationMax_shortHoldAction = 600; unsigned int powerButton_pressDurationMin_sleep = 800; unsigned int powerButton_pressDurationMax_sleep = 2000; unsigned int powerButton_pressDuration_shutdown = 3000; void handlePowerButton() { powerButton_lastPressedMillis = millis(); if (powerButton_disableMillis > 0 ) powerButton_disableMillis = millis(); if (powerButton_disableMillis == 0) { if (powerButton_triggeredMillis == 0) { powerButton_triggeredMillis = millis(); if(useSerial) Serial.println(F("POWER INITIALLY PRESSED")); //Serial.println(F("sending ALT+F4")); //BootKeyboard.press(KEY_LEFT_ALT); //BootKeyboard.press(KEY_F4); //delay(50); //BootKeyboard.releaseAll(); } else if ( (millis() - powerButton_triggeredMillis) >= powerButton_pressDuration_shutdown) { // LONG PRESSED powerButton_triggeredMillis = 0; powerButton_lastPressedMillis = 0; powerButton_disableMillis = millis(); if (useSerial) { Serial.println(F("POWER LONG HOLD")); Serial.println(F("sending SYSTEM_POWER_DOWN")); } if (sendHID) System.write(SYSTEM_POWER_DOWN); } } } void handlePowerButton_loop() { // handle Power Button short press if (powerButton_triggeredMillis > 0) { if (powerButton_lastPressedMillis > 0) { if ((millis() - powerButton_lastPressedMillis) > powerButton_execLoopAfter) { unsigned int tDelta = powerButton_lastPressedMillis - powerButton_triggeredMillis; if (debug) { Serial.print(F("POWER held for ")); Serial.print(tDelta); Serial.println("ms"); } if (tDelta >= powerButton_pressDurationMin_sleep && tDelta <= powerButton_pressDurationMax_sleep) { // SHORT PRESSED if (useSerial) { Serial.println(F("POWER SHORT HOLD")); Serial.println(F("sending SYSTEM_SLEEP")); } if (sendHID) System.write(SYSTEM_SLEEP); powerButton_triggeredMillis = 0; powerButton_lastPressedMillis = 0; powerButton_disableMillis = millis(); } else if (tDelta >= powerButton_pressDurationMin_shortHoldAction && tDelta < powerButton_pressDurationMax_shortHoldAction) { // VERY SHORT HOLD if (useSerial) { Serial.println(F("POWER VERY SHORT HOLD")); Serial.println("sending WIN KEY"); } if (sendHID) BootKeyboard.write(KEY_LEFT_WINDOWS); powerButton_triggeredMillis = 0; powerButton_lastPressedMillis = 0; //powerButton_disableMillis = millis(); } else { // button was pressed too long for "SHORT PRESSED" if (useSerial) { Serial.println(F("POWER BUTTON CANCELLED")); } powerButton_triggeredMillis = 0; powerButton_lastPressedMillis = 0; } } } } if (powerButton_disableMillis > 0) { if ((millis() - powerButton_disableMillis) > powerButton_disableAfterAction) { powerButton_triggeredMillis = 0; powerButton_lastPressedMillis = 0; powerButton_disableMillis = 0; } } }