@@ -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
18101void CommonCLI::checkAdvertInterval () {
0 commit comments