mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-07-17 15:13:21 +02:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2625e7b91d | |||
| 75337d6c29 | |||
| a618383617 |
@@ -51,9 +51,10 @@ ____________________________________________________
|
|||||||
<br />
|
<br />
|
||||||
|
|
||||||
# Timeline (Versions):
|
# Timeline (Versions):
|
||||||
|
- 2025-10-15 APRS Bridge for TNC added.
|
||||||
- 2025-10-13 Rx and Tx Frequencies are now with fully configurable.
|
- 2025-10-13 Rx and Tx Frequencies are now with fully configurable.
|
||||||
- 2025-10-13 Startup Delay to allow the Router/Modem to start WiFiAP before connecting.
|
- 2025-10-13 Startup Delay to allow the Router/Modem to start WiFiAP before connecting.
|
||||||
- 2025-10-12 Choose to send Beacon on Rx or Tx frequency in Digipeater Mode.
|
- 2025-10-12 Choose to send Beacon on Rx or Tx frequency.
|
||||||
- 2025-10-11 User defined NTP server and send beacon over MQTT added.
|
- 2025-10-11 User defined NTP server and send beacon over MQTT added.
|
||||||
- 2025-10-10 Converted the Wiki into a PDF manual.
|
- 2025-10-10 Converted the Wiki into a PDF manual.
|
||||||
- 2025-09-26 Heltec Wireless Bridge support added.
|
- 2025-09-26 Heltec Wireless Bridge support added.
|
||||||
|
|||||||
@@ -82,7 +82,8 @@
|
|||||||
"tnc": {
|
"tnc": {
|
||||||
"enableServer": false,
|
"enableServer": false,
|
||||||
"enableSerial": false,
|
"enableSerial": false,
|
||||||
"acceptOwn": false
|
"acceptOwn": false,
|
||||||
|
"aprsBrigdeActive": false
|
||||||
},
|
},
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
"active": false,
|
"active": false,
|
||||||
|
|||||||
+34
-20
@@ -1511,25 +1511,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-lg-9 col-sm-12">
|
<div class="col-lg-9 col-sm-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-6">
|
||||||
<div class="form-check form-switch">
|
|
||||||
<div class="form-text">
|
|
||||||
Server will be available at port <strong>8001</strong>
|
|
||||||
</div>
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
name="tnc.enableServer"
|
|
||||||
id="tnc.enableServer"
|
|
||||||
class="form-check-input"
|
|
||||||
/>
|
|
||||||
<label
|
|
||||||
for="tnc.enableServer"
|
|
||||||
class="form-label"
|
|
||||||
>Enable TNC server</label
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
@@ -1544,7 +1526,24 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-6">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="tnc.enableServer"
|
||||||
|
id="tnc.enableServer"
|
||||||
|
class="form-check-input"
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
for="tnc.enableServer"
|
||||||
|
class="form-label"
|
||||||
|
>Enable TNC server <small><strong>(Port 8001)</strong></small></label
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-2">
|
||||||
|
<div class="col-6">
|
||||||
<div class="form-check form-switch">
|
<div class="form-check form-switch">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
@@ -1559,6 +1558,21 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="tnc.aprsBridgeActive"
|
||||||
|
id="tnc.aprsBridgeActive"
|
||||||
|
class="form-check-input"
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
for="tnc.aprsBridgeActive"
|
||||||
|
class="form-label"
|
||||||
|
>Enable APRS Bridge</label
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ function loadSettings(settings) {
|
|||||||
document.getElementById("tnc.enableServer").checked = settings.tnc.enableServer;
|
document.getElementById("tnc.enableServer").checked = settings.tnc.enableServer;
|
||||||
document.getElementById("tnc.enableSerial").checked = settings.tnc.enableSerial;
|
document.getElementById("tnc.enableSerial").checked = settings.tnc.enableSerial;
|
||||||
document.getElementById("tnc.acceptOwn").checked = settings.tnc.acceptOwn;
|
document.getElementById("tnc.acceptOwn").checked = settings.tnc.acceptOwn;
|
||||||
|
document.getElementById("tnc.aprsBridgeActive").checked = settings.tnc.aprsBridgeActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MQTT
|
// MQTT
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ public:
|
|||||||
bool enableServer;
|
bool enableServer;
|
||||||
bool enableSerial;
|
bool enableSerial;
|
||||||
bool acceptOwn;
|
bool acceptOwn;
|
||||||
|
bool aprsBridgeActive;
|
||||||
};
|
};
|
||||||
|
|
||||||
class OTA {
|
class OTA {
|
||||||
|
|||||||
+2
-2
@@ -27,8 +27,8 @@ namespace TNC_Utils {
|
|||||||
void setup();
|
void setup();
|
||||||
void loop();
|
void loop();
|
||||||
|
|
||||||
void sendToClients(const String& packet);
|
void sendToClients(const String& packet, bool stripBytes = false);
|
||||||
void sendToSerial(const String& packet);
|
void sendToSerial(const String& packet, bool stripBytes = false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -192,9 +192,9 @@ void loop() {
|
|||||||
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
|
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.tnc.enableServer) TNC_Utils::sendToClients(packet); // Send received packet to TNC KISS
|
if (Config.tnc.enableServer) TNC_Utils::sendToClients(packet, true); // Send received packet to TNC KISS
|
||||||
if (Config.tnc.enableSerial) TNC_Utils::sendToSerial(packet); // Send received packet to Serial KISS
|
if (Config.tnc.enableSerial) TNC_Utils::sendToSerial(packet, true); // Send received packet to Serial KISS
|
||||||
if (Config.mqtt.active) MQTT_Utils::sendToMqtt(packet); // Send received packet to MQTT
|
if (Config.mqtt.active) MQTT_Utils::sendToMqtt(packet); // Send received packet to MQTT
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.aprs_is.active) APRS_IS_Utils::listenAPRSIS(); // listen received packet from APRSIS
|
if (Config.aprs_is.active) APRS_IS_Utils::listenAPRSIS(); // listen received packet from APRSIS
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "query_utils.h"
|
#include "query_utils.h"
|
||||||
#include "A7670_utils.h"
|
#include "A7670_utils.h"
|
||||||
#include "digi_utils.h"
|
#include "digi_utils.h"
|
||||||
|
#include "tnc_utils.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
@@ -367,6 +368,10 @@ namespace APRS_IS_Utils {
|
|||||||
Serial.println(" ---> Rejected (Time): No Tx");
|
Serial.println(" ---> Rejected (Time): No Tx");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (Config.tnc.aprsBridgeActive) {
|
||||||
|
if (Config.tnc.enableServer) TNC_Utils::sendToClients(packet); // Send received packet to TNC KISS
|
||||||
|
if (Config.tnc.enableSerial) TNC_Utils::sendToSerial(packet); // Send received packet to Serial KISS
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ bool Configuration::writeFile() {
|
|||||||
data["tnc"]["enableServer"] = tnc.enableServer;
|
data["tnc"]["enableServer"] = tnc.enableServer;
|
||||||
data["tnc"]["enableSerial"] = tnc.enableSerial;
|
data["tnc"]["enableSerial"] = tnc.enableSerial;
|
||||||
data["tnc"]["acceptOwn"] = tnc.acceptOwn;
|
data["tnc"]["acceptOwn"] = tnc.acceptOwn;
|
||||||
|
data["tnc"]["aprsBridgeActive"] = tnc.aprsBridgeActive;
|
||||||
|
|
||||||
data["mqtt"]["active"] = mqtt.active;
|
data["mqtt"]["active"] = mqtt.active;
|
||||||
data["mqtt"]["server"] = mqtt.server;
|
data["mqtt"]["server"] = mqtt.server;
|
||||||
@@ -331,10 +332,12 @@ bool Configuration::readFile() {
|
|||||||
|
|
||||||
if (!data["tnc"].containsKey("enableServer") ||
|
if (!data["tnc"].containsKey("enableServer") ||
|
||||||
!data["tnc"].containsKey("enableSerial") ||
|
!data["tnc"].containsKey("enableSerial") ||
|
||||||
!data["tnc"].containsKey("acceptOwn")) needsRewrite = true;
|
!data["tnc"].containsKey("acceptOwn") ||
|
||||||
|
!data["tnc"].containsKey("aprsBridgeActive")) needsRewrite = true;
|
||||||
tnc.enableServer = data["tnc"]["enableServer"] | false;
|
tnc.enableServer = data["tnc"]["enableServer"] | false;
|
||||||
tnc.enableSerial = data["tnc"]["enableSerial"] | false;
|
tnc.enableSerial = data["tnc"]["enableSerial"] | false;
|
||||||
tnc.acceptOwn = data["tnc"]["acceptOwn"] | false;
|
tnc.acceptOwn = data["tnc"]["acceptOwn"] | false;
|
||||||
|
tnc.aprsBridgeActive = data["tnc"]["aprsBridgeActive"] | false;
|
||||||
|
|
||||||
if (!data["mqtt"].containsKey("active") ||
|
if (!data["mqtt"].containsKey("active") ||
|
||||||
!data["mqtt"].containsKey("server") ||
|
!data["mqtt"].containsKey("server") ||
|
||||||
@@ -496,6 +499,7 @@ void Configuration::setDefaultValues() {
|
|||||||
tnc.enableServer = false;
|
tnc.enableServer = false;
|
||||||
tnc.enableSerial = false;
|
tnc.enableSerial = false;
|
||||||
tnc.acceptOwn = false;
|
tnc.acceptOwn = false;
|
||||||
|
tnc.aprsBridgeActive = false;
|
||||||
|
|
||||||
mqtt.active = false;
|
mqtt.active = false;
|
||||||
mqtt.server = "";
|
mqtt.server = "";
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ void displaySetup() {
|
|||||||
#ifdef HAS_EPAPER
|
#ifdef HAS_EPAPER
|
||||||
display.landscape();
|
display.landscape();
|
||||||
display.printCenter("LoRa APRS iGate Initialising...");
|
display.printCenter("LoRa APRS iGate Initialising...");
|
||||||
|
if (Config.display.turn180) display.setRotation(2);
|
||||||
display.update();
|
display.update();
|
||||||
#else
|
#else
|
||||||
#ifdef OLED_DISPLAY_HAS_RST_PIN
|
#ifdef OLED_DISPLAY_HAS_RST_PIN
|
||||||
|
|||||||
+10
-6
@@ -21,12 +21,15 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "station_utils.h"
|
#include "station_utils.h"
|
||||||
#include "kiss_protocol.h"
|
#include "kiss_protocol.h"
|
||||||
|
#include "aprs_is_utils.h"
|
||||||
#include "kiss_utils.h"
|
#include "kiss_utils.h"
|
||||||
#include "tnc_utils.h"
|
#include "tnc_utils.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
extern Configuration Config;
|
extern Configuration Config;
|
||||||
|
extern WiFiClient aprsIsClient;
|
||||||
|
extern bool passcodeValid;
|
||||||
|
|
||||||
#define MAX_CLIENTS 4
|
#define MAX_CLIENTS 4
|
||||||
#define INPUT_BUFFER_SIZE (2 + MAX_CLIENTS)
|
#define INPUT_BUFFER_SIZE (2 + MAX_CLIENTS)
|
||||||
@@ -94,7 +97,8 @@ namespace TNC_Utils {
|
|||||||
String sender = frame.substring(0,frame.indexOf(">"));
|
String sender = frame.substring(0,frame.indexOf(">"));
|
||||||
|
|
||||||
if (Config.tnc.acceptOwn || sender != Config.callsign) {
|
if (Config.tnc.acceptOwn || sender != Config.callsign) {
|
||||||
STATION_Utils::addToOutputPacketBuffer(frame);
|
if (Config.loramodule.txActive) STATION_Utils::addToOutputPacketBuffer(frame);
|
||||||
|
if (Config.tnc.aprsBridgeActive && Config.aprs_is.active && passcodeValid && aprsIsClient.connected()) APRS_IS_Utils::upload(frame);
|
||||||
} else {
|
} else {
|
||||||
Utils::println("Ignored own frame from KISS");
|
Utils::println("Ignored own frame from KISS");
|
||||||
}
|
}
|
||||||
@@ -131,8 +135,8 @@ namespace TNC_Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendToClients(const String& packet) {
|
void sendToClients(const String& packet, bool stripBytes) {
|
||||||
String cleanPacket = packet.substring(3);
|
String cleanPacket = stripBytes ? packet.substring(3): packet;
|
||||||
|
|
||||||
const String kissEncoded = encodeKISS(cleanPacket);
|
const String kissEncoded = encodeKISS(cleanPacket);
|
||||||
|
|
||||||
@@ -152,8 +156,8 @@ namespace TNC_Utils {
|
|||||||
Utils::println(cleanPacket);
|
Utils::println(cleanPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendToSerial(const String& packet) {
|
void sendToSerial(const String& packet, bool stripBytes) {
|
||||||
String cleanPacket = packet.substring(3);
|
String cleanPacket = stripBytes ? packet.substring(3): packet;
|
||||||
Serial.print(encodeKISS(cleanPacket));
|
Serial.print(encodeKISS(cleanPacket));
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -259,6 +259,7 @@ namespace WEB_Utils {
|
|||||||
Config.tnc.enableServer = request->hasParam("tnc.enableServer", true);
|
Config.tnc.enableServer = request->hasParam("tnc.enableServer", true);
|
||||||
Config.tnc.enableSerial = request->hasParam("tnc.enableSerial", true);
|
Config.tnc.enableSerial = request->hasParam("tnc.enableSerial", true);
|
||||||
Config.tnc.acceptOwn = request->hasParam("tnc.acceptOwn", true);
|
Config.tnc.acceptOwn = request->hasParam("tnc.acceptOwn", true);
|
||||||
|
Config.tnc.aprsBridgeActive = request->hasParam("tnc.aprsBridgeActive", true);
|
||||||
|
|
||||||
|
|
||||||
Config.mqtt.active = request->hasParam("mqtt.active", true);
|
Config.mqtt.active = request->hasParam("mqtt.active", true);
|
||||||
|
|||||||
Reference in New Issue
Block a user