Skip to content

Commit bdb3fb1

Browse files
ford-jonesthebentern
authored andcommitted
Persist favourites on NodeDB reset (#8292)
* Conditionally delete favourited nodes on reset * trunk fmt * Fix equality check, use existing macro for role validation * Extend favourite persistence setting to devices of all roles * Refactor: Decoupled role/config check and set role defaults appropriately * Use American-English spelling * Use existing reference * Convert reset to bool, regen protos * Add optional arg to nodedb_reset in favor of additional device setting * Use correct proto commit ID * Regen protos * Log preservation status * Pull latest from master
1 parent 7eca061 commit bdb3fb1

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

src/mesh/NodeDB.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -978,12 +978,25 @@ void NodeDB::installDefaultChannels()
978978
channelFile.version = DEVICESTATE_CUR_VER;
979979
}
980980

981-
void NodeDB::resetNodes()
981+
void NodeDB::resetNodes(bool keepFavorites)
982982
{
983983
if (!config.position.fixed_position)
984984
clearLocalPosition();
985985
numMeshNodes = 1;
986-
std::fill(nodeDatabase.nodes.begin() + 1, nodeDatabase.nodes.end(), meshtastic_NodeInfoLite());
986+
if (keepFavorites) {
987+
LOG_INFO("Clearing node database - preserving favorites");
988+
for (size_t i = 0; i < meshNodes->size(); i++) {
989+
meshtastic_NodeInfoLite &node = meshNodes->at(i);
990+
if (i > 0 && !node.is_favorite) {
991+
node = meshtastic_NodeInfoLite();
992+
} else {
993+
numMeshNodes += 1;
994+
}
995+
};
996+
} else {
997+
LOG_INFO("Clearing node database - removing favorites");
998+
std::fill(nodeDatabase.nodes.begin() + 1, nodeDatabase.nodes.end(), meshtastic_NodeInfoLite());
999+
}
9871000
devicestate.has_rx_text_message = false;
9881001
devicestate.has_rx_waypoint = false;
9891002
saveNodeDatabaseToDisk();

src/mesh/NodeDB.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ class NodeDB
229229
*/
230230
size_t getNumOnlineMeshNodes(bool localOnly = false);
231231

232-
void initConfigIntervals(), initModuleConfigIntervals(), resetNodes(), removeNodeByNum(NodeNum nodeNum);
232+
void initConfigIntervals(), initModuleConfigIntervals(), resetNodes(bool keepFavorites = false),
233+
removeNodeByNum(NodeNum nodeNum);
233234

234235
bool factoryReset(bool eraseBleBonds = false);
235236

src/modules/AdminModule.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,12 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
289289
case meshtastic_AdminMessage_nodedb_reset_tag: {
290290
disableBluetooth();
291291
LOG_INFO("Initiate node-db reset");
292-
nodeDB->resetNodes();
292+
// CLIENT_BASE, ROUTER and ROUTER_LATE are able to preserve the remaining hop count when relaying a packet via a
293+
// favorited node, so ensure that their favorites are kept on reset
294+
bool rolePreference =
295+
isOneOf(config.device.role, meshtastic_Config_DeviceConfig_Role_CLIENT_BASE,
296+
meshtastic_Config_DeviceConfig_Role_ROUTER, meshtastic_Config_DeviceConfig_Role_ROUTER_LATE);
297+
nodeDB->resetNodes(rolePreference ? rolePreference : r->nodedb_reset);
293298
reboot(DEFAULT_REBOOT_SECONDS);
294299
break;
295300
}

0 commit comments

Comments
 (0)