|
|
|
@ -187,6 +187,7 @@ struct NodePrefs { // persisted to file |
|
|
|
uint8_t tx_power_dbm; |
|
|
|
uint8_t unused[3]; |
|
|
|
float rx_delay_base; |
|
|
|
uint32_t ble_pin; |
|
|
|
}; |
|
|
|
|
|
|
|
class MyMesh : public BaseChatMesh { |
|
|
|
@ -219,6 +220,11 @@ class MyMesh : public BaseChatMesh { |
|
|
|
if (!_identity_store->load("_main", self_id)) { |
|
|
|
self_id = mesh::LocalIdentity(&trng); // create new random identity
|
|
|
|
saveMainIdentity(self_id); |
|
|
|
|
|
|
|
#if defined(BLE_PIN_CODE) && defined(DISPLAY_CLASS) |
|
|
|
// start with randomly assigned BLE pin
|
|
|
|
_prefs.ble_pin = trng.nextInt(100000, 999999); |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -611,6 +617,9 @@ public: |
|
|
|
_prefs.bw = LORA_BW; |
|
|
|
_prefs.cr = LORA_CR; |
|
|
|
_prefs.tx_power_dbm = LORA_TX_POWER; |
|
|
|
#ifdef BLE_PIN_CODE |
|
|
|
_prefs.ble_pin = BLE_PIN_CODE; |
|
|
|
#endif |
|
|
|
//_prefs.rx_delay_base = 10.0f; enable once new algo fixed
|
|
|
|
} |
|
|
|
|
|
|
|
@ -631,7 +640,34 @@ public: |
|
|
|
if (_fs->exists("/node_prefs")) { |
|
|
|
File file = _fs->open("/node_prefs"); |
|
|
|
if (file) { |
|
|
|
file.read((uint8_t *) &_prefs, sizeof(_prefs)); |
|
|
|
uint8_t pad[8]; |
|
|
|
|
|
|
|
file.read((uint8_t *) &_prefs.airtime_factor, sizeof(float)); // 0
|
|
|
|
file.read((uint8_t *) _prefs.node_name, sizeof(_prefs.node_name)); // 4
|
|
|
|
file.read(pad, 4); // 36
|
|
|
|
file.read((uint8_t *) &_prefs.node_lat, sizeof(_prefs.node_lat)); // 40
|
|
|
|
file.read((uint8_t *) &_prefs.node_lon, sizeof(_prefs.node_lon)); // 48
|
|
|
|
file.read((uint8_t *) &_prefs.freq, sizeof(_prefs.freq)); // 56
|
|
|
|
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.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
|
|
|
|
file.read((uint8_t *) &_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72
|
|
|
|
file.read(pad, 4); // 76
|
|
|
|
file.read((uint8_t *) &_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
|
|
|
|
|
|
|
|
// sanitise bad pref values
|
|
|
|
_prefs.rx_delay_base = constrain(_prefs.rx_delay_base, 0, 20.0f); |
|
|
|
_prefs.airtime_factor = constrain(_prefs.airtime_factor, 0, 9.0f); |
|
|
|
_prefs.freq = constrain(_prefs.freq, 400.0f, 2500.0f); |
|
|
|
_prefs.bw = constrain(_prefs.bw, 62.5f, 500.0f); |
|
|
|
_prefs.sf = constrain(_prefs.sf, 7, 12); |
|
|
|
_prefs.cr = constrain(_prefs.cr, 5, 8); |
|
|
|
_prefs.tx_power_dbm = constrain(_prefs.tx_power_dbm, 1, MAX_LORA_TX_POWER); |
|
|
|
|
|
|
|
file.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -650,6 +686,7 @@ public: |
|
|
|
} |
|
|
|
|
|
|
|
const char* getNodeName() { return _prefs.node_name; } |
|
|
|
uint32_t getBLEPin() { return _prefs.ble_pin; } |
|
|
|
|
|
|
|
void startInterface(BaseSerialInterface& serial) { |
|
|
|
_serial = &serial; |
|
|
|
@ -664,7 +701,26 @@ public: |
|
|
|
File file = _fs->open("/node_prefs", "w", true); |
|
|
|
#endif |
|
|
|
if (file) { |
|
|
|
file.write((const uint8_t *)&_prefs, sizeof(_prefs)); |
|
|
|
uint8_t pad[8]; |
|
|
|
memset(pad, 0, sizeof(pad)); |
|
|
|
|
|
|
|
file.write((uint8_t *) &_prefs.airtime_factor, sizeof(float)); // 0
|
|
|
|
file.write((uint8_t *) _prefs.node_name, sizeof(_prefs.node_name)); // 4
|
|
|
|
file.write(pad, 4); // 36
|
|
|
|
file.write((uint8_t *) &_prefs.node_lat, sizeof(_prefs.node_lat)); // 40
|
|
|
|
file.write((uint8_t *) &_prefs.node_lon, sizeof(_prefs.node_lon)); // 48
|
|
|
|
file.write((uint8_t *) &_prefs.freq, sizeof(_prefs.freq)); // 56
|
|
|
|
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.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
|
|
|
|
file.write((uint8_t *) &_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72
|
|
|
|
file.write(pad, 4); // 76
|
|
|
|
file.write((uint8_t *) &_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80
|
|
|
|
|
|
|
|
file.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1094,6 +1150,7 @@ public: |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef DISPLAY_CLASS |
|
|
|
ui_task.setHasConnection(_serial->isConnected()); |
|
|
|
ui_task.loop(); |
|
|
|
#endif |
|
|
|
} |
|
|
|
@ -1189,7 +1246,7 @@ void setup() { |
|
|
|
#ifdef BLE_PIN_CODE |
|
|
|
char dev_name[32+10]; |
|
|
|
sprintf(dev_name, "MeshCore-%s", the_mesh.getNodeName()); |
|
|
|
serial_interface.begin(dev_name, BLE_PIN_CODE); |
|
|
|
serial_interface.begin(dev_name, the_mesh.getBLEPin()); |
|
|
|
#else |
|
|
|
pinMode(WB_IO2, OUTPUT); |
|
|
|
serial_interface.begin(Serial); |
|
|
|
@ -1205,7 +1262,7 @@ void setup() { |
|
|
|
#elif defined(BLE_PIN_CODE) |
|
|
|
char dev_name[32+10]; |
|
|
|
sprintf(dev_name, "MeshCore-%s", the_mesh.getNodeName()); |
|
|
|
serial_interface.begin(dev_name, BLE_PIN_CODE); |
|
|
|
serial_interface.begin(dev_name, the_mesh.getBLEPin()); |
|
|
|
#else |
|
|
|
serial_interface.begin(Serial); |
|
|
|
#endif |
|
|
|
@ -1215,7 +1272,7 @@ void setup() { |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef DISPLAY_CLASS |
|
|
|
ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE); |
|
|
|
ui_task.begin(the_mesh.getNodeName(), FIRMWARE_BUILD_DATE, the_mesh.getBLEPin()); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|