diff --git a/data/is-cfg.json b/data/is-cfg.json index c84a3f5..3d536bb 100644 --- a/data/is-cfg.json +++ b/data/is-cfg.json @@ -17,10 +17,15 @@ "timeout": 15 }, "aprs_is": { + "active": true, "passcode": "", "server": "euro.aprs2.net", "port": 14580 }, + "digi": { + "active": false, + "beacon": false + }, "lora": { "frequency_rx": 433775000, "frequency_tx": 433775000, diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 9bc836a..08bcf04 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -25,19 +25,20 @@ String create_long_aprs(double lng); TaskQueue> toAprsIs; TaskQueue> fromModem; +TaskQueue> toModem; System LoRaSystem; Configuration userConfig; DisplayTask displayTask; -ModemTask modemTask(fromModem); +ModemTask modemTask(fromModem, toModem); EthTask ethTask; WifiTask wifiTask; OTATask otaTask; NTPTask ntpTask; FTPTask ftpTask; AprsIsTask aprsIsTask(toAprsIs); -RouterTask routerTask(fromModem, toAprsIs); +RouterTask routerTask(fromModem, toModem, toAprsIs); void setup() { Serial.begin(115200); @@ -106,7 +107,9 @@ void setup() { if (userConfig.ftp.active) { LoRaSystem.getTaskManager().addTask(&ftpTask); } - LoRaSystem.getTaskManager().addTask(&aprsIsTask); + if (userConfig.aprs_is.active) { + LoRaSystem.getTaskManager().addTask(&aprsIsTask); + } LoRaSystem.getTaskManager().addTask(&routerTask); LoRaSystem.getTaskManager().setup(LoRaSystem); diff --git a/src/TaskModem.cpp b/src/TaskModem.cpp index 1cf531b..7dad353 100644 --- a/src/TaskModem.cpp +++ b/src/TaskModem.cpp @@ -7,7 +7,7 @@ #include "TaskModem.h" #include "project_configuration.h" -ModemTask::ModemTask(TaskQueue> &fromModem) : Task(TASK_MODEM, TaskModem), _lora_aprs(), _fromModem(fromModem) { +ModemTask::ModemTask(TaskQueue> &fromModem, TaskQueue> &toModem) : Task(TASK_MODEM, TaskModem), _lora_aprs(), _fromModem(fromModem), _toModem(toModem) { } ModemTask::~ModemTask() { @@ -51,5 +51,10 @@ bool ModemTask::loop(System &system) { system.getDisplay().addFrame(std::shared_ptr(new TextFrame("LoRa", msg->toString()))); } + if (!_toModem.empty()) { + std::shared_ptr msg = _toModem.getElement(); + _lora_aprs.sendMessage(msg); + } + return true; } diff --git a/src/TaskModem.h b/src/TaskModem.h index a11dfd3..6087b67 100644 --- a/src/TaskModem.h +++ b/src/TaskModem.h @@ -7,15 +7,17 @@ class ModemTask : public Task { public: - explicit ModemTask(TaskQueue> &fromModem); + explicit ModemTask(TaskQueue> &fromModem, TaskQueue> &_toModem); virtual ~ModemTask(); virtual bool setup(System &system) override; virtual bool loop(System &system) override; private: - LoRa_APRS _lora_aprs; + LoRa_APRS _lora_aprs; + TaskQueue> &_fromModem; + TaskQueue> &_toModem; }; #endif diff --git a/src/TaskRouter.cpp b/src/TaskRouter.cpp index 73f5ba3..210ed7e 100644 --- a/src/TaskRouter.cpp +++ b/src/TaskRouter.cpp @@ -9,7 +9,7 @@ String create_lat_aprs(double lat); String create_long_aprs(double lng); -RouterTask::RouterTask(TaskQueue> &fromModem, TaskQueue> &toAprsIs) : Task(TASK_ROUTER, TaskRouter), _fromModem(fromModem), _toAprsIs(toAprsIs) { +RouterTask::RouterTask(TaskQueue> &fromModem, TaskQueue> &toModem, TaskQueue> &toAprsIs) : Task(TASK_ROUTER, TaskRouter), _fromModem(fromModem), _toModem(toModem), _toAprsIs(toAprsIs) { } RouterTask::~RouterTask() { @@ -18,6 +18,7 @@ RouterTask::~RouterTask() { bool RouterTask::setup(System &system) { // setup beacon _beacon_timer.setTimeout(system.getUserConfig()->beacon.timeout * 60 * 1000); + _beaconMsg = std::shared_ptr(new APRSMessage()); _beaconMsg->setSource(system.getUserConfig()->callsign); _beaconMsg->setDestination("APLG01"); @@ -31,16 +32,47 @@ bool RouterTask::setup(System &system) { bool RouterTask::loop(System &system) { // do routing if (!_fromModem.empty()) { - std::shared_ptr msg = _fromModem.getElement(); - String path = msg->getPath(); + std::shared_ptr modemMsg = _fromModem.getElement(); - if (!(path.indexOf("RFONLY") != -1 || path.indexOf("NOGATE") != -1 || path.indexOf("TCPIP") != -1)) { - if (!path.isEmpty()) { - path += ","; + if (system.getUserConfig()->aprs_is.active && modemMsg->getSource() != system.getUserConfig()->callsign) { + std::shared_ptr aprsIsMsg = std::make_shared(*modemMsg); + String path = aprsIsMsg->getPath(); + + if (!(path.indexOf("RFONLY") != -1 || path.indexOf("NOGATE") != -1 || path.indexOf("TCPIP") != -1)) { + if (!path.isEmpty()) { + path += ","; + } + + aprsIsMsg->setPath(path + "qAR," + system.getUserConfig()->callsign); + + logPrintD("APRS-IS: "); + logPrintlnD(aprsIsMsg->toString()); + _toAprsIs.addElement(aprsIsMsg); + } else { + logPrintlnD("APRS-IS: no forward => RFonly"); } - msg->setPath(path + "qAR," + system.getUserConfig()->callsign); + } else { + if (!system.getUserConfig()->aprs_is.active) + logPrintlnD("APRS-IS: disabled"); - _toAprsIs.addElement(msg); + if (modemMsg->getSource() == system.getUserConfig()->callsign) + logPrintlnD("APRS-IS: no forward => own packet received"); + } + + if (system.getUserConfig()->digi.active && modemMsg->getSource() != system.getUserConfig()->callsign) { + std::shared_ptr digiMsg = std::make_shared(*modemMsg); + String path = digiMsg->getPath(); + + // simple loop check + if (path.indexOf("WIDE1-1") >= 0 || path.indexOf(system.getUserConfig()->callsign) == -1) { + // fixme + digiMsg->setPath(system.getUserConfig()->callsign + "*"); + + logPrintD("DIGI: "); + logPrintlnD(digiMsg->toString()); + + _toModem.addElement(digiMsg); + } } } @@ -48,11 +80,21 @@ bool RouterTask::loop(System &system) { if (_beacon_timer.check()) { logPrintD("[" + timeString() + "] "); logPrintlnD(_beaconMsg->encode()); - _toAprsIs.addElement(_beaconMsg); + + if (system.getUserConfig()->aprs_is.active) + _toAprsIs.addElement(_beaconMsg); + + if (system.getUserConfig()->digi.beacon) { + _toModem.addElement(_beaconMsg); + } + system.getDisplay().addFrame(std::shared_ptr(new TextFrame("BEACON", _beaconMsg->toString()))); + _beacon_timer.start(); } + uint32_t diff = _beacon_timer.getTriggerTimeInSec(); _stateInfo = "beacon " + String(uint32_t(diff / 60)) + ":" + String(uint32_t(diff % 60)); + return true; } diff --git a/src/TaskRouter.h b/src/TaskRouter.h index b6e4289..8d8d1ac 100644 --- a/src/TaskRouter.h +++ b/src/TaskRouter.h @@ -6,7 +6,7 @@ class RouterTask : public Task { public: - RouterTask(TaskQueue> &fromModem, TaskQueue> &toAprsIs); + RouterTask(TaskQueue> &fromModem, TaskQueue> &toModem, TaskQueue> &toAprsIs); virtual ~RouterTask(); virtual bool setup(System &system) override; @@ -14,6 +14,7 @@ public: private: TaskQueue> &_fromModem; + TaskQueue> &_toModem; TaskQueue> &_toAprsIs; std::shared_ptr _beaconMsg; diff --git a/src/project_configuration.cpp b/src/project_configuration.cpp index 1a68b74..4bce038 100644 --- a/src/project_configuration.cpp +++ b/src/project_configuration.cpp @@ -20,12 +20,15 @@ void ProjectConfigurationManagement::readProjectConfiguration(DynamicJsonDocumen conf.beacon.positionLatitude = data["beacon"]["position"]["latitude"] | 0.0; conf.beacon.positionLongitude = data["beacon"]["position"]["longitude"] | 0.0; conf.beacon.timeout = data["beacon"]["timeout"] | 15; + conf.aprs_is.active = data["aprs_is"]["active"] | true; if (data.containsKey("aprs_is") && data["aprs_is"].containsKey("passcode")) conf.aprs_is.passcode = data["aprs_is"]["passcode"].as(); if (data.containsKey("aprs_is") && data["aprs_is"].containsKey("server")) conf.aprs_is.server = data["aprs_is"]["server"].as(); conf.aprs_is.port = data["aprs_is"]["port"] | 14580; + conf.digi.active = data["digi"]["active"] | false; + conf.digi.beacon = data["digi"]["beacon"] | false; conf.lora.frequencyRx = data["lora"]["frequency_rx"] | 433775000; conf.lora.frequencyTx = data["lora"]["frequency_tx"] | 433775000; conf.lora.power = data["lora"]["power"] | 20; @@ -70,9 +73,12 @@ void ProjectConfigurationManagement::writeProjectConfiguration(Configuration &co data["beacon"]["position"]["latitude"] = conf.beacon.positionLatitude; data["beacon"]["position"]["longitude"] = conf.beacon.positionLongitude; data["beacon"]["timeout"] = conf.beacon.timeout; + data["aprs_is"]["active"] = conf.aprs_is.active; data["aprs_is"]["passcode"] = conf.aprs_is.passcode; data["aprs_is"]["server"] = conf.aprs_is.server; data["aprs_is"]["port"] = conf.aprs_is.port; + data["digi"]["active"] = conf.digi.active; + data["digi"]["beacon"] = conf.digi.beacon; data["lora"]["frequency_rx"] = conf.lora.frequencyRx; data["lora"]["frequency_tx"] = conf.lora.frequencyTx; data["lora"]["power"] = conf.lora.power; diff --git a/src/project_configuration.h b/src/project_configuration.h index 90af324..e1e1686 100644 --- a/src/project_configuration.h +++ b/src/project_configuration.h @@ -33,14 +33,24 @@ public: class APRS_IS { public: - APRS_IS() : server("euro.aprs2.net"), port(14580) { + APRS_IS() : active(true), server("euro.aprs2.net"), port(14580) { } + bool active; String passcode; String server; int port; }; + class Digi { + public: + Digi() : active(false), beacon(true) { + } + + bool active; + bool beacon; + }; + class LoRa { public: LoRa() : frequencyRx(433775000), frequencyTx(433775000), power(20), spreadingFactor(12), signalBandwidth(125000), codingRate4(5) { @@ -86,6 +96,7 @@ public: Wifi wifi; Beacon beacon; APRS_IS aprs_is; + Digi digi; LoRa lora; Display display; Ftp ftp;