Skip to content

Commit 01d84d5

Browse files
author
Scott Powell
committed
* repeater and room server: CommonCLI now handles load/save of Prefs. Now sanitise bad prefs values.
1 parent 8668136 commit 01d84d5

File tree

4 files changed

+90
-34
lines changed

4 files changed

+90
-34
lines changed

examples/simple_repeater/main.cpp

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -519,13 +519,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
519519
mesh::Mesh::begin();
520520
_fs = fs;
521521
// load persisted prefs
522-
if (_fs->exists("/node_prefs")) {
523-
File file = _fs->open("/node_prefs");
524-
if (file) {
525-
file.read((uint8_t *) &_prefs, sizeof(_prefs));
526-
file.close();
527-
}
528-
}
522+
_cli.loadPrefs(_fs);
529523

530524
_phy->setFrequency(_prefs.freq);
531525
_phy->setSpreadingFactor(_prefs.sf);
@@ -541,16 +535,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
541535
const char* getNodeName() { return _prefs.node_name; }
542536

543537
void savePrefs() override {
544-
#if defined(NRF52_PLATFORM)
545-
File file = _fs->open("/node_prefs", FILE_O_WRITE);
546-
if (file) { file.seek(0); file.truncate(); }
547-
#else
548-
File file = _fs->open("/node_prefs", "w", true);
549-
#endif
550-
if (file) {
551-
file.write((const uint8_t *)&_prefs, sizeof(_prefs));
552-
file.close();
553-
}
538+
_cli.savePrefs(_fs);
554539
}
555540

