LoRa_APRS_iGate/src/TaskRouter.cpp

73 wiersze
2.3 KiB
C++
Czysty Zwykły widok Historia

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-24 13:12:31 +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-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-24 13:50:01 +00:00
_beaconMsg->setPath("WIDE1-1");
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()) {
std::shared_ptr<APRSMessage> msg = _fromModem.getElement();
String path = msg->getPath();
if (!(path.indexOf("RFONLY") != -1 || path.indexOf("NOGATE") != -1 || path.indexOf("TCPIP") != -1)) {
if (!path.isEmpty()) {
path += ",";
}
msg->setPath(path + "qAR," + system.getUserConfig()->callsign);
2021-05-24 12:22:16 +00:00
if (system.getUserConfig()->aprs_is.active)
_toAprsIs.addElement(msg);
}
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-24 13:50:01 +00:00
if (system.getUserConfig()->digi.beacon)
_toModem.addElement(_beaconMsg);
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;
}