@@ -187,6 +187,7 @@ struct NodePrefs { // persisted to file
187187 uint8_t tx_power_dbm;
188188 uint8_t unused[3 ];
189189 float rx_delay_base;
190+ uint32_t ble_pin;
190191};
191192
192193class MyMesh : public BaseChatMesh {
@@ -219,6 +220,11 @@ class MyMesh : public BaseChatMesh {
219220 if (!_identity_store->load (" _main" , self_id)) {
220221 self_id = mesh::LocalIdentity (&trng); // create new random identity
221222 saveMainIdentity (self_id);
223+
224+ #if defined(BLE_PIN_CODE) && defined(DISPLAY_CLASS)
225+ // start with randomly assigned BLE pin
226+ _prefs.ble_pin = trng.nextInt (100000 , 999999 );
227+ #endif
222228 }
223229 }
224230
@@ -611,6 +617,9 @@ class MyMesh : public BaseChatMesh {
611617 _prefs.bw = LORA_BW;
612618 _prefs.cr = LORA_CR;
613619 _prefs.tx_power_dbm = LORA_TX_POWER;
620+ #ifdef BLE_PIN_CODE
621+ _prefs.ble_pin = BLE_PIN_CODE;
622+ #endif
614623 // _prefs.rx_delay_base = 10.0f; enable once new algo fixed
615624 }
616625
@@ -631,7 +640,34 @@ class MyMesh : public BaseChatMesh {
631640 if (_fs->exists (" /node_prefs" )) {
632641 File file = _fs->open (" /node_prefs" );
633642 if (file) {
634- file.read ((uint8_t *) &_prefs, sizeof (_prefs));
643+ uint8_t pad[8 ];
644+
645+ file.read ((uint8_t *) &_prefs.airtime_factor , sizeof (float )); // 0
646+ file.read ((uint8_t *) _prefs.node_name , sizeof (_prefs.node_name )); // 4
647+ file.read (pad, 4 ); // 36
648+ file.read ((uint8_t *) &_prefs.node_lat , sizeof (_prefs.node_lat )); // 40
649+ file.read ((uint8_t *) &_prefs.node_lon , sizeof (_prefs.node_lon )); // 48
650+ file.read ((uint8_t *) &_prefs.freq , sizeof (_prefs.freq )); // 56
651+ file.read ((uint8_t *) &_prefs.sf , sizeof (_prefs.sf )); // 60
652+ file.read ((uint8_t *) &_prefs.cr , sizeof (_prefs.cr )); // 61
653+ file.read ((uint8_t *) &_prefs.reserved1 , sizeof (_prefs.reserved1 )); // 62
654+ file.read ((uint8_t *) &_prefs.reserved2 , sizeof (_prefs.reserved2 )); // 63
655+ file.read ((uint8_t *) &_prefs.bw , sizeof (_prefs.bw )); // 64
656+ file.read ((uint8_t *) &_prefs.tx_power_dbm , sizeof (_prefs.tx_power_dbm )); // 68
657+ file.read ((uint8_t *) _prefs.unused , sizeof (_prefs.unused )); // 69
658+ file.read ((uint8_t *) &_prefs.rx_delay_base , sizeof (_prefs.rx_delay_base )); // 72
659+ file.read (pad, 4 ); // 76
660+ file.read ((uint8_t *) &_prefs.ble_pin , sizeof (_prefs.ble_pin )); // 80
661+
662+ // sanitise bad pref values
663+ _prefs.rx_delay_base = constrain (_prefs.rx_delay_base , 0 , 20 .0f );
664+ _prefs.airtime_factor = constrain (_prefs.airtime_factor , 0 , 9 .0f );
665+ _prefs.freq = constrain (_prefs.freq , 400 .0f , 2500 .0f );
666+ _prefs.bw = constrain (_prefs.bw , 62 .5f , 500 .0f );
667+ _prefs.sf = constrain (_prefs.sf , 7 , 12 );
668+ _prefs.cr = constrain (_prefs.cr , 5 , 8 );
669+ _prefs.tx_power_dbm = constrain (_prefs.tx_power_dbm , 1 , MAX_LORA_TX_POWER);
670+
635671 file.close ();
636672 }
637673 }
@@ -650,6 +686,7 @@ class MyMesh : public BaseChatMesh {
650686 }
651687
652688 const char * getNodeName () { return _prefs.node_name ; }
689+ uint32_t getBLEPin () { return _prefs.ble_pin ; }
653690
654691 void startInterface (BaseSerialInterface& serial) {
655692 _serial = &serial;
@@ -664,7 +701,26 @@ class MyMesh : public BaseChatMesh {
664701 File file = _fs->open (" /node_prefs" , " w" , true );
665702#endif
666703 if (file) {
667- file.write ((const uint8_t *)&_prefs, sizeof (_prefs));
704+ uint8_t pad[8 ];
705+ memset (pad, 0 , sizeof (pad));
706+
707+ file.write ((uint8_t *) &_prefs.airtime_factor , sizeof (float )); // 0
708+ file.write ((uint8_t *) _prefs.node_name , sizeof (_prefs.node_name )); // 4
709+ file.write (pad, 4 ); // 36
710+ file.write ((uint8_t *) &_prefs.node_lat , sizeof (_prefs.node_lat )); // 40
711+ file.write ((uint8_t *) &_prefs.node_lon , sizeof (_prefs.node_lon )); // 48
712+ file.write ((uint8_t *) &_prefs.freq , sizeof (_prefs.freq )); // 56
713+ file.write ((uint8_t *) &_prefs.sf , sizeof (_prefs.sf )); // 60
714+ file.write ((uint8_t *) &_prefs.cr , sizeof (_prefs.cr )); // 61
715+ file.write ((uint8_t *) &_prefs.reserved1 , sizeof (_prefs.reserved1 )); // 62
716+ file.write ((uint8_t *) &_prefs.reserved2 , sizeof (_prefs.reserved2 )); // 63
717+ file.write ((uint8_t *) &_prefs.bw , sizeof (_prefs.bw )); // 64
718+ file.write ((uint8_t *) &_prefs.tx_power_dbm , sizeof (_prefs.tx_power_dbm )); // 68
719+ file.write ((uint8_t *) _prefs.unused , sizeof (_prefs.unused )); // 69
720+ file.write ((uint8_t *) &_prefs.rx_delay_base , sizeof (_prefs.rx_delay_base )); // 72
721+ file.write (pad, 4 ); // 76
722+ file.write ((uint8_t *) &_prefs.ble_pin , sizeof (_prefs.ble_pin )); // 80
723+
668724 file.close ();
669725 }
670726 }
@@ -1094,6 +1150,7 @@ class MyMesh : public BaseChatMesh {
10941150 }
10951151
10961152 #ifdef DISPLAY_CLASS
1153+ ui_task.setHasConnection (_serial->isConnected ());
10971154 ui_task.loop ();
10981155 #endif
10991156 }
@@ -1189,7 +1246,7 @@ void setup() {
11891246#ifdef BLE_PIN_CODE
11901247 char dev_name[32 +10 ];
11911248 sprintf (dev_name, " MeshCore-%s" , the_mesh.getNodeName ());
1192- serial_interface.begin (dev_name, BLE_PIN_CODE );
1249+ serial_interface.begin (dev_name, the_mesh. getBLEPin () );
11931250#else
11941251 pinMode (WB_IO2, OUTPUT);
11951252 serial_interface.begin (Serial);
@@ -1205,7 +1262,7 @@ void setup() {
12051262#elif defined(BLE_PIN_CODE)
12061263 char dev_name[32 +10 ];
12071264 sprintf (dev_name, " MeshCore-%s" , the_mesh.getNodeName ());
1208- serial_interface.begin (dev_name, BLE_PIN_CODE );
1265+ serial_interface.begin (dev_name, the_mesh. getBLEPin () );
12091266#else
12101267 serial_interface.begin (Serial);
12111268#endif
@@ -1215,7 +1272,7 @@ void setup() {
12151272#endif
12161273
12171274#ifdef DISPLAY_CLASS
1218- ui_task.begin (the_mesh.getNodeName (), FIRMWARE_BUILD_DATE);
1275+ ui_task.begin (the_mesh.getNodeName (), FIRMWARE_BUILD_DATE, the_mesh. getBLEPin () );
12191276#endif
12201277}
12211278
0 commit comments