Merge branch 'dev' into xiao_s3_serial_onpins

This commit is contained in:
Florent de Lamotte
2025-04-01 11:33:00 +02:00
15 changed files with 98 additions and 51 deletions

View File

@@ -1437,19 +1437,22 @@ void setup() {
board.begin(); board.begin();
if (!radio_init()) { halt(); }
fast_rng.begin(radio_get_rng_seed());
#ifdef HAS_UI #ifdef HAS_UI
DisplayDriver* disp = NULL; DisplayDriver* disp = NULL;
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
if (display.begin()) { if (display.begin()) {
disp = &display; disp = &display;
disp->startFrame();
disp->print("Please wait...");
disp->endFrame();
} }
#endif #endif
#endif #endif
if (!radio_init()) { halt(); }
fast_rng.begin(radio_get_rng_seed());
#if defined(NRF52_PLATFORM) #if defined(NRF52_PLATFORM)
InternalFS.begin(); InternalFS.begin();
the_mesh.begin(InternalFS, the_mesh.begin(InternalFS,

View File

@@ -616,6 +616,14 @@ void setup() {
board.begin(); board.begin();
#ifdef DISPLAY_CLASS
if(display.begin()){
display.startFrame();
display.print("Please wait...");
display.endFrame();
}
#endif
if (!radio_init()) { halt(); } if (!radio_init()) { halt(); }
fast_rng.begin(radio_get_rng_seed()); fast_rng.begin(radio_get_rng_seed());
@@ -646,7 +654,6 @@ void setup() {
the_mesh.begin(fs); the_mesh.begin(fs);
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
display.begin();
ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE); ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE);
#endif #endif

View File

@@ -62,7 +62,7 @@
#endif #endif
#ifndef MAX_UNSYNCED_POSTS #ifndef MAX_UNSYNCED_POSTS
#define MAX_UNSYNCED_POSTS 16 #define MAX_UNSYNCED_POSTS 32
#endif #endif
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
@@ -111,7 +111,7 @@ struct PostInfo {
#define REPLY_DELAY_MILLIS 1500 #define REPLY_DELAY_MILLIS 1500
#define PUSH_NOTIFY_DELAY_MILLIS 2000 #define PUSH_NOTIFY_DELAY_MILLIS 2000
#define SYNC_PUSH_INTERVAL 2000 #define SYNC_PUSH_INTERVAL 1200
#define PUSH_ACK_TIMEOUT_FLOOD 12000 #define PUSH_ACK_TIMEOUT_FLOOD 12000
#define PUSH_TIMEOUT_BASE 4000 #define PUSH_TIMEOUT_BASE 4000
@@ -782,6 +782,7 @@ public:
} }
// check next Round-Robin client, and sync next new post // check next Round-Robin client, and sync next new post
auto client = &known_clients[next_client_idx]; auto client = &known_clients[next_client_idx];
bool did_push = false;
if (client->pending_ack == 0 && client->last_activity != 0 && client->push_failures < 3) { // not already waiting for ACK, AND not evicted, AND retries not max if (client->pending_ack == 0 && client->last_activity != 0 && client->push_failures < 3) { // not already waiting for ACK, AND not evicted, AND retries not max
MESH_DEBUG_PRINTLN("loop - checking for client %02X", (uint32_t) client->id.pub_key[0]); MESH_DEBUG_PRINTLN("loop - checking for client %02X", (uint32_t) client->id.pub_key[0]);
for (int k = 0, idx = next_post_idx; k < MAX_UNSYNCED_POSTS; k++) { for (int k = 0, idx = next_post_idx; k < MAX_UNSYNCED_POSTS; k++) {
@@ -789,6 +790,7 @@ public:
&& !posts[idx].author.matches(client->id)) { // don't push posts to the author && !posts[idx].author.matches(client->id)) { // don't push posts to the author
// push this post to Client, then wait for ACK // push this post to Client, then wait for ACK
pushPostToClient(client, posts[idx]); pushPostToClient(client, posts[idx]);
did_push = true;
MESH_DEBUG_PRINTLN("loop - pushed to client %02X: %s", (uint32_t) client->id.pub_key[0], posts[idx].text); MESH_DEBUG_PRINTLN("loop - pushed to client %02X: %s", (uint32_t) client->id.pub_key[0], posts[idx].text);
break; break;
} }
@@ -799,7 +801,12 @@ public:
} }
next_client_idx = (next_client_idx + 1) % num_clients; // round robin polling for each client next_client_idx = (next_client_idx + 1) % num_clients; // round robin polling for each client
next_push = futureMillis(SYNC_PUSH_INTERVAL); if (did_push) {
next_push = futureMillis(SYNC_PUSH_INTERVAL);
} else {
// were no unsynced posts for curr client, so proccess next client much quicker! (in next loop())
next_push = futureMillis(SYNC_PUSH_INTERVAL / 8);
}
} }
if (next_flood_advert && millisHasNowPassed(next_flood_advert)) { if (next_flood_advert && millisHasNowPassed(next_flood_advert)) {
@@ -839,6 +846,14 @@ void setup() {
board.begin(); board.begin();
#ifdef DISPLAY_CLASS
if(display.begin()){
display.startFrame();
display.print("Please wait...");
display.endFrame();
}
#endif
if (!radio_init()) { halt(); } if (!radio_init()) { halt(); }
fast_rng.begin(radio_get_rng_seed()); fast_rng.begin(radio_get_rng_seed());
@@ -868,7 +883,6 @@ void setup() {
the_mesh.begin(fs); the_mesh.begin(fs);
#ifdef DISPLAY_CLASS #ifdef DISPLAY_CLASS
display.begin();
ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE); ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE);
#endif #endif

View File

@@ -1,12 +1,12 @@
#include <Arduino.h> #include <Arduino.h>
#include "FaketecBoard.h" #include "PromicroBoard.h"
#include <bluefruit.h> #include <bluefruit.h>
#include <Wire.h> #include <Wire.h>
static BLEDfu bledfu; static BLEDfu bledfu;
void FaketecBoard::begin() { void PromicroBoard::begin() {
// for future use, sub-classes SHOULD call this from their begin() // for future use, sub-classes SHOULD call this from their begin()
startup_reason = BD_STARTUP_NORMAL; startup_reason = BD_STARTUP_NORMAL;
btn_prev_state = HIGH; btn_prev_state = HIGH;
@@ -39,7 +39,7 @@ static void disconnect_callback(uint16_t conn_handle, uint8_t reason) {
MESH_DEBUG_PRINTLN("BLE client disconnected"); MESH_DEBUG_PRINTLN("BLE client disconnected");
} }
bool FaketecBoard::startOTAUpdate(const char* id, char reply[]) { bool PromicroBoard::startOTAUpdate(const char* id, char reply[]) {
// Config the peripheral connection with maximum bandwidth // Config the peripheral connection with maximum bandwidth
// more SRAM required by SoftDevice // more SRAM required by SoftDevice
// Note: All config***() function must be called before begin() // Note: All config***() function must be called before begin()
@@ -50,7 +50,7 @@ bool FaketecBoard::startOTAUpdate(const char* id, char reply[]) {
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4 // Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
Bluefruit.setTxPower(4); Bluefruit.setTxPower(4);
// Set the BLE device name // Set the BLE device name
Bluefruit.setName("Faketec_OTA"); Bluefruit.setName("ProMicro_OTA");
Bluefruit.Periph.setConnectCallback(connect_callback); Bluefruit.Periph.setConnectCallback(connect_callback);
Bluefruit.Periph.setDisconnectCallback(disconnect_callback); Bluefruit.Periph.setDisconnectCallback(disconnect_callback);

View File

@@ -19,7 +19,7 @@
#define PIN_VBAT_READ 17 #define PIN_VBAT_READ 17
#define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking #define ADC_MULTIPLIER (1.815f) // dependent on voltage divider resistors. TODO: more accurate battery tracking
class FaketecBoard : public mesh::MainBoard { class PromicroBoard : public mesh::MainBoard {
protected: protected:
uint8_t startup_reason; uint8_t startup_reason;
uint8_t btn_prev_state; uint8_t btn_prev_state;
@@ -43,7 +43,7 @@ public:
} }
const char* getManufacturerName() const override { const char* getManufacturerName() const override {
return "Faketec DIY"; return "ProMicro DIY";
} }
int buttonStateChanged() { int buttonStateChanged() {

View File

@@ -15,6 +15,7 @@ public:
virtual bool isOn() = 0; virtual bool isOn() = 0;
virtual void turnOn() = 0; virtual void turnOn() = 0;
virtual void turnOff() = 0; virtual void turnOff() = 0;
virtual void clear() = 0;
virtual void startFrame(Color bkg = DARK) = 0; virtual void startFrame(Color bkg = DARK) = 0;
virtual void setTextSize(int sz) = 0; virtual void setTextSize(int sz) = 0;
virtual void setColor(Color c) = 0; virtual void setColor(Color c) = 0;

View File

@@ -20,6 +20,11 @@ void SSD1306Display::turnOff() {
_isOn = false; _isOn = false;
} }
void SSD1306Display::clear() {
display.clearDisplay();
display.display();
}
void SSD1306Display::startFrame(Color bkg) { void SSD1306Display::startFrame(Color bkg) {
display.clearDisplay(); // TODO: apply 'bkg' display.clearDisplay(); // TODO: apply 'bkg'
_color = SSD1306_WHITE; _color = SSD1306_WHITE;

View File

@@ -27,6 +27,7 @@ public:
bool isOn() override { return _isOn; } bool isOn() override { return _isOn; }
void turnOn() override; void turnOn() override;
void turnOff() override; void turnOff() override;
void clear() override;
void startFrame(Color bkg = DARK) override; void startFrame(Color bkg = DARK) override;
void setTextSize(int sz) override; void setTextSize(int sz) override;
void setColor(Color c) override; void setColor(Color c) override;

View File

@@ -44,3 +44,21 @@ build_src_filter = ${LilyGo_TBeam.build_src_filter}
lib_deps = lib_deps =
${LilyGo_TBeam.lib_deps} ${LilyGo_TBeam.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
[env:Tbeam_repeater]
extends = LilyGo_TBeam
build_flags =
${LilyGo_TBeam.build_flags}
-D DISPLAY_CLASS=SSD1306Display
-D ADVERT_NAME='"Tbeam Repeater"'
-D ADVERT_LAT=-37.0
-D ADVERT_LON=145.0
-D ADMIN_PASSWORD='"password"'
-D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
build_src_filter = ${LilyGo_TBeam.build_src_filter}
+<helpers/ui/*.cpp>
+<../examples/simple_repeater>
lib_deps =
${LilyGo_TBeam.lib_deps}
${esp32_ota.lib_deps}

View File

@@ -5,9 +5,9 @@ TBeamBoard board;
#if defined(P_LORA_SCLK) #if defined(P_LORA_SCLK)
static SPIClass spi; static SPIClass spi;
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, spi); RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DIO_1, spi);
#else #else
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DIO_1);
#endif #endif
WRAPPER_CLASS radio_driver(radio, board); WRAPPER_CLASS radio_driver(radio, board);

View File

@@ -1,4 +1,4 @@
[faketec] [Faketec]
extends = nrf52840_base extends = nrf52840_base
board = promicro_nrf52840 board = promicro_nrf52840
build_flags = ${nrf52840_base.build_flags} build_flags = ${nrf52840_base.build_flags}
@@ -15,17 +15,17 @@ build_flags = ${nrf52840_base.build_flags}
-D PIN_OLED_RESET=-1 -D PIN_OLED_RESET=-1
-D PIN_USER_BTN=6 -D PIN_USER_BTN=6
build_src_filter = ${nrf52840_base.build_src_filter} build_src_filter = ${nrf52840_base.build_src_filter}
+<helpers/nrf52/FaketecBoard.cpp> +<helpers/nrf52/PromicroBoard.cpp>
+<../variants/promicro> +<../variants/promicro>
lib_deps= lib_deps=
${nrf52840_base.lib_deps} ${nrf52840_base.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13 adafruit/Adafruit SSD1306 @ ^2.5.13
[env:Faketec_Repeater] [env:Faketec_Repeater]
extends = faketec extends = Faketec
build_src_filter = ${faketec.build_src_filter} +<../examples/simple_repeater> +<helpers/ui/*.cpp> build_src_filter = ${Faketec.build_src_filter} +<../examples/simple_repeater> +<helpers/ui/*.cpp>
build_flags = build_flags =
${faketec.build_flags} ${Faketec.build_flags}
-D ADVERT_NAME="\"Faketec Repeater\"" -D ADVERT_NAME="\"Faketec Repeater\""
-D ADVERT_LAT=-37.0 -D ADVERT_LAT=-37.0
-D ADVERT_LON=145.0 -D ADVERT_LON=145.0
@@ -33,14 +33,14 @@ build_flags =
; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
lib_deps = lib_deps =
${faketec.lib_deps} ${Faketec.lib_deps}
adafruit/RTClib @ ^2.1.3 adafruit/RTClib @ ^2.1.3
[env:Faketec_room_server] [env:Faketec_room_server]
extends = faketec extends = Faketec
build_src_filter = ${faketec.build_src_filter} +<../examples/simple_room_server> +<helpers/ui/*.cpp> build_src_filter = ${Faketec.build_src_filter} +<../examples/simple_room_server> +<helpers/ui/*.cpp>
build_flags = build_flags =
${faketec.build_flags} ${Faketec.build_flags}
-D ADVERT_NAME="\"Test Room\"" -D ADVERT_NAME="\"Test Room\""
-D ADVERT_LAT=-37.0 -D ADVERT_LAT=-37.0
-D ADVERT_LON=145.0 -D ADVERT_LON=145.0
@@ -49,41 +49,41 @@ build_flags =
; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
lib_deps = lib_deps =
${faketec.lib_deps} ${Faketec.lib_deps}
adafruit/RTClib @ ^2.1.3 adafruit/RTClib @ ^2.1.3
[env:Faketec_terminal_chat] [env:Faketec_terminal_chat]
extends = faketec extends = Faketec
build_flags = build_flags =
${faketec.build_flags} ${Faketec.build_flags}
-D MAX_CONTACTS=100 -D MAX_CONTACTS=100
-D MAX_GROUP_CHANNELS=1 -D MAX_GROUP_CHANNELS=1
; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
build_src_filter = ${faketec.build_src_filter} +<../examples/simple_secure_chat/main.cpp> build_src_filter = ${Faketec.build_src_filter} +<../examples/simple_secure_chat/main.cpp>
lib_deps = lib_deps =
${faketec.lib_deps} ${Faketec.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
adafruit/RTClib @ ^2.1.3 adafruit/RTClib @ ^2.1.3
[env:Faketec_companion_radio_usb] [env:Faketec_companion_radio_usb]
extends = faketec extends = Faketec
build_flags = build_flags =
${faketec.build_flags} ${Faketec.build_flags}
-D MAX_CONTACTS=100 -D MAX_CONTACTS=100
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 ; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1
; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 ; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1
build_src_filter = ${faketec.build_src_filter} +<../examples/companion_radio> +<../examples/companion_radio> +<helpers/ui/*.cpp> build_src_filter = ${Faketec.build_src_filter} +<../examples/companion_radio> +<../examples/companion_radio> +<helpers/ui/*.cpp>
lib_deps = lib_deps =
${faketec.lib_deps} ${Faketec.lib_deps}
adafruit/RTClib @ ^2.1.3 adafruit/RTClib @ ^2.1.3
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
[env:Faketec_companion_radio_ble] [env:Faketec_companion_radio_ble]
extends = faketec extends = Faketec
build_flags = build_flags =
${faketec.build_flags} ${Faketec.build_flags}
-D MAX_CONTACTS=100 -D MAX_CONTACTS=100
-D MAX_GROUP_CHANNELS=8 -D MAX_GROUP_CHANNELS=8
-D BLE_PIN_CODE=123456 -D BLE_PIN_CODE=123456
@@ -92,9 +92,9 @@ build_flags =
-D ENABLE_PRIVATE_KEY_IMPORT=1 -D ENABLE_PRIVATE_KEY_IMPORT=1
; -D MESH_PACKET_LOGGING=1 ; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1 ; -D MESH_DEBUG=1
build_src_filter = ${faketec.build_src_filter} +<helpers/nrf52/SerialBLEInterface.cpp> +<../examples/companion_radio> +<helpers/ui/*.cpp> build_src_filter = ${Faketec.build_src_filter} +<helpers/nrf52/SerialBLEInterface.cpp> +<../examples/companion_radio> +<helpers/ui/*.cpp>
lib_deps = lib_deps =
${faketec.lib_deps} ${Faketec.lib_deps}
adafruit/RTClib @ ^2.1.3 adafruit/RTClib @ ^2.1.3
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
@@ -103,14 +103,14 @@ extends = nrf52840_base
board = promicro_nrf52840 board = promicro_nrf52840
build_flags = ${nrf52840_base.build_flags} build_flags = ${nrf52840_base.build_flags}
-I variants/promicro -I variants/promicro
-D FAKETEC -D PROMICROLLCC68
-D RADIO_CLASS=CustomLLCC68 -D RADIO_CLASS=CustomLLCC68
-D WRAPPER_CLASS=CustomLLCC68Wrapper -D WRAPPER_CLASS=CustomLLCC68Wrapper
-D LORA_TX_POWER=22 -D LORA_TX_POWER=22
-D SX126X_CURRENT_LIMIT=130 -D SX126X_CURRENT_LIMIT=130
-D SX126X_RX_BOOSTED_GAIN=1 -D SX126X_RX_BOOSTED_GAIN=1
build_src_filter = ${nrf52840_base.build_src_filter} build_src_filter = ${nrf52840_base.build_src_filter}
+<helpers/nrf52/FaketecBoard.cpp> +<helpers/nrf52/PromicroBoard.cpp>
+<../variants/promicro> +<../variants/promicro>
[env:ProMicroLLCC68_Repeater] [env:ProMicroLLCC68_Repeater]

View File

@@ -2,7 +2,7 @@
#include "target.h" #include "target.h"
#include <helpers/ArduinoHelpers.h> #include <helpers/ArduinoHelpers.h>
FaketecBoard board; PromicroBoard board;
RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI);

View File

@@ -3,12 +3,12 @@
#define RADIOLIB_STATIC_ONLY 1 #define RADIOLIB_STATIC_ONLY 1
#include <RadioLib.h> #include <RadioLib.h>
#include <helpers/RadioLibWrappers.h> #include <helpers/RadioLibWrappers.h>
#include <helpers/nrf52/FaketecBoard.h> #include <helpers/nrf52/PromicroBoard.h>
#include <helpers/CustomSX1262Wrapper.h> #include <helpers/CustomSX1262Wrapper.h>
#include <helpers/CustomLLCC68Wrapper.h> #include <helpers/CustomLLCC68Wrapper.h>
#include <helpers/AutoDiscoverRTCClock.h> #include <helpers/AutoDiscoverRTCClock.h>
extern FaketecBoard board; extern PromicroBoard board;
extern WRAPPER_CLASS radio_driver; extern WRAPPER_CLASS radio_driver;
extern AutoDiscoverRTCClock rtc_clock; extern AutoDiscoverRTCClock rtc_clock;

View File

@@ -1,6 +1,5 @@
#include <Arduino.h> #include <Arduino.h>
#include "target.h" #include "target.h"
#include <helpers/ArduinoHelpers.h>
T1000eBoard board; T1000eBoard board;
@@ -8,8 +7,7 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU
WRAPPER_CLASS radio_driver(radio, board); WRAPPER_CLASS radio_driver(radio, board);
VolatileRTCClock fallback_clock; VolatileRTCClock rtc_clock;
AutoDiscoverRTCClock rtc_clock(fallback_clock);
#ifndef LORA_CR #ifndef LORA_CR
#define LORA_CR 5 #define LORA_CR 5
@@ -38,7 +36,7 @@ static const Module::RfSwitchMode_t rfswitch_table[] = {
#endif #endif
bool radio_init() { bool radio_init() {
rtc_clock.begin(Wire); //rtc_clock.begin(Wire);
#ifdef LR11X0_DIO3_TCXO_VOLTAGE #ifdef LR11X0_DIO3_TCXO_VOLTAGE
float tcxo = LR11X0_DIO3_TCXO_VOLTAGE; float tcxo = LR11X0_DIO3_TCXO_VOLTAGE;

View File

@@ -5,11 +5,11 @@
#include <helpers/RadioLibWrappers.h> #include <helpers/RadioLibWrappers.h>
#include <helpers/nrf52/T1000eBoard.h> #include <helpers/nrf52/T1000eBoard.h>
#include <helpers/CustomLR1110Wrapper.h> #include <helpers/CustomLR1110Wrapper.h>
#include <helpers/AutoDiscoverRTCClock.h> #include <helpers/ArduinoHelpers.h>
extern T1000eBoard board; extern T1000eBoard board;
extern WRAPPER_CLASS radio_driver; extern WRAPPER_CLASS radio_driver;
extern AutoDiscoverRTCClock rtc_clock; extern VolatileRTCClock rtc_clock;
bool radio_init(); bool radio_init();
uint32_t radio_get_rng_seed(); uint32_t radio_get_rng_seed();