@@ -83,14 +83,14 @@ static uint32_t _atoi(const char* sp) {
8383
8484/* ------------ Frame Protocol --------------*/
8585
86- #define FIRMWARE_VER_CODE 3
86+ #define FIRMWARE_VER_CODE 4
8787
8888#ifndef FIRMWARE_BUILD_DATE
89- #define FIRMWARE_BUILD_DATE " 30 Mar 2025"
89+ #define FIRMWARE_BUILD_DATE " 7 Apr 2025"
9090#endif
9191
9292#ifndef FIRMWARE_VERSION
93- #define FIRMWARE_VERSION " v1.4.2 "
93+ #define FIRMWARE_VERSION " v1.4.3 "
9494#endif
9595
9696#define CMD_APP_START 1
@@ -130,6 +130,7 @@ static uint32_t _atoi(const char* sp) {
130130#define CMD_SIGN_FINISH 35
131131#define CMD_SEND_TRACE_PATH 36
132132#define CMD_SET_DEVICE_PIN 37
133+ #define CMD_SET_OTHER_PARAMS 38
133134
134135#define RESP_CODE_OK 0
135136#define RESP_CODE_ERR 1
@@ -164,6 +165,7 @@ static uint32_t _atoi(const char* sp) {
164165#define PUSH_CODE_STATUS_RESPONSE 0x87
165166#define PUSH_CODE_LOG_RX_DATA 0x88
166167#define PUSH_CODE_TRACE_DATA 0x89
168+ #define PUSH_CODE_NEW_ADVERT 0x8A
167169
168170#define ERR_CODE_UNSUPPORTED_CMD 1
169171#define ERR_CODE_NOT_FOUND 2
@@ -184,7 +186,7 @@ struct NodePrefs { // persisted to file
184186 uint8_t sf;
185187 uint8_t cr;
186188 uint8_t reserved1;
187- uint8_t reserved2 ;
189+ uint8_t manual_add_contacts ;
188190 float bw;
189191 uint8_t tx_power_dbm;
190192 uint8_t unused[3 ];
@@ -499,11 +501,19 @@ class MyMesh : public BaseChatMesh {
499501 }
500502 }
501503
504+ bool isAutoAddEnabled () const override {
505+ return (_prefs.manual_add_contacts & 1 ) == 0 ;
506+ }
507+
502508 void onDiscoveredContact (ContactInfo& contact, bool is_new) override {
503509 if (_serial->isConnected ()) {
504- out_frame[0 ] = PUSH_CODE_ADVERT;
505- memcpy (&out_frame[1 ], contact.id .pub_key , PUB_KEY_SIZE);
506- _serial->writeFrame (out_frame, 1 + PUB_KEY_SIZE);
510+ if (!isAutoAddEnabled () && is_new) {
511+ writeContactRespFrame (PUSH_CODE_NEW_ADVERT, contact);
512+ } else {
513+ out_frame[0 ] = PUSH_CODE_ADVERT;
514+ memcpy (&out_frame[1 ], contact.id .pub_key , PUB_KEY_SIZE);
515+ _serial->writeFrame (out_frame, 1 + PUB_KEY_SIZE);
516+ }
507517 } else {
508518 soundBuzzer ();
509519 }
@@ -663,6 +673,10 @@ class MyMesh : public BaseChatMesh {
663673 }
664674
665675 void onRawDataRecv (mesh::Packet* packet) override {
676+ if (packet->payload_len + 4 > sizeof (out_frame)) {
677+ MESH_DEBUG_PRINTLN (" onRawDataRecv(), payload_len too long: %d" , packet->payload_len );
678+ return ;
679+ }
666680 int i = 0 ;
667681 out_frame[i++] = PUSH_CODE_RAW_DATA;
668682 out_frame[i++] = (int8_t )(_radio->getLastSNR () * 4 );
@@ -746,7 +760,7 @@ class MyMesh : public BaseChatMesh {
746760 file.read ((uint8_t *) &_prefs.sf , sizeof (_prefs.sf )); // 60
747761 file.read ((uint8_t *) &_prefs.cr , sizeof (_prefs.cr )); // 61
748762 file.read ((uint8_t *) &_prefs.reserved1 , sizeof (_prefs.reserved1 )); // 62
749- file.read ((uint8_t *) &_prefs.reserved2 , sizeof (_prefs.reserved2 )); // 63
763+ file.read ((uint8_t *) &_prefs.manual_add_contacts , sizeof (_prefs.manual_add_contacts )); // 63
750764 file.read ((uint8_t *) &_prefs.bw , sizeof (_prefs.bw )); // 64
751765 file.read ((uint8_t *) &_prefs.tx_power_dbm , sizeof (_prefs.tx_power_dbm )); // 68
752766 file.read ((uint8_t *) _prefs.unused , sizeof (_prefs.unused )); // 69
@@ -847,7 +861,7 @@ class MyMesh : public BaseChatMesh {
847861 file.write ((uint8_t *) &_prefs.sf , sizeof (_prefs.sf )); // 60
848862 file.write ((uint8_t *) &_prefs.cr , sizeof (_prefs.cr )); // 61
849863 file.write ((uint8_t *) &_prefs.reserved1 , sizeof (_prefs.reserved1 )); // 62
850- file.write ((uint8_t *) &_prefs.reserved2 , sizeof (_prefs.reserved2 )); // 63
864+ file.write ((uint8_t *) &_prefs.manual_add_contacts , sizeof (_prefs.manual_add_contacts )); // 63
851865 file.write ((uint8_t *) &_prefs.bw , sizeof (_prefs.bw )); // 64
852866 file.write ((uint8_t *) &_prefs.tx_power_dbm , sizeof (_prefs.tx_power_dbm )); // 68
853867 file.write ((uint8_t *) _prefs.unused , sizeof (_prefs.unused )); // 69
@@ -888,12 +902,15 @@ class MyMesh : public BaseChatMesh {
888902 out_frame[i++] = MAX_LORA_TX_POWER;
889903 memcpy (&out_frame[i], self_id.pub_key , PUB_KEY_SIZE); i += PUB_KEY_SIZE;
890904
891- int32_t lat, lon, alt = 0 ;
905+ int32_t lat, lon;
892906 lat = (_prefs.node_lat * 1000000.0 );
893907 lon = (_prefs.node_lon * 1000000.0 );
894908 memcpy (&out_frame[i], &lat, 4 ); i += 4 ;
895909 memcpy (&out_frame[i], &lon, 4 ); i += 4 ;
896- memcpy (&out_frame[i], &alt, 4 ); i += 4 ;
910+ out_frame[i++] = 0 ; // reserved
911+ out_frame[i++] = 0 ; // reserved
912+ out_frame[i++] = 0 ; // reserved
913+ out_frame[i++] = _prefs.manual_add_contacts ;
897914
898915 uint32_t freq = _prefs.freq * 1000 ;
899916 memcpy (&out_frame[i], &freq, 4 ); i += 4 ;
@@ -1177,6 +1194,10 @@ class MyMesh : public BaseChatMesh {
11771194 _prefs.airtime_factor = ((float )af) / 1000 .0f ;
11781195 savePrefs ();
11791196 writeOKFrame ();
1197+ } else if (cmd_frame[0 ] == CMD_SET_OTHER_PARAMS) {
1198+ _prefs.manual_add_contacts = cmd_frame[1 ];
1199+ savePrefs ();
1200+ writeOKFrame ();
11801201 } else if (cmd_frame[0 ] == CMD_REBOOT && memcmp (&cmd_frame[1 ], " reboot" , 6 ) == 0 ) {
11811202 board.reboot ();
11821203 } else if (cmd_frame[0 ] == CMD_GET_BATTERY_VOLTAGE) {
@@ -1505,7 +1526,7 @@ void setup() {
15051526#endif
15061527
15071528#ifdef HAS_UI
1508- ui_task.begin (disp, the_mesh.getNodeName (), FIRMWARE_BUILD_DATE, the_mesh.getBLEPin ());
1529+ ui_task.begin (disp, the_mesh.getNodeName (), FIRMWARE_BUILD_DATE, FIRMWARE_VERSION, the_mesh.getBLEPin ());
15091530#endif
15101531}
15111532
0 commit comments