Initial T-Echo support

This commit is contained in:
Mark Qvist 2025-01-15 18:38:14 +01:00
parent 13266c96db
commit 2d2d90847a
10 changed files with 261 additions and 54 deletions

View File

@ -95,6 +95,11 @@
#define MODEL_C6 0xC6 // Heltec Mesh Node T114, 470-510 MHz #define MODEL_C6 0xC6 // Heltec Mesh Node T114, 470-510 MHz
#define MODEL_C7 0xC7 // Heltec Mesh Node T114, 863-928 MHz #define MODEL_C7 0xC7 // Heltec Mesh Node T114, 863-928 MHz
#define PRODUCT_TECHO 0x15 // LilyGO T-Echo devices
#define BOARD_TECHO 0x44
#define MODEL_16 0x16 // T-Echo 433 MHz
#define MODEL_17 0x17 // T-Echo 868/915 MHz
#define PRODUCT_RAK4631 0x10 #define PRODUCT_RAK4631 0x10
#define BOARD_RAK4631 0x51 #define BOARD_RAK4631 0x51
#define MODEL_11 0x11 // RAK4631, 433 Mhz #define MODEL_11 0x11 // RAK4631, 433 Mhz
@ -631,6 +636,58 @@
const int pin_led_tx = LED_GREEN; const int pin_led_tx = LED_GREEN;
const int pin_tcxo_enable = -1; const int pin_tcxo_enable = -1;
#elif BOARD_MODEL == BOARD_TECHO
#define _PINNUM(port, pin) ((port) * 32 + (pin))
#define MODEM SX1262
#define HAS_EEPROM false
#define HAS_BLUETOOTH false
#define HAS_BLE true
#define HAS_CONSOLE false
#define HAS_PMU false
#define HAS_NP false
#define HAS_SD false
#define HAS_TCXO true
#define HAS_BUSY true
#define HAS_INPUT true
#define HAS_SLEEP true
#define BLE_MANUFACTURER "LilyGO"
#define BLE_MODEL "T-Echo"
#define HAS_INPUT true
#define EEPROM_SIZE 296
#define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED
#define CONFIG_UART_BUFFER_SIZE 32768
#define CONFIG_QUEUE_SIZE 6144
#define CONFIG_QUEUE_MAX_LENGTH 200
#define HAS_DISPLAY true
#define HAS_BACKLIGHT true
#define DISPLAY_SCALE 1
#define PIN_VEXT_EN _PINNUM(0, 12)
const int pin_disp_cs = 30;
const int pin_disp_dc = 28;
const int pin_disp_reset = 2;
const int pin_disp_busy = 3;
const int pin_disp_en = -1;
const int pin_disp_sck = 31;
const int pin_disp_mosi = 29;
const int pin_disp_miso = -1;
const int pin_backlight = 43;
const int pin_btn_usr1 = 42;
const int pin_reset = 25;
const int pin_cs = 24;
const int pin_sclk = 19;
const int pin_mosi = 22;
const int pin_miso = 23;
const int pin_busy = 17;
const int pin_dio = 20;
const int pin_tcxo_enable = 21;
const int pin_led_rx = 14;
const int pin_led_tx = 14;
#elif BOARD_MODEL == BOARD_HELTEC_T114 #elif BOARD_MODEL == BOARD_HELTEC_T114
#define MODEM SX1262 #define MODEM SX1262
#define HAS_EEPROM false #define HAS_EEPROM false
@ -652,13 +709,10 @@
#define EEPROM_SIZE 296 #define EEPROM_SIZE 296
#define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED #define EEPROM_OFFSET EEPROM_SIZE-EEPROM_RESERVED
#define BLE_MANUFACTURER "Heltec" #define BLE_MANUFACTURER "Heltec"
#define BLE_MODEL "HT-n5262" #define BLE_MODEL "T114"
// ADC
#define PIN_T114_ADC_EN 6 #define PIN_T114_ADC_EN 6
#define PIN_VEXT_EN 21
// External sensors
#define PIN_T114_VEXT_EN 21
// LED // LED
#define LED_T114_GREEN 3 #define LED_T114_GREEN 3

View File

@ -207,6 +207,7 @@
uint8_t battery_state = 0x00; uint8_t battery_state = 0x00;
uint8_t display_intensity = 0xFF; uint8_t display_intensity = 0xFF;
uint8_t display_addr = 0xFF; uint8_t display_addr = 0xFF;
volatile bool display_updating = false;
bool display_blanking_enabled = false; bool display_blanking_enabled = false;
bool display_diagnostics = true; bool display_diagnostics = true;
bool device_init_done = false; bool device_init_done = false;

150
Display.h
View File

