From 171c1df3fa0297418d8be983938a888a223fd102 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 28 Jan 2023 14:32:57 -0600 Subject: [PATCH] Role based defaults --- src/mesh/NodeDB.cpp | 20 ++++++++++++++++++-- src/mesh/NodeDB.h | 2 ++ src/modules/AdminModule.cpp | 8 +++----- src/modules/PositionModule.cpp | 6 ++++-- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index cfb815d1e..5e49301ea 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -225,6 +225,24 @@ void NodeDB::installDefaultModuleConfig() initModuleConfigIntervals(); } +void NodeDB::installRoleDefaults(meshtastic_Config_DeviceConfig_Role role) +{ + if (role == meshtastic_Config_DeviceConfig_Role_ROUTER) { + initConfigIntervals(); + initModuleConfigIntervals(); + } else if (role == meshtastic_Config_DeviceConfig_Role_REPEATER) { + config.display.screen_on_secs = 1; + meshtastic_Channel &ch = channels.getByIndex(channels.getPrimaryIndex()); + meshtastic_ChannelSettings &channelSettings = ch.settings; + uint8_t defaultpskIndex = 1; + channelSettings.psk.bytes[0] = defaultpskIndex; + channelSettings.psk.size = 1; + } else if (role == meshtastic_Config_DeviceConfig_Role_TRACKER) { + config.position.position_broadcast_smart_enabled = false; + config.position.position_broadcast_secs = 120; + } +} + void NodeDB::initModuleConfigIntervals() { moduleConfig.telemetry.device_update_interval = default_broadcast_interval_secs; @@ -609,13 +627,11 @@ void NodeDB::updatePosition(uint32_t nodeId, const meshtastic_Position &p, RxSou LOG_INFO("updatePosition LOCAL pos@%x, time=%u, latI=%d, lonI=%d, alt=%d\n", p.timestamp, p.time, p.latitude_i, p.longitude_i, p.altitude); info->position = p; - } else if ((p.time > 0) && !p.latitude_i && !p.longitude_i && !p.timestamp && !p.location_source) { // FIXME SPECIAL TIME SETTING PACKET FROM EUD TO RADIO // (stop-gap fix for issue #900) LOG_DEBUG("updatePosition SPECIAL time setting time=%u\n", p.time); info->position.time = p.time; - } else { // Be careful to only update fields that have been set by the REMOTE sender // A lot of position reports don't have time populated. In that case, be careful to not blow away the time we diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index c169a85cd..106d35402 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -129,6 +129,8 @@ class NodeDB bool loadProto(const char *filename, size_t protoSize, size_t objSize, const pb_msgdesc_t *fields, void *dest_struct); bool saveProto(const char *filename, size_t protoSize, const pb_msgdesc_t *fields, const void *dest_struct); + void installRoleDefaults(meshtastic_Config_DeviceConfig_Role role); + private: /// Find a node in our DB, create an empty NodeInfo if missing meshtastic_NodeInfo *getOrCreateNode(NodeNum n); diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index b67751bf2..18557f0b3 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -225,7 +225,7 @@ void AdminModule::handleSetOwner(const meshtastic_User &o) void AdminModule::handleSetConfig(const meshtastic_Config &c) { - bool isRouter = (config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER); + auto existingRole = config.device.role; bool isRegionUnset = (config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_UNSET); switch (c.which_payload_variant) { @@ -234,10 +234,8 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c) config.has_device = true; config.device = c.payload_variant.device; // If we're setting router role for the first time, install its intervals - if (!isRouter && c.payload_variant.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER) { - nodeDB.initConfigIntervals(); - nodeDB.initModuleConfigIntervals(); - } + if (existingRole != c.payload_variant.device.role) + nodeDB.installRoleDefaults(c.payload_variant.device.role); break; case meshtastic_Config_position_tag: LOG_INFO("Setting config: Position\n"); diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp index ee3ba493f..d923dad8a 100644 --- a/src/modules/PositionModule.cpp +++ b/src/modules/PositionModule.cpp @@ -129,7 +129,10 @@ void PositionModule::sendOurPosition(NodeNum dest, bool wantReplies) meshtastic_MeshPacket *p = allocReply(); p->to = dest; p->decoded.want_response = wantReplies; - p->priority = meshtastic_MeshPacket_Priority_BACKGROUND; + if (config.device.role == meshtastic_Config_DeviceConfig_Role_TRACKER) + p->priority = meshtastic_MeshPacket_Priority_RELIABLE; + else + p->priority = meshtastic_MeshPacket_Priority_BACKGROUND; prevPacketId = p->id; service.sendToMesh(p, RX_SRC_LOCAL, true); @@ -161,7 +164,6 @@ int32_t PositionModule::runOnce() sendOurPosition(NODENUM_BROADCAST, requestReplies); } } - } else if (config.position.position_broadcast_smart_enabled) { // Only send packets if the channel is less than 25% utilized.