556541
bool formatFileSystem() override {

examples/simple_room_server/main.cpp

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -560,13 +560,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
560560
mesh::Mesh::begin();
561561
_fs = fs;
562562
// load persisted prefs
563-
if (_fs->exists("/node_prefs")) {
564-
File file = _fs->open("/node_prefs");
565-
if (file) {
566-
file.read((uint8_t *) &_prefs, sizeof(_prefs));
567-
file.close();
568-
}
569-
}
563+
_cli.loadPrefs(_fs);
570564

571565
_phy->setFrequency(_prefs.freq);
572566
_phy->setSpreadingFactor(_prefs.sf);
@@ -582,16 +576,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks {
582576
const char* getNodeName() { return _prefs.node_name; }
583577

584578
void savePrefs() override {
585-
#if defined(NRF52_PLATFORM)
586-
File file = _fs->open("/node_prefs", FILE_O_WRITE);
587-
if (file) { file.seek(0); file.truncate(); }
588-
#else
589-
File file = _fs->open("/node_prefs", "w", true);
590-
#endif
591-
if (file) {
592-
file.write((const uint8_t *)&_prefs, sizeof(_prefs));
593-
file.close();
594-
}
579+
_cli.savePrefs(_fs);
595580
}
596581

597582
bool formatFileSystem() override {

src/helpers/CommonCLI.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,89 @@ static uint32_t _atoi(const char* sp) {
1313
return n;
1414
}
1515

16+
void CommonCLI::loadPrefs(FILESYSTEM* fs) {
17+
if (fs->exists("/node_prefs")) {
18+
File file = fs->open("/node_prefs");
19+
if (file) {
20+
uint8_t pad[8];
21+
22+
file.read((uint8_t *) &_prefs->airtime_factor, sizeof(_prefs->airtime_factor)); // 0
23+
file.read((uint8_t *) &_prefs->node_name, sizeof(_prefs->node_name)); // 4
24+
file.read(pad, 4); // 36
25+
file.read((uint8_t *) &_prefs->node_lat, sizeof(_prefs->node_lat)); // 40
26+
file.read((uint8_t *) &_prefs->node_lon, sizeof(_prefs->node_lon)); // 48
27+
file.read((uint8_t *) &_prefs->password[0], sizeof(_prefs->password)); // 56
28+
file.read((uint8_t *) &_prefs->freq, sizeof(_prefs->freq)); // 72
29+
file.read((uint8_t *) &_prefs->tx_power_dbm, sizeof(_prefs->tx_power_dbm)); // 76
30+
file.read((uint8_t *) &_prefs->disable_fwd, sizeof(_prefs->disable_fwd)); // 77
31+
file.read((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78
32+
file.read((uint8_t *) &_prefs->unused, sizeof(_prefs->unused)); // 79
33+
file.read((uint8_t *) &_prefs->rx_delay_base, sizeof(_prefs->rx_delay_base)); // 80
34+
file.read((uint8_t *) &_prefs->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84
35+
file.read((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88
36+
file.read((uint8_t *) &_prefs->direct_tx_delay_factor, sizeof(_prefs->direct_tx_delay_factor)); // 104
37+
file.read(pad, 4); // 108
38+
file.read((uint8_t *) &_prefs->sf, sizeof(_prefs->sf)); // 112
39+
file.read((uint8_t *) &_prefs->cr, sizeof(_prefs->cr)); // 113
40+
file.read((uint8_t *) &_prefs->reserved1, sizeof(_prefs->reserved1)); // 114
41+
file.read((uint8_t *) &_prefs->reserved2, sizeof(_prefs->reserved2)); // 115
42+
file.read((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116
43+
file.read(pad, 4); // 120
44+
45+
// sanitise bad pref values
46+
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
47+
_prefs->tx_delay_factor = constrain(_prefs->tx_delay_factor, 0, 2.0f);
48+
_prefs->direct_tx_delay_factor = constrain(_prefs->direct_tx_delay_factor, 0, 2.0f);
49+
_prefs->airtime_factor = constrain(_prefs->airtime_factor, 0, 9.0f);
50+
_prefs->freq = constrain(_prefs->freq, 400.0f, 2500.0f);
51+
_prefs->bw = constrain(_prefs->bw, 62.5f, 500.0f);
52+
_prefs->sf = constrain(_prefs->sf, 7, 12);
53+
_prefs->cr = constrain(_prefs->cr, 5, 8);
54+
_prefs->tx_power_dbm = constrain(_prefs->tx_power_dbm, 1, 30);
55+
56+
file.close();
57+
}
58+
}
59+
}
60+
61+
void CommonCLI::savePrefs(FILESYSTEM* fs) {
62+
#if defined(NRF52_PLATFORM)
63+
File file = fs->open("/node_prefs", FILE_O_WRITE);
64+
if (file) { file.seek(0); file.truncate(); }
65+
#else
66+
File file = fs->open("/node_prefs", "w", true);
67+
#endif
68+
if (file) {
69+
uint8_t pad[8];
70+
memset(pad, 0, sizeof(pad));
71+
72+
file.write((uint8_t *) &_prefs->airtime_factor, sizeof(_prefs->airtime_factor)); // 0
73+
file.write((uint8_t *) &_prefs->node_name, sizeof(_prefs->node_name)); // 4
74+
file.write(pad, 4); // 36
75+
file.write((uint8_t *) &_prefs->node_lat, sizeof(_prefs->node_lat)); // 40
76+
file.write((uint8_t *) &_prefs->node_lon, sizeof(_prefs->node_lon)); // 48
77+
file.write((uint8_t *) &_prefs->password[0], sizeof(_prefs->password)); // 56
78+
file.write((uint8_t *) &_prefs->freq, sizeof(_prefs->freq)); // 72
79+
file.write((uint8_t *) &_prefs->tx_power_dbm, sizeof(_prefs->tx_power_dbm)); // 76
80+
file.write((uint8_t *) &_prefs->disable_fwd, sizeof(_prefs->disable_fwd)); // 77
81+
file.write((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78
82+
file.write((uint8_t *) &_prefs->unused, sizeof(_prefs->unused)); // 79
83+
file.write((uint8_t *) &_prefs->rx_delay_base, sizeof(_prefs->rx_delay_base)); // 80
84+
file.write((uint8_t *) &_prefs->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84
85+
file.write((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88
86+
file.write((uint8_t *) &_prefs->direct_tx_delay_factor, sizeof(_prefs->direct_tx_delay_factor)); // 104
87+
file.write(pad, 4); // 108
88+
file.write((uint8_t *) &_prefs->sf, sizeof(_prefs->sf)); // 112
89+
file.write((uint8_t *) &_prefs->cr, sizeof(_prefs->cr)); // 113
90+
file.write((uint8_t *) &_prefs->reserved1, sizeof(_prefs->reserved1)); // 114
91+
file.write((uint8_t *) &_prefs->reserved2, sizeof(_prefs->reserved2)); // 115
92+
file.write((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116
93+
file.write(pad, 4); // 120
94+
95+
file.close();
96+
}
97+
}
98+
1699
#define MIN_LOCAL_ADVERT_INTERVAL 60
17100

18101
void CommonCLI::checkAdvertInterval() {

src/helpers/CommonCLI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "Mesh.h"
4+
#include <helpers/IdentityStore.h>
45

56
struct NodePrefs { // persisted to file
67
float airtime_factor;
@@ -54,5 +55,7 @@ class CommonCLI {
5455
CommonCLI(mesh::MainBoard& board, mesh::Mesh* mesh, NodePrefs* prefs, CommonCLICallbacks* callbacks)
5556
: _board(&board), _mesh(mesh), _prefs(prefs), _callbacks(callbacks) { }
5657

58+
void loadPrefs(FILESYSTEM* _fs);
59+
void savePrefs(FILESYSTEM* _fs);
5760
void handleCommand(uint32_t sender_timestamp, const char* command, char* reply);
5861
};

0 commit comments

Comments
 (0)