2021-05-15 20:58:15 +00:00
|
|
|
#include <logger.h>
|
|
|
|
|
2021-05-18 23:17:23 +00:00
|
|
|
#include <TimeLib.h>
|
|
|
|
|
2021-05-15 20:58:15 +00:00
|
|
|
#include "Task.h"
|
|
|
|
#include "TaskRouter.h"
|
|
|
|
#include "project_configuration.h"
|
|
|
|
|
|
|
|
String create_lat_aprs(double lat);
|
|
|
|
String create_long_aprs(double lng);
|
|
|
|
|
2021-05-25 11:00:44 +00:00
|
|
|
RouterTask::RouterTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &toModem, TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs) : Task(TASK_ROUTER, TaskRouter), _fromModem(fromModem), _toModem(toModem), _toAprsIs(toAprsIs) {
|
2021-05-15 20:58:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
RouterTask::~RouterTask() {
|
|
|
|
}
|
|
|
|
|
2021-05-18 22:44:37 +00:00
|
|
|
bool RouterTask::setup(System &system) {
|
2021-05-15 20:58:15 +00:00
|
|
|
// setup beacon
|
2021-05-18 22:44:37 +00:00
|
|
|
_beacon_timer.setTimeout(system.getUserConfig()->beacon.timeout * 60 * 1000);
|
2021-05-25 09:15:01 +00:00
|
|
|
|
2021-05-15 20:58:15 +00:00
|
|
|
_beaconMsg = std::shared_ptr<APRSMessage>(new APRSMessage());
|
2021-05-18 22:44:37 +00:00
|
|
|
_beaconMsg->setSource(system.getUserConfig()->callsign);
|
2021-05-15 20:58:15 +00:00
|
|
|
_beaconMsg->setDestination("APLG01");
|
2021-05-18 22:44:37 +00:00
|
|
|
String lat = create_lat_aprs(system.getUserConfig()->beacon.positionLatitude);
|
|
|
|
String lng = create_long_aprs(system.getUserConfig()->beacon.positionLongitude);
|
|
|
|
_beaconMsg->getBody()->setData(String("=") + lat + "L" + lng + "&" + system.getUserConfig()->beacon.message);
|
2021-05-15 20:58:15 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-05-18 22:44:37 +00:00
|
|
|
bool RouterTask::loop(System &system) {
|
2021-05-15 20:58:15 +00:00
|
|
|
// do routing
|
2021-05-16 01:52:28 +00:00
|
|
|
if (!_fromModem.empty()) {
|
2021-05-25 11:00:44 +00:00
|
|
|
std::shared_ptr<APRSMessage> modemMsg = _fromModem.getElement();
|
|
|
|
String path;
|
2021-05-23 21:04:10 +00:00
|
|
|
|
2021-05-24 14:50:30 +00:00
|
|
|
if (system.getUserConfig()->aprs_is.active && modemMsg->getSource() != system.getUserConfig()->callsign) {
|
2021-05-24 15:10:20 +00:00
|
|
|
std::shared_ptr<APRSMessage> aprsIsMsg = std::make_shared<APRSMessage>(*modemMsg);
|
2021-05-25 11:00:44 +00:00
|
|
|
path = aprsIsMsg->getPath();
|
2021-05-24 14:50:30 +00:00
|
|
|
|
|
|
|
if (!(path.indexOf("RFONLY") != -1 || path.indexOf("NOGATE") != -1 || path.indexOf("TCPIP") != -1)) {
|
|
|
|
if (!path.isEmpty()) {
|
|
|
|
path += ",";
|
|
|
|
}
|
2021-05-23 21:04:10 +00:00
|
|
|
|
2021-05-24 15:10:20 +00:00
|
|
|
aprsIsMsg->setPath(path + "qAR," + system.getUserConfig()->callsign);
|
|
|
|
|
|
|
|
logPrintD("APRS-IS: ");
|
|
|
|
logPrintlnD(aprsIsMsg->toString());
|
|
|
|
_toAprsIs.addElement(aprsIsMsg);
|
|
|
|
} else {
|
|
|
|
logPrintlnD("APRS-IS: no forward => RFonly");
|
2021-05-24 14:50:30 +00:00
|
|
|
}
|
2021-05-24 15:10:20 +00:00
|
|
|
} else {
|
|
|
|
if (!system.getUserConfig()->aprs_is.active)
|
|
|
|
logPrintlnD("APRS-IS: disabled");
|
|
|
|
|
|
|
|
if (modemMsg->getSource() == system.getUserConfig()->callsign)
|
2021-05-25 09:41:15 +00:00
|
|
|
logPrintlnD("APRS-IS: no forward => own packet received");
|
2021-05-23 21:04:10 +00:00
|
|
|
}
|
2021-05-24 16:48:39 +00:00
|
|
|
|
|
|
|
if (system.getUserConfig()->digi.active && modemMsg->getSource() != system.getUserConfig()->callsign) {
|
|
|
|
std::shared_ptr<APRSMessage> digiMsg = std::make_shared<APRSMessage>(*modemMsg);
|
2021-05-25 11:00:44 +00:00
|
|
|
path = digiMsg->getPath();
|
2021-05-24 16:48:39 +00:00
|
|
|
|
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
}
|
2021-05-15 20:58:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// check for beacon
|
|
|
|
if (_beacon_timer.check()) {
|
|
|
|
logPrintD("[" + timeString() + "] ");
|
|
|
|
logPrintlnD(_beaconMsg->encode());
|
2021-05-24 12:22:16 +00:00
|
|
|
|
|
|
|
if (system.getUserConfig()->aprs_is.active)
|
|
|
|
_toAprsIs.addElement(_beaconMsg);
|
|
|
|
|
2021-05-25 09:15:01 +00:00
|
|
|
if (system.getUserConfig()->digi.beacon) {
|
|
|
|
std::shared_ptr<APRSMessage> digiBeaconMsg = std::make_shared<APRSMessage>(*_beaconMsg);
|
|
|
|
digiBeaconMsg->setPath("WIDE1-1");
|
|
|
|
_toModem.addElement(digiBeaconMsg);
|
|
|
|
}
|
2021-05-24 13:12:31 +00:00
|
|
|
|
2021-05-18 22:44:37 +00:00
|
|
|
system.getDisplay().addFrame(std::shared_ptr<DisplayFrame>(new TextFrame("BEACON", _beaconMsg->toString())));
|
2021-05-24 12:22:16 +00:00
|
|
|
|
2021-05-15 20:58:15 +00:00
|
|
|
_beacon_timer.start();
|
|
|
|
}
|
2021-05-24 12:22:16 +00:00
|
|
|
|
2021-05-18 23:17:23 +00:00
|
|
|
uint32_t diff = _beacon_timer.getTriggerTimeInSec();
|
|
|
|
_stateInfo = "beacon " + String(uint32_t(diff / 60)) + ":" + String(uint32_t(diff % 60));
|
2021-05-24 12:22:16 +00:00
|
|
|
|
2021-05-15 20:58:15 +00:00
|
|
|
return true;
|
|
|
|
}
|