diff --git a/README.md b/README.md index 2fbcfcc38..e7da82ea3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Meshtastic-device [![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/meshtastic/Meshtastic-device) +[![Continuous Integration](https://github.com/meshtastic/Meshtastic-device/actions/workflows/main.yml/badge.svg)](https://github.com/meshtastic/Meshtastic-device/actions/workflows/main.yml) +![GitHub all releases](https://img.shields.io/github/downloads/meshtastic/meshtastic-device/total) + ## 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