pull/96/head
Peter Buchegger 2021-05-25 22:43:16 +02:00
commit 8a70ca9f0c
8 zmienionych plików z 92 dodań i 17 usunięć

Wyświetl plik

@ -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,

Wyświetl plik

@ -25,19 +25,20 @@ String create_long_aprs(double lng);
TaskQueue<std::shared_ptr<APRSMessage>> toAprsIs;
TaskQueue<std::shared_ptr<APRSMessage>> fromModem;
TaskQueue<std::shared_ptr<APRSMessage>> 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);

Wyświetl plik

@ -7,7 +7,7 @@
#include "TaskModem.h"
#include "project_configuration.h"
ModemTask::ModemTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem) : Task(TASK_MODEM, TaskModem), _lora_aprs(), _fromModem(fromModem) {
ModemTask::ModemTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &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<DisplayFrame>(new TextFrame("LoRa", msg->toString())));
}
if (!_toModem.empty()) {
std::shared_ptr<APRSMessage> msg = _toModem.getElement();
_lora_aprs.sendMessage(msg);
}
return true;
}

Wyświetl plik

@ -7,15 +7,17 @@
class ModemTask : public Task {
public:
explicit ModemTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem);
explicit ModemTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &_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<std::shared_ptr<APRSMessage>> &_fromModem;
TaskQueue<std::shared_ptr<APRSMessage>> &_toModem;
};
#endif

Wyświetl plik

@ -9,7 +9,7 @@
String create_lat_aprs(double lat);
String create_long_aprs(double lng);
RouterTask::RouterTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs) : Task(TASK_ROUTER, TaskRouter), _fromModem(fromModem), _toAprsIs(toAprsIs) {
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) {
}
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<APRSMessage>(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<APRSMessage> msg = _fromModem.getElement();
String path = msg->getPath();
std::shared_ptr<APRSMessage> 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<APRSMessage> aprsIsMsg = std::make_shared<APRSMessage>(*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<APRSMessage> digiMsg = std::make_shared<APRSMessage>(*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<DisplayFrame>(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;
}

Wyświetl plik

@ -6,7 +6,7 @@
class RouterTask : public Task {
public:
RouterTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs);
RouterTask(TaskQueue<std::shared_ptr<APRSMessage>> &fromModem, TaskQueue<std::shared_ptr<APRSMessage>> &toModem, TaskQueue<std::shared_ptr<APRSMessage>> &toAprsIs);
virtual ~RouterTask();
virtual bool setup(System &system) override;
@ -14,6 +14,7 @@ public:
private:
TaskQueue<std::shared_ptr<APRSMessage>> &_fromModem;
TaskQueue<std::shared_ptr<APRSMessage>> &_toModem;
TaskQueue<std::shared_ptr<APRSMessage>> &_toAprsIs;
std::shared_ptr<APRSMessage> _beaconMsg;

Wyświetl plik

@ -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<String>();
if (data.containsKey("aprs_is") && data["aprs_is"].containsKey("server"))
conf.aprs_is.server = data["aprs_is"]["server"].as<String>();
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;

Wyświetl plik

@ -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;