@ -16,21 +16,33 @@
#include "Graphics.h" #include "Graphics.h"
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#if BOARD_MODEL == BOARD_TDECK #if BOARD_MODEL != BOARD_TECHO
#include <Adafruit_ST7789.h> #if BOARD_MODEL == BOARD_TDECK
#elif BOARD_MODEL == BOARD_HELTEC_T114 #include <Adafruit_ST7789.h>
#include "ST7789.h" #elif BOARD_MODEL == BOARD_HELTEC_T114
#define COLOR565(r, g, b) (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3)) #include "ST7789.h"
#elif BOARD_MODEL == BOARD_TBEAM_S_V1 #define COLOR565(r, g, b) (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3))
#include <Adafruit_SH110X.h> #elif BOARD_MODEL == BOARD_TBEAM_S_V1
#include <Adafruit_SH110X.h>
#else
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#endif
#else #else
#include <Wire.h> void (*display_callback)();
#include <Adafruit_SSD1306.h> void display_add_callback(void (*callback)()) { display_callback = callback; }
void busyCallback(const void* p) { display_callback(); }
#define SSD1306_BLACK GxEPD_BLACK
#define SSD1306_WHITE GxEPD_WHITE
#include <GxEPD2_BW.h>
#include <SPI.h>
#endif #endif
#include "Fonts/Org_01.h" #include "Fonts/Org_01.h"
#define DISP_W 128 #define DISP_W 128
#define DISP_H 64 #define DISP_H 64
#if BOARD_MODEL == BOARD_RNODE_NG_20 || BOARD_MODEL == BOARD_LORA32_V2_0 #if BOARD_MODEL == BOARD_RNODE_NG_20 || BOARD_MODEL == BOARD_LORA32_V2_0
#define DISP_RST -1 #define DISP_RST -1
#define DISP_ADDR 0x3C #define DISP_ADDR 0x3C
@ -62,6 +74,11 @@
#define DISP_ADDR 0x3C #define DISP_ADDR 0x3C
#define SCL_OLED 17 #define SCL_OLED 17
#define SDA_OLED 18 #define SDA_OLED 18
#elif BOARD_MODEL == BOARD_TECHO
SPIClass displaySPI = SPIClass(NRF_SPIM0, pin_disp_miso, pin_disp_sck, pin_disp_mosi);
#define DISP_W 128
#define DISP_H 64
#define DISP_ADDR -1
#elif BOARD_MODEL == BOARD_TBEAM_S_V1 #elif BOARD_MODEL == BOARD_TBEAM_S_V1
#define DISP_RST -1 #define DISP_RST -1
#define DISP_ADDR 0x3C #define DISP_ADDR 0x3C
@ -88,10 +105,18 @@
Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire, -1); Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire, -1);
#define SSD1306_WHITE SH110X_WHITE #define SSD1306_WHITE SH110X_WHITE
#define SSD1306_BLACK SH110X_BLACK #define SSD1306_BLACK SH110X_BLACK
#elif BOARD_MODEL == BOARD_TECHO
GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(pin_disp_cs, pin_disp_dc, pin_disp_reset, pin_disp_busy));
uint32_t last_epd_refresh = 0;
uint32_t last_epd_full_refresh = 0;
#define REFRESH_PERIOD 300000
#else #else
Adafruit_SSD1306 display(DISP_W, DISP_H, &Wire, DISP_RST); Adafruit_SSD1306 display(DISP_W, DISP_H, &Wire, DISP_RST);
#endif #endif
float disp_target_fps = 7;
float epd_update_fps = 0.5;
#define DISP_MODE_UNKNOWN 0x00 #define DISP_MODE_UNKNOWN 0x00
#define DISP_MODE_LANDSCAPE 0x01 #define DISP_MODE_LANDSCAPE 0x01
#define DISP_MODE_PORTRAIT 0x02 #define DISP_MODE_PORTRAIT 0x02
@ -107,8 +132,8 @@ uint8_t display_unblank_intensity = display_intensity;
bool display_blanked = false; bool display_blanked = false;
bool display_tx = false; bool display_tx = false;
bool recondition_display = false; bool recondition_display = false;
uint8_t disp_target_fps = 7;
int disp_update_interval = 1000/disp_target_fps; int disp_update_interval = 1000/disp_target_fps;
int epd_update_interval = 1000/disp_target_fps;
uint32_t last_page_flip = 0; uint32_t last_page_flip = 0;
int page_interval = 4000; int page_interval = 4000;
bool device_signatures_ok(); bool device_signatures_ok();
@ -129,19 +154,7 @@ GFXcanvas1 disp_area(64, 64);
void fillRect(int16_t x, int16_t y, int16_t width, int16_t height, uint16_t colour); void fillRect(int16_t x, int16_t y, int16_t width, int16_t height, uint16_t colour);
void update_area_positions() { void update_area_positions() {
#if BOARD_MODEL != BOARD_HELTEC_T114 #if BOARD_MODEL == BOARD_HELTEC_T114
if (disp_mode == DISP_MODE_PORTRAIT) {
p_ad_x = 0 * DISPLAY_SCALE;
p_ad_y = 0 * DISPLAY_SCALE;
p_as_x = 0 * DISPLAY_SCALE;
p_as_y = 64 * DISPLAY_SCALE;
} else if (disp_mode == DISP_MODE_LANDSCAPE) {
p_ad_x = 0 * DISPLAY_SCALE;
p_ad_y = 0 * DISPLAY_SCALE;
p_as_x = 64 * DISPLAY_SCALE;
p_as_y = 0 * DISPLAY_SCALE;
}
#else
if (disp_mode == DISP_MODE_PORTRAIT) { if (disp_mode == DISP_MODE_PORTRAIT) {
p_ad_x = 16; p_ad_x = 16;
p_ad_y = 64; p_ad_y = 64;
@ -153,6 +166,30 @@ void update_area_positions() {
p_as_x = 126; p_as_x = 126;
p_as_y = p_ad_y; p_as_y = p_ad_y;
} }
#elif BOARD_MODEL == BOARD_TECHO
if (disp_mode == DISP_MODE_PORTRAIT) {
p_ad_x = 61;
p_ad_y = 36;
p_as_x = 64;
p_as_y = 64+36;
} else if (disp_mode == DISP_MODE_LANDSCAPE) {
p_ad_x = 0;
p_ad_y = 0;
p_as_x = 64;
p_as_y = 0;
}
#else
if (disp_mode == DISP_MODE_PORTRAIT) {
p_ad_x = 0 * DISPLAY_SCALE;
p_ad_y = 0 * DISPLAY_SCALE;
p_as_x = 0 * DISPLAY_SCALE;
p_as_y = 64 * DISPLAY_SCALE;
} else if (disp_mode == DISP_MODE_LANDSCAPE) {
p_ad_x = 0 * DISPLAY_SCALE;
p_ad_y = 0 * DISPLAY_SCALE;
p_as_x = 64 * DISPLAY_SCALE;
p_as_y = 0 * DISPLAY_SCALE;
}
#endif #endif
} }
@ -161,8 +198,9 @@ uint8_t display_contrast = 0x00;
void set_contrast(Adafruit_SH1106G *display, uint8_t value) { void set_contrast(Adafruit_SH1106G *display, uint8_t value) {
} }
#elif BOARD_MODEL == BOARD_HELTEC_T114 #elif BOARD_MODEL == BOARD_HELTEC_T114
void set_contrast(ST7789Spi *display, uint8_t value) { void set_contrast(ST7789Spi *display, uint8_t value) { }
} #elif BOARD_MODEL == BOARD_TECHO
void set_contrast(uint8_t value) { }
#elif BOARD_MODEL == BOARD_TDECK #elif BOARD_MODEL == BOARD_TDECK
void set_contrast(Adafruit_ST7789 *display, uint8_t value) { void set_contrast(Adafruit_ST7789 *display, uint8_t value) {
static uint8_t level = 0; static uint8_t level = 0;
@ -227,6 +265,13 @@ bool display_init() {
#elif BOARD_MODEL == BOARD_HELTEC_T114 #elif BOARD_MODEL == BOARD_HELTEC_T114
pinMode(PIN_T114_TFT_EN, OUTPUT); pinMode(PIN_T114_TFT_EN, OUTPUT);
digitalWrite(PIN_T114_TFT_EN, LOW); digitalWrite(PIN_T114_TFT_EN, LOW);
#elif BOARD_MODEL == BOARD_TECHO
display.init(0, true, 10, false, displaySPI, SPISettings(4000000, MSBFIRST, SPI_MODE0));
display.epd2.setBusyCallback(busyCallback);
#if HAS_BACKLIGHT
pinMode(pin_backlight, INPUT_PULLUP);
digitalWrite(pin_backlight, HIGH);
#endif
#elif BOARD_MODEL == BOARD_TBEAM_S_V1 #elif BOARD_MODEL == BOARD_TBEAM_S_V1
Wire.begin(SDA_OLED, SCL_OLED); Wire.begin(SDA_OLED, SCL_OLED);
#endif #endif
@ -261,7 +306,10 @@ bool display_init() {
} }
#endif #endif
#if BOARD_MODEL == BOARD_TDECK #if BOARD_MODEL == BOARD_TECHO
// Don't check if display is actually connected
if(false) {
#elif BOARD_MODEL == BOARD_TDECK
display.init(240, 320); display.init(240, 320);
display.setSPISpeed(80e6); display.setSPISpeed(80e6);
#elif BOARD_MODEL == BOARD_HELTEC_T114 #elif BOARD_MODEL == BOARD_HELTEC_T114
@ -276,7 +324,9 @@ bool display_init() {
#endif #endif
return false; return false;
} else { } else {
set_contrast(&display, display_contrast); #if BOARD_MODEL != BOARD_TECHO
set_contrast(&display, display_contrast);
#endif
if (display_rotation != 0xFF) { if (display_rotation != 0xFF) {
if (display_rotation == 0 || display_rotation == 2) { if (display_rotation == 0 || display_rotation == 2) {
disp_mode = DISP_MODE_LANDSCAPE; disp_mode = DISP_MODE_LANDSCAPE;
@ -321,6 +371,9 @@ bool display_init() {
#elif BOARD_MODEL == BOARD_TDECK #elif BOARD_MODEL == BOARD_TDECK
disp_mode = DISP_MODE_PORTRAIT; disp_mode = DISP_MODE_PORTRAIT;
display.setRotation(3); display.setRotation(3);
#elif BOARD_MODEL == BOARD_TECHO
disp_mode = DISP_MODE_PORTRAIT;
display.setRotation(3);
#else #else
disp_mode = DISP_MODE_PORTRAIT; disp_mode = DISP_MODE_PORTRAIT;
display.setRotation(3); display.setRotation(3);
@ -328,9 +381,11 @@ bool display_init() {
} }
update_area_positions(); update_area_positions();
for (int i = 0; i < WATERFALL_SIZE; i++) { #if BOARD_MODEL == BOARD_TECHO
waterfall[i] = 0; display.setPartialWindow(p_ad_x, p_ad_y, 64, 128);
} #endif
for (int i = 0; i < WATERFALL_SIZE; i++) { waterfall[i] = 0; }
last_page_flip = millis(); last_page_flip = millis();
@ -835,6 +890,7 @@ void display_recondition() {
} }
void update_display(bool blank = false) { void update_display(bool blank = false) {
display_updating = true;
if (blank == true) { if (blank == true) {
last_disp_update = millis()-disp_update_interval-1; last_disp_update = millis()-disp_update_interval-1;
} else { } else {
@ -858,13 +914,20 @@ void update_display(bool blank = false) {
if (millis()-last_disp_update >= disp_update_interval) { if (millis()-last_disp_update >= disp_update_interval) {
if (display_contrast != display_intensity) { if (display_contrast != display_intensity) {
display_contrast = display_intensity; display_contrast = display_intensity;
set_contrast(&display, display_contrast); #if BOARD_MODEL != BOARD_TECHO
set_contrast(&display, display_contrast);
#endif
} }
#if BOARD_MODEL == BOARD_TECHO
display.setFullWindow();
display.fillScreen(SSD1306_WHITE);
#endif
#if BOARD_MODEL == BOARD_HELTEC_T114 #if BOARD_MODEL == BOARD_HELTEC_T114
display.clear(); display.clear();
display.display(); display.display();
#elif BOARD_MODEL != BOARD_TDECK #elif BOARD_MODEL != BOARD_TDECK && BOARD_MODEL != BOARD_TECHO
display.clearDisplay(); display.clearDisplay();
display.display(); display.display();
#else #else
@ -873,16 +936,20 @@ void update_display(bool blank = false) {
last_disp_update = millis(); last_disp_update = millis();
} }
} else { } else {
if (millis()-last_disp_update >= disp_update_interval) { if (millis()-last_disp_update >= disp_update_interval) {
uint32_t current = millis();
if (display_contrast != display_intensity) { if (display_contrast != display_intensity) {
display_contrast = display_intensity; display_contrast = display_intensity;
set_contrast(&display, display_contrast); #if BOARD_MODEL != BOARD_TECHO
set_contrast(&display, display_contrast);
#endif
} }
#if BOARD_MODEL == BOARD_HELTEC_T114 #if BOARD_MODEL == BOARD_HELTEC_T114
display.clear(); display.clear();
#elif BOARD_MODEL != BOARD_TDECK #elif BOARD_MODEL != BOARD_TDECK && BOARD_MODEL != BOARD_TECHO
display.clearDisplay(); display.clearDisplay();
#endif #endif
@ -891,16 +958,29 @@ void update_display(bool blank = false) {
disp_update_interval = 1000/disp_target_fps; disp_update_interval = 1000/disp_target_fps;
display_recondition(); display_recondition();
} else { } else {
#if BOARD_MODEL == BOARD_TECHO
display.setPartialWindow(p_ad_x, p_ad_y, 64, 128);
display.fillScreen(SSD1306_WHITE);
#endif
update_stat_area(); update_stat_area();
update_disp_area(); update_disp_area();
} }
#if BOARD_MODEL != BOARD_TDECK #if BOARD_MODEL == BOARD_TECHO
if (current-last_epd_refresh >= epd_update_interval) {
if (current-last_epd_full_refresh >= REFRESH_PERIOD) { display.display(false); last_epd_full_refresh = millis(); }
else { display.display(true); }
last_epd_refresh = millis();
}
#elif BOARD_MODEL != BOARD_TDECK
display.display(); display.display();
#endif #endif
last_disp_update = millis(); last_disp_update = millis();
} }
} }
display_updating = false;
} }
void display_unblank() { void display_unblank() {

View File

@ -47,6 +47,8 @@ prep-nrf:
arduino-cli core update-index --config-file arduino-cli.yaml arduino-cli core update-index --config-file arduino-cli.yaml
arduino-cli core install rakwireless:nrf52 --config-file arduino-cli.yaml arduino-cli core install rakwireless:nrf52 --config-file arduino-cli.yaml
arduino-cli core install Heltec_nRF52:Heltec_nRF52 --config-file arduino-cli.yaml arduino-cli core install Heltec_nRF52:Heltec_nRF52 --config-file arduino-cli.yaml
arduino-cli core install adafruit:nrf52 --config-file arduino-cli.yaml
arduino-cli lib install "GxEPD2"
arduino-cli config set library.enable_unsafe_install true arduino-cli config set library.enable_unsafe_install true
arduino-cli lib install --git-url https://github.com/liamcottle/esp8266-oled-ssd1306#e16cee124fe26490cb14880c679321ad8ac89c95 arduino-cli lib install --git-url https://github.com/liamcottle/esp8266-oled-ssd1306#e16cee124fe26490cb14880c679321ad8ac89c95
pip install adafruit-nrfutil --upgrade pip install adafruit-nrfutil --upgrade
@ -138,6 +140,9 @@ firmware-rak4631:
firmware-heltec_t114: firmware-heltec_t114:
arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x3C\"" arduino-cli compile --log --fqbn Heltec_nRF52:Heltec_nRF52:HT-n5262 -e --build-property "build.partitions=no_ota" --build-property "upload.maximum_size=2097152" --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x3C\""
firmware-techo:
arduino-cli compile --log --fqbn adafruit:nrf52:pca10056 -e --build-property "compiler.cpp.extra_flags=\"-DBOARD_MODEL=0x44\""
upload: upload:
arduino-cli upload -p /dev/ttyUSB0 --fqbn unsignedio:avr:rnode arduino-cli upload -p /dev/ttyUSB0 --fqbn unsignedio:avr:rnode
@ -245,6 +250,11 @@ upload-heltec_t114:
@sleep 1 @sleep 1
rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes from_device /dev/ttyACM0) rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes from_device /dev/ttyACM0)
upload-techo:
arduino-cli upload -p /dev/ttyACM0 --fqbn adafruit:nrf52:pca10056
@sleep 6
rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes from_device /dev/ttyACM0)
release: release-all release: release-all
release-all: console-site spiffs-image release-tbeam release-tbeam_sx1262 release-lora32_v10 release-lora32_v20 release-lora32_v21 release-lora32_v10_extled release-lora32_v20_extled release-lora32_v21_extled release-lora32_v21_tcxo release-featheresp32 release-genericesp32 release-heltec32_v2 release-heltec32_v3 release-heltec32_v2_extled release-heltec_t114 release-rnode_ng_20 release-rnode_ng_21 release-t3s3 release-t3s3_sx127x release-t3s3_sx1280_pa release-tdeck release-tbeam_supreme release-rak4631 release-hashes release-all: console-site spiffs-image release-tbeam release-tbeam_sx1262 release-lora32_v10 release-lora32_v20 release-lora32_v21 release-lora32_v10_extled release-lora32_v20_extled release-lora32_v21_extled release-lora32_v21_tcxo release-featheresp32 release-genericesp32 release-heltec32_v2 release-heltec32_v3 release-heltec32_v2_extled release-heltec_t114 release-rnode_ng_20 release-rnode_ng_21 release-t3s3 release-t3s3_sx127x release-t3s3_sx1280_pa release-tdeck release-tbeam_supreme release-rak4631 release-hashes

20
Power.h
View File

@ -128,6 +128,22 @@
bool bat_voltage_dropping = false; bool bat_voltage_dropping = false;
float bat_delay_v = 0; float bat_delay_v = 0;
float bat_state_change_v = 0; float bat_state_change_v = 0;
#elif BOARD_MODEL == BOARD_TECHO
#define BAT_V_MIN 3.15
#define BAT_V_MAX 4.2
#define BAT_V_CHG 4.48
#define BAT_V_FLOAT 4.33
#define BAT_SAMPLES 7
const uint8_t pin_vbat = 4;
float bat_p_samples[BAT_SAMPLES];
float bat_v_samples[BAT_SAMPLES];
uint8_t bat_samples_count = 0;
int bat_discharging_samples = 0;
int bat_charging_samples = 0;
int bat_charged_samples = 0;
bool bat_voltage_dropping = false;
float bat_delay_v = 0;
float bat_state_change_v = 0;
#endif #endif
uint32_t last_pmu_update = 0; uint32_t last_pmu_update = 0;
@ -138,7 +154,7 @@ uint8_t pmu_rc = 0;
void kiss_indicate_battery(); void kiss_indicate_battery();
void measure_battery() { void measure_battery() {
#if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_TECHO
battery_installed = true; battery_installed = true;
battery_indeterminate = true; battery_indeterminate = true;
@ -148,6 +164,8 @@ void measure_battery() {
float battery_measurement = (float)(analogRead(pin_vbat)) / 4095.0*6.7828; float battery_measurement = (float)(analogRead(pin_vbat)) / 4095.0*6.7828;
#elif BOARD_MODEL == BOARD_HELTEC_T114 #elif BOARD_MODEL == BOARD_HELTEC_T114
float battery_measurement = (float)(analogRead(pin_vbat)) * 0.017165; float battery_measurement = (float)(analogRead(pin_vbat)) * 0.017165;
#elif BOARD_MODEL == BOARD_TECHO
float battery_measurement = (float)(analogRead(pin_vbat)) * 0.017165;
#else #else
float battery_measurement = (float)(analogRead(pin_vbat)) / 4095.0*7.26; float battery_measurement = (float)(analogRead(pin_vbat)) / 4095.0*7.26;
#endif #endif

View File

@ -59,6 +59,16 @@ char sbuf[128];
#endif #endif
void setup() { void setup() {
pinMode(pin_led_rx, OUTPUT);
pinMode(pin_led_tx, OUTPUT);
while (true) {
delay(300);
led_rx_on();
delay(300);
led_rx_off();
}
#if MCU_VARIANT == MCU_ESP32 #if MCU_VARIANT == MCU_ESP32
boot_seq(); boot_seq();
EEPROM.begin(EEPROM_SIZE); EEPROM.begin(EEPROM_SIZE);
@ -75,6 +85,12 @@ void setup() {
pinMode(DISPLAY_BL_PIN, OUTPUT); pinMode(DISPLAY_BL_PIN, OUTPUT);
#endif #endif
#if BOARD_MODEL == BOARD_TECHO
pinMode(PIN_VEXT_EN, OUTPUT);
digitalWrite(PIN_VEXT_EN, HIGH);
#endif
#endif #endif
#if MCU_VARIANT == MCU_NRF52 #if MCU_VARIANT == MCU_NRF52
@ -105,11 +121,11 @@ void setup() {
led_init(); led_init();
#endif #endif
#if BOARD_MODEL != BOARD_RAK4631 && BOARD_MODEL != BOARD_HELTEC_T114 && BOARD_MODEL != BOARD_T3S3 && BOARD_MODEL != BOARD_TBEAM_S_V1 #if BOARD_MODEL != BOARD_RAK4631 && BOARD_MODEL != BOARD_HELTEC_T114 && BOARD_MODEL != BOARD_TECHO && BOARD_MODEL != BOARD_T3S3 && BOARD_MODEL != BOARD_TBEAM_S_V1
// Some boards need to wait until the hardware UART is set up before booting // Some boards need to wait until the hardware UART is set up before booting
// the full firmware. In the case of the RAK4631 and Heltec T114, the line below will wait // the full firmware. In the case of the RAK4631 and Heltec T114, the line below will wait
// until a serial connection is actually established with a master. Thus, it // until a serial connection is actually established with a master. Thus, it
// is disabled on this platform. // is disabled on this platform.
while (!Serial); while (!Serial);
#endif #endif
@ -211,6 +227,10 @@ void setup() {
eeprom_update(eeprom_addr(ADDR_CONF_DSET), CONF_OK_BYTE); eeprom_update(eeprom_addr(ADDR_CONF_DSET), CONF_OK_BYTE);
eeprom_update(eeprom_addr(ADDR_CONF_DINT), 0xFF); eeprom_update(eeprom_addr(ADDR_CONF_DINT), 0xFF);
} }
#if BOARD_MODEL == BOARD_TECHO
display_add_callback(work_while_waiting);
#endif
display_unblank(); display_unblank();
disp_ready = display_init(); disp_ready = display_init();
update_display(); update_display();
@ -1491,6 +1511,8 @@ void tx_queue_handler() {
} }
} }
void work_while_waiting() { loop(); }
void loop() { void loop() {
if (radio_online) { if (radio_online) {
#if MCU_VARIANT == MCU_ESP32 #if MCU_VARIANT == MCU_ESP32
@ -1562,7 +1584,7 @@ void loop() {
#endif #endif
#if HAS_DISPLAY #if HAS_DISPLAY
if (disp_ready) update_display(); if (disp_ready && !display_updating) update_display();
#endif #endif
#if HAS_PMU #if HAS_PMU
@ -1612,9 +1634,12 @@ void sleep_now() {
#elif PLATFORM == PLATFORM_NRF52 #elif PLATFORM == PLATFORM_NRF52
#if BOARD_MODEL == BOARD_HELTEC_T114 #if BOARD_MODEL == BOARD_HELTEC_T114
npset(0,0,0); npset(0,0,0);
digitalWrite(PIN_T114_VEXT_EN, LOW); digitalWrite(PIN_VEXT_EN, LOW);
digitalWrite(PIN_T114_TFT_BLGT, HIGH); digitalWrite(PIN_T114_TFT_BLGT, HIGH);
digitalWrite(PIN_T114_TFT_EN, HIGH); digitalWrite(PIN_T114_TFT_EN, HIGH);
#elif BOARD_MODEL == BOARD_TECHO
digitalWrite(PIN_VEXT_EN, LOW);
digitalWrite(pin_backlight, LOW);
#endif #endif
sd_power_gpregret_set(0, 0x6d); sd_power_gpregret_set(0, 0x6d);
nrf_gpio_cfg_sense_input(pin_btn_usr1, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(pin_btn_usr1, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);

Binary file not shown.

View File

@ -121,8 +121,8 @@ uint8_t boot_vector = 0x00;
void led_init() { void led_init() {
#if BOARD_MODEL == BOARD_HELTEC_T114 #if BOARD_MODEL == BOARD_HELTEC_T114
// Enable vext power supply to neopixel // Enable vext power supply to neopixel
pinMode(PIN_T114_VEXT_EN, OUTPUT); pinMode(PIN_VEXT_EN, OUTPUT);
digitalWrite(PIN_T114_VEXT_EN, HIGH); digitalWrite(PIN_VEXT_EN, HIGH);
#endif #endif
#if MCU_VARIANT == MCU_NRF52 #if MCU_VARIANT == MCU_NRF52
@ -323,7 +323,14 @@ uint8_t boot_vector = 0x00;
void led_tx_off() { digitalWrite(pin_led_tx, HIGH); } void led_tx_off() { digitalWrite(pin_led_tx, HIGH); }
void led_id_on() { } void led_id_on() { }
void led_id_off() { } void led_id_off() { }
#endif #elif BOARD_MODEL == BOARD_TECHO
void led_rx_on() { digitalWrite(pin_led_rx, LOW); }
void led_rx_off() { digitalWrite(pin_led_rx, HIGH); }
void led_tx_on() { digitalWrite(pin_led_tx, LOW); }
void led_tx_off() { digitalWrite(pin_led_tx, HIGH); }
void led_id_on() { }
void led_id_off() { }
#endif
#endif #endif
void hard_reset(void) { void hard_reset(void) {
@ -1287,7 +1294,7 @@ void promisc_disable() {
#if !HAS_EEPROM && MCU_VARIANT == MCU_NRF52 #if !HAS_EEPROM && MCU_VARIANT == MCU_NRF52
bool eeprom_begin() { bool eeprom_begin() {
InternalFS.begin(); InternalFS.begin();
file.open(EEPROM_FILE, FILE_O_READ); file.open(EEPROM_FILE, FILE_O_READ);
if (!file) { if (!file) {
if (file.open(EEPROM_FILE, FILE_O_WRITE)) { if (file.open(EEPROM_FILE, FILE_O_WRITE)) {
@ -1454,7 +1461,7 @@ bool eeprom_product_valid() {
#elif PLATFORM == PLATFORM_ESP32 #elif PLATFORM == PLATFORM_ESP32
if (rval == PRODUCT_RNODE || rval == BOARD_RNODE_NG_20 || rval == BOARD_RNODE_NG_21 || rval == PRODUCT_HMBRW || rval == PRODUCT_TBEAM || rval == PRODUCT_T32_10 || rval == PRODUCT_T32_20 || rval == PRODUCT_T32_21 || rval == PRODUCT_H32_V2 || rval == PRODUCT_H32_V3 || rval == PRODUCT_TDECK_V1 || rval == PRODUCT_TBEAM_S_V1) { if (rval == PRODUCT_RNODE || rval == BOARD_RNODE_NG_20 || rval == BOARD_RNODE_NG_21 || rval == PRODUCT_HMBRW || rval == PRODUCT_TBEAM || rval == PRODUCT_T32_10 || rval == PRODUCT_T32_20 || rval == PRODUCT_T32_21 || rval == PRODUCT_H32_V2 || rval == PRODUCT_H32_V3 || rval == PRODUCT_TDECK_V1 || rval == PRODUCT_TBEAM_S_V1) {
#elif PLATFORM == PLATFORM_NRF52 #elif PLATFORM == PLATFORM_NRF52
if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HELTEC_T114 || rval == PRODUCT_HMBRW) { if (rval == PRODUCT_RAK4631 || rval == PRODUCT_HELTEC_T114 || rval == PRODUCT_TECHO || rval == PRODUCT_HMBRW) {
#else #else
if (false) { if (false) {
#endif #endif
@ -1484,6 +1491,8 @@ bool eeprom_model_valid() {
if (model == MODEL_E4 || model == MODEL_E9 || model == MODEL_E3 || model == MODEL_E8) { if (model == MODEL_E4 || model == MODEL_E9 || model == MODEL_E3 || model == MODEL_E8) {
#elif BOARD_MODEL == BOARD_TDECK #elif BOARD_MODEL == BOARD_TDECK
if (model == MODEL_D4 || model == MODEL_D9) { if (model == MODEL_D4 || model == MODEL_D9) {
#elif BOARD_MODEL == BOARD_TECHO
if (model == MODEL_16 || model == MODEL_17) {
#elif BOARD_MODEL == BOARD_TBEAM_S_V1 #elif BOARD_MODEL == BOARD_TBEAM_S_V1
if (model == MODEL_DB || model == MODEL_DC) { if (model == MODEL_DB || model == MODEL_DC) {
#elif BOARD_MODEL == BOARD_LORA32_V1_0 #elif BOARD_MODEL == BOARD_LORA32_V1_0

View File

@ -3,4 +3,5 @@ board_manager:
- https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json - https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- https://raw.githubusercontent.com/RAKwireless/RAKwireless-Arduino-BSP-Index/main/package_rakwireless_index.json - https://raw.githubusercontent.com/RAKwireless/RAKwireless-Arduino-BSP-Index/main/package_rakwireless_index.json
- https://github.com/HelTecAutomation/Heltec_nRF52/releases/download/1.7.0/package_heltec_nrf_index.json - https://github.com/HelTecAutomation/Heltec_nRF52/releases/download/1.7.0/package_heltec_nrf_index.json
- https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
- http://unsigned.io/arduino/package_unsignedio_UnsignedBoards_index.json - http://unsigned.io/arduino/package_unsignedio_UnsignedBoards_index.json

View File

@ -87,7 +87,11 @@
#define FREQ_DIV_6X (double)pow(2.0, 25.0) #define FREQ_DIV_6X (double)pow(2.0, 25.0)
#define FREQ_STEP_6X (double)(XTAL_FREQ_6X / FREQ_DIV_6X) #define FREQ_STEP_6X (double)(XTAL_FREQ_6X / FREQ_DIV_6X)
#if defined(NRF52840_XXAA) #if BOARD_MODEL == BOARD_TECHO
SPIClass spim3 = SPIClass(NRF_SPIM3, pin_miso, pin_sclk, pin_mosi) ;
#define SPI spim3
#elif defined(NRF52840_XXAA)
extern SPIClass spiModem; extern SPIClass spiModem;
#define SPI spiModem #define SPI spiModem
#endif #endif
@ -123,6 +127,9 @@ bool sx126x::preInit() {
#if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK
SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs); SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs);
#elif BOARD_MODEL == BOARD_TECHO
SPI.setPins(pin_miso, pin_sclk, pin_mosi);
SPI.begin();
#else #else
SPI.begin(); SPI.begin();
#endif #endif
@ -569,6 +576,8 @@ void sx126x::enableTCXO() {
uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF};
#elif BOARD_MODEL == BOARD_HELTEC_T114 #elif BOARD_MODEL == BOARD_HELTEC_T114
uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF}; uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF};
#elif BOARD_MODEL == BOARD_TECHO
uint8_t buf[4] = {MODE_TCXO_1_8V_6X, 0x00, 0x00, 0xFF};
#endif #endif
executeOpcode(OP_DIO3_TCXO_CTRL_6X, buf, 4); executeOpcode(OP_DIO3_TCXO_CTRL_6X, buf, 4);
#endif #endif