From 09b467ce7cb161f7f249f71e8c300c007ebe1927 Mon Sep 17 00:00:00 2001 From: Jm Casler Date: Fri, 3 Dec 2021 22:20:15 -0800 Subject: [PATCH] WIP for S&F. Next is to validate the stub outs work as expected. --- src/plugins/esp32/StoreForwardPlugin.cpp | 76 +++++++++++++++++------- src/plugins/esp32/StoreForwardPlugin.h | 6 ++ 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/src/plugins/esp32/StoreForwardPlugin.cpp b/src/plugins/esp32/StoreForwardPlugin.cpp index 06080cdbf..155afa244 100644 --- a/src/plugins/esp32/StoreForwardPlugin.cpp +++ b/src/plugins/esp32/StoreForwardPlugin.cpp @@ -68,8 +68,6 @@ void StoreForwardPlugin::populatePSRAM() https://learn.upesy.com/en/programmation/psram.html#psram-tab */ - uint32_t store_forward_plugin_replay_max_records = 250; - DEBUG_MSG("Before PSRAM initilization:\n"); DEBUG_MSG(" Total heap: %d\n", ESP.getHeapSize()); @@ -77,14 +75,17 @@ void StoreForwardPlugin::populatePSRAM() DEBUG_MSG(" Total PSRAM: %d\n", ESP.getPsramSize()); DEBUG_MSG(" Free PSRAM: %d\n", ESP.getFreePsram()); - // Use a maximum of 2/3 the available PSRAM unless otherwise specified. + this->packetHistoryTXQueue = + static_cast(ps_calloc(this->historyReturnMax, sizeof(PacketHistoryStruct))); + + /* Use a maximum of 2/3 the available PSRAM unless otherwise specified. + Note: This needs to be done after every thing that would use PSRAM + */ uint32_t numberOfPackets = - (radioConfig.preferences.store_forward_plugin_records ? radioConfig.preferences.store_forward_plugin_records - : (((ESP.getFreePsram() / 3) * 2) / sizeof(PacketHistoryStruct))); + (this->records ? this->records : (((ESP.getFreePsram() / 3) * 2) / sizeof(PacketHistoryStruct))); this->packetHistory = static_cast(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct))); - this->packetHistoryTXQueue = - static_cast(ps_calloc(store_forward_plugin_replay_max_records, sizeof(PacketHistoryStruct))); + DEBUG_MSG("After PSRAM initilization:\n"); DEBUG_MSG(" Total heap: %d\n", ESP.getHeapSize()); @@ -107,7 +108,7 @@ void StoreForwardPlugin::historyReport() void StoreForwardPlugin::historySend(uint32_t msAgo, uint32_t to) { - uint32_t packetsSent = 0; + //uint32_t packetsSent = 0; uint32_t queueSize = storeForwardPlugin->historyQueueCreate(msAgo, to); @@ -229,12 +230,6 @@ ProcessMessage StoreForwardPlugin::handleReceived(const MeshPacket &mp) DEBUG_MSG("--- S&F Received something\n"); - /* - StoreAndForwardMessage sfm = StoreAndForwardMessage_init_default; - - switch (sfm.rr) { - } -*/ auto &p = mp.decoded; // The router node should not be sending messages as a client. @@ -287,49 +282,66 @@ ProcessMessage StoreForwardPlugin::handleReceivedProtobuf(const MeshPacket &mp, return ProcessMessage::CONTINUE; } - //auto sfp = *p; - //auto p = *p; + if (mp.decoded.portnum == PortNum_TEXT_MESSAGE_APP) { + DEBUG_MSG("Packet came from an PortNum_TEXT_MESSAGE_APP port %u\n", mp.decoded.portnum); + return ProcessMessage::CONTINUE; + } else if (mp.decoded.portnum == PortNum_STORE_FORWARD_APP) { + DEBUG_MSG("Packet came from an PortNum_STORE_FORWARD_APP port %u\n", mp.decoded.portnum); + + } else { + DEBUG_MSG("Packet came from an UNKNOWN port %u\n", mp.decoded.portnum); + return ProcessMessage::CONTINUE; + } - // Advance states as needed switch (p->rr) { case StoreAndForward_RequestResponse_CLIENT_ERROR: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_CLIENT_ERROR\n"); break; case StoreAndForward_RequestResponse_CLIENT_HISTORY: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_CLIENT_HISTORY\n"); break; case StoreAndForward_RequestResponse_CLIENT_PING: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_CLIENT_PING\n"); break; case StoreAndForward_RequestResponse_CLIENT_PONG: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_CLIENT_PONG\n"); break; case StoreAndForward_RequestResponse_CLIENT_STATS: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_CLIENT_STATS\n"); break; case StoreAndForward_RequestResponse_ROUTER_BUSY: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_ROUTER_BUSY\n"); break; case StoreAndForward_RequestResponse_ROUTER_ERROR: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_ROUTER_ERROR\n"); break; case StoreAndForward_RequestResponse_ROUTER_HEARTBEAT: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_ROUTER_HEARTBEAT\n"); break; case StoreAndForward_RequestResponse_ROUTER_PING: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_ROUTER_PING\n"); break; case StoreAndForward_RequestResponse_ROUTER_PONG: // Do nothing + DEBUG_MSG("StoreAndForward_RequestResponse_ROUTER_PONG\n"); break; @@ -337,7 +349,7 @@ ProcessMessage StoreForwardPlugin::handleReceivedProtobuf(const MeshPacket &mp, assert(0); // unexpected state - FIXME, make an error code and reboot } - return ProcessMessage::CONTINUE; // Let others look at this message also if they want + return ProcessMessage::STOP; // There's no need for others to look at this message. } StoreForwardPlugin::StoreForwardPlugin() @@ -354,9 +366,9 @@ StoreForwardPlugin::StoreForwardPlugin() without having to configure it from the PythonAPI or WebUI. */ - // radioConfig.preferences.store_forward_plugin_enabled = 1; - // radioConfig.preferences.is_router = 1; - // radioConfig.preferences.is_always_powered = 1; + //radioConfig.preferences.store_forward_plugin_enabled = 1; + //radioConfig.preferences.is_router = 1; + //radioConfig.preferences.is_always_powered = 1; } if (radioConfig.preferences.store_forward_plugin_enabled) { @@ -369,9 +381,31 @@ StoreForwardPlugin::StoreForwardPlugin() // Do the startup here + // Maximum number of records to return. + if (radioConfig.preferences.store_forward_plugin_history_return_max) + this->historyReturnMax = radioConfig.preferences.store_forward_plugin_history_return_max; + + // Maximum time window for records to return (in minutes) + if (radioConfig.preferences.store_forward_plugin_history_return_window) + this->historyReturnWindow = radioConfig.preferences.store_forward_plugin_history_return_window; + + // Maximum number of records to store in memory + if (radioConfig.preferences.store_forward_plugin_records) + this->records = radioConfig.preferences.store_forward_plugin_records; + + // Maximum number of records to store in memory + if (radioConfig.preferences.store_forward_plugin_heartbeat) + this->heartbeat = radioConfig.preferences.store_forward_plugin_heartbeat; + // Popupate PSRAM with our data structures. this->populatePSRAM(); + // Calculate the packet time. + // this->packetTimeMax = RadioLibInterface::instance->getPacketTime(Constants_DATA_PAYLOAD_LEN); + // RadioLibInterface::instance->getPacketTime(Constants_DATA_PAYLOAD_LEN); + // RadioLibInterface::instance->getPacketTime(Constants_DATA_PAYLOAD_LEN); + // RadioInterface::getPacketTime(500)l + this->packetTimeMax = 2000; } else { diff --git a/src/plugins/esp32/StoreForwardPlugin.h b/src/plugins/esp32/StoreForwardPlugin.h index 05526e783..1f164171f 100644 --- a/src/plugins/esp32/StoreForwardPlugin.h +++ b/src/plugins/esp32/StoreForwardPlugin.h @@ -62,6 +62,12 @@ class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThrea private: void populatePSRAM(); + // S&F Defaults + uint32_t historyReturnMax = 250; // 250 records + uint32_t historyReturnWindow = 240; // 4 hours + uint32_t records = 0; // Calculated + bool heartbeat = false; // No heartbeat. + protected: virtual int32_t runOnce();