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
|
"timeout": 15
|
||||||
},
|
},
|
||||||
"aprs_is": {
|
"aprs_is": {
|
||||||
|
"active": true,
|
||||||
"passcode": "",
|
"passcode": "",
|
||||||
"server": "euro.aprs2.net",
|
"server": "euro.aprs2.net",
|
||||||
"port": 14580
|
"port": 14580
|
||||||
},
|
},
|
||||||
|
"digi": {
|
||||||
|
"active": false,
|
||||||
|
"beacon": false
|
||||||
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"frequency_rx": 433775000,
|
"frequency_rx": 433775000,
|
||||||
"frequency_tx": 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>> toAprsIs;
|
||||||
TaskQueue<std::shared_ptr<APRSMessage>> fromModem;
|
TaskQueue<std::shared_ptr<APRSMessage>> fromModem;
|
||||||
|
TaskQueue<std::shared_ptr<APRSMessage>> toModem;
|
||||||
|
|
||||||
System LoRaSystem;
|
System LoRaSystem;
|
||||||
Configuration userConfig;
|
Configuration userConfig;
|
||||||
|
|
||||||
DisplayTask displayTask;
|
DisplayTask displayTask;
|
||||||
ModemTask modemTask(fromModem);
|
ModemTask modemTask(fromModem, toModem);
|
||||||
EthTask ethTask;
|
EthTask ethTask;
|
||||||
WifiTask wifiTask;
|
WifiTask wifiTask;
|
||||||
OTATask otaTask;
|
OTATask otaTask;
|
||||||
NTPTask ntpTask;
|
NTPTask ntpTask;
|
||||||
FTPTask ftpTask;
|
FTPTask ftpTask;
|
||||||
AprsIsTask aprsIsTask(toAprsIs);
|
AprsIsTask aprsIsTask(toAprsIs);
|
||||||
RouterTask routerTask(fromModem, toAprsIs);
|
RouterTask routerTask(fromModem, toModem, toAprsIs);
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
|
@ -106,7 +107,9 @@ void setup() {
|
||||||
if (userConfig.ftp.active) {
|
if (userConfig.ftp.active) {
|
||||||
LoRaSystem.getTaskManager().addTask(&ftpTask);
|
LoRaSystem.getTaskManager().addTask(&ftpTask);
|
||||||
}
|
}
|
||||||
LoRaSystem.getTaskManager().addTask(&aprsIsTask);
|
if (userConfig.aprs_is.active) {
|
||||||
|
LoRaSystem.getTaskManager().addTask(&aprsIsTask);
|
||||||
|
}
|
||||||
LoRaSystem.getTaskManager().addTask(&routerTask);
|
LoRaSystem.getTaskManager().addTask(&routerTask);
|
||||||
|
|
||||||
LoRaSystem.getTaskManager().setup(LoRaSystem);
|
LoRaSystem.getTaskManager().setup(LoRaSystem);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include "TaskModem.h"
|
#include "TaskModem.h"
|
||||||
#include "project_configuration.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() {
|
ModemTask::~ModemTask() {
|
||||||
|
@ -51,5 +51,10 @@ bool ModemTask::loop(System &system) {
|
||||||
system.getDisplay().addFrame(std::shared_ptr<DisplayFrame>(new TextFrame("LoRa", msg->toString())));
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,15 +7,17 @@
|
||||||
|
|
||||||
class ModemTask : public Task {
|
class ModemTask : public Task {
|
||||||
public:
|
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 ~ModemTask();
|
||||||
|
|
||||||
virtual bool setup(System &system) override;
|
virtual bool setup(System &system) override;
|
||||||
virtual bool loop(System &system) override;
|
virtual bool loop(System &system) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LoRa_APRS _lora_aprs;
|
LoRa_APRS _lora_aprs;
|
||||||
|
|
||||||
TaskQueue<std::shared_ptr<APRSMessage>> &_fromModem;
|
TaskQueue<std::shared_ptr<APRSMessage>> &_fromModem;
|
||||||
|
TaskQueue<std::shared_ptr<APRSMessage>> &_toModem;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
String create_lat_aprs(double lat);
|
String create_lat_aprs(double lat);
|
||||||
String create_long_aprs(double lng);
|
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() {
|
RouterTask::~RouterTask() {
|
||||||
|
@ -18,6 +18,7 @@ RouterTask::~RouterTask() {
|
||||||
bool RouterTask::setup(System &system) {
|
bool RouterTask::setup(System &system) {
|
||||||
// setup beacon
|
// setup beacon
|
||||||
_beacon_timer.setTimeout(system.getUserConfig()->beacon.timeout * 60 * 1000);
|
_beacon_timer.setTimeout(system.getUserConfig()->beacon.timeout * 60 * 1000);
|
||||||
|
|
||||||
_beaconMsg = std::shared_ptr<APRSMessage>(new APRSMessage());
|
_beaconMsg = std::shared_ptr<APRSMessage>(new APRSMessage());
|
||||||
_beaconMsg->setSource(system.getUserConfig()->callsign);
|
_beaconMsg->setSource(system.getUserConfig()->callsign);
|
||||||
_beaconMsg->setDestination("APLG01");
|
_beaconMsg->setDestination("APLG01");
|
||||||
|
@ -31,16 +32,47 @@ bool RouterTask::setup(System &system) {
|
||||||
bool RouterTask::loop(System &system) {
|
bool RouterTask::loop(System &system) {
|
||||||
// do routing
|
// do routing
|
||||||
if (!_fromModem.empty()) {
|
if (!_fromModem.empty()) {
|
||||||
std::shared_ptr<APRSMessage> msg = _fromModem.getElement();
|
std::shared_ptr<APRSMessage> modemMsg = _fromModem.getElement();
|
||||||
String path = msg->getPath();
|
|
||||||
|
|
||||||
if (!(path.indexOf("RFONLY") != -1 || path.indexOf("NOGATE") != -1 || path.indexOf("TCPIP") != -1)) {
|
if (system.getUserConfig()->aprs_is.active && modemMsg->getSource() != system.getUserConfig()->callsign) {
|
||||||
if (!path.isEmpty()) {
|
std::shared_ptr<APRSMessage> aprsIsMsg = std::make_shared<APRSMessage>(*modemMsg);
|
||||||
path += ",";
|
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()) {
|
if (_beacon_timer.check()) {
|
||||||
logPrintD("[" + timeString() + "] ");
|
logPrintD("[" + timeString() + "] ");
|
||||||
logPrintlnD(_beaconMsg->encode());
|
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())));
|
system.getDisplay().addFrame(std::shared_ptr<DisplayFrame>(new TextFrame("BEACON", _beaconMsg->toString())));
|
||||||
|
|
||||||
_beacon_timer.start();
|
_beacon_timer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t diff = _beacon_timer.getTriggerTimeInSec();
|
uint32_t diff = _beacon_timer.getTriggerTimeInSec();
|
||||||
_stateInfo = "beacon " + String(uint32_t(diff / 60)) + ":" + String(uint32_t(diff % 60));
|
_stateInfo = "beacon " + String(uint32_t(diff / 60)) + ":" + String(uint32_t(diff % 60));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
class RouterTask : public Task {
|
class RouterTask : public Task {
|
||||||
public:
|
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 ~RouterTask();
|
||||||
|
|
||||||
virtual bool setup(System &system) override;
|
virtual bool setup(System &system) override;
|
||||||
|
@ -14,6 +14,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TaskQueue<std::shared_ptr<APRSMessage>> &_fromModem;
|
TaskQueue<std::shared_ptr<APRSMessage>> &_fromModem;
|
||||||
|
TaskQueue<std::shared_ptr<APRSMessage>> &_toModem;
|
||||||
TaskQueue<std::shared_ptr<APRSMessage>> &_toAprsIs;
|
TaskQueue<std::shared_ptr<APRSMessage>> &_toAprsIs;
|
||||||
|
|
||||||
std::shared_ptr<APRSMessage> _beaconMsg;
|
std::shared_ptr<APRSMessage> _beaconMsg;
|
||||||
|
|
|
@ -20,12 +20,15 @@ void ProjectConfigurationManagement::readProjectConfiguration(DynamicJsonDocumen
|
||||||
conf.beacon.positionLatitude = data["beacon"]["position"]["latitude"] | 0.0;
|
conf.beacon.positionLatitude = data["beacon"]["position"]["latitude"] | 0.0;
|
||||||
conf.beacon.positionLongitude = data["beacon"]["position"]["longitude"] | 0.0;
|
conf.beacon.positionLongitude = data["beacon"]["position"]["longitude"] | 0.0;
|
||||||
conf.beacon.timeout = data["beacon"]["timeout"] | 15;
|
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"))
|
if (data.containsKey("aprs_is") && data["aprs_is"].containsKey("passcode"))
|
||||||
conf.aprs_is.passcode = data["aprs_is"]["passcode"].as<String>();
|
conf.aprs_is.passcode = data["aprs_is"]["passcode"].as<String>();
|
||||||
if (data.containsKey("aprs_is") && data["aprs_is"].containsKey("server"))
|
if (data.containsKey("aprs_is") && data["aprs_is"].containsKey("server"))
|
||||||
conf.aprs_is.server = data["aprs_is"]["server"].as<String>();
|
conf.aprs_is.server = data["aprs_is"]["server"].as<String>();
|
||||||
conf.aprs_is.port = data["aprs_is"]["port"] | 14580;
|
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.frequencyRx = data["lora"]["frequency_rx"] | 433775000;
|
||||||
conf.lora.frequencyTx = data["lora"]["frequency_tx"] | 433775000;
|
conf.lora.frequencyTx = data["lora"]["frequency_tx"] | 433775000;
|
||||||
conf.lora.power = data["lora"]["power"] | 20;
|
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"]["latitude"] = conf.beacon.positionLatitude;
|
||||||
data["beacon"]["position"]["longitude"] = conf.beacon.positionLongitude;
|
data["beacon"]["position"]["longitude"] = conf.beacon.positionLongitude;
|
||||||
data["beacon"]["timeout"] = conf.beacon.timeout;
|
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"]["passcode"] = conf.aprs_is.passcode;
|
||||||
data["aprs_is"]["server"] = conf.aprs_is.server;
|
data["aprs_is"]["server"] = conf.aprs_is.server;
|
||||||
data["aprs_is"]["port"] = conf.aprs_is.port;
|
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_rx"] = conf.lora.frequencyRx;
|
||||||
data["lora"]["frequency_tx"] = conf.lora.frequencyTx;
|
data["lora"]["frequency_tx"] = conf.lora.frequencyTx;
|
||||||
data["lora"]["power"] = conf.lora.power;
|
data["lora"]["power"] = conf.lora.power;
|
||||||
|
|
|
@ -33,14 +33,24 @@ public:
|
||||||
|
|
||||||
class APRS_IS {
|
class APRS_IS {
|
||||||
public:
|
public:
|
||||||
APRS_IS() : server("euro.aprs2.net"), port(14580) {
|
APRS_IS() : active(true), server("euro.aprs2.net"), port(14580) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool active;
|
||||||
String passcode;
|
String passcode;
|
||||||
String server;
|
String server;
|
||||||
int port;
|
int port;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Digi {
|
||||||
|
public:
|
||||||
|
Digi() : active(false), beacon(true) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool active;
|
||||||
|
bool beacon;
|
||||||
|
};
|
||||||
|
|
||||||
class LoRa {
|
class LoRa {
|
||||||
public:
|
public:
|
||||||
LoRa() : frequencyRx(433775000), frequencyTx(433775000), power(20), spreadingFactor(12), signalBandwidth(125000), codingRate4(5) {
|
LoRa() : frequencyRx(433775000), frequencyTx(433775000), power(20), spreadingFactor(12), signalBandwidth(125000), codingRate4(5) {
|
||||||
|
@ -86,6 +96,7 @@ public:
|
||||||
Wifi wifi;
|
Wifi wifi;
|
||||||
Beacon beacon;
|
Beacon beacon;
|
||||||
APRS_IS aprs_is;
|
APRS_IS aprs_is;
|
||||||
|
Digi digi;
|
||||||
LoRa lora;
|
LoRa lora;
|
||||||
Display display;
|
Display display;
|
||||||
Ftp ftp;
|
Ftp ftp;
|
||||||
|
|
Ładowanie…
Reference in New Issue