Compare commits
11 Commits
startup-de
...
NTP-server
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8add599838 | ||
|
|
83ec2265c6 | ||
|
|
bec4f4f473 | ||
|
|
87a67cd2c9 | ||
|
|
4e48b2d02d | ||
|
|
607277bfe9 | ||
|
|
c2f8596667 | ||
|
|
ba7ff2a2d9 | ||
|
|
b44eb1028d | ||
|
|
d7602268f2 | ||
|
|
2f6f9be28e |
@@ -32,7 +32,7 @@ ____________________________________________________
|
||||
|
||||
- T-Deck Plus (and also regular T-Deck with/without GPS).
|
||||
|
||||
- HELTEC V2, V3, V3.2, T114, Wireless Stick, Wireless Stick Lite, HT-CT62, Wireless Tracker, Wireless Paper.
|
||||
- HELTEC V2, V3, V3.2, T114, Wireless Stick, Wireless Stick Lite V3/V3.2, HT-CT62, Wireless Tracker, Wireless Paper.
|
||||
|
||||
- RAK Wireless 4631 + 19007(or 19003)
|
||||
|
||||
@@ -51,9 +51,11 @@ ____________________________________________________
|
||||
<br />
|
||||
|
||||
# Timeline (Versions):
|
||||
|
||||
- 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-12 Choose to send Beacon on Rx or Tx frequency in Digipeater Mode.
|
||||
- 2025-10-11 User defined NTP server and send beacon over MQTT added.
|
||||
- 2025-10-10 Changed 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-09 MQTT added (pub+sub), Status defined by Op now and many fixes more.
|
||||
- 2025-06-20 Digipeaters now with updated EcoMode (Board Sleeps until packet Rx reducing current consumption to almost 10% at idle).
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"path": "WIDE1-1",
|
||||
"sendViaAPRSIS": false,
|
||||
"sendViaRF": false,
|
||||
"beaconFreq": 1,
|
||||
"statusActive": false,
|
||||
"statusPacket": "",
|
||||
"gpsActive": false,
|
||||
@@ -35,18 +36,20 @@
|
||||
"blacklist": "",
|
||||
"digi": {
|
||||
"mode": 0,
|
||||
"ecoMode": 0,
|
||||
"beaconOnRxFreq": false
|
||||
"ecoMode": 0
|
||||
},
|
||||
"lora": {
|
||||
"txFreq": 433775000,
|
||||
"rxActive": true,
|
||||
"rxFreq": 433775000,
|
||||
"spreadingFactor": 12,
|
||||
"signalBandwidth": 125000,
|
||||
"codingRate4": 5,
|
||||
"power": 20,
|
||||
"rxSpreadingFactor": 12,
|
||||
"rxCodingRate4": 5,
|
||||
"rxSignalBandwidth": 125000,
|
||||
"txActive": false,
|
||||
"rxActive": true
|
||||
"txFreq": 433775000,
|
||||
"txSpreadingFactor": 12,
|
||||
"txCodingRate4": 5,
|
||||
"txSignalBandwidth": 125000,
|
||||
"power": 20
|
||||
},
|
||||
"display": {
|
||||
"alwaysOn": true,
|
||||
|
||||
@@ -344,7 +344,7 @@
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="startupDelay"
|
||||
class="form-label"
|
||||
@@ -567,12 +567,33 @@
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 d-grid gap-2">
|
||||
<button class="btn btn-primary" id="send-beacon">Send beacon now</button>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<button class="btn btn-primary form-control h-100" id="send-beacon">Send beacon now</button>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="beacon.beaconFreq"
|
||||
class="form-label">
|
||||
<small>(Select LoRa Beacon Frequency)</small>
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="beacon.beaconFreq"
|
||||
id="beacon.beaconFreq"
|
||||
>
|
||||
<option value="0">
|
||||
Beacon on Rx Freq
|
||||
</option>
|
||||
<option value="1">
|
||||
Beacon on Tx Freq
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-4">
|
||||
<div class="col-12">
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="beacon.interval"
|
||||
class="form-label"
|
||||
@@ -648,7 +669,7 @@
|
||||
</h5>
|
||||
<small>Add Callsigns with space between them to Blacklist them (* wild card allowed)</small>
|
||||
</div>
|
||||
<div class="col-9 mt-2">
|
||||
<div class="col-9">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<label
|
||||
@@ -689,7 +710,7 @@
|
||||
</h5>
|
||||
<small>Define the Digipeater mode</small>
|
||||
</div>
|
||||
<div class="col-9 mt-2">
|
||||
<div class="col-9">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<label
|
||||
@@ -728,35 +749,13 @@
|
||||
id="digi.ecoMode"
|
||||
>
|
||||
<option value="0">
|
||||
OFF (Normal Mode - WiFiAP enabled)
|
||||
OFF (Normal Mode - WiFiAP and Serial Output enabled)
|
||||
</option>
|
||||
<option value="1">
|
||||
Ultra Eco Mode (Sleep till Packet Rx (WiFiAP/WebUI & Display disabled))
|
||||
</option>
|
||||
<option value="2">
|
||||
OFF (Normal Mode - WiFiAP disabled)
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<label
|
||||
for="digi.beaconOnRxFreq"
|
||||
class="form-label"
|
||||
>Digipeater Beacon Frequency
|
||||
<small
|
||||
>(If Rx Freq different from Tx Freq).</small
|
||||
></label
|
||||
>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="digi.beaconOnRxFreq"
|
||||
id="digi.beaconOnRxFreq"
|
||||
>
|
||||
<option value="false">
|
||||
Beacon on Tx Freq
|
||||
</option>
|
||||
<option value="true">
|
||||
Beacon on Rx Freq
|
||||
OFF (Normal Mode - WiFiAP disabled but Serial Output still enabled)
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -788,21 +787,6 @@
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="lora.txActive"
|
||||
id="lora.txActive"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="lora.txActive"
|
||||
class="form-label"
|
||||
>Enable LoRa TX</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
@@ -819,6 +803,40 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="lora.txActive"
|
||||
id="lora.txActive"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="lora.txActive"
|
||||
class="form-label"
|
||||
>Enable LoRa TX</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 mt-1">
|
||||
<label
|
||||
for="lora.rxFreq"
|
||||
class="form-label">
|
||||
Rx Frequency
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="text"
|
||||
name="lora.rxFreq"
|
||||
id="lora.rxFreq"
|
||||
placeholder="433775000"
|
||||
class="form-control"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>Hz
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 mt-1">
|
||||
<label
|
||||
for="lora.txFreq"
|
||||
class="form-label"
|
||||
@@ -846,136 +864,123 @@
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="lora.rxFreq"
|
||||
class="form-label">
|
||||
Rx Frequency
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="text"
|
||||
name="lora.rxFreq"
|
||||
id="lora.rxFreq"
|
||||
placeholder="433775000"
|
||||
class="form-control"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>Hz
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-4">
|
||||
<div class="col-12 mb-4">
|
||||
<label
|
||||
for="action.speed"
|
||||
for="lora.rxSpreadingFactor"
|
||||
class="form-label"
|
||||
>Predefined speeds
|
||||
>Rx Spreading Factor
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="action.speed"
|
||||
id="action.speed"
|
||||
>
|
||||
<option value="300">
|
||||
BW 125khz CR 4:5 SF 12 (Slow
|
||||
Standard, 300bps)
|
||||
</option>
|
||||
<option value="244">
|
||||
BW 125khz CR 4:6 SF 12 (244bps)
|
||||
</option>
|
||||
<option value="209">
|
||||
BW 125khz CR 4:7 SF 12 (209bps)
|
||||
</option>
|
||||
<option value="183">
|
||||
BW 125khz CR 4:8 SF 12 (183bps)
|
||||
</option>
|
||||
<option value="610">
|
||||
BW 125khz CR 4:8 SF 10 (610bps)
|
||||
</option>
|
||||
<option value="1200">
|
||||
BW 125khz CR 4:7 SF 9 (Fast
|
||||
Standard, 1200bps)
|
||||
</option>
|
||||
<option value="">
|
||||
User defined
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
<label
|
||||
for="lora.signalBandwidth"
|
||||
class="form-label"
|
||||
>Bandwidth
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.signalBandwidth"
|
||||
id="lora.signalBandwidth"
|
||||
required=""
|
||||
>
|
||||
<option value="62500" selected>
|
||||
62.5 kHz
|
||||
</option>
|
||||
<option value="125000" selected>
|
||||
125 kHz
|
||||
</option>
|
||||
<option value="250000">
|
||||
250 kHz
|
||||
</option>
|
||||
<option value="500000">
|
||||
500 kHz
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-7">
|
||||
<label
|
||||
for="lora.spreadingFactor"
|
||||
class="form-label"
|
||||
>Spreading Factor
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.spreadingFactor"
|
||||
id="lora.spreadingFactor"
|
||||
name="lora.rxSpreadingFactor"
|
||||
id="lora.rxSpreadingFactor"
|
||||
required=""
|
||||
>
|
||||
<option value="7">
|
||||
SF7 - Lowest battery usage
|
||||
</option>
|
||||
<option value="7">SF7 - Lowest battery usage</option>
|
||||
<option value="8">SF8</option>
|
||||
<option value="9">SF9</option>
|
||||
<option value="10">SF10</option>
|
||||
<option value="11">SF11</option>
|
||||
<option value="12" selected>
|
||||
SF12 - Highest sensitivity
|
||||
</option>
|
||||
<option value="12" selected>SF12 - Highest sensitivity</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="lora.codingRate4"
|
||||
class="form-label">
|
||||
Coding Rate
|
||||
for="lora.txSpreadingFactor"
|
||||
class="form-label"
|
||||
>Tx Spreading Factor
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.codingRate4"
|
||||
id="lora.codingRate4"
|
||||
name="lora.txSpreadingFactor"
|
||||
id="lora.txSpreadingFactor"
|
||||
required=""
|
||||
>
|
||||
<option value="5">5</option>
|
||||
<option value="7">SF7 - Lowest battery usage</option>
|
||||
<option value="8">SF8</option>
|
||||
<option value="9">SF9</option>
|
||||
<option value="10">SF10</option>
|
||||
<option value="11">SF11</option>
|
||||
<option value="12" selected>SF12 - Highest sensitivity</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="lora.rxCodingRate4"
|
||||
class="form-label">
|
||||
Rx Coding Rate
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.rxCodingRate4"
|
||||
id="lora.rxCodingRate4"
|
||||
required=""
|
||||
>
|
||||
<option value="5" selected>5</option>
|
||||
<option value="6">6</option>
|
||||
<option value="7">7</option>
|
||||
<option value="8">8</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="lora.txCodingRate4"
|
||||
class="form-label">
|
||||
Tx Coding Rate
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.txCodingRate4"
|
||||
id="lora.txCodingRate4"
|
||||
required=""
|
||||
>
|
||||
<option value="5" selected>5</option>
|
||||
<option value="6">6</option>
|
||||
<option value="7">7</option>
|
||||
<option value="8">8</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="lora.rxSignalBandwidth"
|
||||
class="form-label"
|
||||
>Rx Signal Bandwidth
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.rxSignalBandwidth"
|
||||
id="lora.rxSignalBandwidth"
|
||||
required=""
|
||||
>
|
||||
<option value="62500">62.5 kHz</option>
|
||||
<option value="125000" selected>125 kHz</option>
|
||||
<option value="250000">250 kHz</option>
|
||||
<option value="500000">500 kHz</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="lora.txSignalBandwidth"
|
||||
class="form-label"
|
||||
>Tx Signal Bandwidth
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.txSignalBandwidth"
|
||||
id="lora.txSignalBandwidth"
|
||||
required=""
|
||||
>
|
||||
<option value="62500">62.5 kHz</option>
|
||||
<option value="125000" selected>125 kHz</option>
|
||||
<option value="250000">250 kHz</option>
|
||||
<option value="500000">500 kHz</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 mt-3">
|
||||
<label
|
||||
for="lora.power"
|
||||
class="form-label">
|
||||
@@ -997,7 +1002,7 @@
|
||||
>dBm</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1057,7 +1062,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
<div class="row mt-1">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="display.timeout"
|
||||
@@ -1136,8 +1141,8 @@
|
||||
Calculate voltage divider accordingly.
|
||||
</small>
|
||||
</div>
|
||||
<div class="col-9 mt-2">
|
||||
<div class="row mt-2">
|
||||
<div class="col-9">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
@@ -1166,7 +1171,7 @@
|
||||
>(Send Voltage As Telemetry)</label
|
||||
>
|
||||
</div>
|
||||
<div class="form-check form-switch mt-3">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="battery.monitorInternalVoltage"
|
||||
@@ -1318,7 +1323,7 @@
|
||||
</h5>
|
||||
<small>Define Wx telemetry</small>
|
||||
</div>
|
||||
<div class="col-9 mt-2">
|
||||
<div class="col-9">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="form-check form-switch">
|
||||
@@ -1339,7 +1344,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="row mt-2">
|
||||
<div class="col-6">
|
||||
<label for="wxsensor.heightCorrection" class="form-label"
|
||||
>Height Correction (Above Sea-Level)</label
|
||||
@@ -1407,18 +1412,37 @@
|
||||
>
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="syslog.active"
|
||||
id="syslog.active"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="syslog.active"
|
||||
class="form-label"
|
||||
>Enable syslog</label
|
||||
>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="syslog.active"
|
||||
id="syslog.active"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="syslog.active"
|
||||
class="form-label"
|
||||
>Enable syslog</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="syslog.logBeaconOverTCPIP"
|
||||
id="syslog.logBeaconOverTCPIP"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="syslog.logBeaconOverTCPIP"
|
||||
class="form-label"
|
||||
>Log Beacon over TCP/IP</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
@@ -1449,21 +1473,7 @@
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="syslog.logBeaconOverTCPIP"
|
||||
id="syslog.logBeaconOverTCPIP"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="syslog.logBeaconOverTCPIP"
|
||||
class="form-label"
|
||||
>Log Beacon over TCP/IP</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1584,7 +1594,7 @@
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -1599,7 +1609,24 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="mqtt.beaconOverMqtt"
|
||||
id="mqtt.beaconOverMqtt"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="mqtt.beaconOverMqtt"
|
||||
class="form-label"
|
||||
>Send (also) iGate Beacon</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="mqtt.server"
|
||||
class="form-label"
|
||||
@@ -1614,11 +1641,11 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="mqtt.topic"
|
||||
class="form-label"
|
||||
>Topic</label
|
||||
>Topic <small>(Default is <strong>aprs-igate</strong>)</small></label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
@@ -1629,11 +1656,10 @@
|
||||
placeholder="aprs-igate"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-text">
|
||||
Default is <strong>aprs-igate</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="mqtt.username"
|
||||
class="form-label"
|
||||
@@ -1648,7 +1674,7 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="mqtt.password"
|
||||
class="form-label"
|
||||
@@ -1663,11 +1689,13 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="mqtt.port"
|
||||
class="form-label"
|
||||
>Port</label
|
||||
>Port <small>(Default is <strong>1883</strong>)</small></label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
@@ -1681,24 +1709,6 @@
|
||||
min="0"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-text">
|
||||
Default is <strong>1883</strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="mqtt.beaconOverMqtt"
|
||||
id="mqtt.beaconOverMqtt"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="mqtt.beaconOverMqtt"
|
||||
class="form-label"
|
||||
>Send iGate Beacon to MQTT</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1726,9 +1736,9 @@
|
||||
Reboot Time
|
||||
</h5>
|
||||
</div>
|
||||
<div class="col-9 mt-2">
|
||||
<div class="col-9">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -1743,8 +1753,6 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="other.rebootModeTime"
|
||||
@@ -1799,49 +1807,55 @@
|
||||
WiFi Auto AP
|
||||
</h5>
|
||||
<small
|
||||
>Add your password and WiFi AP timeout to
|
||||
auto access point. Auto AP will start if
|
||||
there is no WiFi connection. Timeout will
|
||||
count from startup or last client
|
||||
disconnected.</small
|
||||
>WiFi AP will start if there is no WiFi
|
||||
connection available. Timeout will count from
|
||||
startup or last client disconnected.</small
|
||||
>
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="col-12">
|
||||
<label
|
||||
for="wifi.autoAP.password"
|
||||
class="form-label"
|
||||
>Password</label
|
||||
>
|
||||
<input
|
||||
type="password"
|
||||
name="wifi.autoAP.password"
|
||||
id="wifi.autoAP.password"
|
||||
class="form-control"
|
||||
placeholder="1234567890"
|
||||
required=""
|
||||
/>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<label
|
||||
for="wifi.autoAP.timeout"
|
||||
class="form-label"
|
||||
>WiFi AP timeout to search again for available WiFi's
|
||||
<small>(in minutes)</small></label
|
||||
>
|
||||
<input
|
||||
type="number"
|
||||
name="wifi.autoAP.timeout"
|
||||
id="wifi.autoAP.timeout"
|
||||
class="form-control"
|
||||
placeholder="10"
|
||||
required=""
|
||||
step="1"
|
||||
min="0"
|
||||
/>
|
||||
<div class="form-text">
|
||||
Set to <strong>0</strong> if you don't
|
||||
want WiFi AP to stop.
|
||||
<div class="col-9">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="wifi.autoAP.password"
|
||||
class="form-label"
|
||||
>Password</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="password"
|
||||
name="wifi.autoAP.password"
|
||||
id="wifi.autoAP.password"
|
||||
class="form-control"
|
||||
placeholder="1234567890"
|
||||
required=""
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="wifi.autoAP.timeout"
|
||||
class="form-label"
|
||||
>WiFiAP timeout (to search again)</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
name="wifi.autoAP.timeout"
|
||||
id="wifi.autoAP.timeout"
|
||||
class="form-control"
|
||||
placeholder="10"
|
||||
required=""
|
||||
step="1"
|
||||
min="0"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>minutes</span
|
||||
>
|
||||
<div class="form-text">
|
||||
Set to <strong>0</strong> if you don't
|
||||
want WiFi AP to stop.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1872,27 +1886,29 @@
|
||||
>
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="col-12">
|
||||
<label for="ota.username" class="form-label"
|
||||
>Username</label
|
||||
>
|
||||
<input
|
||||
type="text"
|
||||
name="ota.username"
|
||||
id="ota.username"
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<label for="ota.password" class="form-label"
|
||||
>Password</label
|
||||
>
|
||||
<input
|
||||
type="password"
|
||||
name="ota.password"
|
||||
id="ota.password"
|
||||
class="form-control"
|
||||
/>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<label for="ota.username" class="form-label"
|
||||
>Username</label
|
||||
>
|
||||
<input
|
||||
type="text"
|
||||
name="ota.username"
|
||||
id="ota.username"
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<label for="ota.password" class="form-label"
|
||||
>Password</label
|
||||
>
|
||||
<input
|
||||
type="password"
|
||||
name="ota.password"
|
||||
id="ota.password"
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1922,46 +1938,46 @@
|
||||
>
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="webadmin.active"
|
||||
id="webadmin.active"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="webadmin.active"
|
||||
class="form-label"
|
||||
>Web interface authentication</label
|
||||
>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="webadmin.active"
|
||||
id="webadmin.active"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="webadmin.active"
|
||||
class="form-label"
|
||||
>Web interface authentication</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="webadmin.username" class="form-label"
|
||||
>Username</label
|
||||
>
|
||||
<input
|
||||
type="text"
|
||||
name="webadmin.username"
|
||||
id="webadmin.username"
|
||||
class="form-control"
|
||||
value="admin"
|
||||
required=""
|
||||
/>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<label for="webadmin.password" class="form-label"
|
||||
>Password</label
|
||||
>
|
||||
<input
|
||||
type="password"
|
||||
name="webadmin.password"
|
||||
id="webadmin.password"
|
||||
class="form-control"
|
||||
/>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<label for="webadmin.username" class="form-label"
|
||||
>Username</label
|
||||
>
|
||||
<input
|
||||
type="text"
|
||||
name="webadmin.username"
|
||||
id="webadmin.username"
|
||||
class="form-control"
|
||||
value="admin"
|
||||
required=""
|
||||
/>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<label for="webadmin.password" class="form-label"
|
||||
>Password</label
|
||||
>
|
||||
<input
|
||||
type="password"
|
||||
name="webadmin.password"
|
||||
id="webadmin.password"
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -2005,21 +2021,19 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="remoteManagement.rfOnly"
|
||||
id="remoteManagement.rfOnly"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="remoteManagement.rfOnly"
|
||||
class="form-label"
|
||||
>Managers commands only via RF (not APRS-IS)</label
|
||||
>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="remoteManagement.rfOnly"
|
||||
id="remoteManagement.rfOnly"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="remoteManagement.rfOnly"
|
||||
class="form-label"
|
||||
>Managers commands only via RF (not APRS-IS)</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -2049,41 +2063,43 @@
|
||||
</small>
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="col-12">
|
||||
<label
|
||||
for="ntp.server"
|
||||
class="form-label"
|
||||
>NTP Server hostname</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="text"
|
||||
name="ntp.server"
|
||||
id="ntp.server"
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label
|
||||
for="ntp.gmtCorrection"
|
||||
class="form-label"
|
||||
>GMT Time Correction for accurate Local Time</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
name="ntp.gmtCorrection"
|
||||
id="ntp.gmtCorrection"
|
||||
placeholder="0"
|
||||
class="form-control"
|
||||
step="0.25"
|
||||
min="-23.75"
|
||||
max="23.75"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>hours</span
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="ntp.server"
|
||||
class="form-label"
|
||||
>NTP Server hostname</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="text"
|
||||
name="ntp.server"
|
||||
id="ntp.server"
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="ntp.gmtCorrection"
|
||||
class="form-label"
|
||||
>GMT Time Correction Offset</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
name="ntp.gmtCorrection"
|
||||
id="ntp.gmtCorrection"
|
||||
placeholder="0"
|
||||
class="form-control"
|
||||
step="0.25"
|
||||
min="-23.75"
|
||||
max="23.75"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>hours</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -119,7 +119,11 @@ function loadSettings(settings) {
|
||||
document.getElementById("beacon.interval").value = settings.beacon.interval;
|
||||
document.getElementById("other.rememberStationTime").value = settings.other.rememberStationTime;
|
||||
document.getElementById("beacon.sendViaAPRSIS").checked = settings.beacon.sendViaAPRSIS;
|
||||
|
||||
document.getElementById("beacon.sendViaRF").checked = settings.beacon.sendViaRF;
|
||||
document.getElementById("beacon.beaconFreq").value = settings.beacon.beaconFreq;
|
||||
BeaconingViaRFCheckbox.checked = settings.beacon.sendViaRF;
|
||||
BeaconingFrequency.disabled = !BeaconingViaRFCheckbox.checked;
|
||||
|
||||
document.getElementById("beacon.statusActive").checked = settings.beacon.statusActive;
|
||||
document.getElementById("beacon.statusPacket").value = settings.beacon.statusPacket;
|
||||
@@ -135,16 +139,18 @@ function loadSettings(settings) {
|
||||
// Digi
|
||||
document.getElementById("digi.mode").value = settings.digi.mode;
|
||||
document.getElementById("digi.ecoMode").value = settings.digi.ecoMode;
|
||||
document.getElementById("digi.beaconOnRxFreq").value = settings.digi.beaconOnRxFreq;
|
||||
|
||||
// LoRa
|
||||
document.getElementById("lora.txFreq").value = settings.lora.txFreq;
|
||||
document.getElementById("lora.rxFreq").value = settings.lora.rxFreq;
|
||||
document.getElementById("lora.txActive").checked = settings.lora.txActive;
|
||||
document.getElementById("lora.rxActive").checked = settings.lora.rxActive;
|
||||
document.getElementById("lora.spreadingFactor").value = settings.lora.spreadingFactor;
|
||||
document.getElementById("lora.signalBandwidth").value = settings.lora.signalBandwidth;
|
||||
document.getElementById("lora.codingRate4").value = settings.lora.codingRate4;
|
||||
document.getElementById("lora.rxFreq").value = settings.lora.rxFreq;
|
||||
document.getElementById("lora.rxSpreadingFactor").value = settings.lora.rxSpreadingFactor;
|
||||
document.getElementById("lora.rxCodingRate4").value = settings.lora.rxCodingRate4;
|
||||
document.getElementById("lora.rxSignalBandwidth").value = settings.lora.rxSignalBandwidth;
|
||||
document.getElementById("lora.txActive").checked = settings.lora.txActive;
|
||||
document.getElementById("lora.txFreq").value = settings.lora.txFreq;
|
||||
document.getElementById("lora.txSpreadingFactor").value = settings.lora.txSpreadingFactor;
|
||||
document.getElementById("lora.txCodingRate4").value = settings.lora.txCodingRate4;
|
||||
document.getElementById("lora.txSignalBandwidth").value = settings.lora.txSignalBandwidth;
|
||||
document.getElementById("lora.power").value = settings.lora.power;
|
||||
|
||||
// Display
|
||||
@@ -252,7 +258,6 @@ function loadSettings(settings) {
|
||||
document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode;
|
||||
|
||||
updateImage();
|
||||
refreshSpeedStandard();
|
||||
}
|
||||
|
||||
function showToast(message) {
|
||||
@@ -304,6 +309,12 @@ function updateImage() {
|
||||
}
|
||||
}
|
||||
|
||||
// Beaconing Switches
|
||||
const BeaconingViaRFCheckbox = document.querySelector('input[name="beacon.sendViaRF"]');
|
||||
const BeaconingFrequency = document.querySelector('select[name="beacon.beaconFreq"]');
|
||||
BeaconingViaRFCheckbox.addEventListener("change", function() {
|
||||
BeaconingFrequency.disabled = !this.checked;
|
||||
});
|
||||
|
||||
// Status Switch
|
||||
const StatusCheckbox = document.querySelector('input[name="beacon.statusActive"]');
|
||||
@@ -458,65 +469,6 @@ document
|
||||
updateImage();
|
||||
});
|
||||
|
||||
const speedStandards = {
|
||||
300: [125, 5, 12],
|
||||
244: [125, 6, 12],
|
||||
209: [125, 7, 12],
|
||||
183: [125, 8, 12],
|
||||
610: [125, 8, 10],
|
||||
1200: [125, 7, 9],
|
||||
};
|
||||
|
||||
function refreshSpeedStandard() {
|
||||
const bw = Number(document.getElementById("lora.signalBandwidth").value);
|
||||
const cr4 = Number(document.getElementById("lora.codingRate4").value);
|
||||
const sf = Number(document.getElementById("lora.spreadingFactor").value);
|
||||
|
||||
let found = false;
|
||||
|
||||
for (const speed in speedStandards) {
|
||||
const standard = speedStandards[speed];
|
||||
|
||||
if (standard[0] !== bw / 1000) continue;
|
||||
if (standard[1] !== cr4) continue;
|
||||
if (standard[2] !== sf) continue;
|
||||
|
||||
document.getElementById("action.speed").value = speed;
|
||||
found = true;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
document.getElementById("action.speed").value = "";
|
||||
}
|
||||
}
|
||||
|
||||
document
|
||||
.getElementById("lora.signalBandwidth")
|
||||
.addEventListener("focusout", refreshSpeedStandard);
|
||||
document
|
||||
.getElementById("lora.codingRate4")
|
||||
.addEventListener("focusout", refreshSpeedStandard);
|
||||
document
|
||||
.getElementById("lora.spreadingFactor")
|
||||
.addEventListener("focusout", refreshSpeedStandard);
|
||||
|
||||
document.getElementById("action.speed").addEventListener("change", function () {
|
||||
const speed = document.getElementById("action.speed").value;
|
||||
|
||||
if (speed !== "") {
|
||||
const value = speedStandards[Number(speed)];
|
||||
|
||||
const bw = value[0];
|
||||
const cr4 = value[1];
|
||||
const sf = value[2];
|
||||
|
||||
document.getElementById("lora.signalBandwidth").value = bw * 1000;
|
||||
document.getElementById("lora.codingRate4").value = cr4;
|
||||
document.getElementById("lora.spreadingFactor").value = sf;
|
||||
}
|
||||
});
|
||||
|
||||
const form = document.querySelector("form");
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 150 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 711 KiB |
@@ -45,12 +45,13 @@ public:
|
||||
String overlay;
|
||||
String symbol;
|
||||
String path;
|
||||
bool sendViaRF;
|
||||
bool sendViaAPRSIS;
|
||||
bool gpsActive;
|
||||
bool gpsAmbiguity;
|
||||
bool sendViaRF;
|
||||
int beaconFreq;
|
||||
bool statusActive;
|
||||
String statusPacket;
|
||||
bool gpsActive;
|
||||
bool gpsAmbiguity;
|
||||
};
|
||||
|
||||
class APRS_IS {
|
||||
@@ -67,19 +68,21 @@ public:
|
||||
class DIGI {
|
||||
public:
|
||||
int mode;
|
||||
int ecoMode; // 0 = Not Active | 1 = Ultra EcoMode | 2 = Not Active (WiFi OFF, Serial ON)
|
||||
bool beaconOnRxFreq;
|
||||
int ecoMode; // 0 = Not Active | 1 = Ultra EcoMode | 2 = Not Active (WiFi OFF, Serial ON)
|
||||
};
|
||||
|
||||
class LoraModule {
|
||||
public:
|
||||
long txFreq;
|
||||
long rxFreq;
|
||||
bool txActive;
|
||||
bool rxActive;
|
||||
int spreadingFactor;
|
||||
long signalBandwidth;
|
||||
int codingRate4;
|
||||
long rxFreq;
|
||||
int rxSpreadingFactor;
|
||||
int rxCodingRate4;
|
||||
long rxSignalBandwidth;
|
||||
bool txActive;
|
||||
long txFreq;
|
||||
int txSpreadingFactor;
|
||||
int txCodingRate4;
|
||||
long txSignalBandwidth;
|
||||
int power;
|
||||
};
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝
|
||||
|
||||
|
||||
Ricardo Guzman - CA2RXU
|
||||
Ricardo Guzman - CA2RXU
|
||||
https://github.com/richonguzman/LoRa_APRS_iGate
|
||||
(donations : http://paypal.me/richonguzman)
|
||||
___________________________________________________________________*/
|
||||
@@ -67,8 +67,8 @@ ___________________________________________________________________*/
|
||||
#endif
|
||||
|
||||
|
||||
String versionDate = "2025-10-12";
|
||||
String versionNumber = "3.1.3";
|
||||
String versionDate = "2025-10-15";
|
||||
String versionNumber = "3.1.4";
|
||||
Configuration Config;
|
||||
WiFiClient aprsIsClient;
|
||||
WiFiClient mqttClient;
|
||||
|
||||
@@ -68,9 +68,11 @@ bool Configuration::writeFile() {
|
||||
data["beacon"]["longitude"] = beacon.longitude;
|
||||
data["beacon"]["overlay"] = beacon.overlay;
|
||||
data["beacon"]["symbol"] = beacon.symbol;
|
||||
data["beacon"]["path"] = beacon.path;
|
||||
|
||||
data["beacon"]["sendViaAPRSIS"] = beacon.sendViaAPRSIS;
|
||||
data["beacon"]["sendViaRF"] = beacon.sendViaRF;
|
||||
data["beacon"]["path"] = beacon.path;
|
||||
data["beacon"]["beaconFreq"] = beacon.beaconFreq;
|
||||
|
||||
data["beacon"]["statusActive"] = beacon.statusActive;
|
||||
data["beacon"]["statusPacket"] = beacon.statusPacket;
|
||||
@@ -87,16 +89,18 @@ bool Configuration::writeFile() {
|
||||
#if defined(HAS_A7670)
|
||||
if (digi.ecoMode == 1) data["digi"]["ecoMode"] = 2;
|
||||
#endif
|
||||
data["digi"]["beaconOnRxFreq"] = digi.beaconOnRxFreq;
|
||||
|
||||
data["lora"]["rxFreq"] = loramodule.rxFreq;
|
||||
data["lora"]["txFreq"] = loramodule.txFreq;
|
||||
data["lora"]["spreadingFactor"] = loramodule.spreadingFactor;
|
||||
data["lora"]["signalBandwidth"] = loramodule.signalBandwidth;
|
||||
data["lora"]["codingRate4"] = loramodule.codingRate4;
|
||||
data["lora"]["power"] = loramodule.power;
|
||||
data["lora"]["txActive"] = loramodule.txActive;
|
||||
data["lora"]["rxActive"] = loramodule.rxActive;
|
||||
data["lora"]["rxFreq"] = loramodule.rxFreq;
|
||||
data["lora"]["rxSpreadingFactor"] = loramodule.rxSpreadingFactor;
|
||||
data["lora"]["rxCodingRate4"] = loramodule.rxCodingRate4;
|
||||
data["lora"]["rxSignalBandwidth"] = loramodule.rxSignalBandwidth;
|
||||
data["lora"]["txActive"] = loramodule.txActive;
|
||||
data["lora"]["txFreq"] = loramodule.txFreq;
|
||||
data["lora"]["txSpreadingFactor"] = loramodule.txSpreadingFactor;
|
||||
data["lora"]["txCodingRate4"] = loramodule.txCodingRate4;
|
||||
data["lora"]["txSignalBandwidth"] = loramodule.txSignalBandwidth;
|
||||
data["lora"]["power"] = loramodule.power;
|
||||
|
||||
data["display"]["alwaysOn"] = display.alwaysOn;
|
||||
data["display"]["timeout"] = display.timeout;
|
||||
@@ -223,6 +227,7 @@ bool Configuration::readFile() {
|
||||
!data["beacon"].containsKey("path") ||
|
||||
!data["beacon"].containsKey("sendViaAPRSIS") ||
|
||||
!data["beacon"].containsKey("sendViaRF") ||
|
||||
!data["beacon"].containsKey("beaconFreq") ||
|
||||
!data["beacon"].containsKey("statusActive") ||
|
||||
!data["beacon"].containsKey("statusPacket") ||
|
||||
!data["beacon"].containsKey("gpsActive") ||
|
||||
@@ -236,6 +241,7 @@ bool Configuration::readFile() {
|
||||
beacon.path = data["beacon"]["path"] | "WIDE1-1";
|
||||
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
|
||||
beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
|
||||
beacon.beaconFreq = data["beacon"]["beaconFreq"] | 1;
|
||||
beacon.statusActive = data["beacon"]["statusActive"] | false;
|
||||
beacon.statusPacket = data["beacon"]["statusPacket"] | "";
|
||||
beacon.gpsActive = data["beacon"]["gpsActive"] | false;
|
||||
@@ -248,34 +254,37 @@ bool Configuration::readFile() {
|
||||
blacklist = data["blacklist"] | "station callsign";
|
||||
|
||||
if (!data["digi"].containsKey("mode") ||
|
||||
!data["digi"].containsKey("ecoMode") ||
|
||||
!data["digi"].containsKey("beaconOnRxFreq")) needsRewrite = true;
|
||||
!data["digi"].containsKey("ecoMode")) needsRewrite = true;
|
||||
digi.mode = data["digi"]["mode"] | 0;
|
||||
digi.ecoMode = data["digi"]["ecoMode"] | 0;
|
||||
if (digi.ecoMode == 1) shouldSleepStop = false;
|
||||
digi.beaconOnRxFreq = data["digi"]["beaconOnRxFreq"] | false;
|
||||
|
||||
#if defined(HAS_A7670)
|
||||
if (digi.ecoMode == 1) digi.ecoMode = 2;
|
||||
#endif
|
||||
|
||||
if (!data["lora"].containsKey("txFreq") ||
|
||||
if (!data["lora"].containsKey("rxActive") ||
|
||||
!data["lora"].containsKey("rxFreq") ||
|
||||
!data["lora"].containsKey("spreadingFactor") ||
|
||||
!data["lora"].containsKey("signalBandwidth") ||
|
||||
!data["lora"].containsKey("codingRate4") ||
|
||||
!data["lora"].containsKey("power") ||
|
||||
!data["lora"].containsKey("rxSpreadingFactor") ||
|
||||
!data["lora"].containsKey("rxCodingRate4") ||
|
||||
!data["lora"].containsKey("rxSignalBandwidth") ||
|
||||
!data["lora"].containsKey("txActive") ||
|
||||
!data["lora"].containsKey("rxActive")) needsRewrite = true;
|
||||
loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
|
||||
!data["lora"].containsKey("txFreq") ||
|
||||
!data["lora"].containsKey("txSpreadingFactor") ||
|
||||
!data["lora"].containsKey("txCodingRate4") ||
|
||||
!data["lora"].containsKey("txSignalBandwidth") ||
|
||||
!data["lora"].containsKey("power")) needsRewrite = true;
|
||||
loramodule.rxActive = data["lora"]["rxActive"] | true;
|
||||
loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000;
|
||||
loramodule.spreadingFactor = data["lora"]["spreadingFactor"] | 12;
|
||||
loramodule.signalBandwidth = data["lora"]["signalBandwidth"] | 125000;
|
||||
loramodule.codingRate4 = data["lora"]["codingRate4"] | 5;
|
||||
loramodule.power = data["lora"]["power"] | 20;
|
||||
loramodule.rxSpreadingFactor = data["lora"]["rxSpreadingFactor"] | 12;
|
||||
loramodule.rxCodingRate4 = data["lora"]["rxCodingRate4"] | 5;
|
||||
loramodule.rxSignalBandwidth = data["lora"]["rxSignalBandwidth"] | 125000;
|
||||
loramodule.txActive = data["lora"]["txActive"] | false;
|
||||
loramodule.rxActive = data["lora"]["rxActive"] | false;
|
||||
|
||||
loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
|
||||
loramodule.txSpreadingFactor = data["lora"]["txSpreadingFactor"] | 12;
|
||||
loramodule.txCodingRate4 = data["lora"]["txCodingRate4"] | 5;
|
||||
loramodule.txSignalBandwidth = data["lora"]["txSignalBandwidth"] | 125000;
|
||||
loramodule.power = data["lora"]["power"] | 20;
|
||||
|
||||
if (!data["display"].containsKey("alwaysOn") ||
|
||||
!data["display"].containsKey("timeout") ||
|
||||
!data["display"].containsKey("turn180")) needsRewrite = true;
|
||||
@@ -427,10 +436,12 @@ void Configuration::setDefaultValues() {
|
||||
beacon.interval = 15;
|
||||
beacon.overlay = "L";
|
||||
beacon.symbol = "a";
|
||||
beacon.sendViaAPRSIS = true;
|
||||
beacon.sendViaRF = false;
|
||||
beacon.path = "WIDE1-1";
|
||||
|
||||
beacon.sendViaAPRSIS = true;
|
||||
beacon.sendViaRF = false;
|
||||
beacon.beaconFreq = 1;
|
||||
|
||||
beacon.statusActive = false;
|
||||
beacon.statusPacket = "";
|
||||
|
||||
@@ -443,16 +454,18 @@ void Configuration::setDefaultValues() {
|
||||
|
||||
digi.mode = 0;
|
||||
digi.ecoMode = 0;
|
||||
digi.beaconOnRxFreq = false;
|
||||
|
||||
loramodule.txFreq = 433775000;
|
||||
loramodule.rxFreq = 433775000;
|
||||
loramodule.spreadingFactor = 12;
|
||||
loramodule.signalBandwidth = 125000;
|
||||
loramodule.codingRate4 = 5;
|
||||
loramodule.power = 20;
|
||||
loramodule.txActive = false;
|
||||
loramodule.rxActive = true;
|
||||
loramodule.rxFreq = 433775000;
|
||||
loramodule.rxSpreadingFactor = 12;
|
||||
loramodule.rxCodingRate4 = 5;
|
||||
loramodule.rxSignalBandwidth = 125000;
|
||||
loramodule.txActive = false;
|
||||
loramodule.txFreq = 433775000;
|
||||
loramodule.txSpreadingFactor = 12;
|
||||
loramodule.txCodingRate4 = 5;
|
||||
loramodule.txSignalBandwidth = 125000;
|
||||
loramodule.power = 20;
|
||||
|
||||
display.alwaysOn = true;
|
||||
display.timeout = 4;
|
||||
|
||||
@@ -93,10 +93,10 @@ namespace LoRa_Utils {
|
||||
#if defined(HAS_SX1278) || defined(HAS_SX1276)
|
||||
radio.setDio0Action(setFlag, RISING);
|
||||
#endif
|
||||
radio.setSpreadingFactor(Config.loramodule.spreadingFactor);
|
||||
float signalBandwidth = Config.loramodule.signalBandwidth/1000;
|
||||
radio.setBandwidth(signalBandwidth);
|
||||
radio.setCodingRate(Config.loramodule.codingRate4);
|
||||
radio.setSpreadingFactor(Config.loramodule.rxSpreadingFactor);
|
||||
radio.setCodingRate(Config.loramodule.rxCodingRate4);
|
||||
float signalBandwidth = Config.loramodule.rxSignalBandwidth/1000;
|
||||
radio.setBandwidth(signalBandwidth);
|
||||
radio.setCRC(true);
|
||||
|
||||
#if (defined(RADIO_RXEN) && defined(RADIO_TXEN)) // QRP Labs LightGateway has 400M22S (SX1268)
|
||||
@@ -129,22 +129,28 @@ namespace LoRa_Utils {
|
||||
}
|
||||
|
||||
void changeFreqTx() {
|
||||
delay(500);
|
||||
delay(300);
|
||||
float freq = (float)Config.loramodule.txFreq / 1000000;
|
||||
radio.setFrequency(freq);
|
||||
radio.setSpreadingFactor(Config.loramodule.txSpreadingFactor);
|
||||
radio.setCodingRate(Config.loramodule.txCodingRate4);
|
||||
radio.setBandwidth(Config.loramodule.txSignalBandwidth);
|
||||
}
|
||||
|
||||
void changeFreqRx() {
|
||||
delay(500);
|
||||
delay(300);
|
||||
float freq = (float)Config.loramodule.rxFreq / 1000000;
|
||||
radio.setFrequency(freq);
|
||||
radio.setSpreadingFactor(Config.loramodule.rxSpreadingFactor);
|
||||
radio.setCodingRate(Config.loramodule.rxCodingRate4);
|
||||
radio.setBandwidth(Config.loramodule.rxSignalBandwidth);
|
||||
}
|
||||
|
||||
void sendNewPacket(const String& newPacket) {
|
||||
if (!Config.loramodule.txActive) return;
|
||||
|
||||
if (Config.loramodule.txFreq != Config.loramodule.rxFreq) {
|
||||
if (!packetIsBeacon || (packetIsBeacon && !Config.digi.beaconOnRxFreq)) {
|
||||
if (!packetIsBeacon || (packetIsBeacon && Config.beacon.beaconFreq == 1)) {
|
||||
changeFreqTx();
|
||||
}
|
||||
}
|
||||
@@ -168,7 +174,7 @@ namespace LoRa_Utils {
|
||||
if (Config.digi.ecoMode != 1) digitalWrite(INTERNAL_LED_PIN, LOW); // disabled in Ultra Eco Mode
|
||||
#endif
|
||||
if (Config.loramodule.txFreq != Config.loramodule.rxFreq) {
|
||||
if (!packetIsBeacon || (packetIsBeacon && !Config.digi.beaconOnRxFreq)) {
|
||||
if (!packetIsBeacon || (packetIsBeacon && Config.beacon.beaconFreq == 1)) {
|
||||
changeFreqRx();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
extern Configuration Config;
|
||||
|
||||
WiFiUDP ntpUDP;
|
||||
NTPClient timeClient(ntpUDP, Config.ntp.server.c_str(), 0, 15 * 60 * 1000); // Update interval 15 min
|
||||
NTPClient* timeClient;
|
||||
|
||||
|
||||
namespace NTP_Utils {
|
||||
@@ -35,17 +35,17 @@ namespace NTP_Utils {
|
||||
void setup() {
|
||||
if (WiFi.status() == WL_CONNECTED && Config.digi.ecoMode == 0 && Config.callsign != "NOCALL-10") {
|
||||
int gmt = Config.ntp.gmtCorrection * 3600;
|
||||
timeClient.setTimeOffset(gmt);
|
||||
timeClient.begin();
|
||||
timeClient = new NTPClient(ntpUDP, Config.ntp.server.c_str(), gmt, 15 * 60 * 1000); // Update interval 15 min
|
||||
timeClient->begin();
|
||||
}
|
||||
}
|
||||
|
||||
void update() {
|
||||
if (WiFi.status() == WL_CONNECTED && Config.digi.ecoMode == 0 && Config.callsign != "NOCALL-10") timeClient.update();
|
||||
if (WiFi.status() == WL_CONNECTED && Config.digi.ecoMode == 0 && Config.callsign != "NOCALL-10") timeClient->update();
|
||||
}
|
||||
|
||||
String getFormatedTime() {
|
||||
if (Config.digi.ecoMode == 0) return timeClient.getFormattedTime();
|
||||
if (Config.digi.ecoMode == 0) return timeClient->getFormattedTime();
|
||||
return "DigiEcoMode Active";
|
||||
}
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace Utils {
|
||||
if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) {
|
||||
status.concat(":>");
|
||||
status.concat(Config.beacon.statusPacket);
|
||||
STATION_Utils::addToOutputPacketBuffer(status);
|
||||
STATION_Utils::addToOutputPacketBuffer(status, true); // treated also as beacon on Tx Freq
|
||||
statusAfterBoot = false;
|
||||
}
|
||||
}
|
||||
@@ -284,6 +284,7 @@ namespace Utils {
|
||||
Serial.println("Tx Freq less than 125kHz from Rx Freq ---> NOT VALID");
|
||||
displayShow("Tx Freq is less than ", "125kHz from Rx Freq", "device will autofix", "and then reboot", 1000);
|
||||
Config.loramodule.txFreq = Config.loramodule.rxFreq; // Inform about that but then change the TX QRG to RX QRG and reset the device
|
||||
Config.beacon.beaconFreq = 1; // return to LoRa Tx Beacon Freq
|
||||
Config.writeFile();
|
||||
ESP.restart();
|
||||
}
|
||||
|
||||
@@ -177,6 +177,7 @@ namespace WEB_Utils {
|
||||
Config.beacon.interval = getParamIntSafe("beacon.interval", Config.beacon.interval);
|
||||
Config.beacon.sendViaAPRSIS = request->hasParam("beacon.sendViaAPRSIS", true);
|
||||
Config.beacon.sendViaRF = request->hasParam("beacon.sendViaRF", true);
|
||||
Config.beacon.beaconFreq = getParamIntSafe("beacon.beaconFreq", Config.beacon.beaconFreq);
|
||||
Config.beacon.latitude = getParamDoubleSafe("beacon.latitude", Config.beacon.latitude);
|
||||
Config.beacon.longitude = getParamDoubleSafe("beacon.longitude", Config.beacon.longitude);
|
||||
Config.beacon.comment = getParamStringSafe("beacon.comment", Config.beacon.comment);
|
||||
@@ -198,16 +199,19 @@ namespace WEB_Utils {
|
||||
|
||||
Config.digi.mode = getParamIntSafe("digi.mode", Config.digi.mode);
|
||||
Config.digi.ecoMode = getParamIntSafe("digi.ecoMode", Config.digi.ecoMode);
|
||||
Config.digi.beaconOnRxFreq = request->hasParam("digi.beaconOnRxFreq", true);
|
||||
|
||||
|
||||
Config.loramodule.txFreq = getParamIntSafe("lora.txFreq", Config.loramodule.txFreq);
|
||||
Config.loramodule.rxFreq = getParamIntSafe("lora.rxFreq", Config.loramodule.rxFreq);
|
||||
Config.loramodule.spreadingFactor = getParamIntSafe("lora.spreadingFactor", Config.loramodule.spreadingFactor);
|
||||
Config.loramodule.signalBandwidth = getParamIntSafe("lora.signalBandwidth", Config.loramodule.signalBandwidth);
|
||||
Config.loramodule.codingRate4 = getParamIntSafe("lora.codingRate4", Config.loramodule.codingRate4);
|
||||
Config.loramodule.power = getParamIntSafe("lora.power", Config.loramodule.power);
|
||||
Config.loramodule.txActive = request->hasParam("lora.txActive", true);
|
||||
Config.loramodule.rxActive = request->hasParam("lora.rxActive", true);
|
||||
Config.loramodule.rxFreq = getParamIntSafe("lora.rxFreq", Config.loramodule.rxFreq);
|
||||
Config.loramodule.rxSpreadingFactor = getParamIntSafe("lora.rxSpreadingFactor", Config.loramodule.rxSpreadingFactor);
|
||||
Config.loramodule.rxCodingRate4 = getParamIntSafe("lora.rxCodingRate4", Config.loramodule.rxCodingRate4);
|
||||
Config.loramodule.rxSignalBandwidth = getParamIntSafe("lora.rxSignalBandwidth", Config.loramodule.rxSignalBandwidth);
|
||||
Config.loramodule.txActive = request->hasParam("lora.txActive", true);
|
||||
Config.loramodule.txFreq = getParamIntSafe("lora.txFreq", Config.loramodule.txFreq);
|
||||
Config.loramodule.txSpreadingFactor = getParamIntSafe("lora.txSpreadingFactor", Config.loramodule.txSpreadingFactor);
|
||||
Config.loramodule.txCodingRate4 = getParamIntSafe("lora.txCodingRate4", Config.loramodule.txCodingRate4);
|
||||
Config.loramodule.txSignalBandwidth = getParamIntSafe("lora.txSignalBandwidth", Config.loramodule.txSignalBandwidth);
|
||||
Config.loramodule.power = getParamIntSafe("lora.power", Config.loramodule.power);
|
||||
|
||||
|
||||
Config.display.alwaysOn = request->hasParam("display.alwaysOn", true);
|
||||
|
||||