* companion: UITask now shows BLE PIN (when no connection)
* companion, HeltecV3: new installs, now chooses random BLE PIN * companion: prefs load/save improvements (sanitises bad values)
This commit is contained in:
@@ -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,
|
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;
|
_prevBtnState = HIGH;
|
||||||
_auto_off = millis() + AUTO_OFF_MILLIS;
|
_auto_off = millis() + AUTO_OFF_MILLIS;
|
||||||
clearMsgPreview();
|
clearMsgPreview();
|
||||||
_node_name = node_name;
|
_node_name = node_name;
|
||||||
_build_date = build_date;
|
_build_date = build_date;
|
||||||
|
_pin_code = pin_code;
|
||||||
_display->turnOn();
|
_display->turnOn();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,8 +74,16 @@ void UITask::renderCurrScreen() {
|
|||||||
sprintf(tmp, "Build: %s", _build_date);
|
sprintf(tmp, "Build: %s", _build_date);
|
||||||
_display->setCursor(0, 32);
|
_display->setCursor(0, 32);
|
||||||
_display->print(tmp);
|
_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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ class UITask {
|
|||||||
DisplayDriver* _display;
|
DisplayDriver* _display;
|
||||||
unsigned long _next_read, _next_refresh, _auto_off;
|
unsigned long _next_read, _next_refresh, _auto_off;
|
||||||
int _prevBtnState;
|
int _prevBtnState;
|
||||||
|
bool _connected;
|
||||||
|
uint32_t _pin_code;
|
||||||
const char* _node_name;
|
const char* _node_name;
|
||||||
const char* _build_date;
|
const char* _build_date;
|
||||||
char _origin[62];
|
char _origin[62];
|
||||||
@@ -13,9 +15,10 @@ class UITask {
|
|||||||
|
|
||||||
void renderCurrScreen();
|
void renderCurrScreen();
|
||||||
public:
|
public:
|
||||||
UITask(DisplayDriver& display) : _display(&display) { _next_read = _next_refresh = 0; }
|
UITask(DisplayDriver& display) : _display(&display) { _next_read = _next_refresh = 0; _connected = false; }
|
||||||
void begin(const char* node_name, const char* build_date);
|
void begin(const char* node_name, const char* build_date, uint32_t pin_code);
|
||||||
|
|
||||||
|
void setHasConnection(bool connected) { _connected = connected; }
|
||||||
void clearMsgPreview();
|
void clearMsgPreview();
|
||||||
void showMsgPreview(uint8_t path_len, const char* from_name, const char* text);
|
void showMsgPreview(uint8_t path_len, const char* from_name, const char* text);
|
||||||
void loop();
|
void loop();
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ struct NodePrefs { // persisted to file
|
|||||||
uint8_t tx_power_dbm;
|
uint8_t tx_power_dbm;
|
||||||
uint8_t unused[3];
|
uint8_t unused[3];
|
||||||
float rx_delay_base;
|
float rx_delay_base;
|
||||||
|
uint32_t ble_pin;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MyMesh : public BaseChatMesh {
|
class MyMesh : public BaseChatMesh {
|
||||||
@@ -219,6 +220,11 @@ class MyMesh : public BaseChatMesh {
|
|||||||
if (!_identity_store->load("_main", self_id)) {
|
if (!_identity_store->load("_main", self_id)) {
|
||||||
self_id = mesh::LocalIdentity(&trng); // create new random identity
|
self_id = mesh::LocalIdentity(&trng); // create new random identity
|
||||||
saveMainIdentity(self_id);
|
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.bw = LORA_BW;
|
||||||
_prefs.cr = LORA_CR;
|
_prefs.cr = LORA_CR;
|
||||||
_prefs.tx_power_dbm = LORA_TX_POWER;
|
_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
|
//_prefs.rx_delay_base = 10.0f; enable once new algo fixed
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -631,7 +640,34 @@ public:
|
|||||||
if (_fs->exists("/node_prefs")) {
|
if (_fs->exists("/node_prefs")) {
|
||||||
File file = _fs->open("/node_prefs");
|
File file = _fs->open("/node_prefs");
|
||||||
if (file) {
|
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();
|
file.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -650,6 +686,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
const char* getNodeName() { return _prefs.node_name; }
|
const char* getNodeName() { return _prefs.node_name; }
|
||||||
|
uint32_t getBLEPin() { return _prefs.ble_pin; }
|
||||||
|
|
||||||
void startInterface(BaseSerialInterface& serial) {
|
void startInterface(BaseSerialInterface& serial) {
|
||||||
_serial = &serial;
|
_serial = &serial;
|
||||||
@@ -664,7 +701,26 @@ public:
|
|||||||
File file = _fs->open("/node_prefs", "w", true);
|
File file = _fs->open("/node_prefs", "w", true);
|
||||||
#endif
|
#endif
|
||||||
if (file) {
|
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();
|
file.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1094,6 +1150,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DISPLAY_CLASS
|
#ifdef DISPLAY_CLASS
|
||||||
|
ui_task.setHasConnection(_serial->isConnected());
|
||||||
ui_task.loop();
|
ui_task.loop();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -1189,7 +1246,7 @@ void setup() {
|
|||||||
#ifdef BLE_PIN_CODE
|
#ifdef BLE_PIN_CODE
|
||||||
char dev_name[32+10];
|
char dev_name[32+10];
|
||||||
sprintf(dev_name, "MeshCore-%s", the_mesh.getNodeName());
|
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
|
#else
|
||||||
pinMode(WB_IO2, OUTPUT);
|
pinMode(WB_IO2, OUTPUT);
|
||||||
serial_interface.begin(Serial);
|
serial_interface.begin(Serial);
|
||||||
@@ -1205,7 +1262,7 @@ void setup() {
|
|||||||
#elif defined(BLE_PIN_CODE)
|
#elif defined(BLE_PIN_CODE)
|
||||||
char dev_name[32+10];
|
char dev_name[32+10];
|
||||||
sprintf(dev_name, "MeshCore-%s", the_mesh.getNodeName());
|
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
|
#else
|
||||||
serial_interface.begin(Serial);
|
serial_interface.begin(Serial);
|
||||||
#endif
|
#endif
|
||||||
@@ -1215,7 +1272,7 @@ void setup() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_CLASS
|
#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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user