diff --git a/.vscode/settings.json b/.vscode/settings.json index 557670551..ac9d660e2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,6 +40,7 @@ "cinttypes": "cpp", "utility": "cpp", "typeinfo": "cpp", - "string": "cpp" + "string": "cpp", + "*.xbm": "cpp" } } \ No newline at end of file diff --git a/TODO.md b/TODO.md index 506aa3730..6dd789cf4 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,9 @@ # High priority * make nice screens (boot, about to sleep, debug info (gps signal, #people), latest text, person info - one frame per person on network) +* we are currently spinning like crazy in loop, instead sleep unless we have work to do +* have radiohead ISR send messages to RX queue directly, to allow that thread to block until we have something to send * turn framerate from ui->state.frameState to 1 fps (or less) unless in transition -* use a better font * very occasionally send our position and user packet (if for nothing else so that other nodes update last_seen) * switch to my gui layout manager * make basic gui. different screens: debug, one page for each user in the user db, last received text message @@ -99,4 +100,5 @@ until the phone pulls those packets. Ever so often power on bluetooth just so w * correctly map nodeids to nodenums, currently we just do a proof of concept by always doing a broadcast * add interrupt detach/sleep mode config to lora radio so we can enable deepsleep without panicing * make jtag work on second board -* implement regen owner and radio prefs \ No newline at end of file +* implement regen owner and radio prefs +* use a better font \ No newline at end of file diff --git a/images/genfiles.sh b/images/genfiles.sh new file mode 100755 index 000000000..1a2f7b8ed --- /dev/null +++ b/images/genfiles.sh @@ -0,0 +1,3 @@ +# using height of 50 to have 14 pixels beneath icon for text +inkscape -z -e icon.png -w 50 -h 50 icon-24px.svg +convert icon.png -background white -alpha Background ../src/icon.xbm diff --git a/images/icon.png b/images/icon.png new file mode 100644 index 000000000..00e765b44 Binary files /dev/null and b/images/icon.png differ diff --git a/src/configuration.h b/src/configuration.h index 3fb8206a9..f562ae77c 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -29,7 +29,7 @@ along with this program. If not, see . // Version // ----------------------------------------------------------------------------- -#define APP_NAME "meshtastic" +#define APP_NAME "Meshtastic" #define APP_VERSION "0.0.1" // ----------------------------------------------------------------------------- diff --git a/src/icon.xbm b/src/icon.xbm new file mode 100644 index 000000000..7b07a22e2 --- /dev/null +++ b/src/icon.xbm @@ -0,0 +1,33 @@ +#define icon_width 50 +#define icon_height 50 +static const char icon_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFE, 0x0F, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0xFF, 0x03, 0x00, + 0xFF, 0x03, 0x00, 0x80, 0xFF, 0x00, 0x00, 0xFC, 0x07, 0x00, 0xC0, 0x3F, + 0xE0, 0x1F, 0xF0, 0x0F, 0x00, 0xC0, 0x1F, 0xFC, 0xFF, 0xE0, 0x0F, 0x00, + 0xE0, 0x0F, 0xFF, 0xFF, 0xC3, 0x1F, 0x00, 0xF0, 0x87, 0xFF, 0xFF, 0x87, + 0x3F, 0x00, 0xF0, 0xC3, 0xFF, 0xFF, 0x0F, 0x3F, 0x00, 0xF8, 0xE3, 0x7F, + 0xF8, 0x1F, 0x7F, 0x00, 0xF8, 0xF1, 0x0F, 0xC0, 0x3F, 0x7E, 0x00, 0xF8, + 0xF1, 0x07, 0x80, 0x3F, 0x7E, 0x00, 0xFC, 0xF8, 0x03, 0x00, 0x7F, 0xFC, + 0x00, 0xFC, 0xF8, 0x81, 0x07, 0x7E, 0xFC, 0x00, 0x7C, 0xF8, 0xE0, 0x1F, + 0x7C, 0xF8, 0x00, 0x7C, 0xFC, 0xF0, 0x3F, 0xFC, 0xF8, 0x00, 0x7C, 0xFC, + 0xF0, 0x3F, 0xFC, 0xF8, 0x00, 0x7C, 0x7C, 0xF8, 0x7F, 0xF8, 0xF8, 0x00, + 0x7C, 0x7C, 0xF8, 0x7F, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, + 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x03, 0x00, + 0x00, 0x00, 0x80, 0x7F, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, }; diff --git a/src/images.h b/src/images.h index b74c9cbd1..6d1232cab 100644 --- a/src/images.h +++ b/src/images.h @@ -7,35 +7,7 @@ const uint8_t SATELLITE_IMAGE[] PROGMEM = { }; - -#define WiFi_Logo_width 60 -#define WiFi_Logo_height 36 -const uint8_t WiFi_Logo_bits[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, - 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x83, 0x01, 0x80, 0xFF, 0xFF, 0xFF, - 0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00, - 0xC0, 0xFF, 0xFF, 0x7C, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x31, 0x46, 0x7C, - 0xFC, 0x77, 0x08, 0x00, 0xE0, 0x23, 0xC6, 0x3C, 0xFC, 0x67, 0x18, 0x00, - 0xE0, 0x23, 0xE4, 0x3F, 0x1C, 0x00, 0x18, 0x00, 0xE0, 0x23, 0x60, 0x3C, - 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x03, 0x60, 0x3C, 0x1C, 0x70, 0x18, 0x00, - 0xE0, 0x07, 0x60, 0x3C, 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, - 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, - 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x8F, 0x71, 0x3C, - 0x1C, 0x70, 0x18, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x08, 0x00, - 0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x80, 0xFF, 0xFF, 0x1F, - 0x00, 0x00, 0x06, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x07, 0x00, - 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0xFF, - 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, - 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, - 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - }; +#include "icon.xbm" #if 0 const uint8_t activeSymbol[] PROGMEM = { diff --git a/src/screen.cpp b/src/screen.cpp index ee85fa4ba..ae668d2eb 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -29,7 +29,10 @@ along with this program. If not, see . #include "OLEDDisplayUi.h" #include "screen.h" -#define SCREEN_HEADER_HEIGHT 14 +#define FONT_HEIGHT 14 // actually 13 for "ariel 10" but want a little extra space + +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 #ifdef I2C_SDA SSD1306Wire dispdev(SSD1306_ADDRESS, I2C_SDA, I2C_SCL); @@ -38,10 +41,10 @@ SSD1306Wire dispdev(SSD1306_ADDRESS, 0, 0); // fake values to keep build happy, #endif bool disp; // true if we are using display -uint8_t _screen_line = SCREEN_HEADER_HEIGHT - 1; OLEDDisplayUi ui(&dispdev); + void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state) { display->setTextAlignment(TEXT_ALIGN_RIGHT); @@ -49,13 +52,19 @@ void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state) display->drawString(128, 0, String(millis())); } -void drawFrame1(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +void drawBootScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // draw an xbm image. // Please note that everything that should be transitioned // needs to be drawn relative to x and y - display->drawXbm(x + 34, y + 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits); + display->drawXbm(x + 32, y, icon_width, icon_height,(const uint8_t *) icon_bits); + + display->setFont(ArialMT_Plain_10); + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->drawString(64 + x, SCREEN_HEIGHT - FONT_HEIGHT, APP_NAME " " APP_VERSION); + + ui.disableIndicator(); } void drawFrame2(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) @@ -91,7 +100,8 @@ void drawFrame3(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int1 display->drawString(128 + x, 33 + y, "Right aligned (128,33)"); } -void drawFrame4(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +/// Draw the last text message we received +void drawLastTextFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // Demo for drawStringMaxWidth: // with the third parameter you can define the width after which words will be wrapped. @@ -107,14 +117,14 @@ void drawFrame5(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int1 // This array keeps function pointers to all frames // frames are the single views that slide in -FrameCallback frames[] = {drawFrame1, drawFrame2, drawFrame3, drawFrame4, drawFrame5}; +FrameCallback frames[] = {drawBootScreen, drawFrame2, drawFrame3, drawLastTextFrame, drawFrame5}; // how many frames are there? int frameCount = 5; +int overlaysCount = 1; // Overlays are statically drawn on top of a frame eg. a clock OverlayCallback overlays[] = {msOverlay}; -int overlaysCount = 1; void _screen_header() { @@ -190,11 +200,11 @@ void screen_print(const char *text) return; dispdev.print(text); - if (_screen_line + 8 > dispdev.getHeight()) + /* if (_screen_line + 8 > dispdev.getHeight()) { // scroll } - _screen_line += 8; + _screen_line += 8; */ screen_loop(); } @@ -236,7 +246,7 @@ void screen_setup() // Scroll buffer dispdev.setLogBuffer(5, 30); - dispdev.flipScreenVertically(); + // dispdev.flipScreenVertically(); // looks better without this on lora32 dispdev.setFont(Custom_ArialMT_Plain_10); #endif }