@@ -86,7 +86,7 @@ static uint32_t _atoi(const char* sp) {
8686
8787/* ------------ Frame Protocol --------------*/
8888
89- #define FIRMWARE_VER_CODE 3
89+ #define FIRMWARE_VER_CODE 4
9090
9191#ifndef FIRMWARE_BUILD_DATE
9292 #define FIRMWARE_BUILD_DATE " 7 Apr 2025"
@@ -133,6 +133,7 @@ static uint32_t _atoi(const char* sp) {
133133#define CMD_SIGN_FINISH 35
134134#define CMD_SEND_TRACE_PATH 36
135135#define CMD_SET_DEVICE_PIN 37
136+ #define CMD_SET_OTHER_PARAMS 38
136137
137138#define RESP_CODE_OK 0
138139#define RESP_CODE_ERR 1
@@ -167,6 +168,7 @@ static uint32_t _atoi(const char* sp) {
167168#define PUSH_CODE_STATUS_RESPONSE 0x87
168169#define PUSH_CODE_LOG_RX_DATA 0x88
169170#define PUSH_CODE_TRACE_DATA 0x89
171+ #define PUSH_CODE_NEW_ADVERT 0x8A
170172
171173#define ERR_CODE_UNSUPPORTED_CMD 1
172174#define ERR_CODE_NOT_FOUND 2
@@ -187,7 +189,7 @@ struct NodePrefs { // persisted to file
187189 uint8_t sf;
188190 uint8_t cr;
189191 uint8_t reserved1;
190- uint8_t reserved2 ;
192+ uint8_t manual_add_contacts ;
191193 float bw;
192194 uint8_t tx_power_dbm;
193195 uint8_t unused[3 ];
@@ -502,11 +504,19 @@ class MyMesh : public BaseChatMesh {
502504 }
503505 }
504506
507+ bool isAutoAddEnabled () const override {
508+ return (_prefs.manual_add_contacts & 1 ) == 0 ;
509+ }
510+
505511 void onDiscoveredContact (ContactInfo& contact, bool is_new) override {
506512 if (_serial->isConnected ()) {
507- out_frame[0 ] = PUSH_CODE_ADVERT;
508- memcpy (&out_frame[1 ], contact.id .pub_key , PUB_KEY_SIZE);
509- _serial->writeFrame (out_frame, 1 + PUB_KEY_SIZE);
513+ if (!isAutoAddEnabled () && is_new) {
514+ writeContactRespFrame (PUSH_CODE_NEW_ADVERT, contact);
515+ } else {
516+ out_frame[0 ] = PUSH_CODE_ADVERT;
517+ memcpy (&out_frame[1 ], contact.id .pub_key , PUB_KEY_SIZE);
518+ _serial->writeFrame (out_frame, 1 + PUB_KEY_SIZE);
519+ }
510520 } else {
511521 soundBuzzer ();
512522 }
@@ -666,6 +676,10 @@ class MyMesh : public BaseChatMesh {
666676 }
667677
668678 void onRawDataRecv (mesh::Packet* packet) override {
679+ if (packet->payload_len + 4 > sizeof (out_frame)) {
680+ MESH_DEBUG_PRINTLN (" onRawDataRecv(), payload_len too long: %d" , packet->payload_len );
681+ return ;
682+ }
669683 int i = 0 ;
670684 out_frame[i++] = PUSH_CODE_RAW_DATA;
671685 out_frame[i++] = (int8_t )(_radio->getLastSNR () * 4 );
@@ -749,7 +763,7 @@ class MyMesh : public BaseChatMesh {
749763 file.read ((uint8_t *) &_prefs.sf , sizeof (_prefs.sf )); // 60
750764 file.read ((uint8_t *) &_prefs.cr , sizeof (_prefs.cr )); // 61
751765 file.read ((uint8_t *) &_prefs.reserved1 , sizeof (_prefs.reserved1 )); // 62
752- file.read ((uint8_t *) &_prefs.reserved2 , sizeof (_prefs.reserved2 )); // 63
766+ file.read ((uint8_t *) &_prefs.manual_add_contacts , sizeof (_prefs.manual_add_contacts )); // 63
753767 file.read ((uint8_t *) &_prefs.bw , sizeof (_prefs.bw )); // 64
754768 file.read ((uint8_t *) &_prefs.tx_power_dbm , sizeof (_prefs.tx_power_dbm )); // 68
755769 file.read ((uint8_t *) _prefs.unused , sizeof (_prefs.unused )); // 69
@@ -850,7 +864,7 @@ class MyMesh : public BaseChatMesh {
850864 file.write ((uint8_t *) &_prefs.sf , sizeof (_prefs.sf )); // 60
851865 file.write ((uint8_t *) &_prefs.cr , sizeof (_prefs.cr )); // 61
852866 file.write ((uint8_t *) &_prefs.reserved1 , sizeof (_prefs.reserved1 )); // 62
853- file.write ((uint8_t *) &_prefs.reserved2 , sizeof (_prefs.reserved2 )); // 63
867+ file.write ((uint8_t *) &_prefs.manual_add_contacts , sizeof (_prefs.manual_add_contacts )); // 63
854868 file.write ((uint8_t *) &_prefs.bw , sizeof (_prefs.bw )); // 64
855869 file.write ((uint8_t *) &_prefs.tx_power_dbm , sizeof (_prefs.tx_power_dbm )); // 68
856870 file.write ((uint8_t *) _prefs.unused , sizeof (_prefs.unused )); // 69
@@ -891,12 +905,15 @@ class MyMesh : public BaseChatMesh {
891905 out_frame[i++] = MAX_LORA_TX_POWER;
892906 memcpy (&out_frame[i], self_id.pub_key , PUB_KEY_SIZE); i += PUB_KEY_SIZE;
893907
894- int32_t lat, lon, alt = 0 ;
908+ int32_t lat, lon;
895909 lat = (_prefs.node_lat * 1000000.0 );
896910 lon = (_prefs.node_lon * 1000000.0 );
897911 memcpy (&out_frame[i], &lat, 4 ); i += 4 ;
898912 memcpy (&out_frame[i], &lon, 4 ); i += 4 ;
899- memcpy (&out_frame[i], &alt, 4 ); i += 4 ;
913+ out_frame[i++] = 0 ; // reserved
914+ out_frame[i++] = 0 ; // reserved
915+ out_frame[i++] = 0 ; // reserved
916+ out_frame[i++] = _prefs.manual_add_contacts ;
900917
901918 uint32_t freq = _prefs.freq * 1000 ;
902919 memcpy (&out_frame[i], &freq, 4 ); i += 4 ;
@@ -1180,6 +1197,10 @@ class MyMesh : public BaseChatMesh {
11801197 _prefs.airtime_factor = ((float )af) / 1000 .0f ;
11811198 savePrefs ();
11821199 writeOKFrame ();
1200+ } else if (cmd_frame[0 ] == CMD_SET_OTHER_PARAMS) {
1201+ _prefs.manual_add_contacts = cmd_frame[1 ];
1202+ savePrefs ();
1203+ writeOKFrame ();
11831204 } else if (cmd_frame[0 ] == CMD_REBOOT && memcmp (&cmd_frame[1 ], " reboot" , 6 ) == 0 ) {
11841205 board.reboot ();
11851206 } else if (cmd_frame[0 ] == CMD_GET_BATTERY_VOLTAGE) {
0 commit comments