diff --git a/src/MeshRadio.cpp b/src/MeshRadio.cpp index 31f229ab..c7cdcb42 100644 --- a/src/MeshRadio.cpp +++ b/src/MeshRadio.cpp @@ -10,10 +10,6 @@ #include #include -/// 16 bytes of random PSK for our _public_ default channel that all devices power up on -static const uint8_t defaultpsk[] = {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, - 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0xbf}; - /** * ## LoRaWAN for North America @@ -32,14 +28,6 @@ MeshRadio::MeshRadio(MemoryPool &_pool, PointerQueue &_r { myNodeInfo.num_channels = NUM_CHANNELS; - // radioConfig.modem_config = RadioConfig_ModemConfig_Bw125Cr45Sf128; // medium range and fast - // channelSettings.modem_config = ChannelSettings_ModemConfig_Bw500Cr45Sf128; // short range and fast, but wide bandwidth so - // incompatible radios can talk together - channelSettings.modem_config = ChannelSettings_ModemConfig_Bw125Cr48Sf4096; // slow and long range - - channelSettings.tx_power = 23; - memcpy(&channelSettings.psk, &defaultpsk, sizeof(channelSettings.psk)); - strcpy(channelSettings.name, "Default"); // Can't print strings this early - serial not setup yet // DEBUG_MSG("Set meshradio defaults name=%s\n", channelSettings.name); } @@ -122,7 +110,7 @@ void MeshRadio::reloadConfig() // FIXME - can we do this? It seems to be in the Heltec board. rf95.setTxPower(channelSettings.tx_power, false); - DEBUG_MSG("Set radio: name=%s. config=%u, ch=%d, txpower=%d\n", channelSettings.name, channelSettings.modem_config, + DEBUG_MSG("Set radio: name=%s, config=%u, ch=%d, txpower=%d\n", channelSettings.name, channelSettings.modem_config, channel_num, channelSettings.tx_power); // Done with init tell radio to start receiving diff --git a/src/MeshService.cpp b/src/MeshService.cpp index bf170238..5ded40dd 100644 --- a/src/MeshService.cpp +++ b/src/MeshService.cpp @@ -217,6 +217,7 @@ void MeshService::loop() void MeshService::reloadConfig() { // If we can successfully set this radio to these settings, save them to disk + nodeDB.resetRadioConfig(); // Don't let the phone send us fatally bad settings radio.reloadConfig(); nodeDB.saveToDisk(); } diff --git a/src/NodeDB.cpp b/src/NodeDB.cpp index 638498db..7c3b194f 100644 --- a/src/NodeDB.cpp +++ b/src/NodeDB.cpp @@ -44,9 +44,37 @@ static uint8_t ourMacAddr[6]; NodeDB::NodeDB() : nodes(devicestate.node_db), numNodes(&devicestate.node_db_count) {} +void NodeDB::resetRadioConfig() +{ + /// 16 bytes of random PSK for our _public_ default channel that all devices power up on + static const uint8_t defaultpsk[] = {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, + 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0xbf}; + + if (radioConfig.preferences.sds_secs == 0) { + DEBUG_MSG("RadioConfig reset!\n"); + radioConfig.preferences.send_owner_interval = 4; // per sw-design.md + radioConfig.preferences.position_broadcast_secs = 15 * 60; + radioConfig.preferences.wait_bluetooth_secs = 120; + radioConfig.preferences.screen_on_secs = 30; + radioConfig.preferences.mesh_sds_timeout_secs = 2 * 60 * 60; + radioConfig.preferences.phone_sds_timeout_sec = 2 * 60 * 60; + radioConfig.preferences.sds_secs = 365 * 24 * 60 * 60; // one year + radioConfig.preferences.ls_secs = 60 * 60; + radioConfig.preferences.phone_timeout_secs = 15 * 60; + + // radioConfig.modem_config = RadioConfig_ModemConfig_Bw125Cr45Sf128; // medium range and fast + // channelSettings.modem_config = ChannelSettings_ModemConfig_Bw500Cr45Sf128; // short range and fast, but wide bandwidth + // so incompatible radios can talk together + channelSettings.modem_config = ChannelSettings_ModemConfig_Bw125Cr48Sf4096; // slow and long range + + channelSettings.tx_power = 23; + memcpy(&channelSettings.psk, &defaultpsk, sizeof(channelSettings.psk)); + strcpy(channelSettings.name, "Default"); + } +} + void NodeDB::init() { - // init our devicestate with valid flags so protobuf writing/reading will work devicestate.has_my_node = true; devicestate.has_radio = true; @@ -57,15 +85,7 @@ void NodeDB::init() devicestate.node_db_count = 0; devicestate.receive_queue_count = 0; - radioConfig.preferences.send_owner_interval = 4; // per sw-design.md - radioConfig.preferences.position_broadcast_secs = 15 * 60; - radioConfig.preferences.wait_bluetooth_secs = 120; - radioConfig.preferences.screen_on_secs = 30; - radioConfig.preferences.mesh_sds_timeout_secs = 2 * 60 * 60; - radioConfig.preferences.phone_sds_timeout_sec = 2 * 60 * 60; - radioConfig.preferences.sds_secs = 365 * 24 * 60 * 60; // one year - radioConfig.preferences.ls_secs = 60 * 60; - radioConfig.preferences.phone_timeout_secs = 15 * 60; + resetRadioConfig(); // default to no GPS, until one has been found by probing myNodeInfo.has_gps = false; @@ -102,6 +122,7 @@ void NodeDB::init() // saveToDisk(); loadFromDisk(); + resetRadioConfig(); // If bogus settings got saved, then fix them DEBUG_MSG("NODENUM=0x%x, dbsize=%d\n", myNodeInfo.my_node_num, *numNodes); } diff --git a/src/NodeDB.h b/src/NodeDB.h index 76b043e4..ddabeb23 100644 --- a/src/NodeDB.h +++ b/src/NodeDB.h @@ -43,6 +43,9 @@ class NodeDB /// write to flash void saveToDisk(); + // Reinit radio config if needed, because sometimes a buggy android app might send us bogus settings + void resetRadioConfig(); + /// given a subpacket sniffed from the network, update our DB state /// we updateGUI and updateGUIforNode if we think our this change is big enough for a redraw void updateFrom(const MeshPacket &p);