diff --git a/examples/companion_radio/UITask.cpp b/examples/companion_radio/UITask.cpp index b30c34b1..f003aa52 100644 --- a/examples/companion_radio/UITask.cpp +++ b/examples/companion_radio/UITask.cpp @@ -21,12 +21,13 @@ static const uint8_t meshcore_logo [] PROGMEM = { 0xe3, 0xe3, 0x8f, 0xff, 0x1f, 0xfc, 0x3c, 0x0e, 0x1f, 0xf8, 0xff, 0xf8, 0x70, 0x3c, 0x7f, 0xf8, }; -void UITask::begin(const char* node_name, const char* build_date) { +void UITask::begin(const char* node_name, const char* build_date, uint32_t pin_code) { _prevBtnState = HIGH; _auto_off = millis() + AUTO_OFF_MILLIS; clearMsgPreview(); _node_name = node_name; _build_date = build_date; + _pin_code = pin_code; _display->turnOn(); } @@ -73,8 +74,16 @@ void UITask::renderCurrScreen() { sprintf(tmp, "Build: %s", _build_date); _display->setCursor(0, 32); _display->print(tmp); - //_display->printf("freq : %03.2f sf %d\n", _prefs.freq, _prefs.sf); - //_display->printf("bw : %03.2f cr %d\n", _prefs.bw, _prefs.cr); + + if (_connected) { + //_display->printf("freq : %03.2f sf %d\n", _prefs.freq, _prefs.sf); + //_display->printf("bw : %03.2f cr %d\n", _prefs.bw, _prefs.cr); + } else { + _display->setTextSize(2); + _display->setCursor(0, 43); + sprintf(tmp, "Pin:%d", _pin_code); + _display->print(tmp); + } } } diff --git a/examples/companion_radio/UITask.h b/examples/companion_radio/UITask.h index 89c58763..f1a63225 100644 --- a/examples/companion_radio/UITask.h +++ b/examples/companion_radio/UITask.h @@ -6,6 +6,8 @@ class UITask { DisplayDriver* _display; unsigned long _next_read, _next_refresh, _auto_off; int _prevBtnState; + bool _connected; + uint32_t _pin_code; const char* _node_name; const char* _build_date; char _origin[62]; @@ -13,9 +15,10 @@ class UITask { void renderCurrScreen(); public: - UITask(DisplayDriver& display) : _display(&display) { _next_read = _next_refresh = 0; } - void begin(const char* node_name, const char* build_date); + UITask(DisplayDriver& display) : _display(&display) { _next_read = _next_refresh = 0; _connected = false; } + void begin(const char* node_name, const char* build_date, uint32_t pin_code); + void setHasConnection(bool connected) { _connected = connected; } void clearMsgPreview(); void showMsgPreview(uint8_t path_len, const char* from_name, const char* text); void loop(); diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 69f3df4e..1f528439 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -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 }