Initial demonstrable build

1.2-legacy
Jm Casler 2021-11-20 21:21:11 -08:00
rodzic 32017e53f5
commit 5191fd6475
2 zmienionych plików z 47 dodań i 46 usunięć

Wyświetl plik

@ -9,16 +9,21 @@
#include <Arduino.h>
#include <map>
#define STOREFORWARD_MAX_PACKETS 0
//#define STOREFORWARD_MAX_PACKETS 0
#define STOREFORWARD_SEND_HISTORY_PERIOD 10 * 60
#define STOREFORWARD_SEND_HISTORY_MAX 0
#define STOREFORWARD_HOP_MAX 0 // How many hops should we allow the packet to be forwarded?
/*
Jm's TODO:
TODO:
- Be able to identify if you're within range of a router.
- Be able to specify the HOP MAX to reduce airtime.
- Restrict operation of S&F on the slow channel configurations.
- Build in rate limiting -- Don't allow a user to repeatedly request the history.
DONE:
Allow max history to be defined by radioConfig.preferences.store_forward_plugin_records
*/
@ -43,9 +48,9 @@ int32_t StoreForwardPlugin::runOnce()
* This behavior is expected to change. It's only here until we come up with something better.
*/
DEBUG_MSG("Store & Forward Plugin - Sending heartbeat\n");
//DEBUG_MSG("Store & Forward Plugin - Sending heartbeat\n");
storeForwardPlugin->sendPayload();
//storeForwardPlugin->sendPayload();
return (4 * 60 * 1000);
}
@ -77,9 +82,9 @@ void StoreForwardPlugin::populatePSRAM()
DEBUG_MSG(" Total PSRAM: %d\n", ESP.getPsramSize());
DEBUG_MSG(" Free PSRAM: %d\n", ESP.getFreePsram());
// Use a maximum of half the available PSRAM unless otherwise specified.
uint32_t numberOfPackets =
STOREFORWARD_MAX_PACKETS ? STOREFORWARD_MAX_PACKETS : ((ESP.getPsramSize() / 2) / sizeof(PacketHistoryStruct));
// Use a maximum of 2/3 the available PSRAM unless otherwise specified.
uint32_t numberOfPackets =( radioConfig.preferences.store_forward_plugin_records ? radioConfig.preferences.store_forward_plugin_records :
( ( (ESP.getFreePsram() / 3) * 2 )/ sizeof(PacketHistoryStruct)) );
// this->packetHistory = (PacketHistoryStruct *)ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct));
this->packetHistory = static_cast<PacketHistoryStruct *>(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct)));
@ -114,7 +119,7 @@ void StoreForwardPlugin::historyReport()
void StoreForwardPlugin::historySend(uint32_t msAgo, uint32_t to)
{
MeshPacket mp;
//MeshPacket mp;
for (int i = 0; i < this->packetHistoryCurrent; i++) {
if (this->packetHistory[i].time) {
@ -125,18 +130,9 @@ void StoreForwardPlugin::historySend(uint32_t msAgo, uint32_t to)
DEBUG_MSG("Request: to-0x%08x, Stored: time-%u to-0x%08x\n", to & 0xffffffff, this->packetHistory[i].time,
this->packetHistory[i].to & 0xffffffff);
// bool pb_decode_from_bytes(const uint8_t *srcbuf, size_t srcbufsize, const pb_msgdesc_t *fields, void
// *dest_struct);
pb_decode_from_bytes(this->packetHistory[i].bytes, this->packetHistory[i].bytes_size, ToRadio_fields, &mp);
DEBUG_MSG(">>>>> %s\n", this->packetHistory[i].payload);
/*
Take saved packet
Decode it
Read something form the decoded packet.
*/
DEBUG_MSG(">>>>> %s\n", mp.decoded.payload.bytes);
storeForwardPlugin->sendPayload(to, true);
storeForwardPlugin->sendPayload(to, i);
}
/*
@ -147,7 +143,7 @@ void StoreForwardPlugin::historySend(uint32_t msAgo, uint32_t to)
if ((this->packetHistory[i].to & 0xffffffff) == to) {
DEBUG_MSG("Request: to-0x%08x, Stored: time-%u to-0x%08x\n", to & 0xffffffff, this->packetHistory[i].time,
this->packetHistory[i].to & 0xffffffff);
storeForwardPlugin->sendPayload(to, true);
storeForwardPlugin->sendPayload(to, i);
}
// break;
@ -155,22 +151,19 @@ void StoreForwardPlugin::historySend(uint32_t msAgo, uint32_t to)
}
}
void StoreForwardPlugin::historyAdd(const MeshPacket *mp)
void StoreForwardPlugin::historyAdd(const MeshPacket &mp)
{
auto &p = mp;
//auto &p = *mp.decoded;
auto &p = mp.decoded;
static uint8_t bytes[MAX_RHPACKETLEN];
size_t numbytes = pb_encode_to_bytes(bytes, sizeof(bytes), Data_fields, &p->decoded);
assert(numbytes <= MAX_RHPACKETLEN);
//uint16_t payloadSize = p.payload.size;
// DEBUG_MSG("MP numbytes %u\n", numbytes);
// destination, source, bytes
// memcpy(p->encrypted.bytes, bytes, numbytes);
memcpy(this->packetHistory[this->packetHistoryCurrent].bytes, bytes, MAX_RHPACKETLEN);
this->packetHistory[this->packetHistoryCurrent].time = millis();
this->packetHistory[this->packetHistoryCurrent].to = mp->to;
this->packetHistory[this->packetHistoryCurrent].bytes_size = sizeof(bytes);
this->packetHistory[this->packetHistoryCurrent].to = mp.to;
this->packetHistory[this->packetHistoryCurrent].from = mp.from;
this->packetHistory[this->packetHistoryCurrent].payload_size = p.payload.size;
memcpy(this->packetHistory[this->packetHistoryCurrent].payload, p.payload.bytes, Constants_DATA_PAYLOAD_LEN);
this->packetHistoryCurrent++;
}
@ -180,20 +173,23 @@ MeshPacket *StoreForwardPlugin::allocReply()
return reply;
}
void StoreForwardPlugin::sendPayload(NodeNum dest, bool wantReplies)
void StoreForwardPlugin::sendPayload(NodeNum dest, uint32_t packetHistory_index)
{
DEBUG_MSG("Sending S&F Payload\n");
MeshPacket *p = allocReply();
p->to = dest;
p->decoded.want_response = wantReplies;
p->from = this->packetHistory[packetHistory_index].from;
// Let's assume that if the router received the S&F request that the client is in range.
// TODO: Make this configurable.
p->want_ack = false;
p->want_ack = true;
//static char heartbeatString[20];
//snprintf(heartbeatString, sizeof(heartbeatString), "From SF");
static char heartbeatString[20];
snprintf(heartbeatString, sizeof(heartbeatString), "From SF");
p->decoded.payload.size = strlen(heartbeatString); // You must specify how many bytes are in the reply
memcpy(p->decoded.payload.bytes, "From SF", 7);
p->decoded.payload.size = this->packetHistory[packetHistory_index].payload_size; // You must specify how many bytes are in the reply
memcpy(p->decoded.payload.bytes, this->packetHistory[packetHistory_index].payload, this->packetHistory[packetHistory_index].payload_size);
service.sendToMesh(p);
}
@ -220,9 +216,10 @@ ProcessMessage StoreForwardPlugin::handleReceived(const MeshPacket &mp)
if ((p.payload.bytes[0] == 'S') && (p.payload.bytes[1] == 'F')) {
DEBUG_MSG("--- --- --- Request to send\n");
// Send the last 5 minutes of messages.
storeForwardPlugin->historySend(5 * 1000 * 60, getFrom(&mp));
} else {
storeForwardPlugin->historyAdd(&mp);
storeForwardPlugin->historyAdd(mp);
}
} else {
@ -259,6 +256,7 @@ StoreForwardPlugin::StoreForwardPlugin()
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) {

Wyświetl plik

@ -9,9 +9,12 @@
struct PacketHistoryStruct {
uint32_t time;
uint32_t to;
uint32_t from;
bool ack;
uint8_t bytes[MAX_RHPACKETLEN];
uint8_t bytes_size;
uint8_t payload[Constants_DATA_PAYLOAD_LEN];
pb_size_t payload_size;
//uint8_t bytes[MAX_RHPACKETLEN];
//uint8_t bytes_size;
};
class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThread
@ -30,7 +33,7 @@ class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThrea
Update our local reference of when we last saw that node.
@return 0 if we have never seen that node before otherwise return the last time we saw the node.
*/
void historyAdd(const MeshPacket *mp);
void historyAdd(const MeshPacket &mp);
void historyReport();
void historySend(uint32_t msAgo, uint32_t to);
void populatePSRAM();
@ -38,12 +41,12 @@ class StoreForwardPlugin : public SinglePortPlugin, private concurrency::OSThrea
/**
* Send our payload into the mesh
*/
void sendPayload(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false);
void sendPayload(NodeNum dest = NODENUM_BROADCAST, uint32_t packetHistory_index = 0);
virtual MeshPacket *allocReply();
virtual bool wantPortnum(PortNum p) { return true; };
private:
// Nothing here
// Nothing here.
protected:
virtual int32_t runOnce();