|
|
@@ -61,9 +61,14 @@
|
|
|
|
|
|
#ifdef DISPLAY_CLASS
|
|
|
#include "UITask.h"
|
|
|
- #include <helpers/ui/SSD1306Display.h>
|
|
|
-
|
|
|
- static DISPLAY_CLASS display;
|
|
|
+ #ifdef ST7789
|
|
|
+ #include <helpers/ui/ST7789Display.h>
|
|
|
+ #elif defined(HAS_GxEPD)
|
|
|
+ #include <helpers/ui/GxEPDDisplay.h>
|
|
|
+ #else
|
|
|
+ #include <helpers/ui/SSD1306Display.h>
|
|
|
+ #endif
|
|
|
+ static DISPLAY_CLASS display;
|
|
|
#define HAS_UI
|
|
|
#endif
|
|
|
|
|
|
@@ -85,14 +90,14 @@ static uint32_t _atoi(const char* sp) {
|
|
|
|
|
|
/*------------ Frame Protocol --------------*/
|
|
|
|
|
|
-#define FIRMWARE_VER_CODE 3
|
|
|
+#define FIRMWARE_VER_CODE 4
|
|
|
|
|
|
#ifndef FIRMWARE_BUILD_DATE
|
|
|
- #define FIRMWARE_BUILD_DATE "7 Apr 2025"
|
|
|
+ #define FIRMWARE_BUILD_DATE "21 Apr 2025"
|
|
|
#endif
|
|
|
|
|
|
#ifndef FIRMWARE_VERSION
|
|
|
- #define FIRMWARE_VERSION "v1.4.3"
|
|
|
+ #define FIRMWARE_VERSION "v1.5.1"
|
|
|
#endif
|
|
|
|
|
|
#define CMD_APP_START 1
|
|
|
@@ -132,6 +137,7 @@ static uint32_t _atoi(const char* sp) {
|
|
|
#define CMD_SIGN_FINISH 35
|
|
|
#define CMD_SEND_TRACE_PATH 36
|
|
|
#define CMD_SET_DEVICE_PIN 37
|
|
|
+#define CMD_SET_OTHER_PARAMS 38
|
|
|
|
|
|
#define RESP_CODE_OK 0
|
|
|
#define RESP_CODE_ERR 1
|
|
|
@@ -166,6 +172,7 @@ static uint32_t _atoi(const char* sp) {
|
|
|
#define PUSH_CODE_STATUS_RESPONSE 0x87
|
|
|
#define PUSH_CODE_LOG_RX_DATA 0x88
|
|
|
#define PUSH_CODE_TRACE_DATA 0x89
|
|
|
+#define PUSH_CODE_NEW_ADVERT 0x8A
|
|
|
|
|
|
#define ERR_CODE_UNSUPPORTED_CMD 1
|
|
|
#define ERR_CODE_NOT_FOUND 2
|
|
|
@@ -186,7 +193,7 @@ struct NodePrefs { // persisted to file
|
|
|
uint8_t sf;
|
|
|
uint8_t cr;
|
|
|
uint8_t reserved1;
|
|
|
- uint8_t reserved2;
|
|
|
+ uint8_t manual_add_contacts;
|
|
|
float bw;
|
|
|
uint8_t tx_power_dbm;
|
|
|
uint8_t unused[3];
|
|
|
@@ -519,11 +526,19 @@ protected:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ bool isAutoAddEnabled() const override {
|
|
|
+ return (_prefs.manual_add_contacts & 1) == 0;
|
|
|
+ }
|
|
|
+
|
|
|
void onDiscoveredContact(ContactInfo& contact, bool is_new) override {
|
|
|
if (_serial->isConnected()) {
|
|
|
- out_frame[0] = PUSH_CODE_ADVERT;
|
|
|
- memcpy(&out_frame[1], contact.id.pub_key, PUB_KEY_SIZE);
|
|
|
- _serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
|
|
|
+ if (!isAutoAddEnabled() && is_new) {
|
|
|
+ writeContactRespFrame(PUSH_CODE_NEW_ADVERT, contact);
|
|
|
+ } else {
|
|
|
+ out_frame[0] = PUSH_CODE_ADVERT;
|
|
|
+ memcpy(&out_frame[1], contact.id.pub_key, PUB_KEY_SIZE);
|
|
|
+ _serial->writeFrame(out_frame, 1 + PUB_KEY_SIZE);
|
|
|
+ }
|
|
|
} else {
|
|
|
soundBuzzer();
|
|
|
}
|
|
|
@@ -683,6 +698,10 @@ protected:
|
|
|
}
|
|
|
|
|
|
void onRawDataRecv(mesh::Packet* packet) override {
|
|
|
+ if (packet->payload_len + 4 > sizeof(out_frame)) {
|
|
|
+ MESH_DEBUG_PRINTLN("onRawDataRecv(), payload_len too long: %d", packet->payload_len);
|
|
|
+ return;
|
|
|
+ }
|
|
|
int i = 0;
|
|
|
out_frame[i++] = PUSH_CODE_RAW_DATA;
|
|
|
out_frame[i++] = (int8_t)(_radio->getLastSNR() * 4);
|
|
|
@@ -770,7 +789,7 @@ public:
|
|
|
file.read((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60
|
|
|
file.read((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61
|
|
|
file.read((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
|
|
|
- file.read((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63
|
|
|
+ file.read((uint8_t *) &_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
|
|
|
file.read((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64
|
|
|
file.read((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
|
|
|
file.read((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69
|
|
|
@@ -873,7 +892,7 @@ public:
|
|
|
file.write((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60
|
|
|
file.write((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61
|
|
|
file.write((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62
|
|
|
- file.write((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63
|
|
|
+ file.write((uint8_t *) &_prefs.manual_add_contacts, sizeof(_prefs.manual_add_contacts)); // 63
|
|
|
file.write((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64
|
|
|
file.write((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68
|
|
|
file.write((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69
|
|
|
@@ -914,12 +933,15 @@ public:
|
|
|
out_frame[i++] = MAX_LORA_TX_POWER;
|
|
|
memcpy(&out_frame[i], self_id.pub_key, PUB_KEY_SIZE); i += PUB_KEY_SIZE;
|
|
|
|
|
|
- int32_t lat, lon, alt = 0;
|
|
|
+ int32_t lat, lon;
|
|
|
lat = (_prefs.node_lat * 1000000.0);
|
|
|
lon = (_prefs.node_lon * 1000000.0);
|
|
|
memcpy(&out_frame[i], &lat, 4); i += 4;
|
|
|
memcpy(&out_frame[i], &lon, 4); i += 4;
|
|
|
- memcpy(&out_frame[i], &alt, 4); i += 4;
|
|
|
+ out_frame[i++] = 0; // reserved
|
|
|
+ out_frame[i++] = 0; // reserved
|
|
|
+ out_frame[i++] = 0; // reserved
|
|
|
+ out_frame[i++] = _prefs.manual_add_contacts;
|
|
|
|
|
|
uint32_t freq = _prefs.freq * 1000;
|
|
|
memcpy(&out_frame[i], &freq, 4); i += 4;
|
|
|
@@ -1126,6 +1148,8 @@ public:
|
|
|
// export SELF
|
|
|
auto pkt = createSelfAdvert(_prefs.node_name, _prefs.node_lat, _prefs.node_lon);
|
|
|
if (pkt) {
|
|
|
+ pkt->header |= ROUTE_TYPE_FLOOD; // would normally be sent in this mode
|
|
|
+
|
|
|
out_frame[0] = RESP_CODE_EXPORT_CONTACT;
|
|
|
uint8_t out_len = pkt->writeTo(&out_frame[1]);
|
|
|
releasePacket(pkt); // undo the obtainNewPacket()
|
|
|
@@ -1203,6 +1227,10 @@ public:
|
|
|
_prefs.airtime_factor = ((float)af) / 1000.0f;
|
|
|
savePrefs();
|
|
|
writeOKFrame();
|
|
|
+ } else if (cmd_frame[0] == CMD_SET_OTHER_PARAMS) {
|
|
|
+ _prefs.manual_add_contacts = cmd_frame[1];
|
|
|
+ savePrefs();
|
|
|
+ writeOKFrame();
|
|
|
} else if (cmd_frame[0] == CMD_REBOOT && memcmp(&cmd_frame[1], "reboot", 6) == 0) {
|
|
|
board.reboot();
|
|
|
} else if (cmd_frame[0] == CMD_GET_BATTERY_VOLTAGE) {
|