forked from meshtastic/firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Moved button thread to its own file (meshtastic#1260)
* Moved button thread to its own file * Move some debug code blocks into their own files * Shutdown refactoring * Removed GENIEBLOCKS
- Loading branch information
1 parent
7b8746d
commit ca4c1c9
Showing
6 changed files
with
329 additions
and
322 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
#include "configuration.h" | ||
#include "concurrency/OSThread.h" | ||
#include "PowerFSM.h" | ||
#include "RadioLibInterface.h" | ||
#include "graphics/Screen.h" | ||
#include "power.h" | ||
#include "buzz.h" | ||
#include <OneButton.h> | ||
|
||
#ifndef NO_ESP32 | ||
#include "nimble/BluetoothUtil.h" | ||
#endif | ||
|
||
namespace concurrency | ||
{ | ||
/** | ||
* Watch a GPIO and if we get an IRQ, wake the main thread. | ||
* Use to add wake on button press | ||
*/ | ||
void wakeOnIrq(int irq, int mode) | ||
{ | ||
attachInterrupt( | ||
irq, | ||
[] { | ||
BaseType_t higherWake = 0; | ||
mainDelay.interruptFromISR(&higherWake); | ||
}, | ||
FALLING); | ||
} | ||
|
||
class ButtonThread : public concurrency::OSThread | ||
{ | ||
// Prepare for button presses | ||
#ifdef BUTTON_PIN | ||
OneButton userButton; | ||
#endif | ||
#ifdef BUTTON_PIN_ALT | ||
OneButton userButtonAlt; | ||
#endif | ||
#ifdef BUTTON_PIN_TOUCH | ||
OneButton userButtonTouch; | ||
#endif | ||
static bool shutdown_on_long_stop; | ||
|
||
public: | ||
static uint32_t longPressTime; | ||
|
||
// callback returns the period for the next callback invocation (or 0 if we should no longer be called) | ||
ButtonThread() : OSThread("Button") | ||
{ | ||
#ifdef BUTTON_PIN | ||
userButton = OneButton(BUTTON_PIN, true, true); | ||
#ifdef INPUT_PULLUP_SENSE | ||
// Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did | ||
pinMode(BUTTON_PIN, INPUT_PULLUP_SENSE); | ||
#endif | ||
userButton.attachClick(userButtonPressed); | ||
userButton.attachDuringLongPress(userButtonPressedLong); | ||
userButton.attachDoubleClick(userButtonDoublePressed); | ||
userButton.attachMultiClick(userButtonMultiPressed); | ||
userButton.attachLongPressStart(userButtonPressedLongStart); | ||
userButton.attachLongPressStop(userButtonPressedLongStop); | ||
wakeOnIrq(BUTTON_PIN, FALLING); | ||
#endif | ||
#ifdef BUTTON_PIN_ALT | ||
userButtonAlt = OneButton(BUTTON_PIN_ALT, true, true); | ||
#ifdef INPUT_PULLUP_SENSE | ||
// Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did | ||
pinMode(BUTTON_PIN_ALT, INPUT_PULLUP_SENSE); | ||
#endif | ||
userButtonAlt.attachClick(userButtonPressed); | ||
userButtonAlt.attachDuringLongPress(userButtonPressedLong); | ||
userButtonAlt.attachDoubleClick(userButtonDoublePressed); | ||
userButtonAlt.attachLongPressStart(userButtonPressedLongStart); | ||
userButtonAlt.attachLongPressStop(userButtonPressedLongStop); | ||
wakeOnIrq(BUTTON_PIN_ALT, FALLING); | ||
#endif | ||
|
||
#ifdef BUTTON_PIN_TOUCH | ||
userButtonTouch = OneButton(BUTTON_PIN_TOUCH, true, true); | ||
#ifdef INPUT_PULLUP_SENSE | ||
// Some platforms (nrf52) have a SENSE variant which allows wake from sleep - override what OneButton did | ||
pinMode(BUTTON_PIN_TOUCH, INPUT_PULLUP_SENSE); | ||
#endif | ||
userButtonTouch.attachClick(touchPressed); | ||
userButtonTouch.attachDuringLongPress(touchPressedLong); | ||
userButtonTouch.attachDoubleClick(touchDoublePressed); | ||
userButtonTouch.attachLongPressStart(touchPressedLongStart); | ||
userButtonTouch.attachLongPressStop(touchPressedLongStop); | ||
wakeOnIrq(BUTTON_PIN_TOUCH, FALLING); | ||
#endif | ||
|
||
} | ||
|
||
protected: | ||
/// If the button is pressed we suppress CPU sleep until release | ||
int32_t runOnce() override | ||
{ | ||
canSleep = true; // Assume we should not keep the board awake | ||
|
||
#ifdef BUTTON_PIN | ||
userButton.tick(); | ||
canSleep &= userButton.isIdle(); | ||
#endif | ||
#ifdef BUTTON_PIN_ALT | ||
userButtonAlt.tick(); | ||
canSleep &= userButtonAlt.isIdle(); | ||
#endif | ||
#ifdef BUTTON_PIN_TOUCH | ||
userButtonTouch.tick(); | ||
canSleep &= userButtonTouch.isIdle(); | ||
#endif | ||
// if (!canSleep) DEBUG_MSG("Supressing sleep!\n"); | ||
// else DEBUG_MSG("sleep ok\n"); | ||
|
||
return 5; | ||
} | ||
|
||
private: | ||
static void touchPressed() | ||
{ | ||
screen->forceDisplay(); | ||
DEBUG_MSG("touch press!\n"); | ||
} | ||
static void touchDoublePressed() | ||
{ | ||
DEBUG_MSG("touch double press!\n"); | ||
} | ||
static void touchPressedLong() | ||
{ | ||
DEBUG_MSG("touch press long!\n"); | ||
} | ||
static void touchDoublePressedLong() | ||
{ | ||
DEBUG_MSG("touch double pressed!\n"); | ||
} | ||
static void touchPressedLongStart() | ||
{ | ||
DEBUG_MSG("touch long press start!\n"); | ||
} | ||
static void touchPressedLongStop() | ||
{ | ||
DEBUG_MSG("touch long press stop!\n"); | ||
} | ||
|
||
|
||
static void userButtonPressed() | ||
{ | ||
// DEBUG_MSG("press!\n"); | ||
powerFSM.trigger(EVENT_PRESS); | ||
} | ||
static void userButtonPressedLong() | ||
{ | ||
// DEBUG_MSG("Long press!\n"); | ||
#ifndef NRF52_SERIES | ||
screen->adjustBrightness(); | ||
#endif | ||
// If user button is held down for 5 seconds, shutdown the device. | ||
if (millis() - longPressTime > 5 * 1000) { | ||
#ifdef TBEAM_V10 | ||
if (axp192_found == true) { | ||
setLed(false); | ||
power->shutdown(); | ||
} | ||
#elif NRF52_SERIES | ||
// Do actual shutdown when button released, otherwise the button release | ||
// may wake the board immediatedly. | ||
if (!shutdown_on_long_stop) { | ||
screen->startShutdownScreen(); | ||
DEBUG_MSG("Shutdown from long press"); | ||
playBeep(); | ||
ledOff(PIN_LED1); | ||
ledOff(PIN_LED2); | ||
shutdown_on_long_stop = true; | ||
} | ||
#endif | ||
} else { | ||
// DEBUG_MSG("Long press %u\n", (millis() - longPressTime)); | ||
} | ||
} | ||
|
||
static void userButtonDoublePressed() | ||
{ | ||
#ifndef NO_ESP32 | ||
disablePin(); | ||
#elif defined(HAS_EINK) | ||
digitalWrite(PIN_EINK_EN,digitalRead(PIN_EINK_EN) == LOW); | ||
#endif | ||
} | ||
|
||
static void userButtonMultiPressed() | ||
{ | ||
#ifndef NO_ESP32 | ||
clearNVS(); | ||
#endif | ||
#ifdef NRF52_SERIES | ||
clearBonds(); | ||
#endif | ||
} | ||
|
||
|
||
static void userButtonPressedLongStart() | ||
{ | ||
DEBUG_MSG("Long press start!\n"); | ||
longPressTime = millis(); | ||
} | ||
|
||
static void userButtonPressedLongStop() | ||
{ | ||
DEBUG_MSG("Long press stop!\n"); | ||
longPressTime = 0; | ||
if (shutdown_on_long_stop) { | ||
playShutdownMelody(); | ||
delay(3000); | ||
power->shutdown(); | ||
} | ||
} | ||
}; | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#if 0 | ||
// Turn off for now | ||
uint32_t axpDebugRead() | ||
{ | ||
axp.debugCharging(); | ||
DEBUG_MSG("vbus current %f\n", axp.getVbusCurrent()); | ||
DEBUG_MSG("charge current %f\n", axp.getBattChargeCurrent()); | ||
DEBUG_MSG("bat voltage %f\n", axp.getBattVoltage()); | ||
DEBUG_MSG("batt pct %d\n", axp.getBattPercentage()); | ||
DEBUG_MSG("is battery connected %d\n", axp.isBatteryConnect()); | ||
DEBUG_MSG("is USB connected %d\n", axp.isVBUSPlug()); | ||
DEBUG_MSG("is charging %d\n", axp.isChargeing()); | ||
|
||
return 30 * 1000; | ||
} | ||
|
||
Periodic axpDebugOutput(axpDebugRead); | ||
axpDebugOutput.setup(); | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
#include "../configuration.h" | ||
#include "../main.h" | ||
#include <Wire.h> | ||
|
||
#ifndef NO_WIRE | ||
void scanI2Cdevice(void) | ||
{ | ||
byte err, addr; | ||
int nDevices = 0; | ||
for (addr = 1; addr < 127; addr++) { | ||
Wire.beginTransmission(addr); | ||
err = Wire.endTransmission(); | ||
if (err == 0) { | ||
DEBUG_MSG("I2C device found at address 0x%x\n", addr); | ||
|
||
nDevices++; | ||
|
||
if (addr == SSD1306_ADDRESS) { | ||
screen_found = addr; | ||
DEBUG_MSG("ssd1306 display found\n"); | ||
} | ||
if (addr == ST7567_ADDRESS) { | ||
screen_found = addr; | ||
DEBUG_MSG("st7567 display found\n"); | ||
} | ||
#ifdef AXP192_SLAVE_ADDRESS | ||
if (addr == AXP192_SLAVE_ADDRESS) { | ||
axp192_found = true; | ||
DEBUG_MSG("axp192 PMU found\n"); | ||
} | ||
#endif | ||
} else if (err == 4) { | ||
DEBUG_MSG("Unknow error at address 0x%x\n", addr); | ||
} | ||
} | ||
|
||
if (nDevices == 0) | ||
DEBUG_MSG("No I2C devices found\n"); | ||
else | ||
DEBUG_MSG("done\n"); | ||
} | ||
#else | ||
void scanI2Cdevice(void) {} | ||
#endif |
Oops, something went wrong.