kopia lustrzana https://github.com/lora-aprs/LoRa_APRS_iGate
Merge branch 'develop' of https://github.com/lora-aprs/LoRa_APRS_iGate into develop
commit
8a70ca9f0c
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Ładowanie…
Reference in New Issue