is2 added for testing

This commit is contained in:
Ricardo Guzman committed 2026-10-18 17:00:24 -03:00
1 parent 1591d9f7fe
commit ef7d38e940
7 files changed
+45 -2

No files matched your search

+1
View File
@@ -27,6 +27,7 @@
"active": false,
"messagesToRF": false,
"objectsToRF": false,
"is2Metadata": false,
"server": "rotate.aprs2.net",
"passcode": "XYZVW",
"port": 14580,
+16
View File
@@ -937,6 +937,22 @@ body{background:var(--msh-bg);color:var(--msh-text);font-family:"Inter",system-u
>
</div>
</div>
<div class="col-6">
<div class="form-check form-switch">
<input
type="checkbox"
name="aprs_is.is2Metadata"
id="aprs_is.is2Metadata"
class="form-check-input"
/>
<label
for="aprs_is.is2Metadata"
class="form-label"
>Send IS2 Metadata
(RSSI/SNR) to APRS-IS</label
>
</div>
</div>
<div class="col-8">
<label
for="aprs_is.server"
+4
View File
@@ -103,6 +103,7 @@ function loadSettings(settings) {
document.getElementById("aprs_is.active").checked = settings.aprs_is.active;
document.getElementById("aprs_is.messagesToRF").checked = settings.aprs_is.messagesToRF;
document.getElementById("aprs_is.objectsToRF").checked = settings.aprs_is.objectsToRF;
document.getElementById("aprs_is.is2Metadata").checked = settings.aprs_is.is2Metadata;
document.getElementById("aprs_is.server").value = settings.aprs_is.server;
document.getElementById("aprs_is.port").value = settings.aprs_is.port;
document.getElementById("aprs_is.filter").value = settings.aprs_is.filter;
@@ -110,6 +111,7 @@ function loadSettings(settings) {
APRSISCheckbox.checked = settings.aprs_is.active;
APRSISGateMessages.disabled = !APRSISCheckbox.checked;
APRSISGateObjects.disabled = !APRSISCheckbox.checked;
APRSISMetadata.disabled = !APRSISCheckbox.checked;
APRSISServer.disabled = !APRSISCheckbox.checked;
APRSISPort.disabled = !APRSISCheckbox.checked;
APRSISPasscode.disabled = !APRSISCheckbox.checked;
@@ -350,6 +352,7 @@ StatusCheckbox.addEventListener("change", function() {
const APRSISCheckbox = document.querySelector('input[name="aprs_is.active"]');
const APRSISGateMessages = document.querySelector('input[name="aprs_is.messagesToRF"]');
const APRSISGateObjects = document.querySelector('input[name="aprs_is.objectsToRF"]');
const APRSISMetadata = document.querySelector('input[name="aprs_is.is2Metadata"]');
const APRSISServer = document.querySelector('input[name="aprs_is.server"]');
const APRSISPort = document.querySelector('input[name="aprs_is.port"]');
const APRSISPasscode = document.querySelector('input[name="aprs_is.passcode"]');
@@ -357,6 +360,7 @@ const APRSISFilter = document.querySelector('input[name="aprs_is.fi
APRSISCheckbox.addEventListener("change", function() {
APRSISGateMessages.disabled = !this.checked;
APRSISGateObjects.disabled = !this.checked;
APRSISMetadata.disabled = !this.checked;
APRSISServer.disabled = !this.checked;
APRSISPort.disabled = !this.checked;
APRSISPasscode.disabled = !this.checked;
+1
View File
@@ -65,6 +65,7 @@ public:
String filter;
bool messagesToRF;
bool objectsToRF;
bool is2Metadata;
};
class DIGI {
+17 -1
View File
@@ -152,6 +152,18 @@ namespace APRS_IS_Utils {
return packetToUpload;
}
String buildIS2Meta() {
static String fixedTail; // rx_modem + rx_bitrate + rx_frequency: RX config doesn't change at runtime
if (fixedTail == "") {
// LoRa bit rate = SF * (BW / 2^SF) * 4/CR (CR = denominator: 5..8)
uint32_t bitrate = (uint32_t)(Config.loramodule.rxSpreadingFactor
* ((float)Config.loramodule.rxSignalBandwidth / (1 << Config.loramodule.rxSpreadingFactor))
* (4.0 / Config.loramodule.rxCodingRate4));
fixedTail = " rx_modem=2 rx_bitrate=" + String(bitrate) + " rx_frequency=" + String(Config.loramodule.rxFreq);
}
return "#is2-meta rx_rssi_dbm=" + String(lastAprsPacket.rssi) + " rx_snr_db=" + String(lastAprsPacket.snr, 1) + fixedTail;
}
bool processReceivedLoRaMessage(const String& sender, const String& packet) {
String receivedMessage;
int leftCurlyBraceIndex = packet.indexOf("{");
@@ -202,7 +214,11 @@ namespace APRS_IS_Utils {
A7670_Utils::uploadToAPRSIS(aprsPacketToUpload);
stationBeacon = false;
#else
upload(aprsPacketToUpload);
if (Config.aprs_is.is2Metadata && aprsPacketToUpload != "") {
upload(buildIS2Meta() + "\r\n" + aprsPacketToUpload); // IS2PLAIN: meta line right before the packet, same write
} else {
upload(aprsPacketToUpload);
}
#endif
Utils::println("(Uploaded to APRS-IS)");
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
+5 -1
View File
@@ -63,6 +63,7 @@ bool Configuration::writeFile() {
data["aprs_is"]["filter"] = aprs_is.filter;
data["aprs_is"]["messagesToRF"] = aprs_is.messagesToRF;
data["aprs_is"]["objectsToRF"] = aprs_is.objectsToRF;
data["aprs_is"]["is2Metadata"] = aprs_is.is2Metadata;
data["beacon"]["comment"] = beacon.comment;
data["beacon"]["rfCommentEveryXBeacons"] = beacon.rfCommentEveryXBeacons;
@@ -238,7 +239,8 @@ bool Configuration::readFile() {
data["aprs_is"]["port"].isNull() ||
data["aprs_is"]["filter"].isNull() ||
data["aprs_is"]["messagesToRF"].isNull() ||
data["aprs_is"]["objectsToRF"].isNull()) needsRewrite = true;
data["aprs_is"]["objectsToRF"].isNull() ||
data["aprs_is"]["is2Metadata"].isNull()) needsRewrite = true;
aprs_is.active = data["aprs_is"]["active"] | false;
aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV";
aprs_is.server = data["aprs_is"]["server"] | "rotate.aprs2.net";
@@ -246,6 +248,7 @@ bool Configuration::readFile() {
aprs_is.filter = data["aprs_is"]["filter"] | "m/10";
aprs_is.messagesToRF = data["aprs_is"]["messagesToRF"] | false;
aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false;
aprs_is.is2Metadata = data["aprs_is"]["is2Metadata"] | false;
if (data["beacon"]["latitude"].isNull() ||
data["beacon"]["longitude"].isNull() ||
@@ -473,6 +476,7 @@ void Configuration::setDefaultValues() {
aprs_is.filter = "m/10";
aprs_is.messagesToRF = false;
aprs_is.objectsToRF = false;
aprs_is.is2Metadata = false;
beacon.comment = "LoRa APRS";
beacon.rfCommentEveryXBeacons = 1;
+1
View File
@@ -234,6 +234,7 @@ namespace WEB_Utils {
if (Config.aprs_is.active) {
Config.aprs_is.messagesToRF = request->hasParam("aprs_is.messagesToRF", true);
Config.aprs_is.objectsToRF = request->hasParam("aprs_is.objectsToRF", true);
Config.aprs_is.is2Metadata = request->hasParam("aprs_is.is2Metadata", true);
Config.aprs_is.server = getParamStringSafe("aprs_is.server", Config.aprs_is.server);
Config.aprs_is.passcode = getParamStringSafe("aprs_is.passcode", Config.aprs_is.passcode);
Config.aprs_is.port = getParamIntSafe("aprs_is.port", Config.aprs_is.port);