ソースを参照

Merge commit '3bc8ec2006917670695b3a74e7bb7df2c764e9e5' into dev

Scott Powell 10 ヶ月 前
コミット
e988531f6a

+ 0 - 7
src/helpers/ui/GxEPDDisplay.h

@@ -12,16 +12,10 @@
 #include <Fonts/FreeSans9pt7b.h>
 #include <Fonts/FreeSansBold12pt7b.h>
 #include <Fonts/FreeSans18pt7b.h>
-
-#include <epd/GxEPD2_150_BN.h>  // 1.54" b/w
-#include <epd/GxEPD2_213_B74.h> // 2.13" b/w
 #include <CRC32.h>
 
 #include "DisplayDriver.h"
 
-//GxEPD2_BW<GxEPD2_150_BN, 200> display(GxEPD2_150_BN(DISP_CS, DISP_DC, DISP_RST, DISP_BUSY)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
-
-
 class GxEPDDisplay : public DisplayDriver {
 
 #if defined(EINK_DISPLAY_MODEL)
@@ -44,7 +38,6 @@ class GxEPDDisplay : public DisplayDriver {
   int last_display_crc_value = 0;
 
 public:
-  // there is a margin in y...
 #if defined(EINK_DISPLAY_MODEL)
   GxEPDDisplay() : DisplayDriver(128, 128), display(EINK_DISPLAY_MODEL(PIN_DISPLAY_CS, PIN_DISPLAY_DC, PIN_DISPLAY_RST, PIN_DISPLAY_BUSY)) {}
 #else

+ 90 - 0
variants/lilygo_techo_lite/TechoBoard.cpp

@@ -0,0 +1,90 @@
+#include <Arduino.h>
+#include "TechoBoard.h"
+
+#ifdef LILYGO_TECHO
+
+#include <bluefruit.h>
+#include <Wire.h>
+
+static BLEDfu bledfu;
+
+static void connect_callback(uint16_t conn_handle) {
+  (void)conn_handle;
+  MESH_DEBUG_PRINTLN("BLE client connected");
+}
+
+static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
+  (void)conn_handle;
+  (void)reason;
+
+  MESH_DEBUG_PRINTLN("BLE client disconnected");
+}
+
+void TechoBoard::begin() {
+  // for future use, sub-classes SHOULD call this from their begin()
+  startup_reason = BD_STARTUP_NORMAL;
+
+  Wire.begin();
+
+  pinMode(SX126X_POWER_EN, OUTPUT);
+  digitalWrite(SX126X_POWER_EN, HIGH);
+  delay(10);   // give sx1262 some time to power up
+}
+
+uint16_t TechoBoard::getBattMilliVolts() {
+  int adcvalue = 0;
+
+  analogReference(AR_INTERNAL_3_0);
+  analogReadResolution(12);
+  delay(10);
+
+  // ADC range is 0..3000mV and resolution is 12-bit (0..4095)
+  adcvalue = analogRead(PIN_VBAT_READ);
+  // Convert the raw value to compensated mv, taking the resistor-
+  // divider into account (providing the actual LIPO voltage)
+  return (uint16_t)((float)adcvalue * REAL_VBAT_MV_PER_LSB);
+}
+
+bool TechoBoard::startOTAUpdate(const char* id, char reply[]) {
+  // Config the peripheral connection with maximum bandwidth
+  // more SRAM required by SoftDevice
+  // Note: All config***() function must be called before begin()
+  Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
+  Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
+
+  Bluefruit.begin(1, 0);
+  // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
+  Bluefruit.setTxPower(4);
+  // Set the BLE device name
+  Bluefruit.setName("TECHO_OTA");
+
+  Bluefruit.Periph.setConnectCallback(connect_callback);
+  Bluefruit.Periph.setDisconnectCallback(disconnect_callback);
+
+  // To be consistent OTA DFU should be added first if it exists
+  bledfu.begin();
+
+  // Set up and start advertising
+  // Advertising packet
+  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
+  Bluefruit.Advertising.addTxPower();
+  Bluefruit.Advertising.addName();
+
+  /* Start Advertising
+    - Enable auto advertising if disconnected
+    - Interval:  fast mode = 20 ms, slow mode = 152.5 ms
+    - Timeout for fast mode is 30 seconds
+    - Start(timeout) with timeout = 0 will advertise forever (until connected)
+
+    For recommended advertising interval
+    https://developer.apple.com/library/content/qa/qa1931/_index.html
+  */
+  Bluefruit.Advertising.restartOnDisconnect(true);
+  Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
+  Bluefruit.Advertising.setFastTimeout(30);   // number of seconds in fast mode
+  Bluefruit.Advertising.start(0);             // 0 = Don't stop advertising after n seconds
+
+  strcpy(reply, "OK - started");
+  return true;
+}
+#endif

+ 55 - 0
variants/lilygo_techo_lite/TechoBoard.h

@@ -0,0 +1,55 @@
+#pragma once
+
+#include <MeshCore.h>
+#include <Arduino.h>
+
+// built-ins
+#define VBAT_MV_PER_LSB   (0.73242188F)   // 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096
+
+#define VBAT_DIVIDER      (0.5F)          // 150K + 150K voltage divider on VBAT
+#define VBAT_DIVIDER_COMP (2.0F)          // Compensation factor for the VBAT divider
+
+#define PIN_VBAT_READ     (4)
+#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
+
+class TechoBoard : public mesh::MainBoard {
+protected:
+  uint8_t startup_reason;
+
+public:
+
+  void begin();
+  uint16_t getBattMilliVolts() override;
+  bool startOTAUpdate(const char* id, char reply[]) override;
+
+  uint8_t getStartupReason() const override {
+    return startup_reason;
+  }
+
+  const char* getManufacturerName() const override {
+    return "LilyGo T-Echo";
+  }
+
+  void powerOff() override {
+    #ifdef LED_RED
+    digitalWrite(LED_RED, LOW);
+    #endif
+    #ifdef LED_GREEN
+    digitalWrite(LED_GREEN, LOW);
+    #endif
+    #ifdef LED_BLUE
+    digitalWrite(LED_BLUE, LOW);
+    #endif
+    #ifdef DISP_BACKLIGHT
+    digitalWrite(DISP_BACKLIGHT, LOW);
+    #endif
+    #ifdef PIN_PWR_EN
+    digitalWrite(PIN_PWR_EN, LOW);
+    #endif
+    sd_power_system_off();
+  }
+
+  void reboot() override {
+    NVIC_SystemReset();
+  }
+};

+ 98 - 0
variants/lilygo_techo_lite/platformio.ini

@@ -0,0 +1,98 @@
+[LilyGo_T-Echo-Lite]
+extends = nrf52_base
+board = t-echo
+board_build.ldscript = boards/nrf52840_s140_v6.ld
+build_flags = ${nrf52_base.build_flags}
+  -I variants/lilygo_techo_lite
+  -I src/helpers/nrf52
+  -I lib/nrf52/s140_nrf52_6.1.1_API/include
+  -I lib/nrf52/s140_nrf52_6.1.1_API/include/nrf52
+  -D LILYGO_TECHO
+  -D RADIO_CLASS=CustomSX1262
+  -D WRAPPER_CLASS=CustomSX1262Wrapper
+  -D LORA_TX_POWER=22
+  -D SX126X_POWER_EN=30
+  -D SX126X_CURRENT_LIMIT=140
+  -D SX126X_RX_BOOSTED_GAIN=1
+  -D P_LORA_TX_LED=LED_GREEN
+  -D DISABLE_DIAGNOSTIC_OUTPUT
+  -D ENV_INCLUDE_GPS=1
+  -D GPS_BAUD_RATE=9600
+  -D PIN_GPS_EN=GPS_EN
+  -D DISPLAY_CLASS=GxEPDDisplay
+  -D EINK_DISPLAY_MODEL=GxEPD2_122_T61
+  -D EINK_SCALE_X=1.5f
+  -D EINK_SCALE_Y=2.0f
+  -D EINK_X_OFFSET=0
+  -D EINK_Y_OFFSET=10
+  -D DISPLAY_ROTATION=4
+  -D AUTO_OFF_MILLIS=0
+build_src_filter = ${nrf52_base.build_src_filter}
+  +<helpers/*.cpp>
+  +<TechoBoard.cpp>
+  +<helpers/sensors/EnvironmentSensorManager.cpp>
+  +<helpers/ui/GxEPDDisplay.cpp>
+  +<helpers/ui/MomentaryButton.cpp>
+  +<../variants/lilygo_techo_lite>
+lib_deps =
+  ${nrf52_base.lib_deps}
+  stevemarple/MicroNMEA @ ^2.0.6
+  adafruit/Adafruit BME280 Library @ ^2.3.0
+  https://github.com/SoulOfNoob/GxEPD2.git
+  bakercp/CRC32 @ ^2.0.0
+debug_tool = jlink
+upload_protocol = nrfutil
+
+[env:LilyGo_T-Echo-Lite_repeater]
+extends = LilyGo_T-Echo-Lite
+build_src_filter = ${LilyGo_T-Echo-Lite.build_src_filter}
+  +<../examples/simple_repeater>
+build_flags =
+  ${LilyGo_T-Echo-Lite.build_flags}
+  -D ADVERT_NAME='"T-Echo-Lite Repeater"'
+  -D ADVERT_LAT=0.0
+  -D ADVERT_LON=0.0
+  -D ADMIN_PASSWORD='"password"'
+  -D MAX_NEIGHBOURS=8
+;  -D MESH_PACKET_LOGGING=1
+;  -D MESH_DEBUG=1
+
+[env:LilyGo_T-Echo-Lite_room_server]
+extends = LilyGo_T-Echo-Lite
+build_src_filter = ${LilyGo_T-Echo-Lite.build_src_filter}
+  +<../examples/simple_room_server>
+build_flags =
+  ${LilyGo_T-Echo-Lite.build_flags}
+  -D ADVERT_NAME='"T-Echo-Lite Room"'
+  -D ADVERT_LAT=0.0
+  -D ADVERT_LON=0.0
+  -D ADMIN_PASSWORD='"password"'
+;  -D MESH_PACKET_LOGGING=1
+;  -D MESH_DEBUG=1
+
+[env:LilyGo_T-Echo-Lite_companion_radio_ble]
+extends = LilyGo_T-Echo-Lite
+board_build.ldscript = boards/nrf52840_s140_v6_extrafs.ld
+board_upload.maximum_size = 712704
+build_flags =
+  ${LilyGo_T-Echo-Lite.build_flags}
+  -I src/helpers/ui
+  -I examples/companion_radio/ui-new
+  -D MAX_CONTACTS=350
+  -D MAX_GROUP_CHANNELS=40
+  ; -D QSPIFLASH=1
+  -D BLE_PIN_CODE=123456
+  ; -D BLE_DEBUG_LOGGING=1
+  -D OFFLINE_QUEUE_SIZE=256
+  -D UI_RECENT_LIST_SIZE=9
+  -D UI_SENSORS_PAGE=1
+  ; -D MESH_PACKET_LOGGING=1
+  ; -D MESH_DEBUG=1
+  -D AUTO_SHUTDOWN_MILLIVOLTS=3300
+build_src_filter = ${LilyGo_T-Echo-Lite.build_src_filter}
+  +<helpers/nrf52/SerialBLEInterface.cpp>
+  +<../examples/companion_radio/*.cpp>
+  +<../examples/companion_radio/ui-new/*.cpp>
+lib_deps =
+  ${LilyGo_T-Echo-Lite.lib_deps}
+  densaugeo/base64 @ ~1.4.0

+ 52 - 0
variants/lilygo_techo_lite/target.cpp

@@ -0,0 +1,52 @@
+#include <Arduino.h>
+#include "target.h"
+#include <helpers/ArduinoHelpers.h>
+#include <helpers/sensors/MicroNMEALocationProvider.h>
+
+TechoBoard board;
+
+RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI);
+
+WRAPPER_CLASS radio_driver(radio, board);
+
+VolatileRTCClock fallback_clock;
+AutoDiscoverRTCClock rtc_clock(fallback_clock);
+
+#ifdef ENV_INCLUDE_GPS
+MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock);
+EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea);
+#else
+EnvironmentSensorManager sensors = EnvironmentSensorManager();
+#endif
+
+#ifdef DISPLAY_CLASS
+  DISPLAY_CLASS display;
+  MomentaryButton user_btn(PIN_USER_BTN, 1000, true);
+#endif
+
+bool radio_init() {
+  rtc_clock.begin(Wire);
+
+  return radio.std_init(&SPI);
+}
+
+uint32_t radio_get_rng_seed() {
+  return radio.random(0x7FFFFFFF);
+}
+
+void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) {
+  radio.setFrequency(freq);
+  radio.setSpreadingFactor(sf);
+  radio.setBandwidth(bw);
+  radio.setCodingRate(cr);
+}
+
+void radio_set_tx_power(uint8_t dbm) {
+  radio.setOutputPower(dbm);
+}
+
+mesh::LocalIdentity radio_new_identity() {
+  RadioNoiseListener rng(radio);
+  return mesh::LocalIdentity(&rng);  // create new random identity
+}
+

+ 31 - 0
variants/lilygo_techo_lite/target.h

@@ -0,0 +1,31 @@
+#pragma once
+
+#define RADIOLIB_STATIC_ONLY 1
+#include <RadioLib.h>
+#include <helpers/radiolib/RadioLibWrappers.h>
+#include <TechoBoard.h>
+#include <helpers/radiolib/CustomSX1262Wrapper.h>
+#include <helpers/AutoDiscoverRTCClock.h>
+#include <helpers/SensorManager.h>
+#include <helpers/sensors/EnvironmentSensorManager.h>
+#include <helpers/sensors/LocationProvider.h>
+#ifdef DISPLAY_CLASS
+  #include <helpers/ui/GxEPDDisplay.h>
+  #include <helpers/ui/MomentaryButton.h>
+#endif
+
+extern TechoBoard board;
+extern WRAPPER_CLASS radio_driver;
+extern AutoDiscoverRTCClock rtc_clock;
+extern EnvironmentSensorManager sensors;
+
+#ifdef DISPLAY_CLASS
+  extern DISPLAY_CLASS display;
+  extern MomentaryButton user_btn;
+#endif
+
+bool radio_init();
+uint32_t radio_get_rng_seed();
+void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr);
+void radio_set_tx_power(uint8_t dbm);
+mesh::LocalIdentity radio_new_identity();

+ 39 - 0
variants/lilygo_techo_lite/variant.cpp

@@ -0,0 +1,39 @@
+#include "variant.h"
+#include "wiring_constants.h"
+#include "wiring_digital.h"
+
+const int MISO = PIN_SPI1_MISO;
+const int MOSI = PIN_SPI1_MOSI;
+const int SCK = PIN_SPI1_SCK;
+
+const uint32_t g_ADigitalPinMap[] = {
+  0xff, 0xff, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+  14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+  27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+  40, 41, 42, 43, 44, 45, 46, 47
+};
+
+void initVariant() {
+  pinMode(PIN_PWR_EN, OUTPUT);
+  digitalWrite(PIN_PWR_EN, HIGH);
+
+  pinMode(PIN_BUTTON1, INPUT_PULLUP);
+  pinMode(PIN_BUTTON2, INPUT_PULLUP);
+
+  pinMode(LED_RED, OUTPUT);
+  pinMode(LED_GREEN, OUTPUT);
+  pinMode(LED_BLUE, OUTPUT);
+  digitalWrite(LED_BLUE, HIGH);
+  digitalWrite(LED_GREEN, HIGH);
+  digitalWrite(LED_RED, HIGH);
+
+  // pinMode(PIN_TXCO, OUTPUT);
+  // digitalWrite(PIN_TXCO, HIGH);
+
+  pinMode(DISP_POWER, OUTPUT);
+  digitalWrite(DISP_POWER, LOW);
+
+  // shutdown gps
+  pinMode(GPS_EN, OUTPUT);
+  digitalWrite(GPS_EN, LOW);
+}

+ 158 - 0
variants/lilygo_techo_lite/variant.h

@@ -0,0 +1,158 @@
+/*
+ * variant.h
+ * Copyright (C) 2023 Seeed K.K.
+ * MIT License
+ */
+
+#pragma once
+
+#define _PINNUM(port, pin) ((port) * 32 + (pin))
+
+#include "WVariant.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// Low frequency clock source
+
+#define USE_LFXO    // 32.768 kHz crystal oscillator
+#define VARIANT_MCK (64000000ul)
+
+#define WIRE_INTERFACES_COUNT   (1)
+
+////////////////////////////////////////////////////////////////////////////////
+// Power
+
+#define PIN_PWR_EN              _PINNUM(0, 30) // RT9080_EN
+
+#define BATTERY_PIN             _PINNUM(0, 2)
+#define ADC_MULTIPLIER          (4.90F)
+
+#define ADC_RESOLUTION          (14)
+#define BATTERY_SENSE_RES       (12)
+
+#define AREF_VOLTAGE            (3.0)
+
+////////////////////////////////////////////////////////////////////////////////
+// Number of pins
+
+#define PINS_COUNT              (48)
+#define NUM_DIGITAL_PINS        (48)
+#define NUM_ANALOG_INPUTS       (1)
+#define NUM_ANALOG_OUTPUTS      (0)
+
+////////////////////////////////////////////////////////////////////////////////
+// UART pin definition
+
+#define PIN_SERIAL1_RX          PIN_GPS_TX
+#define PIN_SERIAL1_TX          PIN_GPS_RX
+////////////////////////////////////////////////////////////////////////////////
+// I2C pin definition
+
+#define PIN_WIRE_SDA            _PINNUM(0, 4) // (SDA)
+#define PIN_WIRE_SCL            _PINNUM(0, 2) // (SCL)
+
+////////////////////////////////////////////////////////////////////////////////
+// SPI pin definition
+
+#define SPI_INTERFACES_COUNT    _PINNUM(0, 2)
+
+#define PIN_SPI_MISO            _PINNUM(0, 17) // (MISO)
+#define PIN_SPI_MOSI            _PINNUM(0, 15) // (MOSI)
+#define PIN_SPI_SCK             _PINNUM(0, 13) // (SCK)
+#define PIN_SPI_NSS             (-1)
+
+////////////////////////////////////////////////////////////////////////////////
+// QSPI FLASH
+
+#define PIN_QSPI_SCK            _PINNUM(0, 4)
+#define PIN_QSPI_CS             _PINNUM(0, 12)
+#define PIN_QSPI_IO0            _PINNUM(0, 6)
+#define PIN_QSPI_IO1            _PINNUM(0, 8)
+#define PIN_QSPI_IO2            _PINNUM(1, 9)
+#define PIN_QSPI_IO3            _PINNUM(0, 26)
+
+#define EXTERNAL_FLASH_DEVICES ZD25WQ32CEIGR
+#define EXTERNAL_FLASH_USE_QSPI
+
+////////////////////////////////////////////////////////////////////////////////
+// Builtin LEDs
+
+#define LED_RED                 _PINNUM(1, 14) // LED_3
+#define LED_BLUE                _PINNUM(1, 5)  // LED_2
+#define LED_GREEN               _PINNUM(1, 7)  // LED_1
+
+//#define PIN_STATUS_LED          LED_BLUE
+#define LED_BUILTIN             (-1)
+#define LED_PIN                 LED_BUILTIN
+#define LED_STATE_ON            LOW
+
+////////////////////////////////////////////////////////////////////////////////
+// Builtin buttons
+
+#define PIN_BUTTON1             _PINNUM(0, 24) // BOOT
+#define BUTTON_PIN              PIN_BUTTON1
+#define PIN_USER_BTN            BUTTON_PIN
+
+#define PIN_BUTTON2             _PINNUM(0, 18)
+#define BUTTON_PIN2             PIN_BUTTON2
+
+#define EXTERNAL_FLASH_DEVICES MX25R1635F
+#define EXTERNAL_FLASH_USE_QSPI
+
+////////////////////////////////////////////////////////////////////////////////
+// Lora
+
+#define USE_SX1262
+#define LORA_CS                 _PINNUM(0, 11)
+#define SX126X_POWER_EN         _PINNUM(0, 30)
+#define SX126X_DIO1             _PINNUM(1, 8)
+#define SX126X_BUSY             _PINNUM(0, 14)
+#define SX126X_RESET            _PINNUM(0, 7)
+#define SX126X_RF_VC1           _PINNUM(0, 27)
+#define SX126X_RF_VC2           _PINNUM(0, 33)
+
+#define P_LORA_DIO_1            SX126X_DIO1
+#define P_LORA_NSS              LORA_CS
+#define P_LORA_RESET            SX126X_RESET
+#define P_LORA_BUSY             SX126X_BUSY
+#define P_LORA_SCLK             PIN_SPI_SCK
+#define P_LORA_MISO             PIN_SPI_MISO
+#define P_LORA_MOSI             PIN_SPI_MOSI
+
+////////////////////////////////////////////////////////////////////////////////
+// SPI1
+
+#define PIN_SPI1_MISO           (-1)            // Not used for Display
+#define PIN_SPI1_MOSI           _PINNUM(0, 20)
+#define PIN_SPI1_SCK            _PINNUM(0, 19)
+
+// GxEPD2 needs that for a panel that is not even used !
+extern const int MISO;
+extern const int MOSI;
+extern const int SCK;
+
+////////////////////////////////////////////////////////////////////////////////
+// Display
+
+// #define DISP_MISO               (-1)         // Not used for Display
+#define DISP_MOSI               _PINNUM(0, 20)
+#define DISP_SCLK               _PINNUM(0, 19)
+#define DISP_CS                 _PINNUM(0, 22)
+#define DISP_DC                 _PINNUM(0, 21)
+#define DISP_RST                _PINNUM(0, 28)
+#define DISP_BUSY               _PINNUM(0, 3)
+#define DISP_POWER              _PINNUM(1, 12)
+// #define DISP_BACKLIGHT          (-1)         // Display has no backlight
+
+#define PIN_DISPLAY_CS          DISP_CS
+#define PIN_DISPLAY_DC          DISP_DC
+#define PIN_DISPLAY_RST         DISP_RST
+#define PIN_DISPLAY_BUSY        DISP_BUSY
+
+////////////////////////////////////////////////////////////////////////////////
+// GPS
+
+#define PIN_GPS_RX              _PINNUM(1, 13) // RXD
+#define PIN_GPS_TX              _PINNUM(1, 15) // TXD
+#define GPS_EN                  _PINNUM(1, 11) // POWER_RT9080_EN
+#define PIN_GPS_STANDBY         _PINNUM(1, 10)
+#define PIN_GPS_PPS             _PINNUM(0, 29) // 1PPS