From 8c225a3c653f94de9e22986d8c1e9d52c4284add Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Fri, 12 Feb 2021 13:48:12 +0800 Subject: [PATCH 1/7] disable lora while updating, show "Updating" on oled screen --- proto | 2 +- src/commands.h | 1 + src/esp32/BluetoothSoftwareUpdate.cpp | 5 ++- src/graphics/Screen.cpp | 29 ++++++++++++++++ src/graphics/Screen.h | 9 +++++ src/mesh/MeshTypes.h | 1 + src/mesh/RadioInterface.h | 5 +++ src/mesh/RadioLibInterface.cpp | 49 ++++++++++++++++----------- 8 files changed, 79 insertions(+), 22 deletions(-) diff --git a/proto b/proto index b1aed0644..0cadaed39 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit b1aed06442025624841b2288fac273d9bc41c438 +Subproject commit 0cadaed3953f66cf1edc99d0fa53e4fd5ebf56d6 diff --git a/src/commands.h b/src/commands.h index c9d519dee..803ea2b55 100644 --- a/src/commands.h +++ b/src/commands.h @@ -9,6 +9,7 @@ enum class Cmd { SET_OFF, ON_PRESS, START_BLUETOOTH_PIN_SCREEN, + START_FIRMWARE_UPDATE_SCREEN, STOP_BLUETOOTH_PIN_SCREEN, STOP_BOOT_SCREEN, PRINT, diff --git a/src/esp32/BluetoothSoftwareUpdate.cpp b/src/esp32/BluetoothSoftwareUpdate.cpp index 03e156b0b..33707c57a 100644 --- a/src/esp32/BluetoothSoftwareUpdate.cpp +++ b/src/esp32/BluetoothSoftwareUpdate.cpp @@ -7,6 +7,8 @@ #include "configuration.h" #include "nimble/BluetoothUtil.h" #include "NodeDB.h" +#include "../graphics/Screen.h" +#include "../main.h" #include #include @@ -47,8 +49,9 @@ int update_size_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_ // void stopMeshBluetoothService(); // stopMeshBluetoothService(); + screen->startFirmwareUpdateScreen(); if (RadioLibInterface::instance) - RadioLibInterface::instance->sleep(); // FIXME, nasty hack - the RF95 ISR/SPI code on ESP32 can fail while we are + RadioLibInterface::instance->disable(); // FIXME, nasty hack - the RF95 ISR/SPI code on ESP32 can fail while we are // writing flash - shut the radio off during updates } } diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 853cdc29c..40ea25237 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -164,6 +164,20 @@ static void drawFrameBluetooth(OLEDDisplay *display, OLEDDisplayUiState *state, display->drawString(64 + x, 48 + y, buf); } +static void drawFrameFirmware(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) +{ + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(FONT_MEDIUM); + display->drawString(64 + x, y, "Updating"); + + display->setFont(FONT_SMALL); + display->drawString(64 + x, FONT_HEIGHT_SMALL + y + 2, "Please wait..."); + + //display->setFont(FONT_LARGE); + //display->drawString(64 + x, 26 + y, btPIN); +} + + /// Draw the last text message we received static void drawCriticalFaultFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { @@ -798,6 +812,9 @@ int32_t Screen::runOnce() case Cmd::START_BLUETOOTH_PIN_SCREEN: handleStartBluetoothPinScreen(cmd.bluetooth_pin); break; + case Cmd::START_FIRMWARE_UPDATE_SCREEN: + handleStartFirmwareUpdateScreen(); + break; case Cmd::STOP_BLUETOOTH_PIN_SCREEN: case Cmd::STOP_BOOT_SCREEN: setFrames(); @@ -928,6 +945,18 @@ void Screen::handleStartBluetoothPinScreen(uint32_t pin) setFastFramerate(); } +void Screen::handleStartFirmwareUpdateScreen() +{ + DEBUG_MSG("showing firmware screen\n"); + showingNormalScreen = false; + + static FrameCallback btFrames[] = {drawFrameFirmware}; + + ui.disableAllIndicators(); + ui.setFrames(btFrames, 1); + setFastFramerate(); +} + void Screen::blink() { setFastFramerate(); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 888f31011..041da4865 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -128,6 +128,14 @@ class Screen : public concurrency::OSThread enqueueCmd(cmd); } + void startFirmwareUpdateScreen() + { + ScreenCmd cmd; + cmd.cmd = Cmd::START_FIRMWARE_UPDATE_SCREEN; + enqueueCmd(cmd); + } + + /// Stops showing the bluetooth PIN screen. void stopBluetoothPinScreen() { enqueueCmd(ScreenCmd{.cmd = Cmd::STOP_BLUETOOTH_PIN_SCREEN}); } @@ -233,6 +241,7 @@ class Screen : public concurrency::OSThread void handleOnPress(); void handleStartBluetoothPinScreen(uint32_t pin); void handlePrint(const char *text); + void handleStartFirmwareUpdateScreen(); /// Rebuilds our list of frames (screens) to default ones. void setFrames(); diff --git a/src/mesh/MeshTypes.h b/src/mesh/MeshTypes.h index 8fd098f43..69e782b12 100644 --- a/src/mesh/MeshTypes.h +++ b/src/mesh/MeshTypes.h @@ -13,6 +13,7 @@ typedef uint32_t PacketId; // A packet sequence number #define ERRNO_OK 0 #define ERRNO_NO_INTERFACES 33 #define ERRNO_UNKNOWN 32 // pick something that doesn't conflict with RH_ROUTER_ERROR_UNABLE_TO_DELIVER +#define ERRNO_DISABLED 34 // the itnerface is disabled /** * the max number of hops a message can pass through, used as the default max for hop_limit in MeshPacket. diff --git a/src/mesh/RadioInterface.h b/src/mesh/RadioInterface.h index c49421d11..e1e23ba29 100644 --- a/src/mesh/RadioInterface.h +++ b/src/mesh/RadioInterface.h @@ -54,6 +54,8 @@ class RadioInterface uint32_t shortPacketMsec; protected: + bool disabled = false; + float bw = 125; uint8_t sf = 9; uint8_t cr = 7; @@ -98,6 +100,9 @@ class RadioInterface /// Prepare hardware for sleep. Call this _only_ for deep sleep, not needed for light sleep. virtual bool sleep() { return true; } + /// Disable this interface (while disabled, no packets can be sent or received) + void disable() { disabled = true; sleep(); } + /** * Send a packet (possibly by enquing in a private fifo). This routine will * later free() the packet to pool. This routine is not allowed to stall. diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index 84fd37ee6..63d7095c5 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -2,8 +2,8 @@ #include "MeshTypes.h" #include "NodeDB.h" #include "SPILock.h" -#include "mesh-pb-constants.h" #include "error.h" +#include "mesh-pb-constants.h" #include #include #include @@ -68,13 +68,12 @@ bool RadioLibInterface::canSendImmediately() bool busyTx = sendingPacket != NULL; bool busyRx = isReceiving && isActivelyReceiving(); - if (busyTx || busyRx) { if (busyTx) DEBUG_MSG("Can not send yet, busyTx\n"); // If we've been trying to send the same packet more than one minute and we haven't gotten a // TX IRQ from the radio, the radio is probably broken. - if (busyTx && (millis() - lastTxStart > 60000)){ + if (busyTx && (millis() - lastTxStart > 60000)) { DEBUG_MSG("Hardware Failure! busyTx for more than 60s\n"); recordCriticalError(CriticalErrorCode_TransmitFailed); #ifndef NO_ESP32 @@ -94,6 +93,11 @@ bool RadioLibInterface::canSendImmediately() /// bluetooth comms code. If the txmit queue is empty it might return an error ErrorCode RadioLibInterface::send(MeshPacket *p) { + if (disabled) { + packetPool.release(p); + return ERRNO_DISABLED; + } + // Sometimes when testing it is useful to be able to never turn on the xmitter #ifndef LORA_DISABLE_SENDING printPacket("enqueuing for send", p); @@ -110,7 +114,7 @@ ErrorCode RadioLibInterface::send(MeshPacket *p) // Count the packet toward our TX airtime utilization. // We only count it if it can be added to the TX queue. airTime->logAirtime(TX_LOG, xmitMsec); - //airTime.logAirtime(TX_LOG, xmitMsec); + // airTime.logAirtime(TX_LOG, xmitMsec); // We want all sending/receiving to be done by our daemon thread, We use a delay here because this packet might have been sent // in response to a packet we just received. So we want to make sure the other side has had a chance to reconfigure its radio @@ -119,7 +123,7 @@ ErrorCode RadioLibInterface::send(MeshPacket *p) return res; #else packetPool.release(p); - return ERRNO_UNKNOWN; + return ERRNO_DISABLED; #endif } @@ -133,17 +137,17 @@ bool RadioLibInterface::canSleep() } /** Attempt to cancel a previously sent packet. Returns true if a packet was found we could cancel */ -bool RadioLibInterface::cancelSending(NodeNum from, PacketId id) { +bool RadioLibInterface::cancelSending(NodeNum from, PacketId id) +{ auto p = txQueue.remove(from, id); - if(p) + if (p) packetPool.release(p); // free the packet we just removed bool result = (p != NULL); - DEBUG_MSG("cancelSending id=0x%x, removed=%d", id, result); + DEBUG_MSG("cancelSending id=0x%x, removed=%d\n", id, result); return result; } - /** radio helper thread callback. We never immediately transmit after any operation (either rx or tx). Instead we should start receiving and @@ -242,7 +246,7 @@ void RadioLibInterface::handleReceiveInterrupt() xmitMsec = getPacketTime(length); airTime->logAirtime(RX_ALL_LOG, xmitMsec); - //airTime.logAirtime(RX_ALL_LOG, xmitMsec); + // airTime.logAirtime(RX_ALL_LOG, xmitMsec); int state = iface->readData(radiobuf, length); if (state != ERR_NONE) { @@ -277,7 +281,7 @@ void RadioLibInterface::handleReceiveInterrupt() addReceiveMetadata(mp); mp->which_payloadVariant = MeshPacket_encrypted_tag; // Mark that the payload is still encrypted at this point - assert(((uint32_t) payloadLen) <= sizeof(mp->encrypted.bytes)); + assert(((uint32_t)payloadLen) <= sizeof(mp->encrypted.bytes)); memcpy(mp->encrypted.bytes, payload, payloadLen); mp->encrypted.size = payloadLen; @@ -285,7 +289,7 @@ void RadioLibInterface::handleReceiveInterrupt() xmitMsec = getPacketTime(mp); airTime->logAirtime(RX_LOG, xmitMsec); - //airTime.logAirtime(RX_LOG, xmitMsec); + // airTime.logAirtime(RX_LOG, xmitMsec); deliverToReceiver(mp); } @@ -295,16 +299,21 @@ void RadioLibInterface::handleReceiveInterrupt() /** start an immediate transmit */ void RadioLibInterface::startSend(MeshPacket *txp) { - printPacket("Starting low level send", txp); - setStandby(); // Cancel any already in process receives + printPacket("Starting low level send", txp); + if (disabled) { + DEBUG_MSG("startSend is dropping tx packet because we are disabled\n"); + packetPool.release(txp); + } else { + setStandby(); // Cancel any already in process receives - configHardwareForSend(); // must be after setStandby + configHardwareForSend(); // must be after setStandby - size_t numbytes = beginSending(txp); + size_t numbytes = beginSending(txp); - int res = iface->startTransmit(radiobuf, numbytes); - assert(res == ERR_NONE); + int res = iface->startTransmit(radiobuf, numbytes); + assert(res == ERR_NONE); - // Must be done AFTER, starting transmit, because startTransmit clears (possibly stale) interrupt pending register bits - enableInterrupt(isrTxLevel0); + // Must be done AFTER, starting transmit, because startTransmit clears (possibly stale) interrupt pending register bits + enableInterrupt(isrTxLevel0); + } } From 52ec4d511cc37d5ce9456ba324ece4c2c672e159 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 14 Feb 2021 11:37:32 +0800 Subject: [PATCH 2/7] oops - we weren't properly stripping timestamps from new style positions --- src/mesh/MeshService.cpp | 14 +------------- src/plugins/PositionPlugin.cpp | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index f3a3bd1aa..59e9fb25f 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -178,18 +178,6 @@ void MeshService::sendToMesh(MeshPacket *p) { nodeDB.updateFrom(*p); // update our local DB for this packet (because phone might have sent position packets etc...) - // Strip out any time information before sending packets to other nodes - to keep the wire size small (and because other - // nodes shouldn't trust it anyways) Note: we allow a device with a local GPS to include the time, so that gpsless - // devices can get time. - if (p->which_payloadVariant == MeshPacket_decoded_tag && p->decoded.which_payloadVariant == SubPacket_position_tag && - p->decoded.position.time) { - if (getRTCQuality() < RTCQualityGPS) { - DEBUG_MSG("Stripping time %u from position send\n", p->decoded.position.time); - p->decoded.position.time = 0; - } else - DEBUG_MSG("Providing time to mesh %u\n", p->decoded.position.time); - } - // Note: We might return !OK if our fifo was full, at that point the only option we have is to drop it router->sendLocal(p); } @@ -221,7 +209,7 @@ NodeInfo *MeshService::refreshMyNodeInfo() { Position &position = node->position; // Update our local node info with our position (even if we don't decide to update anyone else) - position.time = getValidTime(RTCQualityGPS); // This nodedb timestamp might be stale, so update it if our clock is valid. + position.time = getValidTime(RTCQualityFromNet); // This nodedb timestamp might be stale, so update it if our clock is kinda valid position.battery_level = powerStatus->getBatteryChargePercent(); updateBatteryLevel(position.battery_level); diff --git a/src/plugins/PositionPlugin.cpp b/src/plugins/PositionPlugin.cpp index 4ea7298e6..4a0fdb4d8 100644 --- a/src/plugins/PositionPlugin.cpp +++ b/src/plugins/PositionPlugin.cpp @@ -31,14 +31,25 @@ MeshPacket *PositionPlugin::allocReply() { NodeInfo *node = service.refreshMyNodeInfo(); // should guarantee there is now a position assert(node->has_position); - - return allocDataProtobuf(node->position); + + Position p = node->position; + + // Strip out any time information before sending packets to other nodes - to keep the wire size small (and because other + // nodes shouldn't trust it anyways) Note: we allow a device with a local GPS to include the time, so that gpsless + // devices can get time. + if (getRTCQuality() < RTCQualityGPS) { + DEBUG_MSG("Stripping time %u from position send\n", p.time); + p.time = 0; + } else + DEBUG_MSG("Providing time to mesh %u\n", p.time); + + return allocDataProtobuf(p); } void PositionPlugin::sendOurPosition(NodeNum dest, bool wantReplies) { // cancel any not yet sent (now stale) position packets - if(prevPacketId) // if we wrap around to zero, we'll simply fail to cancel in that rare case (no big deal) + if (prevPacketId) // if we wrap around to zero, we'll simply fail to cancel in that rare case (no big deal) service.cancelSending(prevPacketId); MeshPacket *p = allocReply(); @@ -49,4 +60,3 @@ void PositionPlugin::sendOurPosition(NodeNum dest, bool wantReplies) service.sendToMesh(p); } - From a872231f8a25ddb7b834dab399fbfb6dab3f6a5b Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 14 Feb 2021 11:57:48 +0800 Subject: [PATCH 3/7] clean up position broadcasts, send them even if we don't have gps lock --- src/mesh/MeshService.cpp | 17 ----------------- src/plugins/PositionPlugin.cpp | 19 +++++++++++++++++++ src/plugins/PositionPlugin.h | 14 ++++++++++++-- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index 59e9fb25f..a6eaff5cf 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -247,22 +247,5 @@ int MeshService::onGPSChanged(const meshtastic::GPSStatus *unused) // Update our current position in the local DB nodeDB.updatePosition(nodeDB.getNodeNum(), pos); - // We limit our GPS broadcasts to a max rate - static uint32_t lastGpsSend; - uint32_t now = millis(); - if (lastGpsSend == 0 || now - lastGpsSend > getPref_position_broadcast_secs() * 1000) { - lastGpsSend = now; - - static uint32_t currentGeneration; - - // If we changed channels, ask everyone else for their latest info - bool requestReplies = currentGeneration != radioGeneration; - currentGeneration = radioGeneration; - - DEBUG_MSG("Sending position to mesh (wantReplies=%d)\n", requestReplies); - assert(positionPlugin); - positionPlugin->sendOurPosition(NODENUM_BROADCAST, requestReplies); - } - return 0; } diff --git a/src/plugins/PositionPlugin.cpp b/src/plugins/PositionPlugin.cpp index 4a0fdb4d8..09dbdd502 100644 --- a/src/plugins/PositionPlugin.cpp +++ b/src/plugins/PositionPlugin.cpp @@ -60,3 +60,22 @@ void PositionPlugin::sendOurPosition(NodeNum dest, bool wantReplies) service.sendToMesh(p); } + + +int32_t PositionPlugin::runOnce(){ + + // We limit our GPS broadcasts to a max rate + uint32_t now = millis(); + if (lastGpsSend == 0 || now - lastGpsSend >= getPref_position_broadcast_secs() * 1000) { + lastGpsSend = now; + + // If we changed channels, ask everyone else for their latest info + bool requestReplies = currentGeneration != radioGeneration; + currentGeneration = radioGeneration; + + DEBUG_MSG("Sending position to mesh (wantReplies=%d)\n", requestReplies); + sendOurPosition(NODENUM_BROADCAST, requestReplies); + } + + return 5000; // to save power only wake for our callback occasionally +} \ No newline at end of file diff --git a/src/plugins/PositionPlugin.h b/src/plugins/PositionPlugin.h index 9ca2d2082..580a22999 100644 --- a/src/plugins/PositionPlugin.h +++ b/src/plugins/PositionPlugin.h @@ -1,19 +1,26 @@ #pragma once #include "ProtobufPlugin.h" +#include "concurrency/OSThread.h" /** * Position plugin for sending/receiving positions into the mesh */ -class PositionPlugin : public ProtobufPlugin +class PositionPlugin : public ProtobufPlugin, private concurrency::OSThread { /// The id of the last packet we sent, to allow us to cancel it if we make something fresher PacketId prevPacketId = 0; + /// We limit our GPS broadcasts to a max rate + uint32_t lastGpsSend = 0; + + /// We force a rebroadcast if the radio settings change + uint32_t currentGeneration = 0; + public: /** Constructor * name is for debugging output */ - PositionPlugin() : ProtobufPlugin("position", PortNum_POSITION_APP, Position_fields) {} + PositionPlugin() : ProtobufPlugin("position", PortNum_POSITION_APP, Position_fields), concurrency::OSThread("PositionPlugin") {} /** * Send our position into the mesh @@ -31,6 +38,9 @@ class PositionPlugin : public ProtobufPlugin /** Messages can be received that have the want_response bit set. If set, this callback will be invoked * so that subclasses can (optionally) send a response back to the original sender. */ virtual MeshPacket *allocReply(); + + /** Does our periodic broadcast */ + virtual int32_t runOnce(); }; extern PositionPlugin *positionPlugin; \ No newline at end of file From 66a7e8eab98c4b3dfe6ed84d25c0e2224d34cde9 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 14 Feb 2021 12:02:24 +0800 Subject: [PATCH 4/7] oops - we were never sending 'fixed' gps positions to other nodes --- src/mesh/MeshService.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index a6eaff5cf..a1a6f885f 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -232,7 +232,7 @@ int MeshService::onGPSChanged(const meshtastic::GPSStatus *unused) else { // The GPS has lost lock, if we are fixed position we should just keep using // the old position - if(!radioConfig.preferences.fixed_position) { + if(radioConfig.preferences.fixed_position) { DEBUG_MSG("WARNING: Using fixed position\n"); } else { // throw away old position @@ -242,7 +242,7 @@ int MeshService::onGPSChanged(const meshtastic::GPSStatus *unused) } } - DEBUG_MSG("got gps notify time=%u, lat=%d, bat=%d\n", pos.latitude_i, pos.time, pos.battery_level); + DEBUG_MSG("got gps notify time=%u, lat=%d, bat=%d\n", pos.time, pos.latitude_i, pos.battery_level); // Update our current position in the local DB nodeDB.updatePosition(nodeDB.getNodeNum(), pos); From 71c35304d64c731ee6ca63b6256128bf4600b3be Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 14 Feb 2021 12:26:51 +0800 Subject: [PATCH 5/7] delay position plugin start until 60 secs after first boot --- src/plugins/PositionPlugin.cpp | 12 ++++++++++-- src/plugins/PositionPlugin.h | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/plugins/PositionPlugin.cpp b/src/plugins/PositionPlugin.cpp index 09dbdd502..153d20cfc 100644 --- a/src/plugins/PositionPlugin.cpp +++ b/src/plugins/PositionPlugin.cpp @@ -7,6 +7,14 @@ PositionPlugin *positionPlugin; +PositionPlugin::PositionPlugin() + : ProtobufPlugin("position", PortNum_POSITION_APP, Position_fields), concurrency::OSThread("PositionPlugin") +{ + setIntervalFromNow(60 * + 1000); // Send our initial position 60 seconds after we start (to give GPS time to setup) + +} + bool PositionPlugin::handleReceivedProtobuf(const MeshPacket &mp, const Position &p) { // FIXME - we currently update position data in the DB only if the message was a broadcast or destined to us @@ -61,8 +69,8 @@ void PositionPlugin::sendOurPosition(NodeNum dest, bool wantReplies) service.sendToMesh(p); } - -int32_t PositionPlugin::runOnce(){ +int32_t PositionPlugin::runOnce() +{ // We limit our GPS broadcasts to a max rate uint32_t now = millis(); diff --git a/src/plugins/PositionPlugin.h b/src/plugins/PositionPlugin.h index 580a22999..7a45c23a0 100644 --- a/src/plugins/PositionPlugin.h +++ b/src/plugins/PositionPlugin.h @@ -20,8 +20,8 @@ class PositionPlugin : public ProtobufPlugin, private concurrency::OST /** Constructor * name is for debugging output */ - PositionPlugin() : ProtobufPlugin("position", PortNum_POSITION_APP, Position_fields), concurrency::OSThread("PositionPlugin") {} - + PositionPlugin(); + /** * Send our position into the mesh */ From e35f13798624e7def920ee12d8b7350c0c3ee6bd Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 14 Feb 2021 12:27:10 +0800 Subject: [PATCH 6/7] clean up nodeinfo broadcasts and move into plugin --- src/mesh/MeshService.cpp | 18 ------------------ src/plugins/NodeInfoPlugin.cpp | 25 ++++++++++++++++++++++++- src/plugins/NodeInfoPlugin.h | 12 ++++++++---- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index a1a6f885f..ae53e802f 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -51,22 +51,7 @@ MeshService service; #include "Router.h" -static int32_t sendOwnerCb() -{ - static uint32_t currentGeneration; - // If we changed channels, ask everyone else for their latest info - bool requestReplies = currentGeneration != radioGeneration; - currentGeneration = radioGeneration; - - DEBUG_MSG("Sending our nodeinfo to mesh (wantReplies=%d)\n", requestReplies); - assert(nodeInfoPlugin); - nodeInfoPlugin->sendOurNodeInfo(NODENUM_BROADCAST, requestReplies); // Send our info (don't request replies) - - return getPref_send_owner_interval() * getPref_position_broadcast_secs() * 1000; -} - -static concurrency::Periodic *sendOwnerPeriod; MeshService::MeshService() : toPhoneQueue(MAX_RX_TOPHONE) { @@ -75,9 +60,6 @@ MeshService::MeshService() : toPhoneQueue(MAX_RX_TOPHONE) void MeshService::init() { - sendOwnerPeriod = new concurrency::Periodic("SendOwner", sendOwnerCb); - sendOwnerPeriod->setIntervalFromNow(30 * 1000); // Send our initial owner announcement 30 seconds after we start (to give network time to setup) - // moved much earlier in boot (called from setup()) // nodeDB.init(); diff --git a/src/plugins/NodeInfoPlugin.cpp b/src/plugins/NodeInfoPlugin.cpp index 6c236ed34..a04ec4159 100644 --- a/src/plugins/NodeInfoPlugin.cpp +++ b/src/plugins/NodeInfoPlugin.cpp @@ -29,7 +29,7 @@ bool NodeInfoPlugin::handleReceivedProtobuf(const MeshPacket &mp, const User &p) void NodeInfoPlugin::sendOurNodeInfo(NodeNum dest, bool wantReplies) { // cancel any not yet sent (now stale) position packets - if(prevPacketId) // if we wrap around to zero, we'll simply fail to cancel in that rare case (no big deal) + if (prevPacketId) // if we wrap around to zero, we'll simply fail to cancel in that rare case (no big deal) service.cancelSending(prevPacketId); MeshPacket *p = allocReply(); @@ -48,3 +48,26 @@ MeshPacket *NodeInfoPlugin::allocReply() DEBUG_MSG("sending owner %s/%s/%s\n", u.id, u.long_name, u.short_name); return allocDataProtobuf(u); } + +NodeInfoPlugin::NodeInfoPlugin() + : ProtobufPlugin("nodeinfo", PortNum_NODEINFO_APP, User_fields), concurrency::OSThread("NodeInfoPlugin") +{ + setIntervalFromNow(30 * + 1000); // Send our initial owner announcement 30 seconds after we start (to give network time to setup) +} + +int32_t NodeInfoPlugin::runOnce() +{ + static uint32_t currentGeneration; + + // If we changed channels, ask everyone else for their latest info + bool requestReplies = currentGeneration != radioGeneration; + currentGeneration = radioGeneration; + + DEBUG_MSG("Sending our nodeinfo to mesh (wantReplies=%d)\n", requestReplies); + assert(nodeInfoPlugin); + nodeInfoPlugin->sendOurNodeInfo(NODENUM_BROADCAST, requestReplies); // Send our info (don't request replies) + + return getPref_position_broadcast_secs() * 1000; +} + diff --git a/src/plugins/NodeInfoPlugin.h b/src/plugins/NodeInfoPlugin.h index 8b01ea25e..f0a7efebd 100644 --- a/src/plugins/NodeInfoPlugin.h +++ b/src/plugins/NodeInfoPlugin.h @@ -4,17 +4,18 @@ /** * NodeInfo plugin for sending/receiving NodeInfos into the mesh */ -class NodeInfoPlugin : public ProtobufPlugin +class NodeInfoPlugin : public ProtobufPlugin, private concurrency::OSThread { /// The id of the last packet we sent, to allow us to cancel it if we make something fresher PacketId prevPacketId = 0; - + + uint32_t currentGeneration = 0; public: /** Constructor * name is for debugging output */ - NodeInfoPlugin() : ProtobufPlugin("nodeinfo", PortNum_NODEINFO_APP, User_fields) {} - + NodeInfoPlugin(); + /** * Send our NodeInfo into the mesh */ @@ -30,6 +31,9 @@ class NodeInfoPlugin : public ProtobufPlugin /** Messages can be received that have the want_response bit set. If set, this callback will be invoked * so that subclasses can (optionally) send a response back to the original sender. */ virtual MeshPacket *allocReply(); + + /** Does our periodic broadcast */ + virtual int32_t runOnce(); }; extern NodeInfoPlugin *nodeInfoPlugin; \ No newline at end of file From 51ccc3aa9e85f5c76d957519ef6f9f1aead45443 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 14 Feb 2021 12:28:27 +0800 Subject: [PATCH 7/7] 1.1.47 --- version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.properties b/version.properties index 98083da23..30f4b34dd 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 1 minor = 1 -build = 46 +build = 47