leave screen off most of the time - press to wake

1.2-legacy
geeksville 2020-02-12 09:58:46 -08:00
rodzic 556ad310fc
commit c726e5f331
6 zmienionych plików z 67 dodań i 26 usunięć

Wyświetl plik

@ -4,9 +4,9 @@
* make debug info screen show real data (including battery level & charging)
* make real implementation of getNumOnlineNodes
* very occasionally send our position and user packet based on the schedule in the radio info (if for nothing else so that other nodes update last_seen)
* make screen advance only when a new node update arrives, a new text arrives or the user presses a button
* show real text info on the text screen
* retest BLE software update for both board types
* turn on screen when a new update arrives
# Medium priority
@ -122,3 +122,5 @@ until the phone pulls those packets. Ever so often power on bluetooth just so w
* reported altitude is crap
* good tips on which bands might be more free https://github.com/TheThingsNetwork/ttn/issues/119
* finish power measurements (GPS on during sleep vs LCD on during sleep vs LORA on during sleep) and est battery life
* make screen sleep behavior work
* make screen advance only when a new node update arrives, a new text arrives or the user presses a button, turn off screen after a while

Wyświetl plik

@ -11,12 +11,11 @@
// US channel settings
#define CH0_US 903.08f // MHz
#define CH_SPACING_US 2.16f // MHz
#define NUM_CHANNELS_US 13
// FIXME add defs for other regions and use them here
#define CH0 CH0_US
#define CH_SPACING CH_SPACING_US
#define NUM_CHANNELS NUM_CHANNELS_US
#define NUM_CHANNELS Constants_NumChannels
#define MAX_TX_QUEUE 8 // max number of packets which can be waiting for transmission

Wyświetl plik

@ -62,7 +62,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// If not defined, we will wait for lock forever
#define MINWAKE_MSECS (30 * 1000) // stay awake a long time (30 mins) for debugging
#define MINWAKE_MSECS (60 * 1000) // stay awake a long time (30 mins) for debugging
// #define MINWAKE_MSECS (30 * 1000) // Wait after every boot for GPS lock (may need longer than 5s because we turned the gps off during deep sleep)
// -----------------------------------------------------------------------------

Wyświetl plik

