Compare commits

..

6 Commits

Author SHA1 Message Date
richonguzman ba7ff2a2d9 WebUI change 2025-10-13 12:38:52 -03:00
richonguzman b44eb1028d no more speed standards on index 2025-10-13 02:03:18 -03:00
richonguzman d7602268f2 changes for Rx and Tx Lora Freq 2025-10-13 02:00:05 -03:00
richonguzman 2f6f9be28e Lora Config separated for Rx and Tx 2025-10-13 01:33:41 -03:00
richonguzman 92572245cd beacon Freq on digi mod 2025-10-12 21:45:23 -03:00
richonguzman 152217e71c startup delay added 2025-10-12 14:21:51 -03:00
10 changed files with 513 additions and 482 deletions
+11 -7
View File
@@ -39,14 +39,17 @@
"beaconOnRxFreq": false "beaconOnRxFreq": false
}, },
"lora": { "lora": {
"txFreq": 433775000, "rxActive": true,
"rxFreq": 433775000, "rxFreq": 433775000,
"spreadingFactor": 12, "rxSpreadingFactor": 12,
"signalBandwidth": 125000, "rxCodingRate4": 5,
"codingRate4": 5, "rxSignalBandwidth": 125000,
"power": 20,
"txActive": false, "txActive": false,
"rxActive": true "txFreq": 433775000,
"txSpreadingFactor": 12,
"txCodingRate4": 5,
"txSignalBandwidth": 125000,
"power": 20
}, },
"display": { "display": {
"alwaysOn": true, "alwaysOn": true,
@@ -110,6 +113,7 @@
"rememberStationTime": 30, "rememberStationTime": 30,
"backupDigiMode": false, "backupDigiMode": false,
"rebootMode": false, "rebootMode": false,
"rebootModeTime": 6 "rebootModeTime": 6,
"startupDelay": 0
} }
} }
+401 -355
View File
@@ -344,6 +344,28 @@
</button> </button>
</div> </div>
</div> </div>
<div class="col-6 mt-3">
<label
for="startupDelay"
class="form-label"
>Startup Delay<small>(To Allow Router/Modem to start WiFiAP before connection)</small></label
>
<div class="input-group">
<input
type="number"
name="startupDelay"
id="startupDelay"
placeholder="0"
class="form-control"
step="1"
min="0"
max="5"
/>
<span class="input-group-text"
>minutes</span
>
</div>
</div>
</div> </div>
</div> </div>
<hr> <hr>
@@ -550,7 +572,7 @@
</div> </div>
</div> </div>
<div class="row mt-4"> <div class="row mt-4">
<div class="col-12"> <div class="col-6">
<label <label
for="beacon.interval" for="beacon.interval"
class="form-label" class="form-label"
@@ -626,7 +648,7 @@
</h5> </h5>
<small>Add Callsigns with space between them to Blacklist them (* wild card allowed)</small> <small>Add Callsigns with space between them to Blacklist them (* wild card allowed)</small>
</div> </div>
<div class="col-9 mt-2"> <div class="col-9">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<label <label
@@ -667,7 +689,7 @@
</h5> </h5>
<small>Define the Digipeater mode</small> <small>Define the Digipeater mode</small>
</div> </div>
<div class="col-9 mt-2"> <div class="col-9">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<label <label
@@ -706,30 +728,37 @@
id="digi.ecoMode" id="digi.ecoMode"
> >
<option value="0"> <option value="0">
OFF (Normal Mode - WiFiAP enabled) OFF (Normal Mode - WiFiAP and Serial Output enabled)
</option> </option>
<option value="1"> <option value="1">
Ultra Eco Mode (Sleep till Packet Rx (WiFiAP/WebUI & Display disabled)) Ultra Eco Mode (Sleep till Packet Rx (WiFiAP/WebUI & Display disabled))
</option> </option>
<option value="2"> <option value="2">
OFF (Normal Mode - WiFiAP disabled) OFF (Normal Mode - WiFiAP disabled but Serial Output still enabled)
</option> </option>
</select> </select>
</div> </div>
<div class="col-12 mt-3"> <div class="col-12 mt-3">
<div class="form-check form-switch"> <label
<input for="digi.beaconOnRxFreq"
type="checkbox" class="form-label"
name="digi.beaconOnRxFreq" >Digipeater Beacon Frequency
id="digi.beaconOnRxFreq" <small
class="form-check-input" >(If Rx Freq different from Tx Freq).</small
/> ></label
<label >
for="digi.beaconOnRxFreq" <select
class="form-label" class="form-select form-select"
>Which Frequency to send Beacon: <small>(Disable: Tx Freq / Enable: Rx Freq)</small> name="digi.beaconOnRxFreq"
</label> id="digi.beaconOnRxFreq"
</div> >
<option value="false">
Beacon on Tx Freq
</option>
<option value="true">
Beacon on Rx Freq
</option>
</select>
</div> </div>
</div> </div>
</div> </div>
@@ -759,21 +788,6 @@
</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-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="col-6">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input <input
@@ -790,6 +804,40 @@
</div> </div>
</div> </div>
<div class="col-6"> <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 <label
for="lora.txFreq" for="lora.txFreq"
class="form-label" class="form-label"
@@ -817,136 +865,123 @@
</span> </span>
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6 mt-3">
<label <label
for="lora.rxFreq" for="lora.rxSpreadingFactor"
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"
class="form-label" class="form-label"
>Predefined speeds >Rx Spreading Factor
</label> </label>
<select <select
class="form-select form-select" class="form-select form-select"
name="action.speed" name="lora.rxSpreadingFactor"
id="action.speed" id="lora.rxSpreadingFactor"
>
<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"
required="" required=""
> >
<option value="7"> <option value="7">SF7 - Lowest battery usage</option>
SF7 - Lowest battery usage
</option>
<option value="8">SF8</option> <option value="8">SF8</option>
<option value="9">SF9</option> <option value="9">SF9</option>
<option value="10">SF10</option> <option value="10">SF10</option>
<option value="11">SF11</option> <option value="11">SF11</option>
<option value="12" selected> <option value="12" selected>SF12 - Highest sensitivity</option>
SF12 - Highest sensitivity
</option>
</select> </select>
</div> </div>
</div> <div class="col-6 mt-3">
<div class="row mt-3">
<div class="col-6">
<label <label
for="lora.codingRate4" for="lora.txSpreadingFactor"
class="form-label"> class="form-label"
Coding Rate >Tx Spreading Factor
</label> </label>
<select <select
class="form-select form-select" class="form-select form-select"
name="lora.codingRate4" name="lora.txSpreadingFactor"
id="lora.codingRate4" id="lora.txSpreadingFactor"
required="" 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="6">6</option>
<option value="7">7</option> <option value="7">7</option>
<option value="8">8</option> <option value="8">8</option>
</select> </select>
</div> </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 <label
for="lora.power" for="lora.power"
class="form-label"> class="form-label">
@@ -968,7 +1003,7 @@
>dBm</span >dBm</span
> >
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@@ -1028,7 +1063,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row mt-2"> <div class="row mt-1">
<div class="col-6"> <div class="col-6">
<label <label
for="display.timeout" for="display.timeout"
@@ -1107,8 +1142,8 @@
Calculate voltage divider accordingly. Calculate voltage divider accordingly.
</small> </small>
</div> </div>
<div class="col-9 mt-2"> <div class="col-9">
<div class="row mt-2"> <div class="row">
<div class="col-6"> <div class="col-6">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input <input
@@ -1137,7 +1172,7 @@
>(Send Voltage As Telemetry)</label >(Send Voltage As Telemetry)</label
> >
</div> </div>
<div class="form-check form-switch mt-3"> <div class="form-check form-switch">
<input <input
type="checkbox" type="checkbox"
name="battery.monitorInternalVoltage" name="battery.monitorInternalVoltage"
@@ -1289,7 +1324,7 @@
</h5> </h5>
<small>Define Wx telemetry</small> <small>Define Wx telemetry</small>
</div> </div>
<div class="col-9 mt-2"> <div class="col-9">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<div class="form-check form-switch"> <div class="form-check form-switch">
@@ -1310,7 +1345,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row mt-3"> <div class="row mt-2">
<div class="col-6"> <div class="col-6">
<label for="wxsensor.heightCorrection" class="form-label" <label for="wxsensor.heightCorrection" class="form-label"
>Height Correction (Above Sea-Level)</label >Height Correction (Above Sea-Level)</label
@@ -1378,18 +1413,37 @@
> >
</div> </div>
<div class="col-lg-9 col-sm-12"> <div class="col-lg-9 col-sm-12">
<div class="form-check form-switch"> <div class="row">
<input <div class="col-6">
type="checkbox" <div class="form-check form-switch">
name="syslog.active" <input
id="syslog.active" type="checkbox"
class="form-check-input" name="syslog.active"
/> id="syslog.active"
<label class="form-check-input"
for="syslog.active" />
class="form-label" <label
>Enable syslog</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>
<div class="row mt-3"> <div class="row mt-3">
<div class="col-6"> <div class="col-6">
@@ -1420,21 +1474,7 @@
class="form-control" class="form-control"
/> />
</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>
</div> </div>
</div> </div>
@@ -1555,7 +1595,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-check form-switch">
<input <input
type="checkbox" type="checkbox"
@@ -1570,7 +1610,24 @@
> >
</div> </div>
</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 <label
for="mqtt.server" for="mqtt.server"
class="form-label" class="form-label"
@@ -1585,11 +1642,11 @@
/> />
</div> </div>
</div> </div>
<div class="col-12"> <div class="col-6">
<label <label
for="mqtt.topic" for="mqtt.topic"
class="form-label" class="form-label"
>Topic</label >Topic <small>(Default is <strong>aprs-igate</strong>)</small></label
> >
<div class="input-group"> <div class="input-group">
<input <input
@@ -1600,11 +1657,10 @@
placeholder="aprs-igate" placeholder="aprs-igate"
/> />
</div> </div>
<div class="form-text">
Default is <strong>aprs-igate</strong>
</div>
</div> </div>
<div class="col-12"> </div>
<div class="row mt-3">
<div class="col-6">
<label <label
for="mqtt.username" for="mqtt.username"
class="form-label" class="form-label"
@@ -1619,7 +1675,7 @@
/> />
</div> </div>
</div> </div>
<div class="col-12 mt-3"> <div class="col-6">
<label <label
for="mqtt.password" for="mqtt.password"
class="form-label" class="form-label"
@@ -1634,11 +1690,13 @@
/> />
</div> </div>
</div> </div>
<div class="col-12 mt-3"> </div>
<div class="row mt-3">
<div class="col-6">
<label <label
for="mqtt.port" for="mqtt.port"
class="form-label" class="form-label"
>Port</label >Port <small>(Default is <strong>1883</strong>)</small></label
> >
<div class="input-group"> <div class="input-group">
<input <input
@@ -1652,24 +1710,6 @@
min="0" min="0"
/> />
</div> </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> </div>
</div> </div>
@@ -1697,9 +1737,9 @@
Reboot Time Reboot Time
</h5> </h5>
</div> </div>
<div class="col-9 mt-2"> <div class="col-9">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-6">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input <input
type="checkbox" type="checkbox"
@@ -1714,8 +1754,6 @@
> >
</div> </div>
</div> </div>
</div>
<div class="row mt-3">
<div class="col-6"> <div class="col-6">
<label <label
for="other.rebootModeTime" for="other.rebootModeTime"
@@ -1770,49 +1808,55 @@
WiFi Auto AP WiFi Auto AP
</h5> </h5>
<small <small
>Add your password and WiFi AP timeout to >WiFi AP will start if there is no WiFi
auto access point. Auto AP will start if connection available. Timeout will count from
there is no WiFi connection. Timeout will startup or last client disconnected.</small
count from startup or last client
disconnected.</small
> >
</div> </div>
<div class="col-lg-9 col-sm-12"> <div class="col-9">
<div class="col-12"> <div class="row">
<label <div class="col-6">
for="wifi.autoAP.password" <label
class="form-label" for="wifi.autoAP.password"
>Password</label class="form-label"
> >Password</label
<input >
type="password" <div class="input-group">
name="wifi.autoAP.password" <input
id="wifi.autoAP.password" type="password"
class="form-control" name="wifi.autoAP.password"
placeholder="1234567890" id="wifi.autoAP.password"
required="" class="form-control"
/> placeholder="1234567890"
</div> required=""
<div class="col-12 mt-3"> />
<label </div>
for="wifi.autoAP.timeout" </div>
class="form-label" <div class="col-6">
>WiFi AP timeout to search again for available WiFi's <label
<small>(in minutes)</small></label for="wifi.autoAP.timeout"
> class="form-label"
<input >WiFiAP timeout (to search again)</label
type="number" >
name="wifi.autoAP.timeout" <div class="input-group">
id="wifi.autoAP.timeout" <input
class="form-control" type="number"
placeholder="10" name="wifi.autoAP.timeout"
required="" id="wifi.autoAP.timeout"
step="1" class="form-control"
min="0" placeholder="10"
/> required=""
<div class="form-text"> step="1"
Set to <strong>0</strong> if you don't min="0"
want WiFi AP to stop. />
<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> </div>
</div> </div>
@@ -1843,27 +1887,29 @@
> >
</div> </div>
<div class="col-lg-9 col-sm-12"> <div class="col-lg-9 col-sm-12">
<div class="col-12"> <div class="row">
<label for="ota.username" class="form-label" <div class="col-6">
>Username</label <label for="ota.username" class="form-label"
> >Username</label
<input >
type="text" <input
name="ota.username" type="text"
id="ota.username" name="ota.username"
class="form-control" id="ota.username"
/> class="form-control"
</div> />
<div class="col-12 mt-3"> </div>
<label for="ota.password" class="form-label" <div class="col-6">
>Password</label <label for="ota.password" class="form-label"
> >Password</label
<input >
type="password" <input
name="ota.password" type="password"
id="ota.password" name="ota.password"
class="form-control" id="ota.password"
/> class="form-control"
/>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -1893,46 +1939,46 @@
> >
</div> </div>
<div class="col-lg-9 col-sm-12"> <div class="col-lg-9 col-sm-12">
<div class="row"> <div class="col-6">
<div class="col-12"> <div class="form-check form-switch">
<div class="form-check form-switch"> <input
<input type="checkbox"
type="checkbox" name="webadmin.active"
name="webadmin.active" id="webadmin.active"
id="webadmin.active" class="form-check-input"
class="form-check-input" />
/> <label
<label for="webadmin.active"
for="webadmin.active" class="form-label"
class="form-label" >Web interface authentication</label
>Web interface authentication</label >
>
</div>
</div> </div>
</div> </div>
<div class="col-12"> <div class="row">
<label for="webadmin.username" class="form-label" <div class="col-6">
>Username</label <label for="webadmin.username" class="form-label"
> >Username</label
<input >
type="text" <input
name="webadmin.username" type="text"
id="webadmin.username" name="webadmin.username"
class="form-control" id="webadmin.username"
value="admin" class="form-control"
required="" value="admin"
/> required=""
</div> />
<div class="col-12 mt-3"> </div>
<label for="webadmin.password" class="form-label" <div class="col-6">
>Password</label <label for="webadmin.password" class="form-label"
> >Password</label
<input >
type="password" <input
name="webadmin.password" type="password"
id="webadmin.password" name="webadmin.password"
class="form-control" id="webadmin.password"
/> class="form-control"
/>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -1976,21 +2022,19 @@
/> />
</div> </div>
</div> </div>
<div class="row"> <div class="col-12 mt-3">
<div class="col-12"> <div class="form-check form-switch">
<div class="form-check form-switch"> <input
<input type="checkbox"
type="checkbox" name="remoteManagement.rfOnly"
name="remoteManagement.rfOnly" id="remoteManagement.rfOnly"
id="remoteManagement.rfOnly" class="form-check-input"
class="form-check-input" />
/> <label
<label for="remoteManagement.rfOnly"
for="remoteManagement.rfOnly" class="form-label"
class="form-label" >Managers commands only via RF (not APRS-IS)</label
>Managers commands only via RF (not APRS-IS)</label >
>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -2020,41 +2064,43 @@
</small> </small>
</div> </div>
<div class="col-lg-9 col-sm-12"> <div class="col-lg-9 col-sm-12">
<div class="col-12"> <div class="row">
<label <div class="col-6">
for="ntp.server" <label
class="form-label" for="ntp.server"
>NTP Server hostname</label 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="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> </div>
</div> </div>
+10 -66
View File
@@ -95,6 +95,7 @@ function loadSettings(settings) {
networksContainer.appendChild(networkElement); networksContainer.appendChild(networkElement);
networkCount++; networkCount++;
}); });
document.getElementById("startupDelay").value = settings.startupDelay;
// APRS-IS // APRS-IS
document.getElementById("aprs_is.active").checked = settings.aprs_is.active; document.getElementById("aprs_is.active").checked = settings.aprs_is.active;
@@ -137,13 +138,16 @@ function loadSettings(settings) {
document.getElementById("digi.beaconOnRxFreq").value = settings.digi.beaconOnRxFreq; document.getElementById("digi.beaconOnRxFreq").value = settings.digi.beaconOnRxFreq;
// LoRa // 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.rxActive").checked = settings.lora.rxActive;
document.getElementById("lora.spreadingFactor").value = settings.lora.spreadingFactor; document.getElementById("lora.rxFreq").value = settings.lora.rxFreq;
document.getElementById("lora.signalBandwidth").value = settings.lora.signalBandwidth; document.getElementById("lora.rxSpreadingFactor").value = settings.lora.rxSpreadingFactor;
document.getElementById("lora.codingRate4").value = settings.lora.codingRate4; 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; document.getElementById("lora.power").value = settings.lora.power;
// Display // Display
@@ -251,7 +255,6 @@ function loadSettings(settings) {
document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode; document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode;
updateImage(); updateImage();
refreshSpeedStandard();
} }
function showToast(message) { function showToast(message) {
@@ -457,65 +460,6 @@ document
updateImage(); 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"); const form = document.querySelector("form");
+10 -6
View File
@@ -73,13 +73,16 @@ public:
class LoraModule { class LoraModule {
public: public:
long txFreq;
long rxFreq;
bool txActive;
bool rxActive; bool rxActive;
int spreadingFactor; long rxFreq;
long signalBandwidth; int rxSpreadingFactor;
int codingRate4; int rxCodingRate4;
long rxSignalBandwidth;
bool txActive;
long txFreq;
int txSpreadingFactor;
int txCodingRate4;
long txSignalBandwidth;
int power; int power;
}; };
@@ -169,6 +172,7 @@ public:
bool backupDigiMode; bool backupDigiMode;
bool rebootMode; bool rebootMode;
int rebootModeTime; int rebootModeTime;
int startupDelay;
String personalNote; String personalNote;
String blacklist; String blacklist;
std::vector<WiFi_AP> wifiAPs; std::vector<WiFi_AP> wifiAPs;
+1
View File
@@ -46,6 +46,7 @@ namespace Utils {
void checkRebootTime(); void checkRebootTime();
void checkSleepByLowBatteryVoltage(uint8_t mode); void checkSleepByLowBatteryVoltage(uint8_t mode);
bool checkValidCallsign(const String& callsign); bool checkValidCallsign(const String& callsign);
void startupDelay();
} }
+3 -9
View File
@@ -33,7 +33,7 @@
╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝
Ricardo Guzman - CA2RXU Ricardo Guzman - CA2RXU
https://github.com/richonguzman/LoRa_APRS_iGate https://github.com/richonguzman/LoRa_APRS_iGate
(donations : http://paypal.me/richonguzman) (donations : http://paypal.me/richonguzman)
___________________________________________________________________*/ ___________________________________________________________________*/
@@ -67,7 +67,7 @@ ___________________________________________________________________*/
#endif #endif
String versionDate = "2025-10-11"; String versionDate = "2025-10-13";
String versionNumber = "3.1.3"; String versionNumber = "3.1.3";
Configuration Config; Configuration Config;
WiFiClient aprsIsClient; WiFiClient aprsIsClient;
@@ -97,7 +97,6 @@ bool modemLoggedToAPRSIS = false;
std::vector<ReceivedPacket> receivedPackets; std::vector<ReceivedPacket> receivedPackets;
String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine; String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine;
//#define STARTUP_DELAY 5 //min
void setup() { void setup() {
@@ -108,12 +107,7 @@ void setup() {
Utils::validateFreqs(); Utils::validateFreqs();
GPS_Utils::setup(); GPS_Utils::setup();
STATION_Utils::loadBlacklistAndManagers(); STATION_Utils::loadBlacklistAndManagers();
Utils::startupDelay();
#ifdef STARTUP_DELAY // (TEST) just to wait for WiFi init of Routers
displayShow("", " STARTUP DELAY ...", "", "", 0);
delay(STARTUP_DELAY * 60 * 1000);
#endif
SLEEP_Utils::setup(); SLEEP_Utils::setup();
WIFI_Utils::setup(); WIFI_Utils::setup();
NTP_Utils::setup(); NTP_Utils::setup();
+46 -27
View File
@@ -45,6 +45,8 @@ bool Configuration::writeFile() {
} }
} }
data["other"]["startupDelay"] = startupDelay;
data["wifi"]["autoAP"]["password"] = wifiAutoAP.password; data["wifi"]["autoAP"]["password"] = wifiAutoAP.password;
data["wifi"]["autoAP"]["timeout"] = wifiAutoAP.timeout; data["wifi"]["autoAP"]["timeout"] = wifiAutoAP.timeout;
@@ -87,14 +89,17 @@ bool Configuration::writeFile() {
#endif #endif
data["digi"]["beaconOnRxFreq"] = digi.beaconOnRxFreq; 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"]["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"]["alwaysOn"] = display.alwaysOn;
data["display"]["timeout"] = display.timeout; data["display"]["timeout"] = display.timeout;
@@ -186,6 +191,9 @@ bool Configuration::readFile() {
wifiAPs.push_back(wifiap); wifiAPs.push_back(wifiap);
} }
if (!data["other"].containsKey("startupDelay")) needsRewrite = true;
startupDelay = data["other"]["startupDelay"] | 0;
if (!data["wifi"]["autoAP"].containsKey("password") || if (!data["wifi"]["autoAP"].containsKey("password") ||
!data["wifi"]["autoAP"].containsKey("timeout")) needsRewrite = true; !data["wifi"]["autoAP"].containsKey("timeout")) needsRewrite = true;
wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890"; wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890";
@@ -254,23 +262,29 @@ bool Configuration::readFile() {
if (digi.ecoMode == 1) digi.ecoMode = 2; if (digi.ecoMode == 1) digi.ecoMode = 2;
#endif #endif
if (!data["lora"].containsKey("txFreq") || if (!data["lora"].containsKey("rxActive") ||
!data["lora"].containsKey("rxFreq") || !data["lora"].containsKey("rxFreq") ||
!data["lora"].containsKey("spreadingFactor") || !data["lora"].containsKey("rxSpreadingFactor") ||
!data["lora"].containsKey("signalBandwidth") || !data["lora"].containsKey("rxCodingRate4") ||
!data["lora"].containsKey("codingRate4") || !data["lora"].containsKey("rxSignalBandwidth") ||
!data["lora"].containsKey("power") ||
!data["lora"].containsKey("txActive") || !data["lora"].containsKey("txActive") ||
!data["lora"].containsKey("rxActive")) needsRewrite = true; !data["lora"].containsKey("txFreq") ||
loramodule.txFreq = data["lora"]["txFreq"] | 433775000; !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.rxFreq = data["lora"]["rxFreq"] | 433775000;
loramodule.spreadingFactor = data["lora"]["spreadingFactor"] | 12; loramodule.rxSpreadingFactor = data["lora"]["rxSpreadingFactor"] | 12;
loramodule.signalBandwidth = data["lora"]["signalBandwidth"] | 125000; loramodule.rxCodingRate4 = data["lora"]["rxCodingRate4"] | 5;
loramodule.codingRate4 = data["lora"]["codingRate4"] | 5; loramodule.rxSignalBandwidth = data["lora"]["rxSignalBandwidth"] | 125000;
loramodule.power = data["lora"]["power"] | 20;
loramodule.txActive = data["lora"]["txActive"] | false; 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") || if (!data["display"].containsKey("alwaysOn") ||
!data["display"].containsKey("timeout") || !data["display"].containsKey("timeout") ||
!data["display"].containsKey("turn180")) needsRewrite = true; !data["display"].containsKey("turn180")) needsRewrite = true;
@@ -401,6 +415,8 @@ void Configuration::setDefaultValues() {
wifiAPs.push_back(wifiap); wifiAPs.push_back(wifiap);
startupDelay = 0;
wifiAutoAP.password = "1234567890"; wifiAutoAP.password = "1234567890";
wifiAutoAP.timeout = 10; wifiAutoAP.timeout = 10;
@@ -438,14 +454,17 @@ void Configuration::setDefaultValues() {
digi.ecoMode = 0; digi.ecoMode = 0;
digi.beaconOnRxFreq = false; 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.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.alwaysOn = true;
display.timeout = 4; display.timeout = 4;
+10 -4
View File
@@ -93,10 +93,10 @@ namespace LoRa_Utils {
#if defined(HAS_SX1278) || defined(HAS_SX1276) #if defined(HAS_SX1278) || defined(HAS_SX1276)
radio.setDio0Action(setFlag, RISING); radio.setDio0Action(setFlag, RISING);
#endif #endif
radio.setSpreadingFactor(Config.loramodule.spreadingFactor); radio.setSpreadingFactor(Config.loramodule.rxSpreadingFactor);
float signalBandwidth = Config.loramodule.signalBandwidth/1000; radio.setCodingRate(Config.loramodule.rxCodingRate4);
radio.setBandwidth(signalBandwidth); float signalBandwidth = Config.loramodule.rxSignalBandwidth/1000;
radio.setCodingRate(Config.loramodule.codingRate4); radio.setBandwidth(signalBandwidth);
radio.setCRC(true); radio.setCRC(true);
#if (defined(RADIO_RXEN) && defined(RADIO_TXEN)) // QRP Labs LightGateway has 400M22S (SX1268) #if (defined(RADIO_RXEN) && defined(RADIO_TXEN)) // QRP Labs LightGateway has 400M22S (SX1268)
@@ -132,12 +132,18 @@ namespace LoRa_Utils {
delay(500); delay(500);
float freq = (float)Config.loramodule.txFreq / 1000000; float freq = (float)Config.loramodule.txFreq / 1000000;
radio.setFrequency(freq); radio.setFrequency(freq);
radio.setSpreadingFactor(Config.loramodule.txSpreadingFactor);
radio.setCodingRate(Config.loramodule.txCodingRate4);
radio.setBandwidth(Config.loramodule.txSignalBandwidth);
} }
void changeFreqRx() { void changeFreqRx() {
delay(500); delay(500);
float freq = (float)Config.loramodule.rxFreq / 1000000; float freq = (float)Config.loramodule.rxFreq / 1000000;
radio.setFrequency(freq); radio.setFrequency(freq);
radio.setSpreadingFactor(Config.loramodule.rxSpreadingFactor);
radio.setCodingRate(Config.loramodule.rxCodingRate4);
radio.setBandwidth(Config.loramodule.rxSignalBandwidth);
} }
void sendNewPacket(const String& newPacket) { void sendNewPacket(const String& newPacket) {
+8 -1
View File
@@ -88,7 +88,7 @@ namespace Utils {
if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) { if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) {
status.concat(":>"); status.concat(":>");
status.concat(Config.beacon.statusPacket); status.concat(Config.beacon.statusPacket);
STATION_Utils::addToOutputPacketBuffer(status); STATION_Utils::addToOutputPacketBuffer(status, true); // treated also as beacon on Tx Freq
statusAfterBoot = false; statusAfterBoot = false;
} }
} }
@@ -436,4 +436,11 @@ namespace Utils {
return true; return true;
} }
void startupDelay() {
if (Config.startupDelay > 0) {
displayShow("", " STARTUP DELAY ...", "", "", 0);
delay(Config.startupDelay * 60 * 1000);
}
}
} }
+13 -7
View File
@@ -157,6 +157,8 @@ namespace WEB_Utils {
Config.wifiAPs.push_back(wifiap); Config.wifiAPs.push_back(wifiap);
} }
Config.startupDelay = getParamIntSafe("startupDelay", Config.startupDelay);
Config.callsign = getParamStringSafe("callsign", Config.callsign); Config.callsign = getParamStringSafe("callsign", Config.callsign);
Config.wifiAutoAP.password = getParamStringSafe("wifi.autoAP.password", Config.wifiAutoAP.password); Config.wifiAutoAP.password = getParamStringSafe("wifi.autoAP.password", Config.wifiAutoAP.password);
@@ -198,14 +200,18 @@ namespace WEB_Utils {
Config.digi.ecoMode = getParamIntSafe("digi.ecoMode", Config.digi.ecoMode); Config.digi.ecoMode = getParamIntSafe("digi.ecoMode", Config.digi.ecoMode);
Config.digi.beaconOnRxFreq = request->hasParam("digi.beaconOnRxFreq", true); 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.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); Config.display.alwaysOn = request->hasParam("display.alwaysOn", true);