diff --git a/README.md b/README.md
index 2fbcfcc38..e7da82ea3 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,8 @@
# Meshtastic-device
[](https://open.vscode.dev/meshtastic/Meshtastic-device)
+[](https://github.com/meshtastic/Meshtastic-device/actions/workflows/main.yml)
+
+
## This repository contains the device firmware used in the [Meshtastic](https://meshtastic.org) project.
Update Instructions
diff --git a/platformio.ini b/platformio.ini
index d8596b242..faef20896 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -17,6 +17,7 @@ default_envs = tbeam
;default_envs = tlora-v1
;default_envs = tlora_v1_3
;default_envs = tlora-v2
+;default_envs = tlora-v2-1-1.6
;default_envs = lora-relay-v1 # nrf board
;default_envs = t-echo
;default_envs = nrf52840dk-geeksville
@@ -83,7 +84,7 @@ lib_deps =
https://github.com/geeksville/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3
PubSubClient
-; Common settings for conventional (non Portduino) Ardino targets
+; Common settings for conventional (non Portduino) Arduino targets
[arduino_base]
framework = arduino
@@ -122,6 +123,7 @@ lib_deps =
h2zero/NimBLE-Arduino@1.3.4
tobozo/ESP32-targz@^1.1.4
arduino-libraries/NTPClient#531eff39d9fbc831f3d03f706a161739203fbe2a
+ adafruit/Adafruit BME280 Library@^2.2.2
# Hmm - this doesn't work yet
# board_build.ldscript = linker/esp32.extram.bss.ld
@@ -157,7 +159,7 @@ board = ttgo-t-beam
lib_deps =
${esp32_base.lib_deps}
build_flags =
- ${esp32_base.build_flags} -D TBEAM_V10
+ ${esp32_base.build_flags} -D TBEAM_V10 -I variants/tbeam
; The original TBEAM board without the AXP power chip and a few other changes
; Note: I've heard reports this didn't work. Disabled until someone with a 0.7 can test and debug.
@@ -165,53 +167,53 @@ build_flags =
extends = esp32_base
board = ttgo-t-beam
build_flags =
- ${esp32_base.build_flags} -D TBEAM_V07
+ ${esp32_base.build_flags} -D TBEAM_V07 -I variants/tbeam_v07
[env:heltec-v1]
;build_type = debug ; to make it possible to step through our jtag debugger
extends = esp32_base
board = heltec_wifi_lora_32
build_flags =
- ${esp32_base.build_flags} -D HELTEC_V1
+ ${esp32_base.build_flags} -D HELTEC_V1 -I variants/heltec_v1
[env:heltec-v2.0]
;build_type = debug ; to make it possible to step through our jtag debugger
extends = esp32_base
board = heltec_wifi_lora_32_V2
build_flags =
- ${esp32_base.build_flags} -D HELTEC_V2_0
+ ${esp32_base.build_flags} -D HELTEC_V2_0 -I variants/heltec_v2
[env:heltec-v2.1]
;build_type = debug ; to make it possible to step through our jtag debugger
extends = esp32_base
board = heltec_wifi_lora_32_V2
build_flags =
- ${esp32_base.build_flags} -D HELTEC_V2_1
+ ${esp32_base.build_flags} -D HELTEC_V2_1 -I variants/heltec_v2
[env:tlora-v1]
extends = esp32_base
board = ttgo-lora32-v1
build_flags =
- ${esp32_base.build_flags} -D TLORA_V1
+ ${esp32_base.build_flags} -D TLORA_V1 -I variants/tlora_v1
; note: the platformio definition for lora32-v2 seems stale, it is missing a pins_arduino.h file, therefore I don't think it works
[env:tlora_v1_3]
extends = esp32_base
board = ttgo-lora32-v1
build_flags =
- ${esp32_base.build_flags} -D TLORA_V1_3
+ ${esp32_base.build_flags} -D TLORA_V1_3 -I variants/tlora_v1_3
[env:tlora-v2]
extends = esp32_base
board = ttgo-lora32-v1
build_flags =
- ${esp32_base.build_flags} -D TLORA_V2
+ ${esp32_base.build_flags} -D TLORA_V2 -I variants/tlora_v2
[env:tlora-v2-1-1.6]
extends = esp32_base
board = ttgo-lora32-v1
build_flags =
- ${esp32_base.build_flags} -D TLORA_V2_1_16
+ ${esp32_base.build_flags} -D TLORA_V2_1_16 -I variants/tlora_v2_1_16
; Meshtastic DIY v1 by Nano VHF Schematic based on ESP32-WROOM-32 (38 pins) devkit & EBYTE E22 SX1262/SX1268 module
[env:meshtastic-diy-v1]
@@ -221,6 +223,7 @@ build_flags =
${esp32_base.build_flags}
-D DIY_V1
-D EBYTE_E22
+ -I variants/meshtastic_diy_v1
; The Heltec Cubecell plus
; IMPORTANT NOTE: This target doesn't yet work and probably won't ever work. I'm keeping it around for now.
@@ -365,18 +368,6 @@ debug_tool = jlink
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
;upload_protocol = jlink
-; Note, this board is not yet supported! It will not work without futher development.
-; THIS IS UNTESTED (I don't have this board), but other developers can use it as a starting point
-[env:rak4600]
-extends = nrf52_base
-board = wiscore_rak4600
-# add our variants files to the include and src paths
-# define build flags for the TFT_eSPI library
-build_flags = ${nrf52_base.build_flags} -Ivariants/WisCore_RAK4600_Board
-src_filter = ${nrf52_base.src_filter} +<../variants/WisCore_RAK4600_Board>
-lib_deps =
- ${arduino_base.lib_deps}
-
; The PPR board
[env:ppr]
extends = nrf52_base
@@ -475,8 +466,15 @@ lib_deps =
; The Portduino based sim environment on top of any host OS, all hardware will be simulated
[env:native]
platform = https://github.com/geeksville/platform-native.git
-src_filter = ${env.src_filter} - - - - -
-build_flags = ${arduino_base.build_flags} -O0
+src_filter =
+ ${env.src_filter}
+ -
+ -
+ -
+ -
+ -
+ +<../variants/portduino>
+build_flags = ${arduino_base.build_flags} -O0 -I variants/portduino
framework = arduino
board = cross_platform
lib_deps =
@@ -486,8 +484,15 @@ lib_deps =
; The Portduino based sim environment on top of a linux OS and touching linux hardware devices
[env:linux]
platform = https://github.com/geeksville/platform-native.git
-src_filter = ${env.src_filter} - - - - -
-build_flags = ${arduino_base.build_flags} -O0 -lgpiod
+src_filter =
+ ${env.src_filter}
+ -
+ -
+ -
+ -
+ -
+ +<../variants/portduino>
+build_flags = ${arduino_base.build_flags} -O0 -lgpiod -I variants/portduino
framework = arduino
board = linux_hardware
lib_deps =
@@ -500,4 +505,4 @@ lib_deps =
;extends = esp32_base
;board = genieblocks_lora
;build_flags =
-; ${esp32_base.build_flags} -D GENIEBLOCKS
+; ${esp32_base.build_flags} -D GENIEBLOCKS -Ivariants/genieblocks
diff --git a/proto b/proto
index be14ce595..60cf05456 160000
--- a/proto
+++ b/proto
@@ -1 +1 @@
-Subproject commit be14ce595fc30e1f87f8182fab0a06fd8600cdaa
+Subproject commit 60cf0545612bde3daf53f319db1b72d053f870d3
diff --git a/src/DebugConfiguration.h b/src/DebugConfiguration.h
new file mode 100644
index 000000000..4397dfe0b
--- /dev/null
+++ b/src/DebugConfiguration.h
@@ -0,0 +1,61 @@
+// DEBUG LED
+#ifndef LED_INVERTED
+#define LED_INVERTED 0 // define as 1 if LED is active low (on)
+#endif
+
+// -----------------------------------------------------------------------------
+// DEBUG
+// -----------------------------------------------------------------------------
+
+#ifdef CONSOLE_MAX_BAUD
+#define SERIAL_BAUD CONSOLE_MAX_BAUD
+#else
+#define SERIAL_BAUD 921600 // Serial debug baud rate
+#endif
+
+#include "SerialConsole.h"
+
+#define DEBUG_PORT (*console) // Serial debug port
+
+// What platforms should use SEGGER?
+#ifdef NRF52_SERIES
+
+// Always include the SEGGER code on NRF52 - because useful for debugging
+#include "SEGGER_RTT.h"
+
+// The channel we send stdout data to
+#define SEGGER_STDOUT_CH 0
+
+// Debug printing to segger console
+#define SEGGER_MSG(...) SEGGER_RTT_printf(SEGGER_STDOUT_CH, __VA_ARGS__)
+
+// If we are not on a NRF52840 (which has built in USB-ACM serial support) and we don't have serial pins hooked up, then we MUST
+// use SEGGER for debug output
+#if !defined(PIN_SERIAL_RX) && !defined(NRF52840_XXAA)
+// No serial ports on this board - ONLY use segger in memory console
+#define USE_SEGGER
+#endif
+
+#else
+#define SERIAL0_RX_GPIO 3 // Always GPIO3 on ESP32
+#endif
+
+#ifdef USE_SEGGER
+#define DEBUG_MSG(...) SEGGER_RTT_printf(0, __VA_ARGS__)
+#else
+#ifdef DEBUG_PORT
+#define DEBUG_MSG(...) DEBUG_PORT.logDebug(__VA_ARGS__)
+#else
+#define DEBUG_MSG(...)
+#endif
+#endif
+
+// -----------------------------------------------------------------------------
+// AXP192 (Rev1-specific options)
+// -----------------------------------------------------------------------------
+
+#define GPS_POWER_CTRL_CH 3
+#define LORA_POWER_CTRL_CH 2
+
+// Default Bluetooth PIN
+#define defaultBLEPin 123456
diff --git a/src/RF95Configuration.h b/src/RF95Configuration.h
new file mode 100644
index 000000000..f304aadd0
--- /dev/null
+++ b/src/RF95Configuration.h
@@ -0,0 +1,7 @@
+// TODO refactor this out with better radio configuration system
+#ifdef USE_RF95
+#define RF95_RESET LORA_RESET
+#define RF95_IRQ LORA_DIO0 // on SX1262 version this is a no connect DIO0
+#define RF95_DIO1 LORA_DIO1 // Note: not really used for RF95
+#define RF95_DIO2 LORA_DIO2 // Note: not really used for RF95
+#endif
\ No newline at end of file
diff --git a/src/commands.h b/src/commands.h
index 803ea2b55..13ddc7284 100644
--- a/src/commands.h
+++ b/src/commands.h
@@ -13,4 +13,5 @@ enum class Cmd {
STOP_BLUETOOTH_PIN_SCREEN,
STOP_BOOT_SCREEN,
PRINT,
+ START_SHUTDOWN_SCREEN,
};
\ No newline at end of file
diff --git a/src/configuration.h b/src/configuration.h
index 7a482151a..6f289ef28 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -45,10 +45,6 @@ along with this program. If not, see .
// If we are using the JTAG port for debugging, some pins must be left free for that (and things like GPS have to be disabled)
// we don't support jtag on the ttgo - access to gpio 12 is a PITA
-#ifdef ARDUINO_HELTEC_WIFI_LORA_32_V2
-//#define USE_JTAG
-#endif
-
#define REQUIRE_RADIO true // If true, we will fail to start if the radio is not found
/// Convert a preprocessor name into a quoted string
@@ -88,18 +84,6 @@ along with this program. If not, see .
#define BUTTON_PIN_TOUCH PIN_BUTTON_TOUCH
#endif
-// FIXME, use variant.h defs for all of this!!! (even on the ESP32 targets)
-#elif defined(CubeCell_BoardPlus)
-
-//
-// Standard definitions for CubeCell targets
-//
-
-#define NO_ESP32 // Don't use ESP32 libs (mainly bluetooth)
-
-#define LED_PIN -1 // FIXME totally bogus
-#define BUTTON_PIN -1
-
#else
//
@@ -169,338 +153,51 @@ along with this program. If not, see .
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_TBEAM
-// #define BUTTON_NEED_PULLUP // if set we need to turn on the internal CPU pullup during sleep
-
-#define I2C_SDA 21
-#define I2C_SCL 22
-
-#define BUTTON_PIN 38 // The middle button GPIO on the T-Beam
-//#define BUTTON_PIN_ALT 13 // Alternate GPIO for an external button if needed. Does anyone use this? It is not documented anywhere.
-#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
-
-#define LED_INVERTED 1
-#define LED_PIN 4 // Newer tbeams (1.1) have an extra led on GPIO4
-
-// TTGO uses a common pinout for their SX1262 vs RF95 modules - both can be enabled and we will probe at runtime for RF95 and if
-// not found then probe for SX1262
-#define USE_RF95
-#define USE_SX1262
-
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#define LORA_RESET 23
-#define LORA_DIO1 33 // SX1262 IRQ
-#define LORA_DIO2 32 // SX1262 BUSY
-#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled
-
-#ifdef USE_SX1262
-#define SX126X_CS RF95_NSS // FIXME - we really should define LORA_CS instead
-#define SX126X_DIO1 LORA_DIO1
-#define SX126X_BUSY LORA_DIO2
-#define SX126X_RESET LORA_RESET
-#define SX126X_E22 // Not really an E22 but TTGO seems to be trying to clone that
-// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for the sx1262interface
-// code)
-#endif
-
-// Leave undefined to disable our PMU IRQ handler. DO NOT ENABLE THIS because the pmuirq can cause sperious interrupts
-// and waking from light sleep
-// #define PMU_IRQ 35
-#define AXP192_SLAVE_ADDRESS 0x34
-
#elif defined(TBEAM_V07)
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_TBEAM0p7
-// #define BUTTON_NEED_PULLUP // if set we need to turn on the internal CPU pullup during sleep
-
-#define I2C_SDA 21
-#define I2C_SCL 22
-
-#define BUTTON_PIN 39
-#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
-
-#define USE_RF95
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#define LORA_RESET 23
-#define LORA_DIO1 33 // Not really used
-#define LORA_DIO2 32 // Not really used
-
-// This board has different GPS pins than all other boards
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 12
-#define GPS_TX_PIN 15
-
#elif defined(DIY_V1)
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_DIY_V1
-// For OLED LCD
-#define I2C_SDA 21
-#define I2C_SCL 22
-
-// GPS
-#undef GPS_RX_PIN
-#define GPS_RX_PIN 15
-//#undef GPS_TX_PIN
-//#define GPS_TX_PIN 12 // not connected
-
-#define BUTTON_PIN 39 // The middle button GPIO on the T-Beam
-#define EXT_NOTIFY_OUT 12 // Overridden default pin to use for Ext Notify Plugin (#975).
-#define LED_PIN 2 // add status LED (compatible with core-pcb and DIY targets)
-
-#define LORA_DIO0 26 // a No connect on the SX1262/SX1268 module
-#define LORA_RESET 23 // RST for SX1276, and for SX1262/SX1268
-#define LORA_DIO1 33 // IRQ for SX1262/SX1268
-#define LORA_DIO2 32 // BUSY for SX1262/SX1268
-#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262/SX1268, if DIO3 is high the TXCO is enabled
-
-#define RF95_SCK 5
-#define RF95_MISO 19
-#define RF95_MOSI 27
-#define RF95_NSS 18
-
-// supported modules list
-#define USE_SX1262
-#define USE_SX1268
-#define USE_LLCC68
-
-// common pinouts for SX126X modules
-#define SX126X_CS 18 // NSS for SX126X
-#define SX126X_DIO1 LORA_DIO1
-#define SX126X_BUSY LORA_DIO2
-#define SX126X_RESET LORA_RESET
-#define SX126X_RXEN 14
-#define SX126X_TXEN 13
-
-#ifdef EBYTE_E22
-// Internally the TTGO module hooks the SX126x-DIO2 in to control the TX/RX switch
-// (which is the default for the sx1262interface code)
-#define SX126X_E22
-#endif
-
#elif defined(ARDUINO_HELTEC_WIFI_LORA_32_V2)
-// the default ESP32 Pin of 15 is the Oled SCL, set to 36 and 37 and works fine.
-// Tested on Neo6m module.
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 36
-#define GPS_TX_PIN 37
-
-#ifndef USE_JTAG // gpio15 is TDO for JTAG, so no I2C on this board while doing jtag
-#define I2C_SDA 4 // I2C pins for this board
-#define I2C_SCL 15
-#endif
-
-#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
-
-#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
-#define LED_PIN 25 // If defined we will blink this LED
-#define BUTTON_PIN 0 // If defined, this will be used for user button presses
-
-#define USE_RF95
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#ifndef USE_JTAG
-#define LORA_RESET 14
-#endif
-#define LORA_DIO1 35 // Not really used
-#define LORA_DIO2 34 // Not really used
-
-// ratio of voltage divider = 3.20 (R1=100k, R2=220k)
-#define ADC_MULTIPLIER 3.2
-
#ifdef HELTEC_V2_0
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_HELTEC_V2_0
-#define BATTERY_PIN 13 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-
#endif
#ifdef HELTEC_V2_1
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_HELTEC_V2_1
-#define BATTERY_PIN 37 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
-
#endif
#elif defined(ARDUINO_HELTEC_WIFI_LORA_32)
-// the default ESP32 Pin of 15 is the Oled SCL, set to 36 and 37 and works fine.
-// Tested on Neo6m module.
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 36
-#define GPS_TX_PIN 37
-
-#ifndef USE_JTAG // gpio15 is TDO for JTAG, so no I2C on this board while doing jtag
-#define I2C_SDA 4 // I2C pins for this board
-#define I2C_SCL 15
-#endif
-
-#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
-
-#define LED_PIN 25 // If defined we will blink this LED
-#define BUTTON_PIN 0 // If defined, this will be used for user button presses
-
-#define USE_RF95
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#ifndef USE_JTAG
-#define LORA_RESET 14
-#endif
-#define LORA_DIO1 33 // Not really used
-#define LORA_DIO2 32 // Not really used
-
-// ratio of voltage divider = 3.20 (R1=100k, R2=220k)
-#define ADC_MULTIPLIER 3.2
-
-// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_HELTEC_V1
-#define BATTERY_PIN 13 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-
#elif defined(TLORA_V1)
-// This string must exactly match the case used in release file names or the android updater won't work
+
#define HW_VENDOR HardwareModel_TLORA_V1
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 36
-#define GPS_TX_PIN 37
-
-#define I2C_SDA 4 // I2C pins for this board
-#define I2C_SCL 15
-
-#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
-
-// #define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
-#define LED_PIN 2 // If defined we will blink this LED
-#define BUTTON_PIN 0 // If defined, this will be used for user button presses
-#define BUTTON_NEED_PULLUP
-#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
-
-#define USE_RF95
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#define LORA_RESET 14
-#define LORA_DIO1 35 // Not really used
-#define LORA_DIO2 34 // Not really used
#elif defined(TLORA_V2)
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_TLORA_V2
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 36
-#define GPS_TX_PIN 13 // per @eugene
-
-#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-
-#define I2C_SDA 21 // I2C pins for this board
-#define I2C_SCL 22
-
-#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
-
-#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
-#define LED_PIN 25 // If defined we will blink this LED
-#define BUTTON_PIN \
- 0 // If defined, this will be used for user button presses, if your board doesn't have a physical switch, you can wire one
- // between this pin and ground
-#define BUTTON_NEED_PULLUP
-
-#define USE_RF95
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#define LORA_RESET 14
-#define LORA_DIO1 35 // Not really used
-#define LORA_DIO2 34 // Not really used
-
#elif defined(TLORA_V1_3)
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_TLORA_V1_1p3
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 36
-#define GPS_TX_PIN 13 // per @eugene
-
-#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-
-#define I2C_SDA 21 // I2C pins for this board
-#define I2C_SCL 22
-
-#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
-
-#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
-#define LED_PIN 25 // If defined we will blink this LED
-#define BUTTON_PIN 36
-#define BUTTON_NEED_PULLUP
-
-#define USE_RF95
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#define LORA_RESET 14
-#define LORA_DIO1 35 // Not really used
-#define LORA_DIO2 34 // Not really used
-
#elif defined(TLORA_V2_1_16)
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_TLORA_V2_1_1p6
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 15 // per @der_bear on the forum, 36 is incorrect for this board type and 15 is a better pick
-#define GPS_TX_PIN 13
-
-#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-
-#define I2C_SDA 21 // I2C pins for this board
-#define I2C_SCL 22
-
-#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
-
-#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
-#define LED_PIN 25 // If defined we will blink this LED
-#define BUTTON_PIN 12 // If defined, this will be used for user button presses,
-
-#define BUTTON_NEED_PULLUP
-
-#define USE_RF95
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#define LORA_RESET 14
-#define LORA_DIO1 35 // Not really used
-#define LORA_DIO2 34 // Not really used
-
#elif defined(GENIEBLOCKS)
// This string must exactly match the case used in release file names or the android updater won't work
#define HW_VENDOR HardwareModel_GENIEBLOCKS
-#undef GPS_RX_PIN
-#undef GPS_TX_PIN
-#define GPS_RX_PIN 5
-#define GPS_TX_PIN 18
-#define GPS_RESET_N 10
-#define GPS_EXTINT 23 // On MAX-M8 module pin name is EXTINT. On L70 module pin name is STANDBY.
-
-#define BATTERY_PIN 39 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
-#define BATTERY_EN_PIN 14 // Voltage voltage divider enable pin connected to mosfet
-
-#define I2C_SDA 4 // I2C pins for this board
-#define I2C_SCL 2
-
-#define LED_PIN 12 // If defined we will blink this LED
-//#define BUTTON_PIN 36 // If defined, this will be used for user button presses (ToDo problem on that line on debug screen -->
-// Long press start!) #define BUTTON_NEED_PULLUP //GPIOs 34 to 39 are GPIs – input only pins. These pins don’t have internal
-// pull-ups or pull-down resistors.
-
-#define USE_RF95
-#define LORA_DIO0 38 // a No connect on the SX1262 module
-#define LORA_RESET 9
-
-#define RF95_SCK 22
-#define RF95_MISO 19
-#define RF95_MOSI 13
-#define RF95_NSS 21
#endif
@@ -533,100 +230,8 @@ along with this program. If not, see .
#define HW_VENDOR HardwareModel_PORTDUINO
-#define USE_SIM_RADIO
-
-// Pine64 uses a common pinout for their SX1262 vs RF95 modules - both can be enabled and we will probe at runtime for RF95 and if
-// not found then probe for SX1262. Currently the RF95 code is disabled because I think the RF95 module won't need to ship.
-// #define USE_RF95
-#define USE_SX1262
-
-// Fake SPI device selections
-#define RF95_SCK 5
-#define RF95_MISO 19
-#define RF95_MOSI 27
-#define RF95_NSS RADIOLIB_NC // the ch341f spi controller does CS for us
-
-#define LORA_DIO0 26 // a No connect on the SX1262 module
-#define LORA_RESET 14
-#define LORA_DIO1 33 // SX1262 IRQ, called DIO0 on pinelora schematic, pin 7 on ch341f "ack" - FIXME, enable hwints in linux
-#define LORA_DIO2 32 // SX1262 BUSY, actually connected to "DIO5" on pinelora schematic, pin 8 on ch341f "slct"
-#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled
-
-#ifdef USE_SX1262
-#define SX126X_CS 20 // CS0 on pinelora schematic, hooked to gpio D0 on ch341f
-#define SX126X_DIO1 LORA_DIO1
-#define SX126X_BUSY LORA_DIO2
-#define SX126X_RESET LORA_RESET
-// HOPE RFM90 does not have a TCXO therefore not SX126X_E22
#endif
-#endif
-
-// DEBUG LED
-#ifndef LED_INVERTED
-#define LED_INVERTED 0 // define as 1 if LED is active low (on)
-#endif
-
-#ifdef USE_RF95
-#define RF95_RESET LORA_RESET
-#define RF95_IRQ LORA_DIO0 // on SX1262 version this is a no connect DIO0
-#define RF95_DIO1 LORA_DIO1 // Note: not really used for RF95
-#define RF95_DIO2 LORA_DIO2 // Note: not really used for RF95
-#endif
-
-// -----------------------------------------------------------------------------
-// DEBUG
-// -----------------------------------------------------------------------------
-
-#ifdef CONSOLE_MAX_BAUD
-#define SERIAL_BAUD CONSOLE_MAX_BAUD
-#else
-#define SERIAL_BAUD 921600 // Serial debug baud rate
-#endif
-
-#include "SerialConsole.h"
-
-#define DEBUG_PORT (*console) // Serial debug port
-
-// What platforms should use SEGGER?
-#ifdef NRF52_SERIES
-
-// Always include the SEGGER code on NRF52 - because useful for debugging
-#include "SEGGER_RTT.h"
-
-// The channel we send stdout data to
-#define SEGGER_STDOUT_CH 0
-
-// Debug printing to segger console
-#define SEGGER_MSG(...) SEGGER_RTT_printf(SEGGER_STDOUT_CH, __VA_ARGS__)
-
-// If we are not on a NRF52840 (which has built in USB-ACM serial support) and we don't have serial pins hooked up, then we MUST
-// use SEGGER for debug output
-#if !defined(PIN_SERIAL_RX) && !defined(NRF52840_XXAA)
-// No serial ports on this board - ONLY use segger in memory console
-#define USE_SEGGER
-#endif
-
-#else
-#define SERIAL0_RX_GPIO 3 // Always GPIO3 on ESP32
-#endif
-
-#ifdef USE_SEGGER
-#define DEBUG_MSG(...) SEGGER_RTT_printf(0, __VA_ARGS__)
-#else
-#ifdef DEBUG_PORT
-#define DEBUG_MSG(...) DEBUG_PORT.logDebug(__VA_ARGS__)
-#else
-#define DEBUG_MSG(...)
-#endif
-#endif
-
-// -----------------------------------------------------------------------------
-// AXP192 (Rev1-specific options)
-// -----------------------------------------------------------------------------
-
-#define GPS_POWER_CTRL_CH 3
-#define LORA_POWER_CTRL_CH 2
-
-// Default Bluetooth PIN
-#define defaultBLEPin 123456
+#include "variant.h"
+#include "RF95Configuration.h"
+#include "DebugConfiguration.h"
\ No newline at end of file
diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index c7bc0fe36..d18c4ebc8 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -26,7 +26,6 @@ along with this program. If not, see .
#include "MeshService.h"
#include "NodeDB.h"
#include "Screen.h"
-#include "fonts.h"
#include "gps/GeoCoord.h"
#include "gps/RTC.h"
#include "graphics/images.h"
@@ -219,6 +218,14 @@ static void drawFrameBluetooth(OLEDDisplay *display, OLEDDisplayUiState *state,
display->drawString(64 + x, 48 + y, buf);
}
+static void drawFrameShutdown(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
+{
+ display->setTextAlignment(TEXT_ALIGN_CENTER);
+
+ display->setFont(FONT_MEDIUM);
+ display->drawString(64 + x, 26 + y, "Shutting down...");
+}
+
static void drawFrameFirmware(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setTextAlignment(TEXT_ALIGN_CENTER);
@@ -881,6 +888,9 @@ int32_t Screen::runOnce()
handlePrint(cmd.print_text);
free(cmd.print_text);
break;
+ case Cmd::START_SHUTDOWN_SCREEN:
+ handleShutdownScreen();
+ break;
default:
DEBUG_MSG("BUG: invalid cmd\n");
}
@@ -1047,6 +1057,18 @@ void Screen::handleStartBluetoothPinScreen(uint32_t pin)
setFastFramerate();
}
+void Screen::handleShutdownScreen()
+{
+ DEBUG_MSG("showing shutdown screen\n");
+ showingNormalScreen = false;
+
+ static FrameCallback shutdownFrames[] = {drawFrameShutdown};
+
+ ui.disableAllIndicators();
+ ui.setFrames(shutdownFrames, 1);
+ setFastFramerate();
+}
+
void Screen::handleStartFirmwareUpdateScreen()
{
DEBUG_MSG("showing firmware screen\n");
diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h
index 10b2b6ff7..6c50ea2b7 100644
--- a/src/graphics/Screen.h
+++ b/src/graphics/Screen.h
@@ -151,6 +151,12 @@ class Screen : public concurrency::OSThread
enqueueCmd(cmd);
}
+ void startShutdownScreen()
+ {
+ ScreenCmd cmd;
+ cmd.cmd = Cmd::START_SHUTDOWN_SCREEN;
+ enqueueCmd(cmd);
+ }
/// Stops showing the bluetooth PIN screen.
void stopBluetoothPinScreen() { enqueueCmd(ScreenCmd{.cmd = Cmd::STOP_BLUETOOTH_PIN_SCREEN}); }
@@ -262,7 +268,7 @@ class Screen : public concurrency::OSThread
void handleStartBluetoothPinScreen(uint32_t pin);
void handlePrint(const char *text);
void handleStartFirmwareUpdateScreen();
-
+ void handleShutdownScreen();
/// Rebuilds our list of frames (screens) to default ones.
void setFrames();
diff --git a/src/graphics/fonts.h b/src/graphics/fonts.h
deleted file mode 100644
index 4c7cb5ca7..000000000
--- a/src/graphics/fonts.h
+++ /dev/null
@@ -1,425 +0,0 @@
-#pragma once
-
-const uint8_t Custom_ArialMT_Plain_10[] PROGMEM = {
- 0x0A, // Width: 10
- 0x0A, // Height: 10
- 0x20, // First Char: 32
- 0xE0, // Numbers of Chars: 224
-
- // Jump Table:
- 0xFF, 0xFF, 0x00, 0x03, // 32:65535
- 0x00, 0x00, 0x04, 0x03, // 33:0
- 0x00, 0x04, 0x05, 0x04, // 34:4
- 0x00, 0x09, 0x09, 0x06, // 35:9
- 0x00, 0x12, 0x0A, 0x06, // 36:18
- 0x00, 0x1C, 0x10, 0x09, // 37:28
- 0x00, 0x2C, 0x0E, 0x07, // 38:44
- 0x00, 0x3A, 0x01, 0x02, // 39:58
- 0x00, 0x3B, 0x06, 0x03, // 40:59
- 0x00, 0x41, 0x06, 0x03, // 41:65
- 0x00, 0x47, 0x05, 0x04, // 42:71
- 0x00, 0x4C, 0x09, 0x06, // 43:76
- 0x00, 0x55, 0x04, 0x03, // 44:85
- 0x00, 0x59, 0x03, 0x03, // 45:89
- 0x00, 0x5C, 0x04, 0x03, // 46:92
- 0x00, 0x60, 0x05, 0x03, // 47:96
- 0x00, 0x65, 0x0A, 0x06, // 48:101
- 0x00, 0x6F, 0x08, 0x06, // 49:111
- 0x00, 0x77, 0x0A, 0x06, // 50:119
- 0x00, 0x81, 0x0A, 0x06, // 51:129
- 0x00, 0x8B, 0x0B, 0x06, // 52:139
- 0x00, 0x96, 0x0A, 0x06, // 53:150
- 0x00, 0xA0, 0x0A, 0x06, // 54:160
- 0x00, 0xAA, 0x09, 0x06, // 55:170
- 0x00, 0xB3, 0x0A, 0x06, // 56:179
- 0x00, 0xBD, 0x0A, 0x06, // 57:189
- 0x00, 0xC7, 0x04, 0x03, // 58:199
- 0x00, 0xCB, 0x04, 0x03, // 59:203
- 0x00, 0xCF, 0x0A, 0x06, // 60:207
- 0x00, 0xD9, 0x09, 0x06, // 61:217
- 0x00, 0xE2, 0x09, 0x06, // 62:226
- 0x00, 0xEB, 0x0B, 0x06, // 63:235
- 0x00, 0xF6, 0x14, 0x0A, // 64:246
- 0x01, 0x0A, 0x0E, 0x07, // 65:266
- 0x01, 0x18, 0x0C, 0x07, // 66:280
- 0x01, 0x24, 0x0C, 0x07, // 67:292
- 0x01, 0x30, 0x0B, 0x07, // 68:304
- 0x01, 0x3B, 0x0C, 0x07, // 69:315
- 0x01, 0x47, 0x09, 0x06, // 70:327
- 0x01, 0x50, 0x0D, 0x08, // 71:336
- 0x01, 0x5D, 0x0C, 0x07, // 72:349
- 0x01, 0x69, 0x04, 0x03, // 73:361
- 0x01, 0x6D, 0x08, 0x05, // 74:365
- 0x01, 0x75, 0x0E, 0x07, // 75:373
- 0x01, 0x83, 0x0C, 0x06, // 76:387
- 0x01, 0x8F, 0x10, 0x08, // 77:399
- 0x01, 0x9F, 0x0C, 0x07, // 78:415
- 0x01, 0xAB, 0x0E, 0x08, // 79:427
- 0x01, 0xB9, 0x0B, 0x07, // 80:441
- 0x01, 0xC4, 0x0E, 0x08, // 81:452
- 0x01, 0xD2, 0x0C, 0x07, // 82:466
- 0x01, 0xDE, 0x0C, 0x07, // 83:478
- 0x01, 0xEA, 0x0B, 0x06, // 84:490
- 0x01, 0xF5, 0x0C, 0x07, // 85:501
- 0x02, 0x01, 0x0D, 0x07, // 86:513
- 0x02, 0x0E, 0x11, 0x09, // 87:526
- 0x02, 0x1F, 0x0E, 0x07, // 88:543
- 0x02, 0x2D, 0x0D, 0x07, // 89:557
- 0x02, 0x3A, 0x0C, 0x06, // 90:570
- 0x02, 0x46, 0x06, 0x03, // 91:582
- 0x02, 0x4C, 0x06, 0x03, // 92:588
- 0x02, 0x52, 0x04, 0x03, // 93:594
- 0x02, 0x56, 0x09, 0x05, // 94:598
- 0x02, 0x5F, 0x0C, 0x06, // 95:607
- 0x02, 0x6B, 0x03, 0x03, // 96:619
- 0x02, 0x6E, 0x0A, 0x06, // 97:622
- 0x02, 0x78, 0x0A, 0x06, // 98:632
- 0x02, 0x82, 0x0A, 0x05, // 99:642
- 0x02, 0x8C, 0x0A, 0x06, // 100:652
- 0x02, 0x96, 0x0A, 0x06, // 101:662
- 0x02, 0xA0, 0x05, 0x03, // 102:672
- 0x02, 0xA5, 0x0A, 0x06, // 103:677
- 0x02, 0xAF, 0x0A, 0x06, // 104:687
- 0x02, 0xB9, 0x04, 0x02, // 105:697
- 0x02, 0xBD, 0x04, 0x02, // 106:701
- 0x02, 0xC1, 0x08, 0x05, // 107:705
- 0x02, 0xC9, 0x04, 0x02, // 108:713
- 0x02, 0xCD, 0x10, 0x08, // 109:717
- 0x02, 0xDD, 0x0A, 0x06, // 110:733
- 0x02, 0xE7, 0x0A, 0x06, // 111:743
- 0x02, 0xF1, 0x0A, 0x06, // 112:753
- 0x02, 0xFB, 0x0A, 0x06, // 113:763
- 0x03, 0x05, 0x05, 0x03, // 114:773
- 0x03, 0x0A, 0x08, 0x05, // 115:778
- 0x03, 0x12, 0x06, 0x03, // 116:786
- 0x03, 0x18, 0x0A, 0x06, // 117:792
- 0x03, 0x22, 0x09, 0x05, // 118:802
- 0x03, 0x2B, 0x0E, 0x07, // 119:811
- 0x03, 0x39, 0x0A, 0x05, // 120:825
- 0x03, 0x43, 0x09, 0x05, // 121:835
- 0x03, 0x4C, 0x0A, 0x05, // 122:844
- 0x03, 0x56, 0x06, 0x03, // 123:854
- 0x03, 0x5C, 0x04, 0x03, // 124:860
- 0x03, 0x60, 0x05, 0x03, // 125:864
- 0x03, 0x65, 0x09, 0x06, // 126:869
- 0xFF, 0xFF, 0x00, 0x00, // 127:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 128:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 129:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 130:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 131:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 132:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 133:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 134:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 135:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 136:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 137:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 138:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 139:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 140:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 141:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 142:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 143:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 144:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 145:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 146:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 147:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 148:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 149:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 150:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 151:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 152:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 153:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 154:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 155:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 156:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 157:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 158:65535
- 0xFF, 0xFF, 0x00, 0x0A, // 159:65535
- 0xFF, 0xFF, 0x00, 0x03, // 160:65535
- 0x03, 0x6E, 0x04, 0x03, // 161:878
- 0x03, 0x72, 0x0A, 0x06, // 162:882
- 0x03, 0x7C, 0x0C, 0x06, // 163:892
- 0x03, 0x88, 0x0A, 0x06, // 164:904
- 0x03, 0x92, 0x0A, 0x06, // 165:914
- 0x03, 0x9C, 0x04, 0x03, // 166:924
- 0x03, 0xA0, 0x0A, 0x06, // 167:928
- 0x03, 0xAA, 0x05, 0x03, // 168:938
- 0x03, 0xAF, 0x0D, 0x07, // 169:943
- 0x03, 0xBC, 0x07, 0x04, // 170:956
- 0x03, 0xC3, 0x0A, 0x06, // 171:963
- 0x03, 0xCD, 0x09, 0x06, // 172:973
- 0x03, 0xD6, 0x03, 0x03, // 173:982
- 0x03, 0xD9, 0x0D, 0x07, // 174:985
- 0x03, 0xE6, 0x0B, 0x06, // 175:998
- 0x03, 0xF1, 0x07, 0x04, // 176:1009
- 0x03, 0xF8, 0x0A, 0x05, // 177:1016
- 0x04, 0x02, 0x05, 0x03, // 178:1026
- 0x04, 0x07, 0x05, 0x03, // 179:1031
- 0x04, 0x0C, 0x05, 0x03, // 180:1036
- 0x04, 0x11, 0x0A, 0x06, // 181:1041
- 0x04, 0x1B, 0x09, 0x05, // 182:1051
- 0x04, 0x24, 0x03, 0x03, // 183:1060
- 0x04, 0x27, 0x06, 0x03, // 184:1063
- 0x04, 0x2D, 0x05, 0x03, // 185:1069
- 0x04, 0x32, 0x07, 0x04, // 186:1074
- 0x04, 0x39, 0x0A, 0x06, // 187:1081
- 0x04, 0x43, 0x10, 0x08, // 188:1091
- 0x04, 0x53, 0x10, 0x08, // 189:1107
- 0x04, 0x63, 0x10, 0x08, // 190:1123
- 0x04, 0x73, 0x0A, 0x06, // 191:1139
- 0x04, 0x7D, 0x0E, 0x07, // 192:1149
- 0x04, 0x8B, 0x0E, 0x07, // 193:1163
- 0x04, 0x99, 0x0E, 0x07, // 194:1177
- 0x04, 0xA7, 0x0E, 0x07, // 195:1191
- 0x04, 0xB5, 0x0E, 0x07, // 196:1205
- 0x04, 0xC3, 0x0E, 0x07, // 197:1219
- 0x04, 0xD1, 0x12, 0x0A, // 198:1233
- 0x04, 0xE3, 0x0C, 0x07, // 199:1251
- 0x04, 0xEF, 0x0C, 0x07, // 200:1263
- 0x04, 0xFB, 0x0C, 0x07, // 201:1275
- 0x05, 0x07, 0x0C, 0x07, // 202:1287
- 0x05, 0x13, 0x0C, 0x07, // 203:1299
- 0x05, 0x1F, 0x05, 0x03, // 204:1311
- 0x05, 0x24, 0x04, 0x03, // 205:1316
- 0x05, 0x28, 0x04, 0x03, // 206:1320
- 0x05, 0x2C, 0x05, 0x03, // 207:1324
- 0x05, 0x31, 0x0B, 0x07, // 208:1329
- 0x05, 0x3C, 0x0C, 0x07, // 209:1340
- 0x05, 0x48, 0x0E, 0x08, // 210:1352
- 0x05, 0x56, 0x0E, 0x08, // 211:1366
- 0x05, 0x64, 0x0E, 0x08, // 212:1380
- 0x05, 0x72, 0x0E, 0x08, // 213:1394
- 0x05, 0x80, 0x0E, 0x08, // 214:1408
- 0x05, 0x8E, 0x0A, 0x06, // 215:1422
- 0x05, 0x98, 0x0D, 0x08, // 216:1432
- 0x05, 0xA5, 0x0C, 0x07, // 217:1445
- 0x05, 0xB1, 0x0C, 0x07, // 218:1457
- 0x05, 0xBD, 0x0C, 0x07, // 219:1469
- 0x05, 0xC9, 0x0C, 0x07, // 220:1481
- 0x05, 0xD5, 0x0D, 0x07, // 221:1493
- 0x05, 0xE2, 0x0B, 0x07, // 222:1506
- 0x05, 0xED, 0x0C, 0x06, // 223:1517
- 0x05, 0xF9, 0x0A, 0x06, // 224:1529
- 0x06, 0x03, 0x0A, 0x06, // 225:1539
- 0x06, 0x0D, 0x0A, 0x06, // 226:1549
- 0x06, 0x17, 0x0A, 0x06, // 227:1559
- 0x06, 0x21, 0x0A, 0x06, // 228:1569
- 0x06, 0x2B, 0x0A, 0x06, // 229:1579
- 0x06, 0x35, 0x10, 0x09, // 230:1589
- 0x06, 0x45, 0x0A, 0x05, // 231:1605
- 0x06, 0x4F, 0x0A, 0x06, // 232:1615
- 0x06, 0x59, 0x0A, 0x06, // 233:1625
- 0x06, 0x63, 0x0A, 0x06, // 234:1635
- 0x06, 0x6D, 0x0A, 0x06, // 235:1645
- 0x06, 0x77, 0x05, 0x03, // 236:1655
- 0x06, 0x7C, 0x04, 0x03, // 237:1660
- 0x06, 0x80, 0x05, 0x03, // 238:1664
- 0x06, 0x85, 0x05, 0x03, // 239:1669
- 0x06, 0x8A, 0x0A, 0x06, // 240:1674
- 0x06, 0x94, 0x0A, 0x06, // 241:1684
- 0x06, 0x9E, 0x0A, 0x06, // 242:1694
- 0x06, 0xA8, 0x0A, 0x06, // 243:1704
- 0x06, 0xB2, 0x0A, 0x06, // 244:1714
- 0x06, 0xBC, 0x0A, 0x06, // 245:1724
- 0x06, 0xC6, 0x0A, 0x06, // 246:1734
- 0x06, 0xD0, 0x09, 0x05, // 247:1744
- 0x06, 0xD9, 0x0A, 0x06, // 248:1753
- 0x06, 0xE3, 0x0A, 0x06, // 249:1763
- 0x06, 0xED, 0x0A, 0x06, // 250:1773
- 0x06, 0xF7, 0x0A, 0x06, // 251:1783
- 0x07, 0x01, 0x0A, 0x06, // 252:1793
- 0x07, 0x0B, 0x09, 0x05, // 253:1803
- 0x07, 0x14, 0x0A, 0x06, // 254:1812
- 0x07, 0x1E, 0x09, 0x05, // 255:1822
-
- // Font Data:
- 0x00, 0x00, 0xF8, 0x02, // 33
- 0x38, 0x00, 0x00, 0x00, 0x38, // 34
- 0xA0, 0x03, 0xE0, 0x00, 0xB8, 0x03, 0xE0, 0x00, 0xB8, // 35
- 0x30, 0x01, 0x28, 0x02, 0xF8, 0x07, 0x48, 0x02, 0x90, 0x01, // 36
- 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x30, 0x03, 0xC0, 0x00, 0xB0, 0x01, 0x48, 0x02, 0x80, 0x01, // 37
- 0x80, 0x01, 0x50, 0x02, 0x68, 0x02, 0xA8, 0x02, 0x18, 0x01, 0x80, 0x03, 0x80, 0x02, // 38
- 0x38, // 39
- 0xE0, 0x03, 0x10, 0x04, 0x08, 0x08, // 40
- 0x08, 0x08, 0x10, 0x04, 0xE0, 0x03, // 41
- 0x28, 0x00, 0x18, 0x00, 0x28, // 42
- 0x40, 0x00, 0x40, 0x00, 0xF0, 0x01, 0x40, 0x00, 0x40, // 43
- 0x00, 0x00, 0x00, 0x06, // 44
- 0x80, 0x00, 0x80, // 45
- 0x00, 0x00, 0x00, 0x02, // 46
- 0x00, 0x03, 0xE0, 0x00, 0x18, // 47
- 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0xF0, 0x01, // 48
- 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0xF8, 0x03, // 49
- 0x10, 0x02, 0x08, 0x03, 0x88, 0x02, 0x48, 0x02, 0x30, 0x02, // 50
- 0x10, 0x01, 0x08, 0x02, 0x48, 0x02, 0x48, 0x02, 0xB0, 0x01, // 51
- 0xC0, 0x00, 0xA0, 0x00, 0x90, 0x00, 0x88, 0x00, 0xF8, 0x03, 0x80, // 52
- 0x60, 0x01, 0x38, 0x02, 0x28, 0x02, 0x28, 0x02, 0xC8, 0x01, // 53
- 0xF0, 0x01, 0x28, 0x02, 0x28, 0x02, 0x28, 0x02, 0xD0, 0x01, // 54
- 0x08, 0x00, 0x08, 0x03, 0xC8, 0x00, 0x38, 0x00, 0x08, // 55
- 0xB0, 0x01, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0xB0, 0x01, // 56
- 0x70, 0x01, 0x88, 0x02, 0x88, 0x02, 0x88, 0x02, 0xF0, 0x01, // 57
- 0x00, 0x00, 0x20, 0x02, // 58
- 0x00, 0x00, 0x20, 0x06, // 59
- 0x00, 0x00, 0x40, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x10, 0x01, // 60
- 0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA0, // 61
- 0x00, 0x00, 0x10, 0x01, 0xA0, 0x00, 0xA0, 0x00, 0x40, // 62
- 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0xC8, 0x02, 0x48, 0x00, 0x30, // 63
- 0x00, 0x00, 0xC0, 0x03, 0x30, 0x04, 0xD0, 0x09, 0x28, 0x0A, 0x28, 0x0A, 0xC8, 0x0B, 0x68, 0x0A, 0x10, 0x05, 0xE0, 0x04, // 64
- 0x00, 0x02, 0xC0, 0x01, 0xB0, 0x00, 0x88, 0x00, 0xB0, 0x00, 0xC0, 0x01, 0x00, 0x02, // 65
- 0x00, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0xF0, 0x01, // 66
- 0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x10, 0x01, // 67
- 0x00, 0x00, 0xF8, 0x03, 0x08, 0x02, 0x08, 0x02, 0x10, 0x01, 0xE0, // 68
- 0x00, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, // 69
- 0x00, 0x00, 0xF8, 0x03, 0x48, 0x00, 0x48, 0x00, 0x08, // 70
- 0x00, 0x00, 0xE0, 0x00, 0x10, 0x01, 0x08, 0x02, 0x48, 0x02, 0x50, 0x01, 0xC0, // 71
- 0x00, 0x00, 0xF8, 0x03, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xF8, 0x03, // 72
- 0x00, 0x00, 0xF8, 0x03, // 73
- 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0xF8, 0x01, // 74
- 0x00, 0x00, 0xF8, 0x03, 0x80, 0x00, 0x60, 0x00, 0x90, 0x00, 0x08, 0x01, 0x00, 0x02, // 75
- 0x00, 0x00, 0xF8, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, // 76
- 0x00, 0x00, 0xF8, 0x03, 0x30, 0x00, 0xC0, 0x01, 0x00, 0x02, 0xC0, 0x01, 0x30, 0x00, 0xF8, 0x03, // 77
- 0x00, 0x00, 0xF8, 0x03, 0x30, 0x00, 0x40, 0x00, 0x80, 0x01, 0xF8, 0x03, // 78
- 0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0xF0, 0x01, // 79
- 0x00, 0x00, 0xF8, 0x03, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, // 80
- 0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x03, 0x08, 0x03, 0xF0, 0x02, // 81
- 0x00, 0x00, 0xF8, 0x03, 0x48, 0x00, 0x48, 0x00, 0xC8, 0x00, 0x30, 0x03, // 82
- 0x00, 0x00, 0x30, 0x01, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, 0x90, 0x01, // 83
- 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x03, 0x08, 0x00, 0x08, // 84
- 0x00, 0x00, 0xF8, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0xF8, 0x01, // 85
- 0x08, 0x00, 0x70, 0x00, 0x80, 0x01, 0x00, 0x02, 0x80, 0x01, 0x70, 0x00, 0x08, // 86
- 0x18, 0x00, 0xE0, 0x01, 0x00, 0x02, 0xF0, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x00, 0x02, 0xE0, 0x01, 0x18, // 87
- 0x00, 0x02, 0x08, 0x01, 0x90, 0x00, 0x60, 0x00, 0x90, 0x00, 0x08, 0x01, 0x00, 0x02, // 88
- 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0xC0, 0x03, 0x20, 0x00, 0x10, 0x00, 0x08, // 89
- 0x08, 0x03, 0x88, 0x02, 0xC8, 0x02, 0x68, 0x02, 0x38, 0x02, 0x18, 0x02, // 90
- 0x00, 0x00, 0xF8, 0x0F, 0x08, 0x08, // 91
- 0x18, 0x00, 0xE0, 0x00, 0x00, 0x03, // 92
- 0x08, 0x08, 0xF8, 0x0F, // 93
- 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, // 94
- 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, // 95
- 0x08, 0x00, 0x10, // 96
- 0x00, 0x00, 0x00, 0x03, 0xA0, 0x02, 0xA0, 0x02, 0xE0, 0x03, // 97
- 0x00, 0x00, 0xF8, 0x03, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 98
- 0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0x40, 0x01, // 99
- 0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xF8, 0x03, // 100
- 0x00, 0x00, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x02, // 101
- 0x20, 0x00, 0xF0, 0x03, 0x28, // 102
- 0x00, 0x00, 0xC0, 0x05, 0x20, 0x0A, 0x20, 0x0A, 0xE0, 0x07, // 103
- 0x00, 0x00, 0xF8, 0x03, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x03, // 104
- 0x00, 0x00, 0xE8, 0x03, // 105
- 0x00, 0x08, 0xE8, 0x07, // 106
- 0xF8, 0x03, 0x80, 0x00, 0xC0, 0x01, 0x20, 0x02, // 107
- 0x00, 0x00, 0xF8, 0x03, // 108
- 0x00, 0x00, 0xE0, 0x03, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x03, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x03, // 109
- 0x00, 0x00, 0xE0, 0x03, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x03, // 110
- 0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 111
- 0x00, 0x00, 0xE0, 0x0F, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 112
- 0x00, 0x00, 0xC0, 0x01, 0x20, 0x02, 0x20, 0x02, 0xE0, 0x0F, // 113
- 0x00, 0x00, 0xE0, 0x03, 0x20, // 114
- 0x40, 0x02, 0xA0, 0x02, 0xA0, 0x02, 0x20, 0x01, // 115
- 0x20, 0x00, 0xF8, 0x03, 0x20, 0x02, // 116
- 0x00, 0x00, 0xE0, 0x01, 0x00, 0x02, 0x00, 0x02, 0xE0, 0x03, // 117
- 0x20, 0x00, 0xC0, 0x01, 0x00, 0x02, 0xC0, 0x01, 0x20, // 118
- 0xE0, 0x01, 0x00, 0x02, 0xC0, 0x01, 0x20, 0x00, 0xC0, 0x01, 0x00, 0x02, 0xE0, 0x01, // 119
- 0x20, 0x02, 0x40, 0x01, 0x80, 0x00, 0x40, 0x01, 0x20, 0x02, // 120
- 0x20, 0x00, 0xC0, 0x09, 0x00, 0x06, 0xC0, 0x01, 0x20, // 121
- 0x20, 0x02, 0x20, 0x03, 0xA0, 0x02, 0x60, 0x02, 0x20, 0x02, // 122
- 0x80, 0x00, 0x78, 0x0F, 0x08, 0x08, // 123
- 0x00, 0x00, 0xF8, 0x0F, // 124
- 0x08, 0x08, 0x78, 0x0F, 0x80, // 125
- 0xC0, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x80, 0x00, 0xC0, // 126
- 0x00, 0x00, 0xA0, 0x0F, // 161
- 0x00, 0x00, 0xC0, 0x01, 0xA0, 0x0F, 0x78, 0x02, 0x40, 0x01, // 162
- 0x40, 0x02, 0x70, 0x03, 0xC8, 0x02, 0x48, 0x02, 0x08, 0x02, 0x10, 0x02, // 163
- 0x00, 0x00, 0xE0, 0x01, 0x20, 0x01, 0x20, 0x01, 0xE0, 0x01, // 164
- 0x48, 0x01, 0x70, 0x01, 0xC0, 0x03, 0x70, 0x01, 0x48, 0x01, // 165
- 0x00, 0x00, 0x38, 0x0F, // 166
- 0xD0, 0x04, 0x28, 0x09, 0x48, 0x09, 0x48, 0x0A, 0x90, 0x05, // 167
- 0x08, 0x00, 0x00, 0x00, 0x08, // 168
- 0xE0, 0x00, 0x10, 0x01, 0x48, 0x02, 0xA8, 0x02, 0xA8, 0x02, 0x10, 0x01, 0xE0, // 169
- 0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0x78, // 170
- 0x00, 0x00, 0x80, 0x01, 0x40, 0x02, 0x80, 0x01, 0x40, 0x02, // 171
- 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, // 172
- 0x80, 0x00, 0x80, // 173
- 0xE0, 0x00, 0x10, 0x01, 0xE8, 0x02, 0x68, 0x02, 0xC8, 0x02, 0x10, 0x01, 0xE0, // 174
- 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, // 175
- 0x00, 0x00, 0x38, 0x00, 0x28, 0x00, 0x38, // 176
- 0x40, 0x02, 0x40, 0x02, 0xF0, 0x03, 0x40, 0x02, 0x40, 0x02, // 177
- 0x48, 0x00, 0x68, 0x00, 0x58, // 178
- 0x48, 0x00, 0x58, 0x00, 0x68, // 179
- 0x00, 0x00, 0x10, 0x00, 0x08, // 180
- 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x02, 0x00, 0x02, 0xE0, 0x03, // 181
- 0x70, 0x00, 0xF8, 0x0F, 0x08, 0x00, 0xF8, 0x0F, 0x08, // 182
- 0x00, 0x00, 0x40, // 183
- 0x00, 0x00, 0x00, 0x14, 0x00, 0x18, // 184
- 0x00, 0x00, 0x10, 0x00, 0x78, // 185
- 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, // 186
- 0x00, 0x00, 0x40, 0x02, 0x80, 0x01, 0x40, 0x02, 0x80, 0x01, // 187
- 0x00, 0x00, 0x10, 0x02, 0x78, 0x01, 0xC0, 0x00, 0x20, 0x01, 0x90, 0x01, 0xC8, 0x03, 0x00, 0x01, // 188
- 0x00, 0x00, 0x10, 0x02, 0x78, 0x01, 0x80, 0x00, 0x60, 0x00, 0x50, 0x02, 0x48, 0x03, 0xC0, 0x02, // 189
- 0x48, 0x00, 0x58, 0x00, 0x68, 0x03, 0x80, 0x00, 0x60, 0x01, 0x90, 0x01, 0xC8, 0x03, 0x00, 0x01, // 190
- 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0xA0, 0x09, 0x00, 0x04, // 191
- 0x00, 0x02, 0xC0, 0x01, 0xB0, 0x00, 0x89, 0x00, 0xB2, 0x00, 0xC0, 0x01, 0x00, 0x02, // 192
- 0x00, 0x02, 0xC0, 0x01, 0xB0, 0x00, 0x8A, 0x00, 0xB1, 0x00, 0xC0, 0x01, 0x00, 0x02, // 193
- 0x00, 0x02, 0xC0, 0x01, 0xB2, 0x00, 0x89, 0x00, 0xB2, 0x00, 0xC0, 0x01, 0x00, 0x02, // 194
- 0x00, 0x02, 0xC2, 0x01, 0xB1, 0x00, 0x8A, 0x00, 0xB1, 0x00, 0xC0, 0x01, 0x00, 0x02, // 195
- 0x00, 0x02, 0xC0, 0x01, 0xB2, 0x00, 0x88, 0x00, 0xB2, 0x00, 0xC0, 0x01, 0x00, 0x02, // 196
- 0x00, 0x02, 0xC0, 0x01, 0xBE, 0x00, 0x8A, 0x00, 0xBE, 0x00, 0xC0, 0x01, 0x00, 0x02, // 197
- 0x00, 0x03, 0xC0, 0x00, 0xE0, 0x00, 0x98, 0x00, 0x88, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x48, 0x02, // 198
- 0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x08, 0x16, 0x08, 0x1A, 0x10, 0x01, // 199
- 0x00, 0x00, 0xF8, 0x03, 0x49, 0x02, 0x4A, 0x02, 0x48, 0x02, 0x48, 0x02, // 200
- 0x00, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x4A, 0x02, 0x49, 0x02, 0x48, 0x02, // 201
- 0x00, 0x00, 0xFA, 0x03, 0x49, 0x02, 0x4A, 0x02, 0x48, 0x02, 0x48, 0x02, // 202
- 0x00, 0x00, 0xF8, 0x03, 0x4A, 0x02, 0x48, 0x02, 0x4A, 0x02, 0x48, 0x02, // 203
- 0x00, 0x00, 0xF9, 0x03, 0x02, // 204
- 0x02, 0x00, 0xF9, 0x03, // 205
- 0x01, 0x00, 0xFA, 0x03, // 206
- 0x02, 0x00, 0xF8, 0x03, 0x02, // 207
- 0x40, 0x00, 0xF8, 0x03, 0x48, 0x02, 0x48, 0x02, 0x10, 0x01, 0xE0, // 208
- 0x00, 0x00, 0xFA, 0x03, 0x31, 0x00, 0x42, 0x00, 0x81, 0x01, 0xF8, 0x03, // 209
- 0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x08, 0x02, 0xF0, 0x01, // 210
- 0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x0A, 0x02, 0x09, 0x02, 0x08, 0x02, 0xF0, 0x01, // 211
- 0x00, 0x00, 0xF0, 0x01, 0x08, 0x02, 0x0A, 0x02, 0x09, 0x02, 0x0A, 0x02, 0xF0, 0x01, // 212
- 0x00, 0x00, 0xF0, 0x01, 0x0A, 0x02, 0x09, 0x02, 0x0A, 0x02, 0x09, 0x02, 0xF0, 0x01, // 213
- 0x00, 0x00, 0xF0, 0x01, 0x0A, 0x02, 0x08, 0x02, 0x0A, 0x02, 0x08, 0x02, 0xF0, 0x01, // 214
- 0x10, 0x01, 0xA0, 0x00, 0xE0, 0x00, 0xA0, 0x00, 0x10, 0x01, // 215
- 0x00, 0x00, 0xF0, 0x02, 0x08, 0x03, 0xC8, 0x02, 0x28, 0x02, 0x18, 0x03, 0xE8, // 216
- 0x00, 0x00, 0xF8, 0x01, 0x01, 0x02, 0x02, 0x02, 0x00, 0x02, 0xF8, 0x01, // 217
- 0x00, 0x00, 0xF8, 0x01, 0x02, 0x02, 0x01, 0x02, 0x00, 0x02, 0xF8, 0x01, // 218
- 0x00, 0x00, 0xF8, 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0xF8, 0x01, // 219
- 0x00, 0x00, 0xF8, 0x01, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0xF8, 0x01, // 220
- 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0xC2, 0x03, 0x21, 0x00, 0x10, 0x00, 0x08, // 221
- 0x00, 0x00, 0xF8, 0x03, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0xE0, // 222
- 0x00, 0x00, 0xF0, 0x03, 0x08, 0x01, 0x48, 0x02, 0xB0, 0x02, 0x80, 0x01, // 223
- 0x00, 0x00, 0x00, 0x03, 0xA4, 0x02, 0xA8, 0x02, 0xE0, 0x03, // 224
- 0x00, 0x00, 0x00, 0x03, 0xA8, 0x02, 0xA4, 0x02, 0xE0, 0x03, // 225
- 0x00, 0x00, 0x00, 0x03, 0xA8, 0x02, 0xA4, 0x02, 0xE8, 0x03, // 226
- 0x00, 0x00, 0x08, 0x03, 0xA4, 0x02, 0xA8, 0x02, 0xE4, 0x03, // 227
- 0x00, 0x00, 0x00, 0x03, 0xA8, 0x02, 0xA0, 0x02, 0xE8, 0x03, // 228
- 0x00, 0x00, 0x00, 0x03, 0xAE, 0x02, 0xAA, 0x02, 0xEE, 0x03, // 229
- 0x00, 0x00, 0x40, 0x03, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02, 0xC0, 0x02, // 230
- 0x00, 0x00, 0xC0, 0x01, 0x20, 0x16, 0x20, 0x1A, 0x40, 0x01, // 231
- 0x00, 0x00, 0xC0, 0x01, 0xA4, 0x02, 0xA8, 0x02, 0xC0, 0x02, // 232
- 0x00, 0x00, 0xC0, 0x01, 0xA8, 0x02, 0xA4, 0x02, 0xC0, 0x02, // 233
- 0x00, 0x00, 0xC0, 0x01, 0xA8, 0x02, 0xA4, 0x02, 0xC8, 0x02, // 234
- 0x00, 0x00, 0xC0, 0x01, 0xA8, 0x02, 0xA0, 0x02, 0xC8, 0x02, // 235
- 0x00, 0x00, 0xE4, 0x03, 0x08, // 236
- 0x08, 0x00, 0xE4, 0x03, // 237
- 0x08, 0x00, 0xE4, 0x03, 0x08, // 238
- 0x08, 0x00, 0xE0, 0x03, 0x08, // 239
- 0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x38, 0x02, 0xE0, 0x01, // 240
- 0x00, 0x00, 0xE8, 0x03, 0x24, 0x00, 0x28, 0x00, 0xC4, 0x03, // 241
- 0x00, 0x00, 0xC0, 0x01, 0x24, 0x02, 0x28, 0x02, 0xC0, 0x01, // 242
- 0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x24, 0x02, 0xC0, 0x01, // 243
- 0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x24, 0x02, 0xC8, 0x01, // 244
- 0x00, 0x00, 0xC8, 0x01, 0x24, 0x02, 0x28, 0x02, 0xC4, 0x01, // 245
- 0x00, 0x00, 0xC0, 0x01, 0x28, 0x02, 0x20, 0x02, 0xC8, 0x01, // 246
- 0x40, 0x00, 0x40, 0x00, 0x50, 0x01, 0x40, 0x00, 0x40, // 247
- 0x00, 0x00, 0xC0, 0x02, 0xA0, 0x03, 0x60, 0x02, 0xA0, 0x01, // 248
- 0x00, 0x00, 0xE0, 0x01, 0x04, 0x02, 0x08, 0x02, 0xE0, 0x03, // 249
- 0x00, 0x00, 0xE0, 0x01, 0x08, 0x02, 0x04, 0x02, 0xE0, 0x03, // 250
- 0x00, 0x00, 0xE8, 0x01, 0x04, 0x02, 0x08, 0x02, 0xE0, 0x03, // 251
- 0x00, 0x00, 0xE0, 0x01, 0x08, 0x02, 0x00, 0x02, 0xE8, 0x03, // 252
- 0x20, 0x00, 0xC0, 0x09, 0x08, 0x06, 0xC4, 0x01, 0x20, // 253
- 0x00, 0x00, 0xF8, 0x0F, 0x20, 0x02, 0x20, 0x02, 0xC0, 0x01, // 254
- 0x20, 0x00, 0xC8, 0x09, 0x00, 0x06, 0xC8, 0x01, 0x20 // 255
-};
diff --git a/src/input/RotaryEncoderInterruptBase.cpp b/src/input/RotaryEncoderInterruptBase.cpp
index ba825080f..6330233bb 100644
--- a/src/input/RotaryEncoderInterruptBase.cpp
+++ b/src/input/RotaryEncoderInterruptBase.cpp
@@ -39,7 +39,7 @@ void RotaryEncoderInterruptBase::init(
int32_t RotaryEncoderInterruptBase::runOnce()
{
InputEvent e;
- e.inputEvent = InputEventChar_NULL;
+ e.inputEvent = InputEventChar_KEY_NONE;
e.source = this->_originName;
if (this->action == ROTARY_ACTION_PRESSED)
@@ -58,7 +58,7 @@ int32_t RotaryEncoderInterruptBase::runOnce()
e.inputEvent = this->_eventCcw;
}
- if (e.inputEvent != InputEventChar_NULL)
+ if (e.inputEvent != InputEventChar_KEY_NONE)
{
this->notifyObservers(&e);
}
diff --git a/src/main.cpp b/src/main.cpp
index 09253657e..b0f90c445 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -42,9 +42,6 @@
#include "SX1268Interface.h"
#include "LLCC68Interface.h"
-#ifdef NRF52_SERIES
-#include "variant.h"
-#endif
using namespace concurrency;
@@ -303,8 +300,9 @@ class ButtonThread : public OSThread
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
@@ -316,6 +314,7 @@ class ButtonThread : public OSThread
// 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);
@@ -357,6 +356,7 @@ class ButtonThread : public OSThread
longPressTime = 0;
if (shutdown_on_long_stop) {
playShutdownMelody();
+ delay(3000);
power->shutdown();
}
}
@@ -699,8 +699,9 @@ axpDebugOutput.setup();
#endif
uint32_t rebootAtMsec; // If not zero we will reboot at this time (used to reboot shortly after the update completes)
+uint32_t shutdownAtMsec; // If not zero we will shutdown at this time (used to shutdown from python or mobile client)
-void rebootCheck()
+void powerCommandsCheck()
{
if (rebootAtMsec && millis() > rebootAtMsec) {
#ifndef NO_ESP32
@@ -710,6 +711,30 @@ void rebootCheck()
DEBUG_MSG("FIXME implement reboot for this platform");
#endif
}
+
+#if NRF52_SERIES
+ if (shutdownAtMsec) {
+ screen->startShutdownScreen();
+ playBeep();
+ ledOff(PIN_LED1);
+ ledOff(PIN_LED2);
+ }
+#endif
+
+ if (shutdownAtMsec && millis() > shutdownAtMsec) {
+ DEBUG_MSG("Shutting down from admin command\n");
+#ifdef TBEAM_V10
+ if (axp192_found == true) {
+ setLed(false);
+ power->shutdown();
+ }
+#elif NRF52_SERIES
+ playShutdownMelody();
+ power->shutdown();
+#else
+ DEBUG_MSG("FIXME implement shutdown for this platform");
+#endif
+ }
}
// If a thread does something that might need for it to be rescheduled ASAP it can set this flag
@@ -730,7 +755,7 @@ void loop()
#ifdef NRF52_SERIES
nrf52Loop();
#endif
- rebootCheck();
+ powerCommandsCheck();
// For debugging
// if (rIf) ((RadioLibInterface *)rIf)->isActivelyReceiving();
diff --git a/src/main.h b/src/main.h
index 0c5cb349c..2c90f34e3 100644
--- a/src/main.h
+++ b/src/main.h
@@ -21,6 +21,7 @@ extern graphics::Screen *screen;
const char *getDeviceName();
extern uint32_t rebootAtMsec;
+extern uint32_t shutdownAtMsec;
// If a thread does something that might need for it to be rescheduled ASAP it can set this flag
// This will supress the current delay and instead try to run ASAP.
diff --git a/src/mesh/RadioLibInterface.h b/src/mesh/RadioLibInterface.h
index de3505524..8fe2e2b81 100644
--- a/src/mesh/RadioLibInterface.h
+++ b/src/mesh/RadioLibInterface.h
@@ -4,10 +4,6 @@
#include "RadioInterface.h"
#include "MeshPacketQueue.h"
-#ifdef CubeCell_BoardPlus
-#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
-#endif
-
#define RADIOLIB_EXCLUDE_HTTP
#include
diff --git a/src/mesh/generated/admin.pb.h b/src/mesh/generated/admin.pb.h
index 2468faa85..bf9bde18b 100644
--- a/src/mesh/generated/admin.pb.h
+++ b/src/mesh/generated/admin.pb.h
@@ -4,6 +4,7 @@
#ifndef PB_ADMIN_PB_H_INCLUDED
#define PB_ADMIN_PB_H_INCLUDED
#include
+#include "cannedmessages.pb.h"
#include "channel.pb.h"
#include "mesh.pb.h"
#include "radioconfig.pb.h"
@@ -29,6 +30,22 @@ typedef struct _AdminMessage {
bool confirm_set_radio;
bool exit_simulator;
int32_t reboot_seconds;
+ bool get_canned_message_plugin_part1_request;
+ CannedMessagePluginMessagePart1 get_canned_message_plugin_part1_response;
+ bool get_canned_message_plugin_part2_request;
+ CannedMessagePluginMessagePart2 get_canned_message_plugin_part2_response;
+ bool get_canned_message_plugin_part3_request;
+ CannedMessagePluginMessagePart3 get_canned_message_plugin_part3_response;
+ bool get_canned_message_plugin_part4_request;
+ CannedMessagePluginMessagePart4 get_canned_message_plugin_part4_response;
+ bool get_canned_message_plugin_part5_request;
+ CannedMessagePluginMessagePart5 get_canned_message_plugin_part5_response;
+ CannedMessagePluginMessagePart1 set_canned_message_plugin_part1;
+ CannedMessagePluginMessagePart2 set_canned_message_plugin_part2;
+ CannedMessagePluginMessagePart3 set_canned_message_plugin_part3;
+ CannedMessagePluginMessagePart4 set_canned_message_plugin_part4;
+ CannedMessagePluginMessagePart5 set_canned_message_plugin_part5;
+ int32_t shutdown_seconds;
};
} AdminMessage;
@@ -55,6 +72,22 @@ extern "C" {
#define AdminMessage_confirm_set_radio_tag 33
#define AdminMessage_exit_simulator_tag 34
#define AdminMessage_reboot_seconds_tag 35
+#define AdminMessage_get_canned_message_plugin_part1_request_tag 36
+#define AdminMessage_get_canned_message_plugin_part1_response_tag 37
+#define AdminMessage_get_canned_message_plugin_part2_request_tag 38
+#define AdminMessage_get_canned_message_plugin_part2_response_tag 39
+#define AdminMessage_get_canned_message_plugin_part3_request_tag 40
+#define AdminMessage_get_canned_message_plugin_part3_response_tag 41
+#define AdminMessage_get_canned_message_plugin_part4_request_tag 42
+#define AdminMessage_get_canned_message_plugin_part4_response_tag 43
+#define AdminMessage_get_canned_message_plugin_part5_request_tag 44
+#define AdminMessage_get_canned_message_plugin_part5_response_tag 45
+#define AdminMessage_set_canned_message_plugin_part1_tag 46
+#define AdminMessage_set_canned_message_plugin_part2_tag 47
+#define AdminMessage_set_canned_message_plugin_part3_tag 48
+#define AdminMessage_set_canned_message_plugin_part4_tag 49
+#define AdminMessage_set_canned_message_plugin_part5_tag 50
+#define AdminMessage_shutdown_seconds_tag 51
/* Struct field encoding specification for nanopb */
#define AdminMessage_FIELDLIST(X, a) \
@@ -70,7 +103,23 @@ X(a, STATIC, ONEOF, MESSAGE, (variant,get_owner_response,get_owner_respons
X(a, STATIC, ONEOF, BOOL, (variant,confirm_set_channel,confirm_set_channel), 32) \
X(a, STATIC, ONEOF, BOOL, (variant,confirm_set_radio,confirm_set_radio), 33) \
X(a, STATIC, ONEOF, BOOL, (variant,exit_simulator,exit_simulator), 34) \
-X(a, STATIC, ONEOF, INT32, (variant,reboot_seconds,reboot_seconds), 35)
+X(a, STATIC, ONEOF, INT32, (variant,reboot_seconds,reboot_seconds), 35) \
+X(a, STATIC, ONEOF, BOOL, (variant,get_canned_message_plugin_part1_request,get_canned_message_plugin_part1_request), 36) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,get_canned_message_plugin_part1_response,get_canned_message_plugin_part1_response), 37) \
+X(a, STATIC, ONEOF, BOOL, (variant,get_canned_message_plugin_part2_request,get_canned_message_plugin_part2_request), 38) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,get_canned_message_plugin_part2_response,get_canned_message_plugin_part2_response), 39) \
+X(a, STATIC, ONEOF, BOOL, (variant,get_canned_message_plugin_part3_request,get_canned_message_plugin_part3_request), 40) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,get_canned_message_plugin_part3_response,get_canned_message_plugin_part3_response), 41) \
+X(a, STATIC, ONEOF, BOOL, (variant,get_canned_message_plugin_part4_request,get_canned_message_plugin_part4_request), 42) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,get_canned_message_plugin_part4_response,get_canned_message_plugin_part4_response), 43) \
+X(a, STATIC, ONEOF, BOOL, (variant,get_canned_message_plugin_part5_request,get_canned_message_plugin_part5_request), 44) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,get_canned_message_plugin_part5_response,get_canned_message_plugin_part5_response), 45) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,set_canned_message_plugin_part1,set_canned_message_plugin_part1), 46) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,set_canned_message_plugin_part2,set_canned_message_plugin_part2), 47) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,set_canned_message_plugin_part3,set_canned_message_plugin_part3), 48) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,set_canned_message_plugin_part4,set_canned_message_plugin_part4), 49) \
+X(a, STATIC, ONEOF, MESSAGE, (variant,set_canned_message_plugin_part5,set_canned_message_plugin_part5), 50) \
+X(a, STATIC, ONEOF, INT32, (variant,shutdown_seconds,shutdown_seconds), 51)
#define AdminMessage_CALLBACK NULL
#define AdminMessage_DEFAULT NULL
#define AdminMessage_variant_set_radio_MSGTYPE RadioConfig
@@ -79,6 +128,16 @@ X(a, STATIC, ONEOF, INT32, (variant,reboot_seconds,reboot_seconds), 35)
#define AdminMessage_variant_get_radio_response_MSGTYPE RadioConfig
#define AdminMessage_variant_get_channel_response_MSGTYPE Channel
#define AdminMessage_variant_get_owner_response_MSGTYPE User
+#define AdminMessage_variant_get_canned_message_plugin_part1_response_MSGTYPE CannedMessagePluginMessagePart1
+#define AdminMessage_variant_get_canned_message_plugin_part2_response_MSGTYPE CannedMessagePluginMessagePart2
+#define AdminMessage_variant_get_canned_message_plugin_part3_response_MSGTYPE CannedMessagePluginMessagePart3
+#define AdminMessage_variant_get_canned_message_plugin_part4_response_MSGTYPE CannedMessagePluginMessagePart4
+#define AdminMessage_variant_get_canned_message_plugin_part5_response_MSGTYPE CannedMessagePluginMessagePart5
+#define AdminMessage_variant_set_canned_message_plugin_part1_MSGTYPE CannedMessagePluginMessagePart1
+#define AdminMessage_variant_set_canned_message_plugin_part2_MSGTYPE CannedMessagePluginMessagePart2
+#define AdminMessage_variant_set_canned_message_plugin_part3_MSGTYPE CannedMessagePluginMessagePart3
+#define AdminMessage_variant_set_canned_message_plugin_part4_MSGTYPE CannedMessagePluginMessagePart4
+#define AdminMessage_variant_set_canned_message_plugin_part5_MSGTYPE CannedMessagePluginMessagePart5
extern const pb_msgdesc_t AdminMessage_msg;
@@ -86,7 +145,7 @@ extern const pb_msgdesc_t AdminMessage_msg;
#define AdminMessage_fields &AdminMessage_msg
/* Maximum encoded size of messages (where known) */
-#define AdminMessage_size 1619
+#define AdminMessage_size 795
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/mesh/generated/cannedmessages.pb.c b/src/mesh/generated/cannedmessages.pb.c
new file mode 100644
index 000000000..16563446e
--- /dev/null
+++ b/src/mesh/generated/cannedmessages.pb.c
@@ -0,0 +1,24 @@
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.4.4 */
+
+#include "cannedmessages.pb.h"
+#if PB_PROTO_HEADER_VERSION != 40
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+PB_BIND(CannedMessagePluginMessagePart1, CannedMessagePluginMessagePart1, AUTO)
+
+
+PB_BIND(CannedMessagePluginMessagePart2, CannedMessagePluginMessagePart2, AUTO)
+
+
+PB_BIND(CannedMessagePluginMessagePart3, CannedMessagePluginMessagePart3, AUTO)
+
+
+PB_BIND(CannedMessagePluginMessagePart4, CannedMessagePluginMessagePart4, AUTO)
+
+
+PB_BIND(CannedMessagePluginMessagePart5, CannedMessagePluginMessagePart5, AUTO)
+
+
+
diff --git a/src/mesh/generated/cannedmessages.pb.h b/src/mesh/generated/cannedmessages.pb.h
new file mode 100644
index 000000000..0f1b0786e
--- /dev/null
+++ b/src/mesh/generated/cannedmessages.pb.h
@@ -0,0 +1,107 @@
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.4.4 */
+
+#ifndef PB_CANNEDMESSAGES_PB_H_INCLUDED
+#define PB_CANNEDMESSAGES_PB_H_INCLUDED
+#include
+
+#if PB_PROTO_HEADER_VERSION != 40
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+/* Struct definitions */
+typedef struct _CannedMessagePluginMessagePart1 {
+ char text[200];
+} CannedMessagePluginMessagePart1;
+
+typedef struct _CannedMessagePluginMessagePart2 {
+ char text[200];
+} CannedMessagePluginMessagePart2;
+
+typedef struct _CannedMessagePluginMessagePart3 {
+ char text[200];
+} CannedMessagePluginMessagePart3;
+
+typedef struct _CannedMessagePluginMessagePart4 {
+ char text[200];
+} CannedMessagePluginMessagePart4;
+
+typedef struct _CannedMessagePluginMessagePart5 {
+ char text[200];
+} CannedMessagePluginMessagePart5;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Initializer values for message structs */
+#define CannedMessagePluginMessagePart1_init_default {""}
+#define CannedMessagePluginMessagePart2_init_default {""}
+#define CannedMessagePluginMessagePart3_init_default {""}
+#define CannedMessagePluginMessagePart4_init_default {""}
+#define CannedMessagePluginMessagePart5_init_default {""}
+#define CannedMessagePluginMessagePart1_init_zero {""}
+#define CannedMessagePluginMessagePart2_init_zero {""}
+#define CannedMessagePluginMessagePart3_init_zero {""}
+#define CannedMessagePluginMessagePart4_init_zero {""}
+#define CannedMessagePluginMessagePart5_init_zero {""}
+
+/* Field tags (for use in manual encoding/decoding) */
+#define CannedMessagePluginMessagePart1_text_tag 1
+#define CannedMessagePluginMessagePart2_text_tag 1
+#define CannedMessagePluginMessagePart3_text_tag 1
+#define CannedMessagePluginMessagePart4_text_tag 1
+#define CannedMessagePluginMessagePart5_text_tag 1
+
+/* Struct field encoding specification for nanopb */
+#define CannedMessagePluginMessagePart1_FIELDLIST(X, a) \
+X(a, STATIC, SINGULAR, STRING, text, 1)
+#define CannedMessagePluginMessagePart1_CALLBACK NULL
+#define CannedMessagePluginMessagePart1_DEFAULT NULL
+
+#define CannedMessagePluginMessagePart2_FIELDLIST(X, a) \
+X(a, STATIC, SINGULAR, STRING, text, 1)
+#define CannedMessagePluginMessagePart2_CALLBACK NULL
+#define CannedMessagePluginMessagePart2_DEFAULT NULL
+
+#define CannedMessagePluginMessagePart3_FIELDLIST(X, a) \
+X(a, STATIC, SINGULAR, STRING, text, 1)
+#define CannedMessagePluginMessagePart3_CALLBACK NULL
+#define CannedMessagePluginMessagePart3_DEFAULT NULL
+
+#define CannedMessagePluginMessagePart4_FIELDLIST(X, a) \
+X(a, STATIC, SINGULAR, STRING, text, 1)
+#define CannedMessagePluginMessagePart4_CALLBACK NULL
+#define CannedMessagePluginMessagePart4_DEFAULT NULL
+
+#define CannedMessagePluginMessagePart5_FIELDLIST(X, a) \
+X(a, STATIC, SINGULAR, STRING, text, 1)
+#define CannedMessagePluginMessagePart5_CALLBACK NULL
+#define CannedMessagePluginMessagePart5_DEFAULT NULL
+
+extern const pb_msgdesc_t CannedMessagePluginMessagePart1_msg;
+extern const pb_msgdesc_t CannedMessagePluginMessagePart2_msg;
+extern const pb_msgdesc_t CannedMessagePluginMessagePart3_msg;
+extern const pb_msgdesc_t CannedMessagePluginMessagePart4_msg;
+extern const pb_msgdesc_t CannedMessagePluginMessagePart5_msg;
+
+/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
+#define CannedMessagePluginMessagePart1_fields &CannedMessagePluginMessagePart1_msg
+#define CannedMessagePluginMessagePart2_fields &CannedMessagePluginMessagePart2_msg
+#define CannedMessagePluginMessagePart3_fields &CannedMessagePluginMessagePart3_msg
+#define CannedMessagePluginMessagePart4_fields &CannedMessagePluginMessagePart4_msg
+#define CannedMessagePluginMessagePart5_fields &CannedMessagePluginMessagePart5_msg
+
+/* Maximum encoded size of messages (where known) */
+#define CannedMessagePluginMessagePart1_size 202
+#define CannedMessagePluginMessagePart2_size 202
+#define CannedMessagePluginMessagePart3_size 202
+#define CannedMessagePluginMessagePart4_size 202
+#define CannedMessagePluginMessagePart5_size 202
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/src/mesh/generated/deviceonly.pb.h b/src/mesh/generated/deviceonly.pb.h
index 076649b21..5adfd3d4d 100644
--- a/src/mesh/generated/deviceonly.pb.h
+++ b/src/mesh/generated/deviceonly.pb.h
@@ -43,6 +43,11 @@ typedef struct _DeviceState {
uint32_t version;
bool no_save;
bool did_gps_reset;
+ char canned_message_plugin_message_part1[200];
+ char canned_message_plugin_message_part2[200];
+ char canned_message_plugin_message_part3[200];
+ char canned_message_plugin_message_part4[200];
+ char canned_message_plugin_message_part5[200];
} DeviceState;
@@ -53,11 +58,11 @@ extern "C" {
/* Initializer values for message structs */
#define LegacyRadioConfig_init_default {false, LegacyRadioConfig_LegacyPreferences_init_default}
#define LegacyRadioConfig_LegacyPreferences_init_default {_RegionCode_MIN}
-#define DeviceState_init_default {false, LegacyRadioConfig_init_default, false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0}
+#define DeviceState_init_default {false, LegacyRadioConfig_init_default, false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default}, false, MeshPacket_init_default, 0, 0, 0, "", "", "", "", ""}
#define ChannelFile_init_default {0, {Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default, Channel_init_default}}
#define LegacyRadioConfig_init_zero {false, LegacyRadioConfig_LegacyPreferences_init_zero}
#define LegacyRadioConfig_LegacyPreferences_init_zero {_RegionCode_MIN}
-#define DeviceState_init_zero {false, LegacyRadioConfig_init_zero, false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0, 0}
+#define DeviceState_init_zero {false, LegacyRadioConfig_init_zero, false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero}, false, MeshPacket_init_zero, 0, 0, 0, "", "", "", "", ""}
#define ChannelFile_init_zero {0, {Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero, Channel_init_zero}}
/* Field tags (for use in manual encoding/decoding) */
@@ -73,6 +78,11 @@ extern "C" {
#define DeviceState_version_tag 8
#define DeviceState_no_save_tag 9
#define DeviceState_did_gps_reset_tag 11
+#define DeviceState_canned_message_plugin_message_part1_tag 13
+#define DeviceState_canned_message_plugin_message_part2_tag 14
+#define DeviceState_canned_message_plugin_message_part3_tag 15
+#define DeviceState_canned_message_plugin_message_part4_tag 16
+#define DeviceState_canned_message_plugin_message_part5_tag 17
/* Struct field encoding specification for nanopb */
#define LegacyRadioConfig_FIELDLIST(X, a) \
@@ -95,7 +105,12 @@ X(a, STATIC, REPEATED, MESSAGE, receive_queue, 5) \
X(a, STATIC, OPTIONAL, MESSAGE, rx_text_message, 7) \
X(a, STATIC, SINGULAR, UINT32, version, 8) \
X(a, STATIC, SINGULAR, BOOL, no_save, 9) \
-X(a, STATIC, SINGULAR, BOOL, did_gps_reset, 11)
+X(a, STATIC, SINGULAR, BOOL, did_gps_reset, 11) \
+X(a, STATIC, SINGULAR, STRING, canned_message_plugin_message_part1, 13) \
+X(a, STATIC, SINGULAR, STRING, canned_message_plugin_message_part2, 14) \
+X(a, STATIC, SINGULAR, STRING, canned_message_plugin_message_part3, 15) \
+X(a, STATIC, SINGULAR, STRING, canned_message_plugin_message_part4, 16) \
+X(a, STATIC, SINGULAR, STRING, canned_message_plugin_message_part5, 17)
#define DeviceState_CALLBACK NULL
#define DeviceState_DEFAULT NULL
#define DeviceState_legacyRadio_MSGTYPE LegacyRadioConfig
@@ -125,7 +140,7 @@ extern const pb_msgdesc_t ChannelFile_msg;
/* Maximum encoded size of messages (where known) */
#define LegacyRadioConfig_size 4
#define LegacyRadioConfig_LegacyPreferences_size 2
-#define DeviceState_size 9973
+#define DeviceState_size 10985
#define ChannelFile_size 832
#ifdef __cplusplus
diff --git a/src/mesh/generated/radioconfig.pb.h b/src/mesh/generated/radioconfig.pb.h
index b6718ab47..3b71a7629 100644
--- a/src/mesh/generated/radioconfig.pb.h
+++ b/src/mesh/generated/radioconfig.pb.h
@@ -80,14 +80,14 @@ typedef enum _PositionFlags {
} PositionFlags;
typedef enum _InputEventChar {
- InputEventChar_NULL = 0,
- InputEventChar_UP = 17,
- InputEventChar_DOWN = 18,
- InputEventChar_LEFT = 19,
- InputEventChar_RIGHT = 20,
- InputEventChar_SELECT = 10,
- InputEventChar_BACK = 27,
- InputEventChar_CANCEL = 24
+ InputEventChar_KEY_NONE = 0,
+ InputEventChar_KEY_UP = 17,
+ InputEventChar_KEY_DOWN = 18,
+ InputEventChar_KEY_LEFT = 19,
+ InputEventChar_KEY_RIGHT = 20,
+ InputEventChar_KEY_SELECT = 10,
+ InputEventChar_KEY_BACK = 27,
+ InputEventChar_KEY_CANCEL = 24
} InputEventChar;
typedef enum _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType {
@@ -95,7 +95,9 @@ typedef enum _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType {
RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DS18B20 = 1,
RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT12 = 2,
RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT21 = 3,
- RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT22 = 4
+ RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT22 = 4,
+ RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280 = 5,
+ RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME680 = 6
} RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType;
/* Struct definitions */
@@ -180,7 +182,7 @@ typedef struct _RadioConfig_UserPreferences {
InputEventChar rotary1_event_press;
bool canned_message_plugin_enabled;
char canned_message_plugin_allow_input_source[16];
- char canned_message_plugin_messages[1024];
+ char canned_message_plugin_messages[200];
bool canned_message_plugin_send_bell;
} RadioConfig_UserPreferences;
@@ -215,13 +217,13 @@ typedef struct _RadioConfig {
#define _PositionFlags_MAX PositionFlags_POS_TIMESTAMP
#define _PositionFlags_ARRAYSIZE ((PositionFlags)(PositionFlags_POS_TIMESTAMP+1))
-#define _InputEventChar_MIN InputEventChar_NULL
-#define _InputEventChar_MAX InputEventChar_BACK
-#define _InputEventChar_ARRAYSIZE ((InputEventChar)(InputEventChar_BACK+1))
+#define _InputEventChar_MIN InputEventChar_KEY_NONE
+#define _InputEventChar_MAX InputEventChar_KEY_BACK
+#define _InputEventChar_ARRAYSIZE ((InputEventChar)(InputEventChar_KEY_BACK+1))
#define _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MIN RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT11
-#define _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MAX RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT22
-#define _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_ARRAYSIZE ((RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType)(RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT22+1))
+#define _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_MAX RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME680
+#define _RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_ARRAYSIZE ((RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType)(RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME680+1))
#ifdef __cplusplus
@@ -418,8 +420,8 @@ extern const pb_msgdesc_t RadioConfig_UserPreferences_msg;
#define RadioConfig_UserPreferences_fields &RadioConfig_UserPreferences_msg
/* Maximum encoded size of messages (where known) */
-#define RadioConfig_size 1616
-#define RadioConfig_UserPreferences_size 1613
+#define RadioConfig_size 792
+#define RadioConfig_UserPreferences_size 789
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/plugins/AdminPlugin.cpp b/src/plugins/AdminPlugin.cpp
index 01e54fadb..3886cb232 100644
--- a/src/plugins/AdminPlugin.cpp
+++ b/src/plugins/AdminPlugin.cpp
@@ -104,6 +104,12 @@ bool AdminPlugin::handleReceivedProtobuf(const MeshPacket &mp, AdminMessage *r)
rebootAtMsec = (s < 0) ? 0 : (millis() + s * 1000);
break;
}
+ case AdminMessage_shutdown_seconds_tag: {
+ int32_t s = r->shutdown_seconds;
+ DEBUG_MSG("Shutdown in %d seconds\n", s);
+ shutdownAtMsec = (s < 0) ? 0 : (millis() + s * 1000);
+ break;
+ }
#ifdef PORTDUINO
case AdminMessage_exit_simulator_tag:
diff --git a/src/plugins/CannedMessagePlugin.cpp b/src/plugins/CannedMessagePlugin.cpp
index 7a950e3b8..b209187ad 100644
--- a/src/plugins/CannedMessagePlugin.cpp
+++ b/src/plugins/CannedMessagePlugin.cpp
@@ -30,7 +30,7 @@ CannedMessagePlugin::CannedMessagePlugin()
/**
* @brief Items in array this->messages will be set to be pointing on the right
- * starting points of the string radioConfig.preferences.canned_message_plugin_messages
+ * starting points of the string this->messageStore
*
* @return int Returns the number of messages found.
*/
@@ -38,17 +38,23 @@ int CannedMessagePlugin::splitConfiguredMessages()
{
int messageIndex = 0;
int i = 0;
+
+ strncpy(
+ this->messageStore,
+ radioConfig.preferences.canned_message_plugin_messages,
+ CANNED_MESSAGE_PLUGIN_MESSAGES_SIZE);
+
this->messages[messageIndex++] =
- radioConfig.preferences.canned_message_plugin_messages;
+ this->messageStore;
int upTo =
- strlen(radioConfig.preferences.canned_message_plugin_messages) - 1;
+ strlen(this->messageStore) - 1;
while (i < upTo)
{
- if (radioConfig.preferences.canned_message_plugin_messages[i] == '|')
+ if (this->messageStore[i] == '|')
{
// Message ending found, replace it with string-end character.
- radioConfig.preferences.canned_message_plugin_messages[i] = '\0';
+ this->messageStore[i] = '\0';
DEBUG_MSG("CannedMessage %d is: '%s'\n",
messageIndex-1, this->messages[messageIndex-1]);
@@ -60,7 +66,7 @@ int CannedMessagePlugin::splitConfiguredMessages()
// Next message starts after pipe (|) just found.
this->messages[messageIndex++] =
- (radioConfig.preferences.canned_message_plugin_messages + i + 1);
+ (this->messageStore + i + 1);
}
i += 1;
}
@@ -90,22 +96,22 @@ int CannedMessagePlugin::handleInputEvent(const InputEvent *event)
}
bool validEvent = false;
- if (event->inputEvent == static_cast(InputEventChar_UP))
+ if (event->inputEvent == static_cast(InputEventChar_KEY_UP))
{
DEBUG_MSG("Canned message event UP\n");
- this->action = CANNED_MESSAGE_ACTION_UP;
+ this->runState = CANNED_MESSAGE_RUN_STATE_ACTION_UP;
validEvent = true;
}
- if (event->inputEvent == static_cast(InputEventChar_DOWN))
+ if (event->inputEvent == static_cast(InputEventChar_KEY_DOWN))
{
DEBUG_MSG("Canned message event DOWN\n");
- this->action = CANNED_MESSAGE_ACTION_DOWN;
+ this->runState = CANNED_MESSAGE_RUN_STATE_ACTION_DOWN;
validEvent = true;
}
- if (event->inputEvent == static_cast(InputEventChar_SELECT))
+ if (event->inputEvent == static_cast(InputEventChar_KEY_SELECT))
{
DEBUG_MSG("Canned message event Select\n");
- this->action = CANNED_MESSAGE_ACTION_SELECT;
+ this->runState = CANNED_MESSAGE_RUN_STATE_ACTION_SELECT;
validEvent = true;
}
@@ -145,76 +151,82 @@ void CannedMessagePlugin::sendText(NodeNum dest,
int32_t CannedMessagePlugin::runOnce()
{
- if (!radioConfig.preferences.canned_message_plugin_enabled)
+ if ((!radioConfig.preferences.canned_message_plugin_enabled)
+ || (this->runState == CANNED_MESSAGE_RUN_STATE_INACTIVE))
{
return 30000; // TODO: should return MAX_VAL
}
DEBUG_MSG("Check status\n");
UIFrameEvent e = {false, true};
- if (this->sendingState == SENDING_STATE_ACTIVE)
+ if (this->runState == CANNED_MESSAGE_RUN_STATE_SENDING_ACTIVE)
{
// TODO: might have some feedback of sendig state
- this->sendingState = SENDING_STATE_NONE;
+ this->runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
e.frameChanged = true;
- this->notifyObservers(&e);
- }
- else if ((this->action != CANNED_MESSAGE_ACTION_NONE)
- && (this->currentMessageIndex == -1))
- {
- this->currentMessageIndex = 0;
- DEBUG_MSG("First touch.\n");
- e.frameChanged = true;
- }
- else if (this->action == CANNED_MESSAGE_ACTION_SELECT)
- {
- sendText(
- NODENUM_BROADCAST,
- this->messages[this->currentMessageIndex],
- true);
- this->sendingState = SENDING_STATE_ACTIVE;
this->currentMessageIndex = -1;
this->notifyObservers(&e);
- return 2000;
}
- else if (this->action == CANNED_MESSAGE_ACTION_UP)
- {
- this->currentMessageIndex = getPrevIndex();
- DEBUG_MSG("MOVE UP");
- }
- else if (this->action == CANNED_MESSAGE_ACTION_DOWN)
- {
- this->currentMessageIndex = this->getNextIndex();
- DEBUG_MSG("MOVE DOWN");
- }
- if (this->action != CANNED_MESSAGE_ACTION_NONE)
- {
- this->lastTouchMillis = millis();
- this->action = CANNED_MESSAGE_ACTION_NONE;
- this->notifyObservers(&e);
- return INACTIVATE_AFTER_MS;
- }
- if ((millis() - this->lastTouchMillis) > INACTIVATE_AFTER_MS)
+ else if (
+ (this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE)
+ && (millis() - this->lastTouchMillis) > INACTIVATE_AFTER_MS)
{
// Reset plugin
DEBUG_MSG("Reset due the lack of activity.\n");
e.frameChanged = true;
this->currentMessageIndex = -1;
- this->sendingState = SENDING_STATE_NONE;
+ this->runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
this->notifyObservers(&e);
}
+ else if (this->currentMessageIndex == -1)
+ {
+ this->currentMessageIndex = 0;
+ DEBUG_MSG("First touch.\n");
+ e.frameChanged = true;
+ this->runState = CANNED_MESSAGE_RUN_STATE_ACTIVE;
+ }
+ else if (this->runState == CANNED_MESSAGE_RUN_STATE_ACTION_SELECT)
+ {
+ sendText(
+ NODENUM_BROADCAST,
+ this->messages[this->currentMessageIndex],
+ true);
+ this->runState = CANNED_MESSAGE_RUN_STATE_SENDING_ACTIVE;
+ this->currentMessageIndex = -1;
+ this->notifyObservers(&e);
+ return 2000;
+ }
+ else if (this->runState == CANNED_MESSAGE_RUN_STATE_ACTION_UP)
+ {
+ this->currentMessageIndex = getPrevIndex();
+ this->runState = CANNED_MESSAGE_RUN_STATE_ACTIVE;
+ DEBUG_MSG("MOVE UP\n");
+ }
+ else if (this->runState == CANNED_MESSAGE_RUN_STATE_ACTION_DOWN)
+ {
+ this->currentMessageIndex = this->getNextIndex();
+ this->runState = CANNED_MESSAGE_RUN_STATE_ACTIVE;
+ DEBUG_MSG("MOVE DOWN\n");
+ }
+
+ if (this->runState == CANNED_MESSAGE_RUN_STATE_ACTIVE)
+ {
+ this->lastTouchMillis = millis();
+ this->notifyObservers(&e);
+ return INACTIVATE_AFTER_MS;
+ }
return 30000; // TODO: should return MAX_VAL
}
-String CannedMessagePlugin::getCurrentMessage()
+const char* CannedMessagePlugin::getCurrentMessage()
{
return this->messages[this->currentMessageIndex];
}
-String CannedMessagePlugin::getPrevMessage()
+const char* CannedMessagePlugin::getPrevMessage()
{
return this->messages[this->getPrevIndex()];
}
-String CannedMessagePlugin::getNextMessage()
+const char* CannedMessagePlugin::getNextMessage()
{
return this->messages[this->getNextIndex()];
}
@@ -224,11 +236,7 @@ bool CannedMessagePlugin::shouldDraw()
{
return false;
}
- return (currentMessageIndex != -1) || (this->sendingState != SENDING_STATE_NONE);
-}
-cannedMessagePluginSendigState CannedMessagePlugin::getSendingState()
-{
- return this->sendingState;
+ return (currentMessageIndex != -1) || (this->runState != CANNED_MESSAGE_RUN_STATE_INACTIVE);
}
int CannedMessagePlugin::getNextIndex()
@@ -260,7 +268,13 @@ void CannedMessagePlugin::drawFrame(
{
displayedNodeNum = 0; // Not currently showing a node pane
- if (cannedMessagePlugin->getSendingState() == SENDING_STATE_NONE)
+ if (cannedMessagePlugin->runState == CANNED_MESSAGE_RUN_STATE_SENDING_ACTIVE)
+ {
+ display->setTextAlignment(TEXT_ALIGN_CENTER);
+ display->setFont(FONT_MEDIUM);
+ display->drawString(display->getWidth()/2 + x, 0 + y + 12, "Sending...");
+ }
+ else
{
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(FONT_SMALL);
@@ -270,11 +284,5 @@ void CannedMessagePlugin::drawFrame(
display->setFont(FONT_SMALL);
display->drawString(0 + x, 0 + y + 24, cannedMessagePlugin->getNextMessage());
}
- else
- {
- display->setTextAlignment(TEXT_ALIGN_CENTER);
- display->setFont(FONT_MEDIUM);
- display->drawString(display->getWidth()/2 + x, 0 + y + 12, "Sending...");
- }
}
diff --git a/src/plugins/CannedMessagePlugin.h b/src/plugins/CannedMessagePlugin.h
index eab516b85..b65c0b1a4 100644
--- a/src/plugins/CannedMessagePlugin.h
+++ b/src/plugins/CannedMessagePlugin.h
@@ -2,22 +2,23 @@
#include "SinglePortPlugin.h"
#include "input/InputBroker.h"
-enum cannedMessagePluginActionType
+enum cannedMessagePluginRunState
{
- CANNED_MESSAGE_ACTION_NONE,
- CANNED_MESSAGE_ACTION_SELECT,
- CANNED_MESSAGE_ACTION_UP,
- CANNED_MESSAGE_ACTION_DOWN
-};
-
-enum cannedMessagePluginSendigState
-{
- SENDING_STATE_NONE,
- SENDING_STATE_ACTIVE
+ CANNED_MESSAGE_RUN_STATE_INACTIVE,
+ CANNED_MESSAGE_RUN_STATE_ACTIVE,
+ CANNED_MESSAGE_RUN_STATE_SENDING_ACTIVE,
+ CANNED_MESSAGE_RUN_STATE_ACTION_SELECT,
+ CANNED_MESSAGE_RUN_STATE_ACTION_UP,
+ CANNED_MESSAGE_RUN_STATE_ACTION_DOWN
};
#define CANNED_MESSAGE_PLUGIN_MESSAGE_MAX_COUNT 50
+/**
+ * Due to config-packet size restrictions we cannot have user configuration bigger
+ * than Constants_DATA_PAYLOAD_LEN bytes.
+ */
+#define CANNED_MESSAGE_PLUGIN_MESSAGES_SIZE 200
class CannedMessagePlugin :
public SinglePortPlugin,
@@ -29,11 +30,10 @@ class CannedMessagePlugin :
this, &CannedMessagePlugin::handleInputEvent);
public:
CannedMessagePlugin();
- String getCurrentMessage();
- String getPrevMessage();
- String getNextMessage();
+ const char* getCurrentMessage();
+ const char* getPrevMessage();
+ const char* getNextMessage();
bool shouldDraw();
- cannedMessagePluginSendigState getSendingState();
void eventUp();
void eventDown();
void eventSelect();
@@ -57,10 +57,10 @@ class CannedMessagePlugin :
virtual void drawFrame(
OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
- volatile cannedMessagePluginActionType action = CANNED_MESSAGE_ACTION_NONE;
int currentMessageIndex = -1;
- cannedMessagePluginSendigState sendingState = SENDING_STATE_NONE;
+ cannedMessagePluginRunState runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
+ char messageStore[CANNED_MESSAGE_PLUGIN_MESSAGES_SIZE];
char *messages[CANNED_MESSAGE_PLUGIN_MESSAGE_MAX_COUNT];
int messagesCount = 0;
unsigned long lastTouchMillis = 0;
diff --git a/src/plugins/esp32/EnvironmentalMeasurementPlugin.cpp b/src/plugins/esp32/EnvironmentalMeasurementPlugin.cpp
index 08056ea5b..8545b3769 100644
--- a/src/plugins/esp32/EnvironmentalMeasurementPlugin.cpp
+++ b/src/plugins/esp32/EnvironmentalMeasurementPlugin.cpp
@@ -11,10 +11,13 @@
#include
#include
#include
+#include
+#include
#define DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000
#define DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000
#define DS18B20_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000
+#define BME280_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000
#define FAILED_STATE_SENSOR_READ_MULTIPLIER 10
#define DISPLAY_RECEIVEID_MEASUREMENTS_ON_SCREEN true
@@ -50,11 +53,12 @@ int32_t EnvironmentalMeasurementPlugin::runOnce()
radioConfig.preferences.environmental_measurement_plugin_recovery_interval = 60;
radioConfig.preferences.environmental_measurement_plugin_display_farenheit = false;
radioConfig.preferences.environmental_measurement_plugin_sensor_pin = 13;
+
radioConfig.preferences.environmental_measurement_plugin_sensor_type =
RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType::
- RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DS18B20;
+ RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280;
*/
-
+
if (!(radioConfig.preferences.environmental_measurement_plugin_measurement_enabled ||
radioConfig.preferences.environmental_measurement_plugin_screen_enabled)) {
// If this plugin is not enabled, and the user doesn't want the display screen don't waste any OSThread time on it
@@ -96,6 +100,17 @@ int32_t EnvironmentalMeasurementPlugin::runOnce()
DEBUG_MSG("EnvironmentalMeasurement: Opened DHT21/DHT22 on pin: %d\n",
radioConfig.preferences.environmental_measurement_plugin_sensor_pin);
return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
+ case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280:
+ unsigned bmeStatus;
+ // Default i2c address for BME280
+ bmeStatus = bme.begin(0x76);
+ if (!bmeStatus) {
+ DEBUG_MSG("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
+ // TODO more verbose diagnostics
+ } else {
+ DEBUG_MSG("EnvironmentalMeasurement: Opened BME280 on default i2c bus");
+ }
+ return (BME280_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
default:
DEBUG_MSG("EnvironmentalMeasurement: Invalid sensor type selected; Disabling plugin");
return (INT32_MAX);
@@ -146,6 +161,8 @@ int32_t EnvironmentalMeasurementPlugin::runOnce()
case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT21:
case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT22:
return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
+ case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280:
+ return (BME280_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
default:
return (DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
}
@@ -223,10 +240,10 @@ void EnvironmentalMeasurementPlugin::drawFrame(OLEDDisplay *display, OLEDDisplay
last_temp = String(CelsiusToFarenheit(lastMeasurement.temperature), 0) + "°F";
;
}
-
- display->drawString(x, y += fontHeight(FONT_MEDIUM),
- lastSender + ": " + last_temp + "/" + String(lastMeasurement.relative_humidity, 0) + "%(" +
- String(agoSecs) + "s)");
+ display->drawString(x, y += fontHeight(FONT_MEDIUM) - 2, "From: " + lastSender + "(" + String(agoSecs) + "s)");
+ display->drawString(x, y += fontHeight(FONT_SMALL) - 2,"Temp/Hum: " + last_temp + " / " + String(lastMeasurement.relative_humidity, 0) + "%");
+ if (lastMeasurement.barometric_pressure != 0)
+ display->drawString(x, y += fontHeight(FONT_SMALL),"Press: " + String(lastMeasurement.barometric_pressure, 0) + "hPA");
}
bool EnvironmentalMeasurementPlugin::handleReceivedProtobuf(const MeshPacket &mp, EnvironmentalMeasurement *p)
@@ -242,6 +259,7 @@ bool EnvironmentalMeasurementPlugin::handleReceivedProtobuf(const MeshPacket &mp
DEBUG_MSG("EnvironmentalMeasurement: Received data from %s\n", sender);
DEBUG_MSG("EnvironmentalMeasurement->relative_humidity: %f\n", p->relative_humidity);
DEBUG_MSG("EnvironmentalMeasurement->temperature: %f\n", p->temperature);
+ DEBUG_MSG("EnvironmentalMeasurement->barometric_pressure: %f\n", p->barometric_pressure);
lastMeasurementPacket = packetPool.allocCopy(mp);
@@ -289,6 +307,12 @@ bool EnvironmentalMeasurementPlugin::sendOurEnvironmentalMeasurement(NodeNum des
m.relative_humidity = this->dht->readHumidity();
m.temperature = this->dht->readTemperature();
break;
+ case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280:
+ m.temperature = bme.readTemperature();
+ m.relative_humidity = bme.readHumidity();
+ // TODO Work out standard units for pressure. This is in hPa from the Adafruit example
+ m.barometric_pressure = bme.readPressure() / 100.0F;
+ break;
default:
DEBUG_MSG("EnvironmentalMeasurement: Invalid sensor type selected; Disabling plugin");
return false;
@@ -296,6 +320,7 @@ bool EnvironmentalMeasurementPlugin::sendOurEnvironmentalMeasurement(NodeNum des
DEBUG_MSG("EnvironmentalMeasurement->relative_humidity: %f\n", m.relative_humidity);
DEBUG_MSG("EnvironmentalMeasurement->temperature: %f\n", m.temperature);
+ DEBUG_MSG("EnvironmentalMeasurement->barometric_pressure: %f\n", m.barometric_pressure);
sensor_read_error_count = 0;
@@ -303,6 +328,7 @@ bool EnvironmentalMeasurementPlugin::sendOurEnvironmentalMeasurement(NodeNum des
p->to = dest;
p->decoded.want_response = wantReplies;
+ DEBUG_MSG("EnvironmentalMeasurement: Sending packet to mesh");
service.sendToMesh(p);
return true;
}
diff --git a/src/plugins/esp32/EnvironmentalMeasurementPlugin.h b/src/plugins/esp32/EnvironmentalMeasurementPlugin.h
index e60a84c8b..9eed72c8f 100644
--- a/src/plugins/esp32/EnvironmentalMeasurementPlugin.h
+++ b/src/plugins/esp32/EnvironmentalMeasurementPlugin.h
@@ -6,6 +6,8 @@
#include
#include
#include
+#include
+#include
class EnvironmentalMeasurementPlugin : private concurrency::OSThread, public ProtobufPlugin
{
@@ -36,6 +38,7 @@ class EnvironmentalMeasurementPlugin : private concurrency::OSThread, public Pro
DHT *dht;
OneWire *oneWire;
DS18B20 *ds18b20;
+ Adafruit_BME280 bme;
const MeshPacket *lastMeasurementPacket;
uint32_t sensor_read_error_count = 0;
};
\ No newline at end of file
diff --git a/variants/WisCore_RAK4600_Board/variant.cpp b/variants/WisCore_RAK4600_Board/variant.cpp
deleted file mode 100644
index f6d55f7d4..000000000
--- a/variants/WisCore_RAK4600_Board/variant.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "variant.h"
-
-#include "wiring_constants.h"
-#include "wiring_digital.h"
-#include "nrf.h"
-
-const uint32_t g_ADigitalPinMap[] = {
- // D0 - D7
- 0, // xtal 1
- 1, // xtal 2
- 2, // a0
- 3, // a1
- 4, // a2
- 5, // a3
- 6, // TXD
- 7, // GPIO #7
-
- // D8 - D13
- 8, // RXD
-
- 9, // NFC1
- 10, // NFC2
-
- 11, // GPIO11
-
- 12, // SCK
- 13, // MOSI
- 14, // MISO
-
- 15, // GPIO #15
- 16, // GPIO #16
-
- // function set pins
- 17, // LED #1 (red)
- 18, // SWO
- 19, // LED #2 (blue)
- 20, // DFU
- 21, // Reset
- 22, // Factory Reset
- 23, // N/A
- 24, // N/A
-
- 25, // SDA
- 26, // SCL
- 27, // GPIO #27
- 28, // A4
- 29, // A5
- 30, // A6
- 31, // A7
-};
-
-void initVariant()
-{
- // LED1 & LED2
- pinMode(PIN_LED1, OUTPUT);
- ledOff(PIN_LED1);
-
- pinMode(PIN_LED2, OUTPUT);
- ledOff(PIN_LED2);
-}
\ No newline at end of file
diff --git a/variants/WisCore_RAK4600_Board/variant.h b/variants/WisCore_RAK4600_Board/variant.h
deleted file mode 100644
index 4eff0008a..000000000
--- a/variants/WisCore_RAK4600_Board/variant.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifndef _VARIANT_RAK4600_
-#define _VARIANT_RAK4600_
-
-#define RAK4600
-
-/** Master clock frequency */
-#define VARIANT_MCK (64000000ul)
-
-#define USE_LFXO // Board uses 32khz crystal for LF
-// define USE_LFRC // Board uses RC for LF
-
-/*----------------------------------------------------------------------------
- * Headers
- *----------------------------------------------------------------------------*/
-
-#include "WVariant.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif // __cplusplus
-
-// Number of pins defined in PinDescription array
-#define PINS_COUNT (32u)
-#define NUM_DIGITAL_PINS (32u)
-#define NUM_ANALOG_INPUTS (8u)
-#define NUM_ANALOG_OUTPUTS (0u)
-
-// LEDs
-#define PIN_LED1 (17)
-#define PIN_LED2 (19)
-
-#define LED_BUILTIN PIN_LED1
-#define LED_CONN PIN_LED2
-
-#define LED_RED PIN_LED1
-#define LED_BLUE PIN_LED2
-
-#define LED_STATE_ON 1 // State when LED is litted
-
-/*
- * Analog pins
- */
-#define PIN_A0 (2)
-#define PIN_A1 (3)
-#define PIN_A2 (4)
-#define PIN_A3 (5)
-#define PIN_A4 (28)
-#define PIN_A5 (29)
-#define PIN_A6 (30)
-#define PIN_A7 (31)
-
- static const uint8_t A0 = PIN_A0;
- static const uint8_t A1 = PIN_A1;
- static const uint8_t A2 = PIN_A2;
- static const uint8_t A3 = PIN_A3;
- static const uint8_t A4 = PIN_A4;
- static const uint8_t A5 = PIN_A5;
- static const uint8_t A6 = PIN_A6;
- static const uint8_t A7 = PIN_A7;
-#define ADC_RESOLUTION 14
-
-// Other pins
-#define PIN_AREF (24)
-#define PIN_VBAT PIN_A7
-#define PIN_NFC1 (9)
-#define PIN_NFC2 (10)
-
- static const uint8_t AREF = PIN_AREF;
-
-/*
- * Serial interfaces
- */
-// Serial
-#define PIN_SERIAL_RX (22)
-#define PIN_SERIAL_TX (23)
-
-/*
- * SPI Interfaces
- */
-#define SPI_INTERFACES_COUNT 1
-
-#define PIN_SPI_MISO (6)
-#define PIN_SPI_MOSI (5)
-#define PIN_SPI_SCK (7)
-
- static const uint8_t SS = 4;
- static const uint8_t MOSI = PIN_SPI_MOSI;
- static const uint8_t MISO = PIN_SPI_MISO;
- static const uint8_t SCK = PIN_SPI_SCK;
-
-/*
- * Wire Interfaces
- */
-#define WIRE_INTERFACES_COUNT 1
-
-#define PIN_WIRE_SDA (13u)
-#define PIN_WIRE_SCL (12u)
-
-#ifdef __cplusplus
-}
-#endif
-
-/*----------------------------------------------------------------------------
- * Arduino objects - C++ only
- *----------------------------------------------------------------------------*/
-
-#endif
\ No newline at end of file
diff --git a/variants/genieblocks/variant.h b/variants/genieblocks/variant.h
new file mode 100644
index 000000000..0e51e3a9e
--- /dev/null
+++ b/variants/genieblocks/variant.h
@@ -0,0 +1,26 @@
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 5
+#define GPS_TX_PIN 18
+#define GPS_RESET_N 10
+#define GPS_EXTINT 23 // On MAX-M8 module pin name is EXTINT. On L70 module pin name is STANDBY.
+
+#define BATTERY_PIN 39 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+#define BATTERY_EN_PIN 14 // Voltage voltage divider enable pin connected to mosfet
+
+#define I2C_SDA 4 // I2C pins for this board
+#define I2C_SCL 2
+
+#define LED_PIN 12 // If defined we will blink this LED
+//#define BUTTON_PIN 36 // If defined, this will be used for user button presses (ToDo problem on that line on debug screen -->
+// Long press start!) #define BUTTON_NEED_PULLUP //GPIOs 34 to 39 are GPIs – input only pins. These pins don’t have internal
+// pull-ups or pull-down resistors.
+
+#define USE_RF95
+#define LORA_DIO0 38 // a No connect on the SX1262 module
+#define LORA_RESET 9
+
+#define RF95_SCK 22
+#define RF95_MISO 19
+#define RF95_MOSI 13
+#define RF95_NSS 21
\ No newline at end of file
diff --git a/variants/heltec_v1/variant.h b/variants/heltec_v1/variant.h
new file mode 100644
index 000000000..25cb14070
--- /dev/null
+++ b/variants/heltec_v1/variant.h
@@ -0,0 +1,29 @@
+// the default ESP32 Pin of 15 is the Oled SCL, set to 36 and 37 and works fine.
+// Tested on Neo6m module.
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 36
+#define GPS_TX_PIN 37
+
+#ifndef USE_JTAG // gpio15 is TDO for JTAG, so no I2C on this board while doing jtag
+#define I2C_SDA 4 // I2C pins for this board
+#define I2C_SCL 15
+#endif
+
+#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
+
+#define LED_PIN 25 // If defined we will blink this LED
+#define BUTTON_PIN 0 // If defined, this will be used for user button presses
+
+#define USE_RF95
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#ifndef USE_JTAG
+#define LORA_RESET 14
+#endif
+#define LORA_DIO1 33 // Not really used
+#define LORA_DIO2 32 // Not really used
+
+// ratio of voltage divider = 3.20 (R1=100k, R2=220k)
+#define ADC_MULTIPLIER 3.2
+
+#define BATTERY_PIN 13 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
diff --git a/variants/heltec_v2/variant.h b/variants/heltec_v2/variant.h
new file mode 100644
index 000000000..85fe79e32
--- /dev/null
+++ b/variants/heltec_v2/variant.h
@@ -0,0 +1,41 @@
+// the default ESP32 Pin of 15 is the Oled SCL, set to 36 and 37 and works fine.
+// Tested on Neo6m module.
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 36
+#define GPS_TX_PIN 37
+
+#ifndef USE_JTAG // gpio15 is TDO for JTAG, so no I2C on this board while doing jtag
+#define I2C_SDA 4 // I2C pins for this board
+#define I2C_SCL 15
+#endif
+
+#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
+
+#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
+#define LED_PIN 25 // If defined we will blink this LED
+#define BUTTON_PIN 0 // If defined, this will be used for user button presses
+
+#define USE_RF95
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#ifndef USE_JTAG
+#define LORA_RESET 14
+#endif
+#define LORA_DIO1 35 // Not really used
+#define LORA_DIO2 34 // Not really used
+
+// ratio of voltage divider = 3.20 (R1=100k, R2=220k)
+#define ADC_MULTIPLIER 3.2
+
+#ifdef HELTEC_V2_0
+
+#define BATTERY_PIN 13 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+
+#endif
+
+#ifdef HELTEC_V2_1
+
+#define BATTERY_PIN 37 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
+
+#endif
\ No newline at end of file
diff --git a/variants/meshtastic_diy_v1/variant.h b/variants/meshtastic_diy_v1/variant.h
new file mode 100644
index 000000000..8dbfe0e47
--- /dev/null
+++ b/variants/meshtastic_diy_v1/variant.h
@@ -0,0 +1,43 @@
+// For OLED LCD
+#define I2C_SDA 21
+#define I2C_SCL 22
+
+// GPS
+#undef GPS_RX_PIN
+#define GPS_RX_PIN 15
+//#undef GPS_TX_PIN
+//#define GPS_TX_PIN 12 // not connected
+
+#define BUTTON_PIN 39 // The middle button GPIO on the T-Beam
+#define EXT_NOTIFY_OUT 12 // Overridden default pin to use for Ext Notify Plugin (#975).
+#define LED_PIN 2 // add status LED (compatible with core-pcb and DIY targets)
+
+#define LORA_DIO0 26 // a No connect on the SX1262/SX1268 module
+#define LORA_RESET 23 // RST for SX1276, and for SX1262/SX1268
+#define LORA_DIO1 33 // IRQ for SX1262/SX1268
+#define LORA_DIO2 32 // BUSY for SX1262/SX1268
+#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262/SX1268, if DIO3 is high the TXCO is enabled
+
+#define RF95_SCK 5
+#define RF95_MISO 19
+#define RF95_MOSI 27
+#define RF95_NSS 18
+
+// supported modules list
+#define USE_SX1262
+#define USE_SX1268
+#define USE_LLCC68
+
+// common pinouts for SX126X modules
+#define SX126X_CS 18 // NSS for SX126X
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+#define SX126X_RXEN 14
+#define SX126X_TXEN 13
+
+#ifdef EBYTE_E22
+// Internally the TTGO module hooks the SX126x-DIO2 in to control the TX/RX switch
+// (which is the default for the sx1262interface code)
+#define SX126X_E22
+#endif
\ No newline at end of file
diff --git a/variants/portduino/variant.h b/variants/portduino/variant.h
new file mode 100644
index 000000000..18758cb01
--- /dev/null
+++ b/variants/portduino/variant.h
@@ -0,0 +1,26 @@
+#define USE_SIM_RADIO
+
+// Pine64 uses a common pinout for their SX1262 vs RF95 modules - both can be enabled and we will probe at runtime for RF95 and if
+// not found then probe for SX1262. Currently the RF95 code is disabled because I think the RF95 module won't need to ship.
+// #define USE_RF95
+#define USE_SX1262
+
+// Fake SPI device selections
+#define RF95_SCK 5
+#define RF95_MISO 19
+#define RF95_MOSI 27
+#define RF95_NSS RADIOLIB_NC // the ch341f spi controller does CS for us
+
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#define LORA_RESET 14
+#define LORA_DIO1 33 // SX1262 IRQ, called DIO0 on pinelora schematic, pin 7 on ch341f "ack" - FIXME, enable hwints in linux
+#define LORA_DIO2 32 // SX1262 BUSY, actually connected to "DIO5" on pinelora schematic, pin 8 on ch341f "slct"
+#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled
+
+#ifdef USE_SX1262
+#define SX126X_CS 20 // CS0 on pinelora schematic, hooked to gpio D0 on ch341f
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+// HOPE RFM90 does not have a TCXO therefore not SX126X_E22
+#endif
\ No newline at end of file
diff --git a/variants/tbeam/variant.h b/variants/tbeam/variant.h
new file mode 100644
index 000000000..fef19e785
--- /dev/null
+++ b/variants/tbeam/variant.h
@@ -0,0 +1,37 @@
+// #define BUTTON_NEED_PULLUP // if set we need to turn on the internal CPU pullup during sleep
+
+#define I2C_SDA 21
+#define I2C_SCL 22
+
+#define BUTTON_PIN 38 // The middle button GPIO on the T-Beam
+//#define BUTTON_PIN_ALT 13 // Alternate GPIO for an external button if needed. Does anyone use this? It is not documented anywhere.
+#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
+
+#define LED_INVERTED 1
+#define LED_PIN 4 // Newer tbeams (1.1) have an extra led on GPIO4
+
+// TTGO uses a common pinout for their SX1262 vs RF95 modules - both can be enabled and we will probe at runtime for RF95 and if
+// not found then probe for SX1262
+#define USE_RF95
+#define USE_SX1262
+
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#define LORA_RESET 23
+#define LORA_DIO1 33 // SX1262 IRQ
+#define LORA_DIO2 32 // SX1262 BUSY
+#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled
+
+#ifdef USE_SX1262
+#define SX126X_CS RF95_NSS // FIXME - we really should define LORA_CS instead
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+#define SX126X_E22 // Not really an E22 but TTGO seems to be trying to clone that
+// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for the sx1262interface
+// code)
+#endif
+
+// Leave undefined to disable our PMU IRQ handler. DO NOT ENABLE THIS because the pmuirq can cause sperious interrupts
+// and waking from light sleep
+// #define PMU_IRQ 35
+#define AXP192_SLAVE_ADDRESS 0x34
\ No newline at end of file
diff --git a/variants/tbeam_v07/variant.h b/variants/tbeam_v07/variant.h
new file mode 100644
index 000000000..ff007428c
--- /dev/null
+++ b/variants/tbeam_v07/variant.h
@@ -0,0 +1,20 @@
+// #define BUTTON_NEED_PULLUP // if set we need to turn on the internal CPU pullup during sleep
+
+#define I2C_SDA 21
+#define I2C_SCL 22
+
+#define BUTTON_PIN 39
+#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
+
+#define USE_RF95
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#define LORA_RESET 23
+#define LORA_DIO1 33 // Not really used
+#define LORA_DIO2 32 // Not really used
+
+// This board has different GPS pins than all other boards
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 12
+#define GPS_TX_PIN 15
\ No newline at end of file
diff --git a/variants/tlora_v1/variant.h b/variants/tlora_v1/variant.h
new file mode 100644
index 000000000..06352fbbd
--- /dev/null
+++ b/variants/tlora_v1/variant.h
@@ -0,0 +1,21 @@
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 36
+#define GPS_TX_PIN 37
+
+#define I2C_SDA 4 // I2C pins for this board
+#define I2C_SCL 15
+
+#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
+
+// #define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
+#define LED_PIN 2 // If defined we will blink this LED
+#define BUTTON_PIN 0 // If defined, this will be used for user button presses
+#define BUTTON_NEED_PULLUP
+#define EXT_NOTIFY_OUT 13 // Default pin to use for Ext Notify Plugin.
+
+#define USE_RF95
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#define LORA_RESET 14
+#define LORA_DIO1 35 // Not really used
+#define LORA_DIO2 34 // Not really used
diff --git a/variants/tlora_v1_3/variant.h b/variants/tlora_v1_3/variant.h
new file mode 100644
index 000000000..f5240d140
--- /dev/null
+++ b/variants/tlora_v1_3/variant.h
@@ -0,0 +1,22 @@
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 36
+#define GPS_TX_PIN 13 // per @eugene
+
+#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+
+#define I2C_SDA 21 // I2C pins for this board
+#define I2C_SCL 22
+
+#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
+
+#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
+#define LED_PIN 25 // If defined we will blink this LED
+#define BUTTON_PIN 36
+#define BUTTON_NEED_PULLUP
+
+#define USE_RF95
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#define LORA_RESET 14
+#define LORA_DIO1 35 // Not really used
+#define LORA_DIO2 34 // Not really used
\ No newline at end of file
diff --git a/variants/tlora_v2/variant.h b/variants/tlora_v2/variant.h
new file mode 100644
index 000000000..1bff09fb0
--- /dev/null
+++ b/variants/tlora_v2/variant.h
@@ -0,0 +1,24 @@
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 36
+#define GPS_TX_PIN 13 // per @eugene
+
+#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+
+#define I2C_SDA 21 // I2C pins for this board
+#define I2C_SCL 22
+
+#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
+
+#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
+#define LED_PIN 25 // If defined we will blink this LED
+#define BUTTON_PIN \
+ 0 // If defined, this will be used for user button presses, if your board doesn't have a physical switch, you can wire one
+ // between this pin and ground
+#define BUTTON_NEED_PULLUP
+
+#define USE_RF95
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#define LORA_RESET 14
+#define LORA_DIO1 35 // Not really used
+#define LORA_DIO2 34 // Not really used
\ No newline at end of file
diff --git a/variants/tlora_v2_1_16/variant.h b/variants/tlora_v2_1_16/variant.h
new file mode 100644
index 000000000..1a888b46f
--- /dev/null
+++ b/variants/tlora_v2_1_16/variant.h
@@ -0,0 +1,25 @@
+#undef GPS_RX_PIN
+#undef GPS_TX_PIN
+#define GPS_RX_PIN 15 // per @der_bear on the forum, 36 is incorrect for this board type and 15 is a better pick
+#define GPS_TX_PIN 13
+
+#define BATTERY_PIN 35 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage
+// ratio of voltage divider = 2.0 (R42=100k, R43=100k)
+#define ADC_MULTIPLIER 2.2 // 2.0 + 10% for correction of display undervoltage.
+
+#define I2C_SDA 21 // I2C pins for this board
+#define I2C_SCL 22
+
+#define RESET_OLED 16 // If defined, this pin will be used to reset the display controller
+
+#define VEXT_ENABLE 21 // active low, powers the oled display and the lora antenna boost
+#define LED_PIN 25 // If defined we will blink this LED
+#define BUTTON_PIN 12 // If defined, this will be used for user button presses,
+
+#define BUTTON_NEED_PULLUP
+
+#define USE_RF95
+#define LORA_DIO0 26 // a No connect on the SX1262 module
+#define LORA_RESET 14
+#define LORA_DIO1 35 // Not really used
+#define LORA_DIO2 34 // Not really used