@ -49,6 +49,7 @@ PB_BIND(ToRadio, ToRadio, AUTO)
#ifndef PB_CONVERT_DOUBLE_FLOAT
/* On some platforms (such as AVR), double is really float.
* To be able to encode/decode double on these platforms, you need.

Wyświetl plik

@ -14,6 +14,11 @@ extern "C" {
#endif
/* Enum definitions */
typedef enum _Constants {
Constants_Unused = 0,
Constants_NumChannels = 13
} Constants;
typedef enum _Data_Type {
Data_Type_SIGNAL_OPAQUE = 0,
Data_Type_CLEAR_TEXT = 1,
@ -141,6 +146,10 @@ typedef struct _ToRadio {
/* Helper constants for enums */
#define _Constants_MIN Constants_Unused
#define _Constants_MAX Constants_NumChannels
#define _Constants_ARRAYSIZE ((Constants)(Constants_NumChannels+1))
#define _Data_Type_MIN Data_Type_SIGNAL_OPAQUE
#define _Data_Type_MAX Data_Type_CLEAR_READACK
#define _Data_Type_ARRAYSIZE ((Data_Type)(Data_Type_CLEAR_READACK+1))

Wyświetl plik

@ -43,6 +43,7 @@ SSD1306Wire dispdev(SSD1306_ADDRESS, 0, 0); // fake values to keep build happy,
#endif
bool disp; // true if we are using display
bool screenOn; // true if the display is currently powered
OLEDDisplayUi ui(&dispdev);
@ -320,7 +321,7 @@ void drawDebugInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i
// This array keeps function pointers to all frames
// frames are the single views that slide in
FrameCallback bootFrames[] = {drawBootScreen, drawTextMessageFrame, drawDebugInfo};
FrameCallback bootFrames[] = {drawBootScreen};
// Overlays are statically drawn on top of a frame eg. a clock
OverlayCallback overlays[] = {/* msOverlay */};
@ -359,6 +360,7 @@ void screen_off()
return;
dispdev.displayOff();
screenOn = false;
}
void screen_on()
@ -367,6 +369,7 @@ void screen_on()
return;
dispdev.displayOn();
screenOn = true;
}
static void screen_print(const char *text, uint8_t x, uint8_t y, uint8_t alignment)
@ -428,11 +431,15 @@ void screen_setup()
// Scroll buffer
dispdev.setLogBuffer(3, 32);
screen_on(); // update our screenOn bool
#ifdef BICOLOR_DISPLAY
dispdev.flipScreenVertically(); // looks better without this on lora32
#endif
// dispdev.setFont(Custom_ArialMT_Plain_10);
ui.disableAutoTransition(); // we now require presses
#endif
}
@ -441,10 +448,15 @@ static bool showingBluetooth;
/// If set to true (possibly from an ISR), we should turn on the screen the next time our idle loop runs.
static bool wakeScreen;
uint32_t lastPressMs;
/// Turn off the screen this many ms after last press or wake
#define SCREEN_SLEEP_MS (60 * 1000)
uint32_t screen_loop()
{
if (!disp)
return 30 * 1000;
if (!disp) // If we don't have a screen, don't ever spend any CPU for us
return UINT32_MAX;
if (wakeScreen)
{
@ -452,27 +464,41 @@ uint32_t screen_loop()
wakeScreen = false;
}
static bool showingBootScreen = true;
if(!screenOn) // If we didn't just wake and the screen is still off, then bail
return UINT32_MAX;
static bool showingBootScreen = true; // start by showing the bootscreen
ui.update();
// Once we finish showing the bootscreen, remove it from the loop
if (showingBootScreen && !showingBluetooth)
// While showing the bluetooth pair screen all of our standard screen switching is stopped
if (!showingBluetooth)
{
if (ui.getUiState()->currentFrame == 1)
// Once we finish showing the bootscreen, remove it from the loop
if (showingBootScreen)
{
showingBootScreen = false;
screen_set_frames();
if (millis() > 5 * 1000) // we show the boot screen for a few seconds only
{
showingBootScreen = false;
screen_set_frames();
}
}
}
else // standard screen loop handling ehre
{
// If the # nodes changes, we need to regen our list of screens
static size_t oldnumnodes = 0;
size_t numnodes = nodeDB.getNumNodes();
if (numnodes != oldnumnodes)
{
oldnumnodes = numnodes;
screen_set_frames();
}
static size_t oldnumnodes = 0;
size_t numnodes = nodeDB.getNumNodes();
if (numnodes != oldnumnodes)
{
// If the # nodes changes, we need to regen our list of screens
oldnumnodes = numnodes;
screen_set_frames();
if(millis() - lastPressMs > SCREEN_SLEEP_MS) {
DEBUG_MSG("screen timeout, turn it off for now...\n");
screen_off();
}
}
}
// If we are scrolling do 30fps, otherwise just 1 fps (to save CPU)
@ -490,8 +516,7 @@ void screen_start_bluetooth(uint32_t pin)
showingBluetooth = true;
wakeScreen = true;
ui.disableAutoTransition(); // we now require presses
ui.setFrames(btFrames, 1); // Just show the bluetooth frame
ui.setFrames(btFrames, 1); // Just show the bluetooth frame
// we rely on our main loop to show this screen (because we are invoked deep inside of bluetooth callbacks)
// ui.update(); // manually draw once, because I'm not sure if loop is getting called
}
@ -516,12 +541,17 @@ void screen_set_frames()
showingBluetooth = false;
}
/// handle press of the button
void screen_press()
{
// screen_start_bluetooth(123456);
// Once the user presses a button, stop auto scrolling between screens
ui.disableAutoTransition(); // we now require presses
ui.nextFrame();
lastPressMs = millis();
wakeScreen = true;
// If screen was off, just wake it, otherwise advance to next frame
if(screenOn)
ui.nextFrame();
}