@@ -32,32 +32,34 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
3232 if (file) {
3333 uint8_t pad[8 ];
3434
35- file.read ((uint8_t *) &_prefs->airtime_factor , sizeof (_prefs->airtime_factor )); // 0
36- file.read ((uint8_t *) &_prefs->node_name , sizeof (_prefs->node_name )); // 4
37- file.read (pad, 4 ); // 36
38- file.read ((uint8_t *) &_prefs->node_lat , sizeof (_prefs->node_lat )); // 40
39- file.read ((uint8_t *) &_prefs->node_lon , sizeof (_prefs->node_lon )); // 48
40- file.read ((uint8_t *) &_prefs->password [0 ], sizeof (_prefs->password )); // 56
41- file.read ((uint8_t *) &_prefs->freq , sizeof (_prefs->freq )); // 72
42- file.read ((uint8_t *) &_prefs->tx_power_dbm , sizeof (_prefs->tx_power_dbm )); // 76
43- file.read ((uint8_t *) &_prefs->disable_fwd , sizeof (_prefs->disable_fwd )); // 77
44- file.read ((uint8_t *) &_prefs->advert_interval , sizeof (_prefs->advert_interval )); // 78
45- file.read ((uint8_t *) pad, 1 ); // 79 was 'unused'
46- file.read ((uint8_t *) &_prefs->rx_delay_base , sizeof (_prefs->rx_delay_base )); // 80
47- file.read ((uint8_t *) &_prefs->tx_delay_factor , sizeof (_prefs->tx_delay_factor )); // 84
48- file.read ((uint8_t *) &_prefs->guest_password [0 ], sizeof (_prefs->guest_password )); // 88
49- file.read ((uint8_t *) &_prefs->direct_tx_delay_factor , sizeof (_prefs->direct_tx_delay_factor )); // 104
50- file.read (pad, 4 ); // 108
51- file.read ((uint8_t *) &_prefs->sf , sizeof (_prefs->sf )); // 112
52- file.read ((uint8_t *) &_prefs->cr , sizeof (_prefs->cr )); // 113
53- file.read ((uint8_t *) &_prefs->allow_read_only , sizeof (_prefs->allow_read_only )); // 114
54- file.read ((uint8_t *) &_prefs->multi_acks , sizeof (_prefs->multi_acks )); // 115
55- file.read ((uint8_t *) &_prefs->bw , sizeof (_prefs->bw )); // 116
56- file.read ((uint8_t *) &_prefs->agc_reset_interval , sizeof (_prefs->agc_reset_interval )); // 120
57- file.read (pad, 3 ); // 121
58- file.read ((uint8_t *) &_prefs->flood_max , sizeof (_prefs->flood_max )); // 124
59- file.read ((uint8_t *) &_prefs->flood_advert_interval , sizeof (_prefs->flood_advert_interval )); // 125
60- file.read ((uint8_t *) &_prefs->interference_threshold , sizeof (_prefs->interference_threshold )); // 126
35+ file.read ((uint8_t *)&_prefs->airtime_factor , sizeof (_prefs->airtime_factor )); // 0
36+ file.read ((uint8_t *)&_prefs->node_name , sizeof (_prefs->node_name )); // 4
37+ file.read (pad, 4 ); // 36
38+ file.read ((uint8_t *)&_prefs->node_lat , sizeof (_prefs->node_lat )); // 40
39+ file.read ((uint8_t *)&_prefs->node_lon , sizeof (_prefs->node_lon )); // 48
40+ file.read ((uint8_t *)&_prefs->password [0 ], sizeof (_prefs->password )); // 56
41+ file.read ((uint8_t *)&_prefs->freq , sizeof (_prefs->freq )); // 72
42+ file.read ((uint8_t *)&_prefs->tx_power_dbm , sizeof (_prefs->tx_power_dbm )); // 76
43+ file.read ((uint8_t *)&_prefs->disable_fwd , sizeof (_prefs->disable_fwd )); // 77
44+ file.read ((uint8_t *)&_prefs->advert_interval , sizeof (_prefs->advert_interval )); // 78
45+ file.read ((uint8_t *)pad, 1 ); // 79 was 'unused'
46+ file.read ((uint8_t *)&_prefs->rx_delay_base , sizeof (_prefs->rx_delay_base )); // 80
47+ file.read ((uint8_t *)&_prefs->tx_delay_factor , sizeof (_prefs->tx_delay_factor )); // 84
48+ file.read ((uint8_t *)&_prefs->guest_password [0 ], sizeof (_prefs->guest_password )); // 88
49+ file.read ((uint8_t *)&_prefs->direct_tx_delay_factor , sizeof (_prefs->direct_tx_delay_factor )); // 104
50+ file.read (pad, 4 ); // 108
51+ file.read ((uint8_t *)&_prefs->sf , sizeof (_prefs->sf )); // 112
52+ file.read ((uint8_t *)&_prefs->cr , sizeof (_prefs->cr )); // 113
53+ file.read ((uint8_t *)&_prefs->allow_read_only , sizeof (_prefs->allow_read_only )); // 114
54+ file.read ((uint8_t *)&_prefs->multi_acks , sizeof (_prefs->multi_acks )); // 115
55+ file.read ((uint8_t *)&_prefs->bw , sizeof (_prefs->bw )); // 116
56+ file.read ((uint8_t *)&_prefs->agc_reset_interval , sizeof (_prefs->agc_reset_interval )); // 120
57+ file.read (pad, 3 ); // 121
58+ file.read ((uint8_t *)&_prefs->flood_max , sizeof (_prefs->flood_max )); // 124
59+ file.read ((uint8_t *)&_prefs->flood_advert_interval , sizeof (_prefs->flood_advert_interval )); // 125
60+ file.read ((uint8_t *)&_prefs->interference_threshold , sizeof (_prefs->interference_threshold )); // 126
61+ file.read ((uint8_t *)&_prefs->bridge_enabled , sizeof (_prefs->bridge_enabled )); // 127
62+ file.read ((uint8_t *)&_prefs->bridge_channel , sizeof (_prefs->bridge_channel )); // 128
6163
6264 // sanitise bad pref values
6365 _prefs->rx_delay_base = constrain (_prefs->rx_delay_base , 0 , 20 .0f );
@@ -70,6 +72,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
7072 _prefs->cr = constrain (_prefs->cr , 5 , 8 );
7173 _prefs->tx_power_dbm = constrain (_prefs->tx_power_dbm , 1 , 30 );
7274 _prefs->multi_acks = constrain (_prefs->multi_acks , 0 , 1 );
75+ _prefs->bridge_enabled = constrain (_prefs->bridge_enabled , 0 , 1 );
76+ _prefs->bridge_channel = constrain (_prefs->bridge_channel , 0 , 14 );
7377
7478 file.close ();
7579 }
@@ -88,32 +92,34 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
8892 uint8_t pad[8 ];
8993 memset (pad, 0 , sizeof (pad));
9094
91- file.write ((uint8_t *) &_prefs->airtime_factor , sizeof (_prefs->airtime_factor )); // 0
92- file.write ((uint8_t *) &_prefs->node_name , sizeof (_prefs->node_name )); // 4
93- file.write (pad, 4 ); // 36
94- file.write ((uint8_t *) &_prefs->node_lat , sizeof (_prefs->node_lat )); // 40
95- file.write ((uint8_t *) &_prefs->node_lon , sizeof (_prefs->node_lon )); // 48
96- file.write ((uint8_t *) &_prefs->password [0 ], sizeof (_prefs->password )); // 56
97- file.write ((uint8_t *) &_prefs->freq , sizeof (_prefs->freq )); // 72
98- file.write ((uint8_t *) &_prefs->tx_power_dbm , sizeof (_prefs->tx_power_dbm )); // 76
99- file.write ((uint8_t *) &_prefs->disable_fwd , sizeof (_prefs->disable_fwd )); // 77
100- file.write ((uint8_t *) &_prefs->advert_interval , sizeof (_prefs->advert_interval )); // 78
101- file.write ((uint8_t *) pad, 1 ); // 79 was 'unused'
102- file.write ((uint8_t *) &_prefs->rx_delay_base , sizeof (_prefs->rx_delay_base )); // 80
103- file.write ((uint8_t *) &_prefs->tx_delay_factor , sizeof (_prefs->tx_delay_factor )); // 84
104- file.write ((uint8_t *) &_prefs->guest_password [0 ], sizeof (_prefs->guest_password )); // 88
105- file.write ((uint8_t *) &_prefs->direct_tx_delay_factor , sizeof (_prefs->direct_tx_delay_factor )); // 104
106- file.write (pad, 4 ); // 108
107- file.write ((uint8_t *) &_prefs->sf , sizeof (_prefs->sf )); // 112
108- file.write ((uint8_t *) &_prefs->cr , sizeof (_prefs->cr )); // 113
109- file.write ((uint8_t *) &_prefs->allow_read_only , sizeof (_prefs->allow_read_only )); // 114
110- file.write ((uint8_t *) &_prefs->multi_acks , sizeof (_prefs->multi_acks )); // 115
111- file.write ((uint8_t *) &_prefs->bw , sizeof (_prefs->bw )); // 116
112- file.write ((uint8_t *) &_prefs->agc_reset_interval , sizeof (_prefs->agc_reset_interval )); // 120
113- file.write (pad, 3 ); // 121
114- file.write ((uint8_t *) &_prefs->flood_max , sizeof (_prefs->flood_max )); // 124
115- file.write ((uint8_t *) &_prefs->flood_advert_interval , sizeof (_prefs->flood_advert_interval )); // 125
116- file.write ((uint8_t *) &_prefs->interference_threshold , sizeof (_prefs->interference_threshold )); // 126
95+ file.write ((uint8_t *)&_prefs->airtime_factor , sizeof (_prefs->airtime_factor )); // 0
96+ file.write ((uint8_t *)&_prefs->node_name , sizeof (_prefs->node_name )); // 4
97+ file.write (pad, 4 ); // 36
98+ file.write ((uint8_t *)&_prefs->node_lat , sizeof (_prefs->node_lat )); // 40
99+ file.write ((uint8_t *)&_prefs->node_lon , sizeof (_prefs->node_lon )); // 48
100+ file.write ((uint8_t *)&_prefs->password [0 ], sizeof (_prefs->password )); // 56
101+ file.write ((uint8_t *)&_prefs->freq , sizeof (_prefs->freq )); // 72
102+ file.write ((uint8_t *)&_prefs->tx_power_dbm , sizeof (_prefs->tx_power_dbm )); // 76
103+ file.write ((uint8_t *)&_prefs->disable_fwd , sizeof (_prefs->disable_fwd )); // 77
104+ file.write ((uint8_t *)&_prefs->advert_interval , sizeof (_prefs->advert_interval )); // 78
105+ file.write ((uint8_t *)pad, 1 ); // 79 was 'unused'
106+ file.write ((uint8_t *)&_prefs->rx_delay_base , sizeof (_prefs->rx_delay_base )); // 80
107+ file.write ((uint8_t *)&_prefs->tx_delay_factor , sizeof (_prefs->tx_delay_factor )); // 84
108+ file.write ((uint8_t *)&_prefs->guest_password [0 ], sizeof (_prefs->guest_password )); // 88
109+ file.write ((uint8_t *)&_prefs->direct_tx_delay_factor , sizeof (_prefs->direct_tx_delay_factor )); // 104
110+ file.write (pad, 4 ); // 108
111+ file.write ((uint8_t *)&_prefs->sf , sizeof (_prefs->sf )); // 112
112+ file.write ((uint8_t *)&_prefs->cr , sizeof (_prefs->cr )); // 113
113+ file.write ((uint8_t *)&_prefs->allow_read_only , sizeof (_prefs->allow_read_only )); // 114
114+ file.write ((uint8_t *)&_prefs->multi_acks , sizeof (_prefs->multi_acks )); // 115
115+ file.write ((uint8_t *)&_prefs->bw , sizeof (_prefs->bw )); // 116
116+ file.write ((uint8_t *)&_prefs->agc_reset_interval , sizeof (_prefs->agc_reset_interval )); // 120
117+ file.write (pad, 3 ); // 121
118+ file.write ((uint8_t *)&_prefs->flood_max , sizeof (_prefs->flood_max )); // 124
119+ file.write ((uint8_t *)&_prefs->flood_advert_interval , sizeof (_prefs->flood_advert_interval )); // 125
120+ file.write ((uint8_t *)&_prefs->interference_threshold , sizeof (_prefs->interference_threshold )); // 126
121+ file.write ((uint8_t *)&_prefs->bridge_enabled , sizeof (_prefs->bridge_enabled )); // 127
122+ file.write ((uint8_t *)&_prefs->bridge_channel , sizeof (_prefs->bridge_channel )); // 128
117123
118124 file.close ();
119125 }
@@ -252,11 +258,41 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
252258 mesh::Utils::toHex (&reply[2 ], _callbacks->getSelfId ().pub_key , PUB_KEY_SIZE);
253259 } else if (memcmp (config, " role" , 4 ) == 0 ) {
254260 sprintf (reply, " > %s" , _callbacks->getRole ());
261+ #ifdef WITH_BRIDGE
262+ } else if (memcmp (config, " bridge.enabled" , 14 ) == 0 ) {
263+ sprintf (reply, " > %s" , _prefs->bridge_enabled ? " on" : " off" );
264+ #ifdef WITH_ESPNOW_BRIDGE
265+ } else if (memcmp (config, " bridge.channel" , 14 ) == 0 ) {
266+ sprintf (reply, " > %d" , (uint32_t )_prefs->bridge_channel );
267+ #endif
268+ #endif
255269 } else {
256270 sprintf (reply, " ??: %s" , config);
257271 }
258272 } else if (memcmp (command, " set " , 4 ) == 0 ) {
259273 const char * config = &command[4 ];
274+ #ifdef WITH_BRIDGE
275+ if (memcmp (config, " bridge.enabled " , 15 ) == 0 ) {
276+ _prefs->bridge_enabled = memcmp (&config[15 ], " on" , 2 ) == 0 ;
277+ _callbacks->setBridgeState (_prefs->bridge_enabled );
278+ savePrefs ();
279+ strcpy (reply, " OK" );
280+ }
281+ else
282+ #ifdef WITH_ESPNOW_BRIDGE
283+ if (memcmp (config, " bridge.channel " , 15 ) == 0 ) {
284+ int ch = atoi (&config[15 ]);
285+ if (ch > 0 && ch < 15 ) {
286+ _prefs->bridge_channel = (uint8_t )ch;
287+ _callbacks->updateBridgeChannel (ch);
288+ savePrefs ();
289+ strcpy (reply, " OK" );
290+ } else {
291+ strcpy (reply, " Error: channel must be 0 (AUTO) or 1-14" );
292+ }
293+ } else
294+ #endif
295+ #endif
260296 if (memcmp (config, " af " , 3 ) == 0 ) {
261297 _prefs->airtime_factor = atof (&config[3 ]);
262298 savePrefs ();
@@ -301,7 +337,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
301337 StrHelper::strncpy (_prefs->guest_password , &config[15 ], sizeof (_prefs->guest_password ));
302338 savePrefs ();
303339 strcpy (reply, " OK" );
304- } else if (sender_timestamp == 0 && memcmp (config, " prv.key " , 8 ) == 0 ) { // from serial command line only
340+ } else if (sender_timestamp == 0 &&
341+ memcmp (config, " prv.key " , 8 ) == 0 ) { // from serial command line only
305342 uint8_t prv_key[PRV_KEY_SIZE];
306343 bool success = mesh::Utils::fromHex (prv_key, PRV_KEY_SIZE, &config[8 ]);
307344 if (success) {
0 commit comments