Compare commits
93 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fb4712a33 | ||
|
|
39276b0d32 | ||
|
|
22203a7c24 | ||
|
|
d8d832fde9 | ||
|
|
61db6c3132 | ||
|
|
9521a357b1 | ||
|
|
ee95931f00 | ||
|
|
60aa2b05ac | ||
|
|
bc5183a192 | ||
|
|
1019306c7c | ||
|
|
fbe00903ad | ||
|
|
291a6bc80e | ||
|
|
3b550c7f81 | ||
|
|
4659f8b2ff | ||
|
|
62d157d7f0 | ||
|
|
b0e116ee1d | ||
|
|
00b12c2bf5 | ||
|
|
85b21565db | ||
|
|
b9e2c0e8f0 | ||
|
|
b763b4af78 | ||
|
|
5553e7ae5c | ||
|
|
1afd039c3f | ||
|
|
1888084f31 | ||
|
|
dc92b822c8 | ||
|
|
3c305259e0 | ||
|
|
497d648c17 | ||
|
|
d267f6699c | ||
|
|
16ce6bc6d2 | ||
|
|
008b6250ea | ||
|
|
ddb83d1368 | ||
|
|
26e2dec2b2 | ||
|
|
174507377b | ||
|
|
864ed44a5d | ||
|
|
5d69cfbe1c | ||
|
|
e57d356fd1 | ||
|
|
8381f0916c | ||
|
|
beca09293a | ||
|
|
dcca18eeac | ||
|
|
2494acea55 | ||
|
|
0c50ce8de4 | ||
|
|
2f07d35861 | ||
|
|
91240c5be6 | ||
|
|
b4308a95d5 | ||
|
|
6c301795d6 | ||
|
|
5f0c6f4986 | ||
|
|
7c989e6e9e | ||
|
|
2bcda6d3a4 | ||
|
|
848492dc36 | ||
|
|
413bef67fb | ||
|
|
3fa4c9371a | ||
|
|
e846c38f97 | ||
|
|
b8446e3f1d | ||
|
|
c3984bc8da | ||
|
|
601b72da9f | ||
|
|
5d9493314d | ||
|
|
86cf12d6c1 | ||
|
|
e5e2c6a980 | ||
|
|
3b9d49c5f9 | ||
|
|
ab9443140b | ||
|
|
ad1129c588 | ||
|
|
8bb0b0446c | ||
|
|
6b1d319901 | ||
|
|
1ceaf159ba | ||
|
|
f1de8d2df0 | ||
|
|
b9b4f46c66 | ||
|
|
22b2c679d2 | ||
|
|
7baa98bf7e | ||
|
|
35e79709e3 | ||
|
|
f4bae74c26 | ||
|
|
04e721ac5a | ||
|
|
1922d7453b | ||
|
|
f1bd751585 | ||
|
|
c346bc0f39 | ||
|
|
bbc1996918 | ||
|
|
505bb3d5a4 | ||
|
|
b97457146a | ||
|
|
64b51fea72 | ||
|
|
d82cf9235d | ||
|
|
d83bb19bc8 | ||
|
|
0feb0045d0 | ||
|
|
4999c89820 | ||
|
|
f5048edf84 | ||
|
|
691f60925a | ||
|
|
4bf4e781df | ||
|
|
0c09f5a934 | ||
|
|
494be4a393 | ||
|
|
16e79d291c | ||
|
|
c9a52d5b61 | ||
|
|
7d813524e3 | ||
|
|
2d7d02f2df | ||
|
|
562b0a46ea | ||
|
|
69c074a834 | ||
|
|
bf04507ed0 |
32
.github/workflows/build.yml
vendored
@@ -13,6 +13,8 @@ jobs:
|
||||
target:
|
||||
- name: ttgo-lora32-v21
|
||||
chip: esp32
|
||||
- name: ttgo-lora32-v21_915
|
||||
chip: esp32
|
||||
- name: heltec-lora32-v2
|
||||
chip: esp32
|
||||
- name: heltec_wifi_lora_32_V3
|
||||
@@ -21,34 +23,50 @@ jobs:
|
||||
chip: esp32s3
|
||||
- name: heltec_wireless_stick_lite_v3
|
||||
chip: esp32s3
|
||||
- name: heltec_wireless_stick_lite_v3_display
|
||||
chip: esp32s3
|
||||
- name: ESP32_DIY_LoRa
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_LoRa_915
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_1W_LoRa
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_1W_LoRa_915
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_1W_LoRa_Mesh_V1_2
|
||||
chip: esp32
|
||||
- name: ttgo-t-beam-v1_2
|
||||
chip: esp32
|
||||
- name: ttgo-t-beam-v1_2_915
|
||||
chip: esp32
|
||||
- name: ttgo-t-beam-v1
|
||||
chip: esp32
|
||||
- name: ttgo-t-beam-v1_915
|
||||
chip: esp32
|
||||
- name: ttgo-t-beam-v1_SX1268
|
||||
chip: esp32
|
||||
- name: ttgo-t-beam-v1_2_SX1262
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_LoRa_A7670
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_LoRa_A7670_915
|
||||
chip: esp32
|
||||
- name: heltec_wireless_tracker
|
||||
chip: esp32s3
|
||||
- name: heltec_ht-ct62
|
||||
chip: esp32c3
|
||||
- name: OE5HWN_MeshCom
|
||||
chip: esp32
|
||||
- name: WEMOS-LOLIN32-OLED-DIY
|
||||
chip: esp32
|
||||
- name: WEMOS-D1-R32-RA02
|
||||
chip: esp32
|
||||
- name: ttgo-lora32-v21-915
|
||||
chip: esp32
|
||||
- name: heltec_ht-ct62
|
||||
chip: esp32c3
|
||||
- name: esp32c3_DIY_1W_LoRa
|
||||
chip: esp32c3
|
||||
- name: esp32c3_DIY_1W_LoRa_915
|
||||
chip: esp32c3
|
||||
- name: ESP32_C3_OctopusLab_LoRa
|
||||
chip: esp32c3
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
@@ -81,7 +99,7 @@ jobs:
|
||||
run: |
|
||||
if [ "${{ matrix.target.chip }}" == "esp32" ]; then
|
||||
python installer/bin/esptool/esptool.py --chip esp32 merge_bin \
|
||||
-o installer/web_factory_${{ matrix.target.name }}.bin \
|
||||
-o installer/web_factory.bin \
|
||||
--flash_mode dio \
|
||||
--flash_freq 40m \
|
||||
--flash_size 4MB \
|
||||
@@ -92,7 +110,7 @@ jobs:
|
||||
0x3D0000 installer/firmware/spiffs.bin
|
||||
elif [ "${{ matrix.target.chip }}" == "esp32s3" ]; then
|
||||
python installer/bin/esptool/esptool.py --chip esp32s3 merge_bin \
|
||||
-o installer/web_factory_${{ matrix.target.name }}.bin \
|
||||
-o installer/web_factory.bin \
|
||||
--flash_mode dio \
|
||||
--flash_freq 40m \
|
||||
--flash_size 8MB \
|
||||
@@ -103,7 +121,7 @@ jobs:
|
||||
0x3D0000 installer/firmware/spiffs.bin
|
||||
elif [ "${{ matrix.target.chip }}" == "esp32c3" ]; then
|
||||
python installer/bin/esptool/esptool.py --chip esp32c3 merge_bin \
|
||||
-o installer/web_factory_${{ matrix.target.name }}.bin \
|
||||
-o installer/web_factory.bin \
|
||||
--flash_mode dio \
|
||||
--flash_freq 40m \
|
||||
--flash_size 4MB \
|
||||
|
||||
54
README.md
@@ -1,58 +1,62 @@
|
||||
# Richonguzman / CA2RXU LoRa APRS iGate/Digirepeater
|
||||
# CA2RXU LoRa APRS iGate/Digirepeater
|
||||
|
||||
This firmware is for using ESP32 based boards with LoRa Modules and GPS to live in the APRS world.
|
||||
|
||||

|
||||
|
||||
__(NOTE: This iGate Firmware was develop to work with all LoRa APRS Trackers and specially with this firmware <a href="https://github.com/richonguzman/LoRa_APRS_Tracker" target="_blank">LoRa APRS Tracker</a>)__
|
||||
|
||||
___________________________________________________
|
||||
__(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a href="https://github.com/richonguzman/LoRa_APRS_Tracker" target="_blank">LoRa APRS Tracker Firmware</a>))__
|
||||
<br />
|
||||
|
||||
## You can support this project to continue to grow:
|
||||
|
||||
[<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/github-sponsors.png">](https://github.com/sponsors/richonguzman) [<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/paypalme.png">](http://paypal.me/richonguzman)
|
||||
|
||||
____________________________________________________
|
||||
<br />
|
||||
|
||||
# WEB INSTALLER
|
||||
# WEB FLASHER/INSTALLER is <a href="https://richonguzman.github.io/lora-igate-web-flasher/installer.html" target="_blank">here</a>
|
||||
<br />
|
||||
|
||||
As easy as it gets, the new <a href="https://sq2cpa.github.io/lora-flasher/ca2rxu.html" target="_blank">Web Installer</a> (thanks Damian SQ2CPA)
|
||||
# WIKI
|
||||
|
||||
[<img src="https://github.com/richonguzman/LoRa_APRS_iGate/blob/main/images/WebFlasher.png">](https://sq2cpa.github.io/lora-flasher/ca2rxu.html)
|
||||
### FAQ, BME280, TNC and more --> <a href="https://github.com/richonguzman/LoRa_APRS_iGate/wiki/00.-FAQ-(frequently-asked-questions)" target="_blank">here</a>.
|
||||
|
||||
____________________________________________________
|
||||
### Installation Guide --> <a href="https://github.com/richonguzman/LoRa_APRS_iGate/wiki/01.-Installation-Guide" target="_blank">here</a>.
|
||||
<br />
|
||||
|
||||
# SUPPORTED BOARDS
|
||||
|
||||
- TTGO Lilygo LoRa32 v2.1 / v1.6 (they work the same)
|
||||
### Buying links --> <a href="https://github.com/richonguzman/LoRa_APRS_iGate/wiki/108.-Supported-Boards-and-Buying-Links" target="_blank">here</a>.
|
||||
|
||||
- TTGO T-Beam v1.0 , v1.1, v1.2 (also variations with SX1262 and SX1268 LoRa Modules)
|
||||
(NOTE: all boards with 433-868-915 MHz versions)
|
||||
|
||||
- HELTEC V2, V3 , Wireless Stick, HT-CT62, Wireless Tracker
|
||||
- TTGO Lilygo LoRa32 v2.1 / v1.6 (they work the same).
|
||||
|
||||
- ESP32 Wroom + SX1278 LoRa Module or 400M30S 1W LoRa Module for a DIY Versions.
|
||||
- TTGO T-Beam v1.0 , v1.1, v1.2 (also variations with SX1262 and SX1268 LoRa Modules).
|
||||
|
||||
- HELTEC V2, V3 , Wireless Stick, Wireless Stick Lite, HT-CT62, Wireless Tracker.
|
||||
|
||||
- ESP32 Wroom + SX1278 LoRa Module or Ebyte 400M30S (or 900M30S) 1W LoRa Module for a DIY Versions.
|
||||
|
||||
- ESP32C3 + Ebyte 400M30S(or 900M30S) 1W LoRa Module for another DIY version.
|
||||
|
||||
- ESP32 + 4G/LTE A7670 Modem + SX1278 DIY Version.
|
||||
|
||||
- Wemos Lolin32 Oled + SX1278 DIY Version.
|
||||
|
||||
<br />
|
||||
|
||||
### Buying links --> <a href="https://github.com/richonguzman/LoRa_APRS_iGate/wiki/Z.-------Supported-Boards-and-Buying-Links" target="_blank">here</a>.
|
||||
|
||||
____________________________________________________
|
||||
|
||||
# WIKI
|
||||
|
||||
### Installation Guide --> <a href="https://github.com/richonguzman/LoRa_APRS_iGate/wiki/01.-Installation-Guide" target="_blank">here</a>.
|
||||
|
||||
*(Wiki has all configuration explanation, supported boards list, adding BME/BMP Wx modules and more)*
|
||||
|
||||
____________________________________________________
|
||||
## Timeline (Versions):
|
||||
|
||||
- 2024.08.13 Web Authentication for WebUI. Thanks Mitja S57PNX.
|
||||
- 2024.08.05 WIDE2-n added to WIDE1-n in Digirepeater Modes.
|
||||
- 2024.06.27 External Voltage Divider Resistor configuration on WebUI. Thanks Tilen S54B.
|
||||
- 2024.06.26 Personal Note information on WebUI for the Station. Thanks Tilen S54B.
|
||||
- 2024.06.24 Callsign Validation fix. Thanks Helge SA7SKY.
|
||||
- 2024.06.21 Tx packets coming from APRS-IS are (now) formatted into 3rd Party (as they should have been since the beginning). Thanks Lynn KJ4ERJ and Geoffrey F4FXL.
|
||||
- 2024.06.18 All boards with 433 / 868 / 915 MHz versions.
|
||||
- 2024.06.10 ESP32C3 + 1W LoRa Module (E22 400M30S) support added.
|
||||
- 2024.06.09 Si7021 module added (with autodetected I2C Address)
|
||||
- 2024.06.08 Callsign Validation for all Rx and Tx Station that iGate/Digi hears.
|
||||
- 2024.06.08 Callsign Validation for all Station that iGate/Digi hears.
|
||||
- 2024.05.27 Battery Monitor for internal and External Voltages (to make board sleep and avoid low discharge of batterys) T-Beam boards now with Battery readings as well.
|
||||
- 2024.05.23 Forced Reboot Mode added.
|
||||
- 2024.05.22 Experimental backup-Digirepeater-Mode when "only" iGate mode loses WiFi connection added.
|
||||
|
||||
@@ -52,7 +52,9 @@
|
||||
"sendExternalVoltage": false,
|
||||
"externalVoltagePin": 34,
|
||||
"monitorExternalVoltage": false,
|
||||
"externalSleepVoltage": 10.9
|
||||
"externalSleepVoltage": 10.9,
|
||||
"voltageDividerR1": 100.0,
|
||||
"voltageDividerR2": 27.0
|
||||
},
|
||||
"bme": {
|
||||
"active": false,
|
||||
@@ -73,6 +75,10 @@
|
||||
"username": "",
|
||||
"password": ""
|
||||
},
|
||||
"webadmin": {
|
||||
"username": "admin",
|
||||
"password": ""
|
||||
},
|
||||
"other": {
|
||||
"rememberStationTime": 30,
|
||||
"lowPowerMode": false,
|
||||
@@ -80,5 +86,6 @@
|
||||
"backupDigiMode": false,
|
||||
"rebootMode": false,
|
||||
"rebootModeTime": 6
|
||||
}
|
||||
},
|
||||
"personalNote": ""
|
||||
}
|
||||
BIN
data_embed/favicon.png
Normal file
|
After Width: | Height: | Size: 813 B |
@@ -6,6 +6,7 @@
|
||||
<title>LoRa iGate & Digi software − Ricardo Guzman CA2RXU</title>
|
||||
<link rel="stylesheet" href="/bootstrap.css" />
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<link rel="icon" href="/favicon.png" type="image/x-icon">
|
||||
</head>
|
||||
<body class="bg-body-tertiary">
|
||||
<input type="file" accept="text/json,.json" style="display: none" />
|
||||
@@ -15,7 +16,7 @@
|
||||
>
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href=""
|
||||
>CA2RXU's LoRa</a
|
||||
>CA2RXU's LoRa iGate</a
|
||||
>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
@@ -107,10 +108,14 @@
|
||||
Station
|
||||
</h5>
|
||||
<small
|
||||
>Add your ham callsign and SSID. Optionally,
|
||||
you can leave a comment describing your
|
||||
station.</small
|
||||
>
|
||||
>Add your Ham callsign and SSID.
|
||||
<br>
|
||||
<br>
|
||||
You can leave a comment describing your station.
|
||||
<br>
|
||||
<br>
|
||||
In the bottom there is a field for personal note that can only be seen in WEB GUI.
|
||||
</small>
|
||||
</div>
|
||||
<div class="col-lg-9 col-sm-12">
|
||||
<div class="row">
|
||||
@@ -237,6 +242,20 @@
|
||||
class="form-control"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<label
|
||||
for="personalNote"
|
||||
class="form-label"
|
||||
>Personal Note</label
|
||||
>
|
||||
<input
|
||||
type="text"
|
||||
name="personalNote"
|
||||
id="personalNote"
|
||||
class="form-control"
|
||||
placeholder="A Couple of words."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -474,8 +493,8 @@
|
||||
for="beacon.sendViaAPRSIS"
|
||||
class="form-label"
|
||||
>Send our beacon to
|
||||
APRS-IS</label
|
||||
>
|
||||
APRS-IS
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
@@ -489,8 +508,8 @@
|
||||
<label
|
||||
for="beacon.sendViaRF"
|
||||
class="form-label"
|
||||
>Send beacon via RF</label
|
||||
>
|
||||
>Send beacon via RF
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 d-grid gap-2">
|
||||
@@ -502,8 +521,8 @@
|
||||
<label
|
||||
for="beacon.interval"
|
||||
class="form-label"
|
||||
>Interval</label
|
||||
>
|
||||
>Interval
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
@@ -516,8 +535,8 @@
|
||||
min="1"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>minutes</span
|
||||
>
|
||||
>minutes
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -561,6 +580,9 @@
|
||||
<option value="2">
|
||||
WIDE1 (fill-in) Digi
|
||||
</option>
|
||||
<option value="3">
|
||||
WIDE2 (+WIDE1) Digi
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -625,8 +647,8 @@
|
||||
<label
|
||||
for="lora.txFreq"
|
||||
class="form-label"
|
||||
>Tx Frequency</label
|
||||
>
|
||||
>Tx Frequency
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="text"
|
||||
@@ -644,17 +666,17 @@
|
||||
class="form-control"
|
||||
required=""
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>Hz</span
|
||||
>
|
||||
<span class="input-group-text">
|
||||
Hz
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="lora.rxFreq"
|
||||
class="form-label"
|
||||
>Rx Frequency</label
|
||||
>
|
||||
class="form-label">
|
||||
Rx Frequency
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="text"
|
||||
@@ -664,8 +686,8 @@
|
||||
class="form-control"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
>Hz</span
|
||||
>
|
||||
>Hz
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -674,8 +696,8 @@
|
||||
<label
|
||||
for="action.speed"
|
||||
class="form-label"
|
||||
>Predefined speeds</label
|
||||
>
|
||||
>Predefined speeds
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="action.speed"
|
||||
@@ -710,8 +732,8 @@
|
||||
<label
|
||||
for="lora.signalBandwidth"
|
||||
class="form-label"
|
||||
>Bandwidth</label
|
||||
>
|
||||
>Bandwidth
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<select
|
||||
class="form-select form-select"
|
||||
@@ -735,8 +757,8 @@
|
||||
<label
|
||||
for="lora.spreadingFactor"
|
||||
class="form-label"
|
||||
>Spreading Factor</label
|
||||
>
|
||||
>Spreading Factor
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.spreadingFactor"
|
||||
@@ -760,9 +782,9 @@
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="lora.codingRate4"
|
||||
class="form-label"
|
||||
>Coding Rate</label
|
||||
>
|
||||
class="form-label">
|
||||
Coding Rate
|
||||
</label>
|
||||
<select
|
||||
class="form-select form-select"
|
||||
name="lora.codingRate4"
|
||||
@@ -779,9 +801,9 @@
|
||||
<div class="col-6">
|
||||
<label
|
||||
for="lora.power"
|
||||
class="form-label"
|
||||
>Power</label
|
||||
>
|
||||
class="form-label">
|
||||
Power
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
@@ -925,7 +947,15 @@
|
||||
</svg>
|
||||
Battery
|
||||
</h5>
|
||||
<small>Battery Monitor & Health</small>
|
||||
<small>
|
||||
Battery Monitor & Health
|
||||
<br>
|
||||
<br>
|
||||
Max Voltage on input pin is 3.3V.
|
||||
<br>
|
||||
<br>
|
||||
Calculate voltage divider accordingly.
|
||||
</small>
|
||||
</div>
|
||||
<div class="col-9 mt-2">
|
||||
<div class="row mt-2">
|
||||
@@ -943,19 +973,6 @@
|
||||
>Send Internal Voltage</label
|
||||
>
|
||||
</div>
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="battery.sendExternalVoltage"
|
||||
id="battery.sendExternalVoltage"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="battery.sendExternalVoltage"
|
||||
class="form-label"
|
||||
>Send External Voltage</label
|
||||
>
|
||||
</div>
|
||||
<div class="form-check form-switch mt-3">
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -991,21 +1008,20 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="form-floating col-7">
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="text"
|
||||
name="battery.externalVoltagePin"
|
||||
id="battery.externalVoltagePin"
|
||||
value="34"
|
||||
class="form-control"
|
||||
type="checkbox"
|
||||
name="battery.sendExternalVoltage"
|
||||
id="battery.sendExternalVoltage"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="battery.externalVoltagePin"
|
||||
for="battery.sendExternalVoltage"
|
||||
class="form-label"
|
||||
>External Voltage Pin</label
|
||||
>Send External Voltage</label
|
||||
>
|
||||
</div>
|
||||
<div class="form-check form-switch mt-4">
|
||||
<div class="form-check form-switch mt-3">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="battery.monitorExternalVoltage"
|
||||
@@ -1038,6 +1054,52 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-floating col-7 mt-3">
|
||||
<input
|
||||
type="text"
|
||||
name="battery.externalVoltagePin"
|
||||
id="battery.externalVoltagePin"
|
||||
value="34"
|
||||
class="form-control"
|
||||
/>
|
||||
<label
|
||||
for="battery.externalVoltagePin"
|
||||
class="form-label"
|
||||
>External Voltage Pin</label
|
||||
>
|
||||
</div>
|
||||
<div class="col">
|
||||
<label for="battery.voltageDividerR1" class="form-label">External Voltage divider R1</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
name="battery.voltageDividerR1"
|
||||
id="battery.voltageDividerR1"
|
||||
placeholder="100.0"
|
||||
class="form-control"
|
||||
step="0.1"
|
||||
min="1"
|
||||
max="1000"
|
||||
/>
|
||||
<span class="input-group-text">kOhm</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<label for="battery.voltageDividerR2" class="form-label">External Voltage divider R2</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
name="battery.voltageDividerR2"
|
||||
id="battery.voltageDividerR2"
|
||||
placeholder="27.0"
|
||||
class="form-control"
|
||||
step="0.1"
|
||||
min="1"
|
||||
max="1000"
|
||||
/>
|
||||
<span class="input-group-text">kOhm</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1061,7 +1123,7 @@
|
||||
</svg>
|
||||
Telemetry
|
||||
</h5>
|
||||
<small>Define the telemetry</small>
|
||||
<small>Define Wx telemetry</small>
|
||||
</div>
|
||||
<div class="col-9 mt-2">
|
||||
<div class="row">
|
||||
@@ -1078,9 +1140,7 @@
|
||||
class="form-label"
|
||||
><b>Activate Wx Telemetry</b>
|
||||
<small
|
||||
>Requires a BME/BMP280 or
|
||||
BME680 sensor
|
||||
installed</small
|
||||
>Requires a BME/BMP280, BME680 or Si7021 sensor installed</small
|
||||
></label
|
||||
>
|
||||
</div>
|
||||
@@ -1339,7 +1399,7 @@
|
||||
type="number"
|
||||
name="other.rebootModeTime"
|
||||
id="other.rebootModeTime"
|
||||
placeholder="0"
|
||||
placeholder="6"
|
||||
class="form-control"
|
||||
step="6"
|
||||
min="6"
|
||||
@@ -1481,6 +1541,75 @@
|
||||
</div>
|
||||
<hr />
|
||||
|
||||
<div class="row my-5 d-flex align-items-top">
|
||||
<div class="col-lg-3 col-sm-12">
|
||||
<h5>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="20"
|
||||
height="20"
|
||||
fill="currentColor"
|
||||
class="bi bi-cloud-upload-fill"
|
||||
viewBox="0 0 16 16"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M8 0a5.53 5.53 0 0 0-3.594 1.342c-.766.66-1.321 1.52-1.464 2.383C1.266 4.095 0 5.555 0 7.318 0 9.366 1.708 11 3.781 11H7.5V5.707L5.354 7.854a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 5.707V11h4.188C14.502 11 16 9.57 16 7.773c0-1.636-1.242-2.969-2.834-3.194C12.923 1.999 10.69 0 8 0m-.5 14.5V11h1v3.5a.5.5 0 0 1-1 0"
|
||||
/>
|
||||
</svg>
|
||||
Admin
|
||||
</h5>
|
||||
<small
|
||||
>Set your username and password to allow
|
||||
access to the web interface.</small
|
||||
>
|
||||
</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>
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
<hr />
|
||||
|
||||
<div class="row my-5 d-flex align-items-top">
|
||||
<div class="col-lg-3 col-sm-12">
|
||||
<h5>
|
||||
@@ -1537,7 +1666,7 @@
|
||||
<label
|
||||
for="other.lowPowerMode"
|
||||
class="form-label"
|
||||
>Low power mode</label
|
||||
>Low power mode (only for HT-CT62)</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1702,4 +1831,4 @@
|
||||
</body>
|
||||
<script src="/bootstrap.js"></script>
|
||||
<script src="/script.js"></script>
|
||||
</html>
|
||||
</html>
|
||||
@@ -79,7 +79,7 @@ function loadSettings(settings) {
|
||||
document.getElementById("beacon.path").value = settings.beacon.path;
|
||||
document.getElementById("beacon.symbol").value = settings.beacon.symbol;
|
||||
document.getElementById("beacon.overlay").value = settings.beacon.overlay;
|
||||
|
||||
document.getElementById("personalNote").value = settings.personalNote;
|
||||
document.getElementById("action.symbol").value = settings.beacon.overlay + settings.beacon.symbol;
|
||||
|
||||
document.querySelector(".list-networks").innerHTML = "";
|
||||
@@ -162,6 +162,8 @@ function loadSettings(settings) {
|
||||
document.getElementById("battery.internalSleepVoltage").value = settings.battery.internalSleepVoltage.toFixed(1);
|
||||
document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage;
|
||||
document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin;
|
||||
document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1);
|
||||
document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.toFixed(1);
|
||||
document.getElementById("battery.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage;
|
||||
document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1);
|
||||
|
||||
@@ -199,6 +201,11 @@ function loadSettings(settings) {
|
||||
document.getElementById("ota.username").value = settings.ota.username;
|
||||
document.getElementById("ota.password").value = settings.ota.password;
|
||||
|
||||
// Webadmin
|
||||
document.getElementById("webadmin.active").checked = settings.webadmin.active;
|
||||
document.getElementById("webadmin.username").value = settings.webadmin.username;
|
||||
document.getElementById("webadmin.password").value = settings.webadmin.password;
|
||||
|
||||
// Experimental
|
||||
document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode;
|
||||
|
||||
@@ -271,8 +278,23 @@ function toggleFields() {
|
||||
'input[name="battery.externalVoltagePin"]'
|
||||
);
|
||||
|
||||
externalVoltagePinInput.disabled =
|
||||
!sendExternalVoltageCheckbox.checked;
|
||||
externalVoltagePinInput.disabled = !sendExternalVoltageCheckbox.checked;
|
||||
voltageDividerR1.disabled = !sendExternalVoltageCheckbox.checked;
|
||||
voltageDividerR2.disabled = !sendExternalVoltageCheckbox.checked;
|
||||
|
||||
const WebadminCheckbox = document.querySelector(
|
||||
'input[name="webadmin.active"]'
|
||||
);
|
||||
|
||||
const WebadminUsername = document.querySelector(
|
||||
'input[name="webadmin.username"]'
|
||||
);
|
||||
|
||||
const WebadminPassword = document.querySelector(
|
||||
'input[name="webadmin.password"]'
|
||||
);
|
||||
WebadminUsername.disabled = !WebadminCheckbox.checked;
|
||||
WebadminPassword.disabled = !WebadminCheckbox.checked;
|
||||
}
|
||||
|
||||
const sendExternalVoltageCheckbox = document.querySelector(
|
||||
@@ -282,8 +304,34 @@ const externalVoltagePinInput = document.querySelector(
|
||||
'input[name="battery.externalVoltagePin"]'
|
||||
);
|
||||
|
||||
const voltageDividerR1 = document.querySelector(
|
||||
'input[name="battery.voltageDividerR1"]'
|
||||
);
|
||||
|
||||
const voltageDividerR2 = document.querySelector(
|
||||
'input[name="battery.voltageDividerR2"]'
|
||||
);
|
||||
|
||||
sendExternalVoltageCheckbox.addEventListener("change", function () {
|
||||
externalVoltagePinInput.disabled = !this.checked;
|
||||
voltageDividerR1.disabled = !this.checked;
|
||||
voltageDividerR2.disabled = !this.checked;
|
||||
});
|
||||
|
||||
const WebadminCheckbox = document.querySelector(
|
||||
'input[name="webadmin.active"]'
|
||||
);
|
||||
|
||||
const WebadminUsername = document.querySelector(
|
||||
'input[name="webadmin.username"]'
|
||||
);
|
||||
|
||||
const WebadminPassword = document.querySelector(
|
||||
'input[name="webadmin.password"]'
|
||||
);
|
||||
WebadminCheckbox.addEventListener("change", function () {
|
||||
WebadminUsername.disabled = !this.checked;
|
||||
WebadminPassword.disabled = !this.checked;
|
||||
});
|
||||
|
||||
document.querySelector(".new button").addEventListener("click", function () {
|
||||
|
||||
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 112 KiB |
BIN
images/Web002-WiFi Access.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
images/Web003-APRS-IS.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 103 KiB |
BIN
images/Web004-Beaconing.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
images/Web005-Digirepeating.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 40 KiB |
BIN
images/Web006-LoRa.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
images/Web007-Display.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 56 KiB |
BIN
images/Web008-Battery.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 84 KiB |
BIN
images/Web009-Telemetry.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 152 KiB |
BIN
images/Web011-TNC.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
images/Web012-Reboot.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
images/Web013-AutoAP.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
images/Web014-OTA.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
images/Web015-Experimental.png
Normal file
|
After Width: | Height: | Size: 203 KiB |
|
Before Width: | Height: | Size: 133 KiB |
BIN
images/WebFlasherGithub.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
@@ -1,39 +0,0 @@
|
||||
@echo off
|
||||
echo Loading...
|
||||
|
||||
where /q python.exe
|
||||
if %errorlevel% neq 0 (
|
||||
echo "Python is not installed. Please install it and try again."
|
||||
exit /b
|
||||
)
|
||||
|
||||
where /q pip
|
||||
if %errorlevel% neq 0 (
|
||||
echo "pip is not installed. Please install it and try again."
|
||||
exit /b
|
||||
)
|
||||
|
||||
pip show pyserial >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo "Installing pyserial..."
|
||||
pip install pyserial
|
||||
)
|
||||
|
||||
echo Your firmware will be upgraded without factory reset.
|
||||
|
||||
echo:
|
||||
|
||||
echo IF THIS IS YOUR FIRST FLASH ON THIS BOARD PLEASE USE install_with_factory_reset.bat INSTEAD!
|
||||
|
||||
echo:
|
||||
|
||||
echo Available COM ports:
|
||||
python.exe -c "import serial.tools.list_ports; print('\n'.join([str(c) for c in serial.tools.list_ports.comports()]))"
|
||||
|
||||
echo:
|
||||
|
||||
set /p port="Enter COM port (for example COM5): "
|
||||
|
||||
python.exe ./bin/esptool/esptool.py --chip esp32 --port "%port%" --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 firmware/bootloader.bin 0x8000 firmware/partitions.bin 0xe000 firmware/boot_app0.bin 0x10000 firmware/firmware.bin
|
||||
|
||||
pause
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/bin/bash
|
||||
echo "Your firmware will be upgraded without factory reset."
|
||||
echo "IF THIS IS YOUR FIRST FLASH ON THIS BOARD PLEASE USE install_with_factory_reset.sh INSTEAD!"
|
||||
|
||||
read -p "Enter COM port (for example /dev/ttyS5): " port
|
||||
|
||||
PYTHON_CMD=python
|
||||
if command -v python3 &> /dev/null
|
||||
then
|
||||
PYTHON_CMD=python3
|
||||
fi
|
||||
|
||||
PYTHON_CMD ./bin/esptool/esptool.py --chip esp32 --port "$port" --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 firmware/bootloader.bin 0x8000 firmware/partitions.bin 0xe000 firmware/boot_app0.bin 0x10000 firmware/firmware.bin
|
||||
|
||||
echo "Firmware flashed"
|
||||
@@ -1,44 +0,0 @@
|
||||
@echo off
|
||||
echo Loading...
|
||||
|
||||
where /q python.exe
|
||||
if %errorlevel% neq 0 (
|
||||
echo "Python is not installed. Please install it and try again."
|
||||
exit /b
|
||||
)
|
||||
|
||||
where /q pip
|
||||
if %errorlevel% neq 0 (
|
||||
echo "pip is not installed. Please install it and try again."
|
||||
exit /b
|
||||
)
|
||||
|
||||
pip show pyserial >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo "Installing pyserial..."
|
||||
pip install pyserial
|
||||
)
|
||||
|
||||
|
||||
echo Your current configuration will be LOST!!!
|
||||
echo Your current configuration will be LOST!!!
|
||||
echo Your current configuration will be LOST!!!
|
||||
|
||||
echo:
|
||||
|
||||
echo If you already have this board flashed with our firmware please use install_upgrade.bat instead!
|
||||
|
||||
echo:
|
||||
|
||||
echo Available COM ports:
|
||||
python.exe -c "import serial.tools.list_ports; print('\n'.join([str(c) for c in serial.tools.list_ports.comports()]))"
|
||||
|
||||
echo:
|
||||
|
||||
set /p port="Enter COM port (for example COM5): "
|
||||
|
||||
python.exe bin/esptool/esptool.py --chip esp32 --port "%port%" --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size 4MB 2686976 firmware/spiffs.bin
|
||||
|
||||
python.exe bin/esptool/esptool.py --chip esp32 --port "%port%" --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 firmware/bootloader.bin 0x8000 firmware/partitions.bin 0xe000 firmware/boot_app0.bin 0x10000 firmware/firmware.bin
|
||||
|
||||
pause
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/bin/bash
|
||||
echo "Your firmware will be upgraded without factory reset."
|
||||
echo "IF THIS IS YOUR FIRST FLASH ON THIS BOARD PLEASE USE install_with_factory_reset.sh INSTEAD!"
|
||||
|
||||
read -p "Enter COM port (for example /dev/ttyS5): " port
|
||||
|
||||
PYTHON_CMD=python
|
||||
if command -v python3 &> /dev/null
|
||||
then
|
||||
PYTHON_CMD=python3
|
||||
fi
|
||||
|
||||
$PYTHON_CMD ./bin/esptool/esptool.py --chip esp32 --port "$port" --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size 4MB 2686976 firmware/spiffs.bin
|
||||
|
||||
$PYTHON_CMD ./bin/esptool/esptool.py --chip esp32 --port "$port" --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 firmware/bootloader.bin 0x8000 firmware/partitions.bin 0xe000 firmware/boot_app0.bin 0x10000 firmware/firmware.bin
|
||||
|
||||
echo "Firmware flashed"
|
||||
171
platformio.ini
@@ -22,6 +22,7 @@ board_build.embed_files =
|
||||
data_embed/script.js.gz
|
||||
data_embed/bootstrap.css.gz
|
||||
data_embed/bootstrap.js.gz
|
||||
data_embed/favicon.png.gz
|
||||
extra_scripts =
|
||||
pre:tools/compress.py
|
||||
debug_tool = esp-prog
|
||||
@@ -46,11 +47,25 @@ build_flags =
|
||||
-Werror -Wall
|
||||
-DTTGO_T_LORA32_V2_1
|
||||
-DHAS_SX1278
|
||||
-DHAS_ADC_CALIBRATION
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ttgo-lora32-v21_915]
|
||||
board = ttgo-lora32-v21
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DTTGO_T_LORA32_V2_1_915
|
||||
-DHAS_SX1276
|
||||
-DHAS_ADC_CALIBRATION
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:heltec-lora32-v2]
|
||||
board = ttgo-lora32-v21
|
||||
@@ -101,18 +116,16 @@ build_flags =
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
|
||||
[env:heltec_ht-ct62]
|
||||
board = heltec_wireless_stick_lite
|
||||
board_build.mcu = esp32c3
|
||||
[env:heltec_wireless_stick_lite_v3_display]
|
||||
board = esp32-s3-devkitc-1
|
||||
board_build.mcu = esp32s3
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DHELTEC_HTCT62
|
||||
-DHELTEC_WSL_V3_DISPLAY
|
||||
-DHAS_SX1262
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ESP32_DIY_LoRa]
|
||||
board = esp32dev
|
||||
@@ -126,18 +139,58 @@ lib_deps =
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ESP32_DIY_LoRa_915]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32_DIY_LoRa_915
|
||||
-DHAS_SX1276
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ESP32_DIY_1W_LoRa]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32_DIY_1W_LoRa
|
||||
-DHAS_SX1268
|
||||
-DHAS_1W_LORA
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ESP32_DIY_1W_LoRa_915]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32_DIY_1W_LoRa_915
|
||||
-DHAS_SX1262
|
||||
-DHAS_1W_LORA
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ESP32_DIY_1W_LoRa_Mesh_V1_2]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32_DIY_1W_LoRa_Mesh_V1_2
|
||||
-DHAS_SX1268
|
||||
-DHAS_1W_LORA
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
|
||||
[env:ttgo-t-beam-v1_2]
|
||||
board = ttgo-t-beam
|
||||
build_flags =
|
||||
@@ -152,6 +205,20 @@ lib_deps =
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
lewisxhe/XPowersLib @ 0.2.4
|
||||
|
||||
[env:ttgo-t-beam-v1_2_915]
|
||||
board = ttgo-t-beam
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DTTGO_T_Beam_V1_2_915
|
||||
-DHAS_SX1276
|
||||
-DHAS_AXP2101
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
lewisxhe/XPowersLib @ 0.2.4
|
||||
|
||||
[env:ttgo-t-beam-v1]
|
||||
board = ttgo-t-beam
|
||||
build_flags =
|
||||
@@ -166,6 +233,20 @@ lib_deps =
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
lewisxhe/XPowersLib @ 0.2.4
|
||||
|
||||
[env:ttgo-t-beam-v1_915]
|
||||
board = ttgo-t-beam
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DTTGO_T_Beam_V1_0_915
|
||||
-DHAS_SX1276
|
||||
-DHAS_AXP192
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
lewisxhe/XPowersLib @ 0.2.4
|
||||
|
||||
[env:ttgo-t-beam-v1_SX1268]
|
||||
board = ttgo-t-beam
|
||||
build_flags =
|
||||
@@ -200,6 +281,22 @@ build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32_DIY_LoRa_A7670
|
||||
-DHAS_SX1278
|
||||
-DHAS_A7670
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
vshymanskyy/TinyGSM @ 0.12.0
|
||||
vshymanskyy/StreamDebugger @ 1.0.1
|
||||
|
||||
[env:ESP32_DIY_LoRa_A7670_915]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32_DIY_LoRa_A7670_915
|
||||
-DHAS_SX1276
|
||||
-DHAS_A7670
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
@@ -245,12 +342,26 @@ lib_deps =
|
||||
${common.lib_deps}
|
||||
bodmer/TFT_eSPI @ 2.5.43
|
||||
|
||||
[env:heltec_ht-ct62]
|
||||
board = heltec_wireless_stick_lite
|
||||
board_build.mcu = esp32c3
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DHELTEC_HTCT62
|
||||
-DHAS_SX1262
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:OE5HWN_MeshCom]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DOE5HWN_MeshCom
|
||||
-DHAS_SX1268
|
||||
-DHAS_1W_LORA
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
@@ -281,26 +392,46 @@ lib_deps =
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ttgo-lora32-v21-915]
|
||||
board = ttgo-lora32-v21
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DTTGO_T_LORA32_V2_1_915
|
||||
-DHAS_SX1276
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:esp32c3_DIY_1W_LoRa]
|
||||
extends = env:esp32
|
||||
board = esp32-c3-devkitm-1
|
||||
board_build.mcu = esp32c3
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32C3_DIY_1W_LoRa
|
||||
-DHAS_SX1268
|
||||
-DHAS_1W_LORA
|
||||
-DARDUINO_USB_MODE=1
|
||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:esp32c3_DIY_1W_LoRa_915]
|
||||
board = esp32-c3-devkitm-1
|
||||
board_build.mcu = esp32c3
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32C3_DIY_1W_LoRa_915
|
||||
-DHAS_SX1262
|
||||
-DHAS_1W_LORA
|
||||
-DARDUINO_USB_MODE=1
|
||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:ESP32_C3_OctopusLab_LoRa]
|
||||
board = esp32-c3-devkitm-1
|
||||
board_build.mcu = esp32c3
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
-DESP32_C3_OctopusLab_LoRa
|
||||
-DHAS_SX1268
|
||||
-DRADIO_HAS_XTAL
|
||||
-DARDUINO_USB_MODE=1
|
||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include "display.h"
|
||||
#include "utils.h"
|
||||
|
||||
#if defined(ESP32_DIY_LoRa_A7670)
|
||||
#ifdef HAS_A7670
|
||||
#define TINY_GSM_MODEM_SIM7600 //The AT instruction of A7670 is compatible with SIM7600
|
||||
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
|
||||
#define SerialAT Serial1
|
||||
@@ -33,7 +33,7 @@
|
||||
bool checkModemOn() {
|
||||
bool modemReady = false;
|
||||
Serial.print("Starting Modem ... ");
|
||||
show_display(firstLine, "Starting Modem...", " ", " ", 0);
|
||||
displayShow(firstLine, "Starting Modem...", " ", " ", 0);
|
||||
|
||||
pinMode(A7670_ResetPin, OUTPUT); //A7670 Reset
|
||||
digitalWrite(A7670_ResetPin, LOW);
|
||||
@@ -60,7 +60,7 @@
|
||||
modemReady = true;
|
||||
i = 1;
|
||||
Serial.println("Modem Ready!\n");
|
||||
show_display(firstLine, "Starting Modem...", "---> Modem Ready", " ", 0);
|
||||
displayShow(firstLine, "Starting Modem...", "---> Modem Ready", " ", 0);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -78,7 +78,7 @@
|
||||
delay(1000);
|
||||
//setup_gps(); // if gps active / won't be need for now
|
||||
} else {
|
||||
show_display(firstLine, "Starting Modem...", "---> Failed !!!", " ", 0);
|
||||
displayShow(firstLine, "Starting Modem...", "---> Failed !!!", " ", 0);
|
||||
Serial.println(F("*********** Failed to connect to the modem! ***********"));
|
||||
}
|
||||
}
|
||||
@@ -98,26 +98,26 @@
|
||||
//Serial.println(response); // DEBUG of Modem AT message
|
||||
if(response.indexOf("verified") >= 0) {
|
||||
Serial.println("Logged! (User Validated)\n");
|
||||
show_display(firstLine, "Connecting APRS-IS...", "---> Logged!", " ", 1000);
|
||||
displayShow(firstLine, "Connecting APRS-IS...", "---> Logged!", " ", 1000);
|
||||
Serial.println("#################### APRS-IS FEED ####################");
|
||||
validAT = true;
|
||||
i = 1;
|
||||
delayATMessage = 0;
|
||||
} else if (ATMessage == "AT+NETOPEN" && response.indexOf("OK") >= 0) {
|
||||
Serial.println("Port Open!");
|
||||
show_display(firstLine, "Opening Port...", "---> Port Open", " ", 0);
|
||||
displayShow(firstLine, "Opening Port...", "---> Port Open", " ", 0);
|
||||
validAT = true;
|
||||
i = 1;
|
||||
delayATMessage = 0;
|
||||
} else if (ATMessage == "AT+NETOPEN" && response.indexOf("Network is already opened") >= 0) {
|
||||
Serial.println("Port Open! (was already opened)");
|
||||
show_display(firstLine, "Opening Port...", "---> Port Open", " ", 0);
|
||||
displayShow(firstLine, "Opening Port...", "---> Port Open", " ", 0);
|
||||
validAT = true;
|
||||
i = 1;
|
||||
delayATMessage = 0;
|
||||
} else if (ATMessage.indexOf("AT+CIPOPEN") == 0 && response.indexOf("PB DONE") >= 0) {
|
||||
Serial.println("Contacted!");
|
||||
show_display(firstLine, "Connecting APRS-IS...", "---> Contacted", " ", 0);
|
||||
displayShow(firstLine, "Connecting APRS-IS...", "---> Contacted", " ", 0);
|
||||
validAT = true;
|
||||
i = 1;
|
||||
delayATMessage = 0;
|
||||
@@ -146,21 +146,26 @@
|
||||
}
|
||||
|
||||
void APRS_IS_connect() {
|
||||
String loginInfo = "user " + Config.callsign + " pass " + String(Config.aprs_is.passcode) + " vers CA2RXU_LoRa_iGate 1.3 filter " + Config.aprs_is.filter;
|
||||
String loginInfo = "user ";
|
||||
loginInfo += Config.callsign;
|
||||
loginInfo += " pass ";
|
||||
loginInfo += String(Config.aprs_is.passcode);
|
||||
loginInfo += " vers CA2RXU_LoRa_iGate 1.3 filter ";
|
||||
loginInfo += Config.aprs_is.filter;
|
||||
Serial.println("-----> Connecting to APRS IS");
|
||||
while (!modemStartUp) {
|
||||
Serial.print("Opening Port... ");
|
||||
show_display(firstLine, "Opening Port...", " ", " ", 0);
|
||||
displayShow(firstLine, "Opening Port...", " ", " ", 0);
|
||||
modemStartUp = checkATResponse("AT+NETOPEN");
|
||||
delay(2000);
|
||||
} while (!serverStartUp) {
|
||||
Serial.print("Connecting APRS-IS Server... ");
|
||||
show_display(firstLine, "Connecting APRS-IS...", " ", " ", 0);
|
||||
displayShow(firstLine, "Connecting APRS-IS...", " ", " ", 0);
|
||||
serverStartUp = checkATResponse("AT+CIPOPEN=0,\"TCP\",\"" + String(Config.aprs_is.server) + "\"," + String(Config.aprs_is.port));
|
||||
delay(2000);
|
||||
} while (!userBytesSended) {
|
||||
Serial.print("Writing User Login Data ");
|
||||
show_display(firstLine, "Connecting APRS-IS...", "---> User Login Data", " ", 0);
|
||||
displayShow(firstLine, "Connecting APRS-IS...", "---> User Login Data", " ", 0);
|
||||
userBytesSended = checkATResponse("AT+CIPSEND=0," + String(loginInfo.length()+1));
|
||||
delay(2000);
|
||||
} while (!modemLoggedToAPRSIS) {
|
||||
|
||||
@@ -21,6 +21,7 @@ ________________________________________________________________________________
|
||||
#include "aprs_is_utils.h"
|
||||
#include "station_utils.h"
|
||||
#include "boards_pinout.h"
|
||||
#include "battery_utils.h"
|
||||
#include "syslog_utils.h"
|
||||
#include "query_utils.h"
|
||||
#include "power_utils.h"
|
||||
@@ -33,11 +34,11 @@ ________________________________________________________________________________
|
||||
#include "tnc_utils.h"
|
||||
#include "display.h"
|
||||
#include "utils.h"
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#ifdef HAS_A7670
|
||||
#include "A7670_utils.h"
|
||||
#endif
|
||||
|
||||
String versionDate = "2024.06.15";
|
||||
String versionDate = "2024.08.14";
|
||||
Configuration Config;
|
||||
WiFiClient espClient;
|
||||
|
||||
@@ -60,14 +61,14 @@ String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seven
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
POWER_Utils::setup();
|
||||
BATTERY_Utils::setup();
|
||||
Utils::setupDisplay();
|
||||
Config.check();
|
||||
LoRa_Utils::setup();
|
||||
Utils::validateFreqs();
|
||||
GPS_Utils::generateBeacons();
|
||||
|
||||
#ifdef STARTUP_DELAY // (TEST) just to wait for WiFi init of Routers
|
||||
show_display("", " STARTUP DELAY ...", "", "", 0);
|
||||
displayShow("", " STARTUP DELAY ...", "", "", 0);
|
||||
delay(STARTUP_DELAY * 60 * 1000);
|
||||
#endif
|
||||
|
||||
@@ -96,7 +97,7 @@ void setup() {
|
||||
String comment = Config.beacon.comment;
|
||||
if (Config.battery.sendInternalVoltage) comment += " Batt=" + String(BATTERY_Utils::checkInternalVoltage(),2) + "V";
|
||||
if (Config.battery.sendExternalVoltage) comment += " Ext=" + String(BATTERY_Utils::checkExternalVoltage(),2) + "V";
|
||||
STATION_Utils::addToOutputPacketBuffer(GPS_Utils::getiGateLoRaBeaconPacket() + comment);
|
||||
LoRa_Utils::sendNewPacket(GPS_Utils::getiGateLoRaBeaconPacket() + comment);
|
||||
lastBeacon = time;
|
||||
}
|
||||
|
||||
@@ -116,7 +117,7 @@ void setup() {
|
||||
BME_Utils::setup();
|
||||
WEB_Utils::setup();
|
||||
TNC_Utils::setup();
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#ifdef HAS_A7670
|
||||
A7670_Utils::setup();
|
||||
#endif
|
||||
Utils::checkRebootMode();
|
||||
@@ -138,7 +139,7 @@ void loop() {
|
||||
|
||||
WIFI_Utils::checkWiFi(); // Always use WiFi, not related to IGate/Digi mode
|
||||
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#ifdef HAS_A7670
|
||||
if (Config.aprs_is.active && !modemLoggedToAPRSIS) A7670_Utils::APRS_IS_connect();
|
||||
#else
|
||||
if (Config.aprs_is.active && (WiFi.status() == WL_CONNECTED) && !espClient.connected()) APRS_IS_Utils::connect();
|
||||
@@ -161,8 +162,9 @@ void loop() {
|
||||
APRS_IS_Utils::processLoRaPacket(packet); // Send received packet to APRSIS
|
||||
}
|
||||
|
||||
if (Config.digi.mode == 2 || backUpDigiMode) { // If Digi enabled
|
||||
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
|
||||
if (Config.loramodule.txActive && (Config.digi.mode == 2 || Config.digi.mode == 3 || backUpDigiMode)) { // If Digi enabled
|
||||
STATION_Utils::clean25SegBuffer();
|
||||
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
|
||||
}
|
||||
|
||||
if (Config.tnc.enableServer) { // If TNC server enabled
|
||||
@@ -176,11 +178,10 @@ void loop() {
|
||||
if (Config.aprs_is.active) { // If APRSIS enabled
|
||||
APRS_IS_Utils::listenAPRSIS(); // listen received packet from APRSIS
|
||||
}
|
||||
|
||||
|
||||
STATION_Utils::processOutputPacketBuffer();
|
||||
STATION_Utils::clean25SegBuffer();
|
||||
|
||||
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
|
||||
Utils::checkRebootTime();
|
||||
Utils::checkSleepByLowBatteryVoltage(1);
|
||||
}
|
||||
@@ -24,7 +24,7 @@ extern bool backUpDigiMode;
|
||||
|
||||
uint32_t lastRxTime = millis();
|
||||
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#ifdef HAS_A7670
|
||||
extern bool stationBeacon;
|
||||
#endif
|
||||
|
||||
@@ -36,9 +36,8 @@ namespace APRS_IS_Utils {
|
||||
}
|
||||
|
||||
void connect() {
|
||||
uint8_t count = 0;
|
||||
String aprsauth;
|
||||
Serial.print("Connecting to APRS-IS ... ");
|
||||
uint8_t count = 0;
|
||||
while (!espClient.connect(Config.aprs_is.server.c_str(), Config.aprs_is.port) && count < 20) {
|
||||
Serial.println("Didn't connect with server...");
|
||||
delay(1000);
|
||||
@@ -54,11 +53,15 @@ namespace APRS_IS_Utils {
|
||||
}
|
||||
else {
|
||||
Serial.println("Connected!\n(Server: " + String(Config.aprs_is.server) + " / Port: " + String(Config.aprs_is.port) + ")");
|
||||
|
||||
// String filter = "t/m/" + Config.callsign + "/" + (String)Config.aprs_is.reportingDistance;
|
||||
|
||||
aprsauth = "user " + Config.callsign + " pass " + Config.aprs_is.passcode + " vers CA2RXU_LoRa_iGate 1.3 filter " + Config.aprs_is.filter;
|
||||
upload(aprsauth);
|
||||
String aprsAuth = "user ";
|
||||
aprsAuth += Config.callsign;
|
||||
aprsAuth += " pass ";
|
||||
aprsAuth += Config.aprs_is.passcode;
|
||||
aprsAuth += " vers CA2RXU_LoRa_iGate 1.4 filter ";
|
||||
aprsAuth += Config.aprs_is.filter;
|
||||
upload(aprsAuth);
|
||||
delay(200);
|
||||
}
|
||||
}
|
||||
@@ -74,7 +77,7 @@ namespace APRS_IS_Utils {
|
||||
wifiState = "AP";
|
||||
}
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
display_toggle(true);
|
||||
displayToggle(true);
|
||||
}
|
||||
lastScreenOn = millis();
|
||||
}
|
||||
@@ -82,7 +85,7 @@ namespace APRS_IS_Utils {
|
||||
if (!Config.aprs_is.active) {
|
||||
aprsisState = "OFF";
|
||||
} else {
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#ifdef HAS_A7670
|
||||
if (modemLoggedToAPRSIS) {
|
||||
aprsisState = "OK";
|
||||
} else {
|
||||
@@ -96,7 +99,7 @@ namespace APRS_IS_Utils {
|
||||
}
|
||||
#endif
|
||||
if(aprsisState == "--" && !Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
display_toggle(true);
|
||||
displayToggle(true);
|
||||
lastScreenOn = millis();
|
||||
}
|
||||
}
|
||||
@@ -106,24 +109,123 @@ namespace APRS_IS_Utils {
|
||||
secondLine += aprsisState;
|
||||
}
|
||||
|
||||
String buildPacketToUpload(const String& packet) {
|
||||
String payload = packet.substring(packet.indexOf(":"));
|
||||
if (payload.indexOf("\x3c\xff\x01") != -1) {
|
||||
payload = payload.substring(0, payload.indexOf("\x3c\xff\x01"));
|
||||
}
|
||||
if (!(Config.aprs_is.active && Config.digi.mode == 0)) { // Check if NOT only IGate
|
||||
return packet.substring(3, packet.indexOf(":")) + ",qAR," + Config.callsign + payload;
|
||||
String checkForStartingBytes(const String& packet) {
|
||||
if (packet.indexOf("\x3c\xff\x01") != -1) {
|
||||
return packet.substring(0, packet.indexOf("\x3c\xff\x01"));
|
||||
} else {
|
||||
return packet.substring(3, packet.indexOf(":")) + ",qAO," + Config.callsign + payload;
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
|
||||
String buildPacketToUpload(const String& packet) {
|
||||
String buildedPacket = packet.substring(3, packet.indexOf(":"));
|
||||
if (!(Config.aprs_is.active && Config.digi.mode == 0)) { // Check if NOT only IGate
|
||||
buildedPacket += ",qAR,";
|
||||
} else {
|
||||
buildedPacket += ",qAO,";
|
||||
}
|
||||
buildedPacket += Config.callsign;
|
||||
buildedPacket += checkForStartingBytes(packet.substring(packet.indexOf(":")));
|
||||
return buildedPacket;
|
||||
}
|
||||
|
||||
bool processReceivedLoRaMessage(const String& sender, const String& packet, bool thirdParty) {
|
||||
String receivedMessage;
|
||||
if (packet.indexOf("{") > 0) { // ack?
|
||||
String ackMessage = "ack";
|
||||
ackMessage.concat(packet.substring(packet.indexOf("{") + 1));
|
||||
ackMessage.trim();
|
||||
//Serial.println(ackMessage);
|
||||
|
||||
String addToBuffer = Config.callsign;
|
||||
addToBuffer += ">APLRG1,RFONLY";
|
||||
if (Config.beacon.path != "") {
|
||||
addToBuffer += ",";
|
||||
addToBuffer += Config.beacon.path;
|
||||
}
|
||||
addToBuffer += "::";
|
||||
|
||||
String processedSender = sender;
|
||||
for (int i = sender.length(); i < 9; i++) {
|
||||
processedSender += ' ';
|
||||
}
|
||||
addToBuffer += processedSender;
|
||||
|
||||
addToBuffer += ":";
|
||||
addToBuffer += ackMessage;
|
||||
STATION_Utils::addToOutputPacketBuffer(addToBuffer);
|
||||
receivedMessage = packet.substring(packet.indexOf(":") + 1, packet.indexOf("{"));
|
||||
} else {
|
||||
receivedMessage = packet.substring(packet.indexOf(":") + 1);
|
||||
}
|
||||
if (receivedMessage.indexOf("?") == 0) {
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
displayToggle(true);
|
||||
}
|
||||
STATION_Utils::addToOutputPacketBuffer(QUERY_Utils::process(receivedMessage, sender, false, thirdParty));
|
||||
lastScreenOn = millis();
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, "Callsign = " + sender, "TYPE --> QUERY", 0);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void processLoRaPacket(const String& packet) {
|
||||
if (espClient.connected() || modemLoggedToAPRSIS) {
|
||||
if (packet != "") {
|
||||
if ((packet.substring(0, 3) == "\x3c\xff\x01") && (packet.indexOf("NOGATE") == -1) && (packet.indexOf("RFONLY") == -1)) {
|
||||
int firstColonIndex = packet.indexOf(":");
|
||||
if (firstColonIndex > 5 && firstColonIndex < (packet.length() - 1) && packet[firstColonIndex + 1] != '}' && packet.indexOf("TCPIP") == -1) {
|
||||
const String& Sender = packet.substring(3, packet.indexOf(">"));
|
||||
if (Sender != Config.callsign && Utils::checkValidCallsign(Sender)) {
|
||||
STATION_Utils::updateLastHeard(Sender);
|
||||
Utils::typeOfPacket(packet.substring(3), 0); // LoRa-APRS
|
||||
const String& AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2);
|
||||
String Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
||||
Addressee.trim();
|
||||
bool queryMessage = false;
|
||||
if (packet.indexOf("::") > 10 && Addressee == Config.callsign) { // its a message for me!
|
||||
queryMessage = processReceivedLoRaMessage(Sender, checkForStartingBytes(AddresseeAndMessage), false);
|
||||
}
|
||||
if (!queryMessage) {
|
||||
const String& aprsPacket = buildPacketToUpload(packet);
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
displayToggle(true);
|
||||
}
|
||||
lastScreenOn = millis();
|
||||
#ifdef HAS_A7670
|
||||
stationBeacon = true;
|
||||
A7670_Utils::uploadToAPRSIS(aprsPacket);
|
||||
stationBeacon = false;
|
||||
#else
|
||||
upload(aprsPacket);
|
||||
#endif
|
||||
Utils::println("---> Uploaded to APRS-IS");
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String buildPacketToTx(const String& aprsisPacket, uint8_t packetType) {
|
||||
String packet = aprsisPacket;
|
||||
packet.trim();
|
||||
String outputPacket = packet.substring(0, packet.indexOf(","));
|
||||
outputPacket.concat(",TCPIP,WIDE1-1,");
|
||||
String outputPacket = Config.callsign;
|
||||
outputPacket += ">APLRG1";
|
||||
if (Config.beacon.path != "") {
|
||||
outputPacket += ",";
|
||||
outputPacket += Config.beacon.path;
|
||||
}
|
||||
outputPacket += ":}";
|
||||
outputPacket += packet.substring(0, packet.indexOf(",")); // Callsign>Tocall
|
||||
outputPacket.concat(",TCPIP,");
|
||||
outputPacket.concat(Config.callsign);
|
||||
outputPacket.concat("*");
|
||||
switch (packetType) {
|
||||
case 0: // gps
|
||||
if (packet.indexOf(":=") > 0) {
|
||||
@@ -155,152 +257,77 @@ namespace APRS_IS_Utils {
|
||||
return outputPacket;
|
||||
}
|
||||
|
||||
bool processReceivedLoRaMessage(const String& sender, const String& packet) {
|
||||
String receivedMessage;
|
||||
if (packet.indexOf("{") > 0) { // ack?
|
||||
String ackMessage = "ack";
|
||||
ackMessage.concat(packet.substring(packet.indexOf("{") + 1));
|
||||
ackMessage.trim();
|
||||
//Serial.println(ackMessage);
|
||||
String processedSender = sender;
|
||||
for (int i = sender.length(); i < 9; i++) {
|
||||
processedSender += ' ';
|
||||
}
|
||||
if (Config.beacon.path == "") {
|
||||
STATION_Utils::addToOutputPacketBuffer(Config.callsign + ">APLRG1,RFONLY::" + processedSender + ":" + ackMessage);
|
||||
} else {
|
||||
STATION_Utils::addToOutputPacketBuffer(Config.callsign + ">APLRG1,RFONLY," + Config.beacon.path + "::" + processedSender + ":" + ackMessage);
|
||||
}
|
||||
|
||||
receivedMessage = packet.substring(packet.indexOf(":") + 1, packet.indexOf("{"));
|
||||
} else {
|
||||
receivedMessage = packet.substring(packet.indexOf(":") + 1);
|
||||
}
|
||||
if (receivedMessage.indexOf("?") == 0) {
|
||||
delay(2000);
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
display_toggle(true);
|
||||
}
|
||||
STATION_Utils::addToOutputPacketBuffer(QUERY_Utils::process(receivedMessage, sender, 0)); // LoRa
|
||||
lastScreenOn = millis();
|
||||
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, "Callsign = " + sender, "TYPE --> QUERY", 0);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void processLoRaPacket(const String& packet) {
|
||||
if (espClient.connected() || modemLoggedToAPRSIS) {
|
||||
bool queryMessage = false;
|
||||
String aprsPacket, Sender, AddresseeAndMessage, Addressee;
|
||||
if (packet != "") {
|
||||
if ((packet.substring(0, 3) == "\x3c\xff\x01") && (packet.indexOf("TCPIP") == -1) && (packet.indexOf("NOGATE") == -1) && (packet.indexOf("RFONLY") == -1)) {
|
||||
Sender = packet.substring(3, packet.indexOf(">"));
|
||||
if (Sender != Config.callsign && Utils::checkValidCallsign(Sender)) {
|
||||
if (STATION_Utils::check25SegBuffer(Sender, packet.substring(packet.indexOf(":")+2))) {
|
||||
STATION_Utils::updateLastHeard(Sender);
|
||||
Utils::typeOfPacket(packet.substring(3), 0); // LoRa-APRS
|
||||
AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2);
|
||||
Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
||||
Addressee.trim();
|
||||
if (packet.indexOf("::") > 10 && Addressee == Config.callsign) { // its a message for me!
|
||||
if (AddresseeAndMessage.indexOf("\x3c\xff\x01") != -1) {
|
||||
AddresseeAndMessage = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf("\x3c\xff\x01"));
|
||||
}
|
||||
queryMessage = processReceivedLoRaMessage(Sender, AddresseeAndMessage);
|
||||
}
|
||||
if (!queryMessage) {
|
||||
aprsPacket = buildPacketToUpload(packet);
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
display_toggle(true);
|
||||
}
|
||||
lastScreenOn = millis();
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
stationBeacon = true;
|
||||
A7670_Utils::uploadToAPRSIS(aprsPacket);
|
||||
stationBeacon = false;
|
||||
#else
|
||||
upload(aprsPacket);
|
||||
#endif
|
||||
Utils::println("---> Uploaded to APRS-IS");
|
||||
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void processAPRSISPacket(const String& packet) {
|
||||
String Sender, AddresseeAndMessage, Addressee, receivedMessage;
|
||||
if (!packet.startsWith("#")) {
|
||||
if (Config.aprs_is.messagesToRF && packet.indexOf("::") > 0) {
|
||||
Sender = packet.substring(0, packet.indexOf(">"));
|
||||
if (Utils::checkValidCallsign(Sender)) {
|
||||
AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2);
|
||||
Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
||||
Addressee.trim();
|
||||
if (Addressee == Config.callsign) { // its for me!
|
||||
if (AddresseeAndMessage.indexOf("{") > 0) { // ack?
|
||||
String ackMessage = "ack" + AddresseeAndMessage.substring(AddresseeAndMessage.indexOf("{") + 1);
|
||||
ackMessage.trim();
|
||||
delay(4000);
|
||||
for (int i = Sender.length(); i < 9; i++) {
|
||||
Sender += ' ';
|
||||
}
|
||||
String ackPacket = Config.callsign + ">APLRG1,TCPIP,qAC::" + Sender + ":" + ackMessage;
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
A7670_Utils::uploadToAPRSIS(ackPacket);
|
||||
#else
|
||||
upload(ackPacket);
|
||||
#endif
|
||||
receivedMessage = AddresseeAndMessage.substring(AddresseeAndMessage.indexOf(":") + 1, AddresseeAndMessage.indexOf("{"));
|
||||
} else {
|
||||
receivedMessage = AddresseeAndMessage.substring(AddresseeAndMessage.indexOf(":") + 1);
|
||||
}
|
||||
if (receivedMessage.indexOf("?") == 0) {
|
||||
Utils::println("Received Query APRS-IS : " + packet);
|
||||
String queryAnswer = QUERY_Utils::process(receivedMessage, Sender, 1); // APRSIS
|
||||
//Serial.println("---> QUERY Answer : " + queryAnswer.substring(0,queryAnswer.indexOf("\n")));
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
display_toggle(true);
|
||||
}
|
||||
lastScreenOn = millis();
|
||||
delay(500);
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
A7670_Utils::uploadToAPRSIS(queryAnswer);
|
||||
#else
|
||||
upload(queryAnswer);
|
||||
#endif
|
||||
SYSLOG_Utils::log(2, queryAnswer, 0, 0.0, 0); // APRSIS TX
|
||||
fifthLine = "APRS-IS ----> APRS-IS";
|
||||
sixthLine = Config.callsign;
|
||||
for (int j = sixthLine.length();j < 9;j++) {
|
||||
sixthLine += " ";
|
||||
}
|
||||
sixthLine += "> ";
|
||||
sixthLine += Sender;
|
||||
seventhLine = "QUERY = ";
|
||||
seventhLine += receivedMessage;
|
||||
String Sender = packet.substring(0, packet.indexOf(">"));
|
||||
const String& AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2);
|
||||
String Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
||||
Addressee.trim();
|
||||
if (Addressee == Config.callsign) { // its for me!
|
||||
String receivedMessage;
|
||||
if (AddresseeAndMessage.indexOf("{") > 0) { // ack?
|
||||
String ackMessage = "ack";
|
||||
ackMessage += AddresseeAndMessage.substring(AddresseeAndMessage.indexOf("{") + 1);
|
||||
ackMessage.trim();
|
||||
delay(4000);
|
||||
for (int i = Sender.length(); i < 9; i++) {
|
||||
Sender += ' ';
|
||||
}
|
||||
|
||||
String ackPacket = Config.callsign;
|
||||
ackPacket += ">APLRG1,TCPIP,qAC::";
|
||||
ackPacket += Sender;
|
||||
ackPacket += ":";
|
||||
ackPacket += ackMessage;
|
||||
#ifdef HAS_A7670
|
||||
A7670_Utils::uploadToAPRSIS(ackPacket);
|
||||
#else
|
||||
upload(ackPacket);
|
||||
#endif
|
||||
receivedMessage = AddresseeAndMessage.substring(AddresseeAndMessage.indexOf(":") + 1, AddresseeAndMessage.indexOf("{"));
|
||||
} else {
|
||||
Utils::print("Received Message from APRS-IS : " + packet);
|
||||
if (STATION_Utils::wasHeard(Addressee) && Utils::checkValidCallsign(Addressee)) {
|
||||
STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 1));
|
||||
display_toggle(true);
|
||||
lastScreenOn = millis();
|
||||
Utils::typeOfPacket(packet, 1); // APRS-LoRa
|
||||
}
|
||||
receivedMessage = AddresseeAndMessage.substring(AddresseeAndMessage.indexOf(":") + 1);
|
||||
}
|
||||
if (receivedMessage.indexOf("?") == 0) {
|
||||
Utils::println("Received Query APRS-IS : " + packet);
|
||||
String queryAnswer = QUERY_Utils::process(receivedMessage, Sender, true, false);
|
||||
//Serial.println("---> QUERY Answer : " + queryAnswer.substring(0,queryAnswer.indexOf("\n")));
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
displayToggle(true);
|
||||
}
|
||||
lastScreenOn = millis();
|
||||
delay(500);
|
||||
#ifdef HAS_A7670
|
||||
A7670_Utils::uploadToAPRSIS(queryAnswer);
|
||||
#else
|
||||
upload(queryAnswer);
|
||||
#endif
|
||||
SYSLOG_Utils::log(2, queryAnswer, 0, 0.0, 0); // APRSIS TX
|
||||
fifthLine = "APRS-IS ----> APRS-IS";
|
||||
sixthLine = Config.callsign;
|
||||
for (int j = sixthLine.length();j < 9;j++) {
|
||||
sixthLine += " ";
|
||||
}
|
||||
sixthLine += "> ";
|
||||
sixthLine += Sender;
|
||||
seventhLine = "QUERY = ";
|
||||
seventhLine += receivedMessage;
|
||||
}
|
||||
} else {
|
||||
Utils::print("Received Message from APRS-IS : " + packet);
|
||||
if (STATION_Utils::wasHeard(Addressee)) {
|
||||
STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 1));
|
||||
displayToggle(true);
|
||||
lastScreenOn = millis();
|
||||
Utils::typeOfPacket(packet, 1); // APRS-LoRa
|
||||
}
|
||||
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
|
||||
}
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
|
||||
} else if (Config.aprs_is.objectsToRF && packet.indexOf(":;") > 0) {
|
||||
Utils::println("Received Object from APRS-IS : " + packet);
|
||||
STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 5));
|
||||
display_toggle(true);
|
||||
displayToggle(true);
|
||||
lastScreenOn = millis();
|
||||
Utils::typeOfPacket(packet, 1); // APRS-LoRa
|
||||
}
|
||||
@@ -308,7 +335,7 @@ namespace APRS_IS_Utils {
|
||||
}
|
||||
|
||||
void listenAPRSIS() {
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#ifdef HAS_A7670
|
||||
A7670_Utils::listenAPRSIS();
|
||||
#else
|
||||
if (espClient.connected()) {
|
||||
|
||||
@@ -9,10 +9,13 @@ namespace APRS_IS_Utils {
|
||||
void upload(const String& line);
|
||||
void connect();
|
||||
void checkStatus();
|
||||
String checkForStartingBytes(const String& packet);
|
||||
|
||||
String buildPacketToUpload(const String& packet);
|
||||
String buildPacketToTx(const String& aprsisPacket, uint8_t packetType);
|
||||
bool processReceivedLoRaMessage(const String& sender, const String& packet);
|
||||
bool processReceivedLoRaMessage(const String& sender, const String& packet, bool thirdParty);
|
||||
void processLoRaPacket(const String& packet);
|
||||
|
||||
String buildPacketToTx(const String& aprsisPacket, uint8_t packetType);
|
||||
void processAPRSISPacket(const String& packet);
|
||||
void listenAPRSIS();
|
||||
|
||||
|
||||
@@ -5,19 +5,41 @@
|
||||
#include "power_utils.h"
|
||||
#include "utils.h"
|
||||
|
||||
extern Configuration Config;
|
||||
extern uint32_t lastBatteryCheck;
|
||||
extern Configuration Config;
|
||||
extern uint32_t lastBatteryCheck;
|
||||
|
||||
bool shouldSleepLowVoltage = false;
|
||||
bool shouldSleepLowVoltage = false;
|
||||
|
||||
float adcReadingTransformation = (3.3/4095);
|
||||
float voltageDividerCorrection = 0.288;
|
||||
float adcReadingTransformation = (3.3/4095);
|
||||
float voltageDividerCorrection = 0.288;
|
||||
float readingCorrection = 0.125;
|
||||
float multiplyCorrection = 0.035;
|
||||
|
||||
// for External Voltage Measurment (MAX = 15Volts !!!)
|
||||
float R1 = 100.000; //in Kilo-Ohms
|
||||
float R2 = 27.000; //in Kilo-Ohms
|
||||
float readingCorrection = 0.125;
|
||||
float multiplyCorrection = 0.035;
|
||||
float voltageDividerTransformation = 0.0;
|
||||
|
||||
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
#include <esp_adc_cal.h>
|
||||
|
||||
#if defined(TTGO_T_LORA32_V2_1) || defined(TTGO_T_LORA32_V2_1_915)
|
||||
#define InternalBattery_ADC_Channel ADC1_CHANNEL_7 // t_lora32 pin35
|
||||
#define ExternalVoltage_ADC_Channel ADC1_CHANNEL_6 // t_lora32 pin34
|
||||
#endif
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32
|
||||
#define ADC_EXAMPLE_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_VREF
|
||||
#elif CONFIG_IDF_TARGET_ESP32S2
|
||||
#define ADC_EXAMPLE_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP
|
||||
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||
#define ADC_EXAMPLE_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP
|
||||
#elif CONFIG_IDF_TARGET_ESP32S3
|
||||
#define ADC_EXAMPLE_CALI_SCHEME ESP_ADC_CAL_VAL_EFUSE_TP_FIT
|
||||
#endif
|
||||
|
||||
esp_adc_cal_characteristics_t adc_chars;
|
||||
#endif
|
||||
|
||||
bool calibrationEnable = false;
|
||||
|
||||
|
||||
namespace BATTERY_Utils {
|
||||
@@ -26,6 +48,46 @@ namespace BATTERY_Utils {
|
||||
return (voltage - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||
}
|
||||
|
||||
void adcCalibration() {
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
if (calibrationEnable) {
|
||||
adc1_config_width(ADC_WIDTH_BIT_12);
|
||||
adc1_config_channel_atten(InternalBattery_ADC_Channel, ADC_ATTEN_DB_12);
|
||||
adc1_config_channel_atten(ExternalVoltage_ADC_Channel, ADC_ATTEN_DB_12);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void adcCalibrationCheck() {
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
esp_err_t ret;
|
||||
ret = esp_adc_cal_check_efuse(ADC_EXAMPLE_CALI_SCHEME);
|
||||
/*if (ret == ESP_ERR_NOT_SUPPORTED) {
|
||||
Serial.println("Calibration scheme not supported, skip software calibration");
|
||||
} else if (ret == ESP_ERR_INVALID_VERSION) {
|
||||
Serial.println("eFuse not burnt, skip software calibration");
|
||||
} else */
|
||||
if (ret == ESP_OK) {
|
||||
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_12, ADC_WIDTH_BIT_12, 1100, &adc_chars);
|
||||
//Serial.printf("eFuse Vref:%u mV\n", adc_chars.vref);
|
||||
calibrationEnable = true;
|
||||
} /*else {
|
||||
Serial.println("Invalid Calibration Arg");
|
||||
}*/
|
||||
#endif
|
||||
}
|
||||
|
||||
void setup() {
|
||||
if ((Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) && Config.battery.voltageDividerR2 != 0) voltageDividerTransformation = (Config.battery.voltageDividerR1 + Config.battery.voltageDividerR2) / Config.battery.voltageDividerR2;
|
||||
|
||||
#if defined(HAS_ADC_CALIBRATION)
|
||||
if (Config.battery.sendInternalVoltage || Config.battery.monitorInternalVoltage || Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) {
|
||||
adcCalibrationCheck();
|
||||
adcCalibration();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
float checkInternalVoltage() {
|
||||
#if defined(HAS_AXP192) || defined(HAS_AXP2101)
|
||||
if(POWER_Utils::isBatteryConnected()) {
|
||||
@@ -37,38 +99,59 @@ namespace BATTERY_Utils {
|
||||
int sample;
|
||||
int sampleSum = 0;
|
||||
#ifdef ADC_CTRL
|
||||
#if defined(HELTEC_WSL_V3) || defined(HELTEC_WIRELESS_TRACKER)
|
||||
#if defined(HELTEC_WIRELESS_TRACKER)
|
||||
digitalWrite(ADC_CTRL, HIGH);
|
||||
#endif
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V2)
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3)
|
||||
digitalWrite(ADC_CTRL, LOW);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < 100; i++) {
|
||||
#ifdef BATTERY_PIN
|
||||
sample = analogRead(BATTERY_PIN);
|
||||
#endif
|
||||
#if defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa)
|
||||
#if defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_LoRa_915) || defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915)
|
||||
sample = 0;
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
if (calibrationEnable){
|
||||
sample = adc1_get_raw(InternalBattery_ADC_Channel);
|
||||
} else {
|
||||
sample = analogRead(BATTERY_PIN);
|
||||
}
|
||||
#else
|
||||
#ifdef BATTERY_PIN
|
||||
sample = analogRead(BATTERY_PIN);
|
||||
#else
|
||||
sample = 0;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
sampleSum += sample;
|
||||
delayMicroseconds(50);
|
||||
}
|
||||
|
||||
#ifdef ADC_CTRL
|
||||
#if defined(HELTEC_WSL_V3) || defined(HELTEC_WIRELESS_TRACKER)
|
||||
#if defined(HELTEC_WIRELESS_TRACKER)
|
||||
digitalWrite(ADC_CTRL, LOW);
|
||||
#endif
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V2)
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3)
|
||||
digitalWrite(ADC_CTRL, HIGH);
|
||||
#endif
|
||||
double inputDivider = (1.0 / (390.0 + 100.0)) * 100.0; // The voltage divider is a 390k + 100k resistor in series, 100k on the low side.
|
||||
return (((sampleSum/100) * adcReadingTransformation) / inputDivider) + 0.285; // Yes, this offset is excessive, but the ADC on the ESP32s3 is quite inaccurate and noisy. Adjust to own measurements.
|
||||
#else
|
||||
return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
if (calibrationEnable){
|
||||
float voltage = esp_adc_cal_raw_to_voltage(sampleSum / 100, &adc_chars);
|
||||
voltage *= 2; // for 100K/100K voltage divider
|
||||
voltage /= 1000;
|
||||
return voltage;
|
||||
} else {
|
||||
return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping
|
||||
}
|
||||
#else
|
||||
return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// return mapVoltage(voltage, 3.34, 4.71, 3.0, 4.2); // mapped voltage
|
||||
#endif
|
||||
}
|
||||
@@ -77,25 +160,40 @@ namespace BATTERY_Utils {
|
||||
int sample;
|
||||
int sampleSum = 0;
|
||||
for (int i = 0; i < 100; i++) {
|
||||
sample = analogRead(Config.battery.externalVoltagePin);
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
if (calibrationEnable){
|
||||
sample = adc1_get_raw(ExternalVoltage_ADC_Channel);
|
||||
} else {
|
||||
sample = analogRead(Config.battery.externalVoltagePin);
|
||||
}
|
||||
#else
|
||||
sample = analogRead(Config.battery.externalVoltagePin);
|
||||
#endif
|
||||
sampleSum += sample;
|
||||
delayMicroseconds(50);
|
||||
delayMicroseconds(50);
|
||||
}
|
||||
|
||||
float voltage = ((((sampleSum/100)* adcReadingTransformation) + readingCorrection) * ((R1+R2)/R2)) - multiplyCorrection;
|
||||
float extVoltage;
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
if (calibrationEnable){
|
||||
extVoltage = esp_adc_cal_raw_to_voltage(sampleSum / 100, &adc_chars) * voltageDividerTransformation; // in mV
|
||||
extVoltage /= 1000;
|
||||
} else {
|
||||
extVoltage = ((((sampleSum/100)* adcReadingTransformation) + readingCorrection) * voltageDividerTransformation) - multiplyCorrection;
|
||||
}
|
||||
#else
|
||||
extVoltage = ((((sampleSum/100)* adcReadingTransformation) + readingCorrection) * voltageDividerTransformation) - multiplyCorrection;
|
||||
#endif
|
||||
|
||||
return voltage; // raw voltage without mapping
|
||||
return extVoltage; // raw voltage without mapping
|
||||
|
||||
// return mapVoltage(voltage, 5.05, 6.32, 4.5, 5.5); // mapped voltage
|
||||
}
|
||||
|
||||
void checkIfShouldSleep() {
|
||||
if (lastBatteryCheck == 0 || millis() - lastBatteryCheck >= 15 * 60 * 1000) {
|
||||
lastBatteryCheck = millis();
|
||||
|
||||
float voltage = checkInternalVoltage();
|
||||
|
||||
if (voltage < Config.lowVoltageCutOff) {
|
||||
lastBatteryCheck = millis();
|
||||
if (checkInternalVoltage() < Config.lowVoltageCutOff) {
|
||||
ESP.deepSleep(1800000000); // 30 min sleep (60s = 60e6)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
namespace BATTERY_Utils {
|
||||
|
||||
void adcCalibration();
|
||||
void adcCalibrationCheck();
|
||||
void setup();
|
||||
float checkInternalVoltage();
|
||||
float checkExternalVoltage();
|
||||
void checkIfShouldSleep(); // ????
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace BME_Utils {
|
||||
void getWxModuleAddres() {
|
||||
uint8_t err, addr;
|
||||
for(addr = 1; addr < 0x7F; addr++) {
|
||||
#ifdef HELTEC_V3
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
|
||||
Wire1.beginTransmission(addr);
|
||||
err = Wire1.endTransmission();
|
||||
#else
|
||||
@@ -58,12 +58,12 @@ namespace BME_Utils {
|
||||
if (wxModuleAddress != 0x00) {
|
||||
bool wxModuleFound = false;
|
||||
if (wxModuleAddress == 0x76 || wxModuleAddress == 0x77) {
|
||||
#ifdef HELTEC_V3
|
||||
if (bme280.begin(wxModuleAddress, &Wire1)) {
|
||||
Serial.println("BME280 sensor found");
|
||||
wxModuleType = 1;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
|
||||
if (bme280.begin(wxModuleAddress, &Wire1)) {
|
||||
Serial.println("BME280 sensor found");
|
||||
wxModuleType = 1;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
#else
|
||||
if (bme280.begin(wxModuleAddress)) {
|
||||
Serial.println("BME280 sensor found");
|
||||
@@ -93,7 +93,7 @@ namespace BME_Utils {
|
||||
}
|
||||
}
|
||||
if (!wxModuleFound) {
|
||||
show_display("ERROR", "", "BME/BMP/Si7021 sensor active", "but no sensor found...", 2000);
|
||||
displayShow("ERROR", "", "BME/BMP/Si7021 sensor active", "but no sensor found...", 2000);
|
||||
Serial.println("BME/BMP/Si7021 sensor Active in config but not found! Check Wiring");
|
||||
} else {
|
||||
switch (wxModuleType) {
|
||||
@@ -130,8 +130,7 @@ namespace BME_Utils {
|
||||
}
|
||||
|
||||
String generateTempString(const float bmeTemp) {
|
||||
String strTemp;
|
||||
strTemp = String((int)bmeTemp);
|
||||
String strTemp = String((int)bmeTemp);
|
||||
switch (strTemp.length()) {
|
||||
case 1:
|
||||
return "00" + strTemp;
|
||||
@@ -145,8 +144,7 @@ namespace BME_Utils {
|
||||
}
|
||||
|
||||
String generateHumString(const float bmeHum) {
|
||||
String strHum;
|
||||
strHum = String((int)bmeHum);
|
||||
String strHum = String((int)bmeHum);
|
||||
switch (strHum.length()) {
|
||||
case 1:
|
||||
return "0" + strHum;
|
||||
@@ -183,7 +181,6 @@ namespace BME_Utils {
|
||||
}
|
||||
|
||||
String readDataSensor() {
|
||||
String wx, tempStr, humStr, presStr;
|
||||
switch (wxModuleType) {
|
||||
case 1: // BME280
|
||||
bme280.takeForcedMeasurement();
|
||||
@@ -216,20 +213,23 @@ namespace BME_Utils {
|
||||
break;
|
||||
}
|
||||
|
||||
String wx;
|
||||
if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) {
|
||||
Serial.println("BME/BMP/Si7021 Module data failed");
|
||||
wx = ".../...g...t...r...p...P...h..b.....";
|
||||
fifthLine = "";
|
||||
return wx;
|
||||
} else {
|
||||
tempStr = generateTempString(((newTemp + Config.bme.temperatureCorrection) * 1.8) + 32);
|
||||
String tempStr = generateTempString(((newTemp + Config.bme.temperatureCorrection) * 1.8) + 32);
|
||||
|
||||
String humStr;
|
||||
if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4) {
|
||||
humStr = generateHumString(newHum);
|
||||
} else if (wxModuleType == 2) {
|
||||
humStr = "..";
|
||||
}
|
||||
|
||||
String presStr;
|
||||
if (wxModuleAddress == 4) {
|
||||
presStr = ".....";
|
||||
} else {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
|
||||
// LORA MODULES
|
||||
#if defined(TTGO_T_LORA32_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_LORA32_V2_1_915)
|
||||
#if defined(TTGO_T_LORA32_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_LORA32_V2_1_915) || defined(ESP32_DIY_LoRa_915) || defined(TTGO_T_Beam_V1_2_915) || defined(TTGO_T_Beam_V1_0_915)
|
||||
#define RADIO_SCLK_PIN 5 // GPIO5 - SX1278 SCK
|
||||
#define RADIO_MISO_PIN 19 // GPIO19 - SX1278 MISO
|
||||
#define RADIO_MOSI_PIN 27 // GPIO27 - SX1278 MOSI
|
||||
@@ -18,7 +18,7 @@
|
||||
#define RADIO_BUSY_PIN 26 // GPIO26 - SX1278 IRQ ---->DIO0
|
||||
#endif
|
||||
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS)
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS)
|
||||
#define RADIO_SCLK_PIN 9 // SX1262 SCK
|
||||
#define RADIO_MISO_PIN 11 // SX1262 MISO
|
||||
#define RADIO_MOSI_PIN 10 // SX1262 MOSI
|
||||
@@ -28,7 +28,7 @@
|
||||
#define RADIO_BUSY_PIN 13 // SX1262 BUSY
|
||||
#endif
|
||||
|
||||
#ifdef ESP32_DIY_1W_LoRa // Ebyte E22 400M30S / SX1268
|
||||
#if defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) // Ebyte E22 400M30S (SX1268) or E22 900M30S (SX1262)
|
||||
#define RADIO_SCLK_PIN 18
|
||||
#define RADIO_MISO_PIN 19
|
||||
#define RADIO_MOSI_PIN 23
|
||||
@@ -40,6 +40,18 @@
|
||||
#define RADIO_TXEN 25
|
||||
#endif
|
||||
|
||||
#if defined(ESP32_DIY_1W_LoRa_Mesh_V1_2) // https://github.com/NanoVHF/Meshtastic-DIY/tree/main/PCB/ESP-32-devkit_EBYTE-E22/Mesh-v1.02-2LCD-FreePins
|
||||
#define RADIO_SCLK_PIN 5
|
||||
#define RADIO_MISO_PIN 19
|
||||
#define RADIO_MOSI_PIN 27
|
||||
#define RADIO_CS_PIN 18
|
||||
#define RADIO_RST_PIN 23
|
||||
#define RADIO_DIO1_PIN 33
|
||||
#define RADIO_BUSY_PIN 32
|
||||
#define RADIO_RXEN 14
|
||||
#define RADIO_TXEN 13
|
||||
#endif
|
||||
|
||||
#ifdef WEMOS_LOLIN32_OLED_DIY_LoRa
|
||||
#define RADIO_SCLK_PIN 15
|
||||
#define RADIO_MISO_PIN 13
|
||||
@@ -82,7 +94,7 @@
|
||||
#define RADIO_BUSY_PIN 4 // SX1262 BUSY
|
||||
#endif
|
||||
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#if defined(ESP32_DIY_LoRa_A7670) || defined(ESP32_DIY_LoRa_A7670_915)
|
||||
#define RADIO_SCLK_PIN 18
|
||||
#define RADIO_MISO_PIN 19
|
||||
#define RADIO_MOSI_PIN 23
|
||||
@@ -106,10 +118,23 @@
|
||||
#define OLED_SDA 21
|
||||
#define OLED_SCL 22
|
||||
#define OLED_RST 36
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(ESP32C3_DIY_1W_LoRa) || defined(ESP32C3_DIY_1W_LoRa_915)
|
||||
#define RADIO_SCLK_PIN 8
|
||||
#define RADIO_MISO_PIN 9
|
||||
#define RADIO_MOSI_PIN 10
|
||||
#define RADIO_CS_PIN 5
|
||||
#define RADIO_RST_PIN 4
|
||||
#define RADIO_DIO1_PIN 2
|
||||
#define RADIO_BUSY_PIN 3
|
||||
#define RADIO_RXEN 6
|
||||
#define RADIO_TXEN 7
|
||||
#endif
|
||||
|
||||
|
||||
// OLED
|
||||
#if defined(TTGO_T_LORA32_V2_1) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa_A7670) || defined(TTGO_T_LORA32_V2_1_915)
|
||||
#if defined(TTGO_T_LORA32_V2_1) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa_A7670) || defined(TTGO_T_LORA32_V2_1_915) || defined(ESP32_DIY_LoRa_915) || defined(TTGO_T_Beam_V1_0_915) || defined(TTGO_T_Beam_V1_2_915) || defined(ESP32_DIY_LoRa_A7670_915) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2)
|
||||
#define OLED_SDA 21
|
||||
#define OLED_SCL 22
|
||||
#define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin)
|
||||
@@ -133,8 +158,8 @@
|
||||
#define OLED_RST -1
|
||||
#endif
|
||||
|
||||
#if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa)
|
||||
#define HAS_DISPLAY
|
||||
#if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa) && !defined(ESP32C3_DIY_1W_LoRa_915)
|
||||
#define HAS_DISPLAY
|
||||
#endif
|
||||
|
||||
// Leds and other stuff
|
||||
@@ -143,26 +168,29 @@
|
||||
#endif
|
||||
#if defined(TTGO_T_LORA32_V2_1) || defined(TTGO_T_LORA32_V2_1_915)
|
||||
#define INTERNAL_LED_PIN 25 // Green Led
|
||||
#define BATTERY_PIN 35 // es 35 el led y 1 bateria?
|
||||
#define BATTERY_PIN 35
|
||||
#endif
|
||||
#if defined(HELTEC_V2)
|
||||
#define INTERNAL_LED_PIN 25
|
||||
#define BATTERY_PIN 37
|
||||
#define ADC_CTRL 21
|
||||
#endif
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WS)
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WS)
|
||||
#define INTERNAL_LED_PIN 35
|
||||
#define BATTERY_PIN 1
|
||||
#define VEXT_CTRL 36
|
||||
#define ADC_CTRL 37 // Heltec WSL_V3 just like Heltec WT
|
||||
#define BOARD_I2C_SDA 41
|
||||
#define BOARD_I2C_SCL 42
|
||||
#ifdef HELTEC_WSL_V3_DISPLAY
|
||||
#define OLED_RST -1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa)
|
||||
#if defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_LoRa_915) || defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915)
|
||||
#define INTERNAL_LED_PIN 2
|
||||
#endif
|
||||
#if defined(ESP32_DIY_LoRa_A7670)
|
||||
#if defined(ESP32_DIY_LoRa_A7670) || defined(ESP32_DIY_LoRa_A7670_915)
|
||||
#define INTERNAL_LED_PIN 13 // 13 for V1.1 and 12 for V1.0
|
||||
#define BATTERY_PIN 35
|
||||
#endif
|
||||
@@ -176,7 +204,7 @@
|
||||
#define BOARD_I2C_SCL 6
|
||||
#endif
|
||||
|
||||
#ifdef ESP32_C3_DIY_LoRa
|
||||
#ifdef ESP32_C3_DIY_LoRa // just testing!
|
||||
#define OLED_SDA 8
|
||||
#define OLED_SCL 9
|
||||
#define OLED_RST 10
|
||||
@@ -188,16 +216,17 @@
|
||||
#define RADIO_IRQ_PIN 2
|
||||
#endif
|
||||
|
||||
#ifdef ESP32C3_DIY_1W_LoRa
|
||||
#define RADIO_SCLK_PIN 8
|
||||
#define RADIO_MISO_PIN 9
|
||||
#define RADIO_MOSI_PIN 10
|
||||
#if defined(ESP32_C3_OctopusLab_LoRa)
|
||||
#define OLED_SDA 0
|
||||
#define OLED_SCL 1
|
||||
#define OLED_RST -1
|
||||
#define RADIO_SCLK_PIN 6
|
||||
#define RADIO_MISO_PIN 4
|
||||
#define RADIO_MOSI_PIN 7
|
||||
#define RADIO_CS_PIN 5
|
||||
#define RADIO_RST_PIN 4
|
||||
#define RADIO_DIO1_PIN 2
|
||||
#define RADIO_BUSY_PIN 3
|
||||
#define RADIO_RXEN 6
|
||||
#define RADIO_TXEN 7
|
||||
#define RADIO_DIO1_PIN 3
|
||||
#define RADIO_RST_PIN -1
|
||||
#define RADIO_BUSY_PIN 8
|
||||
#endif
|
||||
|
||||
/* (Same pins for LILYGO LoRa32 and ESP32 Wroom Dev )
|
||||
|
||||
@@ -4,16 +4,6 @@
|
||||
#include "display.h"
|
||||
|
||||
|
||||
void Configuration::check() {
|
||||
if (reload) {
|
||||
show_display("------- UPDATE ------", "config is old", "device will update", "and then reboot", 1000);
|
||||
|
||||
writeFile();
|
||||
|
||||
ESP.restart();
|
||||
}
|
||||
}
|
||||
|
||||
void Configuration::writeFile() {
|
||||
Serial.println("Saving config..");
|
||||
|
||||
@@ -27,43 +17,43 @@ void Configuration::writeFile() {
|
||||
}
|
||||
}
|
||||
|
||||
data["wifi"]["autoAP"]["password"] = wifiAutoAP.password;
|
||||
data["wifi"]["autoAP"]["powerOff"] = wifiAutoAP.powerOff;
|
||||
data["wifi"]["autoAP"]["password"] = wifiAutoAP.password;
|
||||
data["wifi"]["autoAP"]["powerOff"] = wifiAutoAP.powerOff;
|
||||
|
||||
data["callsign"] = callsign;
|
||||
data["callsign"] = callsign;
|
||||
|
||||
data["aprs_is"]["active"] = aprs_is.active;
|
||||
data["aprs_is"]["passcode"] = aprs_is.passcode;
|
||||
data["aprs_is"]["server"] = aprs_is.server;
|
||||
data["aprs_is"]["port"] = aprs_is.port;
|
||||
data["aprs_is"]["filter"] = aprs_is.filter;
|
||||
data["aprs_is"]["messagesToRF"] = aprs_is.messagesToRF;
|
||||
data["aprs_is"]["objectsToRF"] = aprs_is.objectsToRF;
|
||||
data["aprs_is"]["active"] = aprs_is.active;
|
||||
data["aprs_is"]["passcode"] = aprs_is.passcode;
|
||||
data["aprs_is"]["server"] = aprs_is.server;
|
||||
data["aprs_is"]["port"] = aprs_is.port;
|
||||
data["aprs_is"]["filter"] = aprs_is.filter;
|
||||
data["aprs_is"]["messagesToRF"] = aprs_is.messagesToRF;
|
||||
data["aprs_is"]["objectsToRF"] = aprs_is.objectsToRF;
|
||||
|
||||
data["beacon"]["comment"] = beacon.comment;
|
||||
data["beacon"]["interval"] = beacon.interval;
|
||||
data["beacon"]["latitude"] = beacon.latitude;
|
||||
data["beacon"]["longitude"] = beacon.longitude;
|
||||
data["beacon"]["overlay"] = beacon.overlay;
|
||||
data["beacon"]["symbol"] = beacon.symbol;
|
||||
data["beacon"]["sendViaAPRSIS"] = beacon.sendViaAPRSIS;
|
||||
data["beacon"]["sendViaRF"] = beacon.sendViaRF;
|
||||
data["beacon"]["path"] = beacon.path;
|
||||
data["beacon"]["comment"] = beacon.comment;
|
||||
data["beacon"]["interval"] = beacon.interval;
|
||||
data["beacon"]["latitude"] = beacon.latitude;
|
||||
data["beacon"]["longitude"] = beacon.longitude;
|
||||
data["beacon"]["overlay"] = beacon.overlay;
|
||||
data["beacon"]["symbol"] = beacon.symbol;
|
||||
data["beacon"]["sendViaAPRSIS"] = beacon.sendViaAPRSIS;
|
||||
data["beacon"]["sendViaRF"] = beacon.sendViaRF;
|
||||
data["beacon"]["path"] = beacon.path;
|
||||
|
||||
data["digi"]["mode"] = digi.mode;
|
||||
data["digi"]["mode"] = digi.mode;
|
||||
|
||||
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"]["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["display"]["alwaysOn"] = display.alwaysOn;
|
||||
data["display"]["timeout"] = display.timeout;
|
||||
data["display"]["turn180"] = display.turn180;
|
||||
data["display"]["alwaysOn"] = display.alwaysOn;
|
||||
data["display"]["timeout"] = display.timeout;
|
||||
data["display"]["turn180"] = display.turn180;
|
||||
|
||||
data["battery"]["sendInternalVoltage"] = battery.sendInternalVoltage;
|
||||
data["battery"]["monitorInternalVoltage"] = battery.monitorInternalVoltage;
|
||||
@@ -73,31 +63,39 @@ void Configuration::writeFile() {
|
||||
data["battery"]["externalVoltagePin"] = battery.externalVoltagePin;
|
||||
data["battery"]["monitorExternalVoltage"] = battery.monitorExternalVoltage;
|
||||
data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage;
|
||||
data["battery"]["voltageDividerR1"] = battery.voltageDividerR1;
|
||||
data["battery"]["voltageDividerR2"] = battery.voltageDividerR2;
|
||||
|
||||
data["bme"]["active"] = bme.active;
|
||||
data["bme"]["heightCorrection"] = bme.heightCorrection;
|
||||
data["bme"]["temperatureCorrection"] = bme.temperatureCorrection;
|
||||
|
||||
data["bme"]["active"] = bme.active;
|
||||
data["bme"]["heightCorrection"] = bme.heightCorrection;
|
||||
data["bme"]["temperatureCorrection"] = bme.temperatureCorrection;
|
||||
data["syslog"]["active"] = syslog.active;
|
||||
data["syslog"]["server"] = syslog.server;
|
||||
data["syslog"]["port"] = syslog.port;
|
||||
|
||||
data["syslog"]["active"] = syslog.active;
|
||||
data["syslog"]["server"] = syslog.server;
|
||||
data["syslog"]["port"] = syslog.port;
|
||||
data["tnc"]["enableServer"] = tnc.enableServer;
|
||||
data["tnc"]["enableSerial"] = tnc.enableSerial;
|
||||
data["tnc"]["acceptOwn"] = tnc.acceptOwn;
|
||||
|
||||
data["tnc"]["enableServer"] = tnc.enableServer;
|
||||
data["tnc"]["enableSerial"] = tnc.enableSerial;
|
||||
data["tnc"]["acceptOwn"] = tnc.acceptOwn;
|
||||
data["other"]["rebootMode"] = rebootMode;
|
||||
data["other"]["rebootModeTime"] = rebootModeTime;
|
||||
|
||||
data["other"]["rebootMode"] = rebootMode;
|
||||
data["other"]["rebootModeTime"] = rebootModeTime;
|
||||
|
||||
data["ota"]["username"] = ota.username;
|
||||
data["ota"]["password"] = ota.password;
|
||||
data["ota"]["username"] = ota.username;
|
||||
data["ota"]["password"] = ota.password;
|
||||
|
||||
data["other"]["rememberStationTime"] = rememberStationTime;
|
||||
|
||||
data["other"]["backupDigiMode"] = backupDigiMode;
|
||||
data["other"]["backupDigiMode"] = backupDigiMode;
|
||||
|
||||
data["other"]["lowPowerMode"] = lowPowerMode;
|
||||
data["other"]["lowVoltageCutOff"] = lowVoltageCutOff;
|
||||
data["other"]["lowPowerMode"] = lowPowerMode;
|
||||
data["other"]["lowVoltageCutOff"] = lowVoltageCutOff;
|
||||
|
||||
data["personalNote"] = personalNote;
|
||||
|
||||
data["webadmin"]["active"] = webadmin.active;
|
||||
data["webadmin"]["username"] = webadmin.username;
|
||||
data["webadmin"]["password"] = webadmin.password;
|
||||
|
||||
serializeJson(data, configFile);
|
||||
|
||||
@@ -128,129 +126,84 @@ bool Configuration::readFile() {
|
||||
wifiAPs.push_back(wifiap);
|
||||
}
|
||||
|
||||
wifiAutoAP.password = data["wifi"]["autoAP"]["password"].as<String>();
|
||||
wifiAutoAP.powerOff = data["wifi"]["autoAP"]["powerOff"].as<int>();
|
||||
wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890";
|
||||
wifiAutoAP.powerOff = data["wifi"]["autoAP"]["powerOff"] | 10;
|
||||
|
||||
callsign = data["callsign"].as<String>();
|
||||
rememberStationTime = data["other"]["rememberStationTime"].as<int>();
|
||||
callsign = data["callsign"] | "NOCALL-10";
|
||||
rememberStationTime = data["other"]["rememberStationTime"] | 30;
|
||||
|
||||
battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"].as<bool>();
|
||||
battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"].as<bool>();
|
||||
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"].as<float>();
|
||||
|
||||
battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"].as<bool>();
|
||||
battery.externalVoltagePin = data["battery"]["externalVoltagePin"].as<int>();
|
||||
battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"].as<bool>();
|
||||
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"].as<float>();
|
||||
|
||||
aprs_is.passcode = data["aprs_is"]["passcode"].as<String>();
|
||||
aprs_is.server = data["aprs_is"]["server"].as<String>();
|
||||
aprs_is.port = data["aprs_is"]["port"].as<int>();
|
||||
|
||||
loramodule.spreadingFactor = data["lora"]["spreadingFactor"].as<int>();
|
||||
loramodule.signalBandwidth = data["lora"]["signalBandwidth"].as<long>();
|
||||
loramodule.codingRate4 = data["lora"]["codingRate4"].as<int>();
|
||||
loramodule.power = data["lora"]["power"].as<int>();
|
||||
|
||||
display.alwaysOn = data["display"]["alwaysOn"].as<bool>();
|
||||
display.timeout = data["display"]["timeout"].as<int>();
|
||||
display.turn180 = data["display"]["turn180"].as<bool>();
|
||||
|
||||
syslog.active = data["syslog"]["active"].as<bool>();
|
||||
syslog.server = data["syslog"]["server"].as<String>();
|
||||
syslog.port = data["syslog"]["port"].as<int>();
|
||||
|
||||
bme.active = data["bme"]["active"].as<bool>();
|
||||
bme.heightCorrection = data["bme"]["heightCorrection"].as<int>();
|
||||
bme.temperatureCorrection = data["bme"]["temperatureCorrection"].as<float>();
|
||||
|
||||
ota.username = data["ota"]["username"].as<String>();
|
||||
ota.password = data["ota"]["password"].as<String>();
|
||||
|
||||
tnc.enableServer = data["tnc"]["enableServer"].as<bool>();
|
||||
tnc.enableSerial = data["tnc"]["enableSerial"].as<bool>();
|
||||
tnc.acceptOwn = data["tnc"]["acceptOwn"].as<bool>();
|
||||
|
||||
lowPowerMode = data["other"]["lowPowerMode"].as<bool>();
|
||||
lowVoltageCutOff = data["other"]["lowVoltageCutOff"].as<double>();
|
||||
|
||||
backupDigiMode = data["other"]["backupDigiMode"].as<bool>();
|
||||
|
||||
rebootMode = data["other"]["rebootMode"].as<bool>();
|
||||
rebootModeTime = data["other"]["rebootModeTime"].as<int>();
|
||||
|
||||
int stationMode = data["stationMode"].as<int>(); // deprecated but need to specify config version
|
||||
|
||||
if (stationMode == 0) {
|
||||
// Load new settings
|
||||
|
||||
beacon.latitude = data["beacon"]["latitude"].as<double>();
|
||||
beacon.longitude = data["beacon"]["longitude"].as<double>();
|
||||
beacon.comment = data["beacon"]["comment"].as<String>();
|
||||
beacon.overlay = data["beacon"]["overlay"].as<String>();
|
||||
beacon.symbol = data["beacon"]["symbol"].as<String>();
|
||||
beacon.interval = data["beacon"]["interval"].as<int>();
|
||||
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"].as<bool>();
|
||||
beacon.sendViaRF = data["beacon"]["sendViaRF"].as<bool>();
|
||||
beacon.path = data["beacon"]["path"].as<String>();
|
||||
|
||||
digi.mode = data["digi"]["mode"].as<int>();
|
||||
|
||||
aprs_is.active = data["aprs_is"]["active"].as<bool>();
|
||||
aprs_is.filter = data["aprs_is"]["filter"].as<String>();
|
||||
aprs_is.messagesToRF = data["aprs_is"]["messagesToRF"].as<bool>();
|
||||
aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"].as<bool>();
|
||||
|
||||
loramodule.txFreq = data["lora"]["txFreq"].as<long>();
|
||||
loramodule.rxFreq = data["lora"]["rxFreq"].as<long>();
|
||||
loramodule.txActive = data["lora"]["txActive"].as<bool>();
|
||||
loramodule.rxActive = data["lora"]["rxActive"].as<bool>();
|
||||
} else {
|
||||
// Load old settings and put into new variables not actual config
|
||||
|
||||
String iGateComment = data["iGateComment"].as<String>();
|
||||
int beaconInterval = data["other"]["beaconInterval"].as<int>();
|
||||
|
||||
long iGateFreq = data["lora"]["iGateFreq"].as<long>();
|
||||
long digirepeaterTxFreq = data["lora"]["digirepeaterTxFreq"].as<long>();
|
||||
long digirepeaterRxFreq = data["lora"]["digirepeaterRxFreq"].as<long>();
|
||||
beacon.latitude = data["beacon"]["latitude"] | 0.0;
|
||||
beacon.longitude = data["beacon"]["longitude"] | 0.0;
|
||||
beacon.comment = data["beacon"]["comment"] | "LoRa APRS";
|
||||
beacon.interval = data["beacon"]["interval"] | 15;
|
||||
beacon.overlay = data["beacon"]["overlay"] | "L";
|
||||
beacon.symbol = data["beacon"]["symbol"] | "a";
|
||||
beacon.path = data["beacon"]["path"] | "WIDE1-1";
|
||||
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
|
||||
beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
|
||||
|
||||
String digiComment = data["digi"]["comment"].as<String>();
|
||||
double digiLatitude = data["digi"]["latitude"].as<double>();
|
||||
double digiLongitude = data["digi"]["longitude"].as<double>();
|
||||
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";
|
||||
aprs_is.port = data["aprs_is"]["port"] | 14580;
|
||||
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;
|
||||
|
||||
digi.mode = data["digi"]["mode"].as<int>();
|
||||
|
||||
beacon.latitude = digiLatitude;
|
||||
beacon.longitude = digiLongitude;
|
||||
beacon.interval = beaconInterval;
|
||||
loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
|
||||
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.txActive = data["lora"]["txActive"] | false;
|
||||
loramodule.rxActive = data["lora"]["rxActive"] | false;
|
||||
|
||||
loramodule.txFreq = digirepeaterTxFreq;
|
||||
loramodule.rxFreq = digirepeaterRxFreq;
|
||||
loramodule.rxActive = true;
|
||||
beacon.sendViaAPRSIS = true;
|
||||
beacon.sendViaRF = false;
|
||||
display.alwaysOn = data["display"]["alwaysOn"] | true;
|
||||
display.timeout = data["display"]["timeout"] | 4;
|
||||
display.turn180 = data["display"]["turn180"] | false;
|
||||
|
||||
switch (stationMode) {
|
||||
case 1: // IGate only
|
||||
// aprs_is.active = true; // better don't do that automatically
|
||||
beacon.comment = iGateComment;
|
||||
loramodule.rxFreq = iGateFreq;
|
||||
break;
|
||||
case 5: // Digi + IGate
|
||||
case 2: // Digi + IGate
|
||||
// aprs_is.active = true; // better don't do that automatically
|
||||
// digi.mode = 2; // better don't do that automatically
|
||||
beacon.comment = digiComment;
|
||||
loramodule.rxFreq = iGateFreq;
|
||||
break;
|
||||
case 3: // Digi
|
||||
case 4: // Digi
|
||||
// digi.mode = 2; // better don't do that automatically
|
||||
beacon.comment = digiComment;
|
||||
break;
|
||||
}
|
||||
battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false;
|
||||
battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false;
|
||||
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 3.0;
|
||||
|
||||
reload = true;
|
||||
}
|
||||
battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false;
|
||||
battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34;
|
||||
battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"] | false;
|
||||
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"] | false;
|
||||
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0;
|
||||
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0;
|
||||
|
||||
bme.active = data["bme"]["active"] | false;
|
||||
bme.heightCorrection = data["bme"]["heightCorrection"] | 0;
|
||||
bme.temperatureCorrection = data["bme"]["temperatureCorrection"] | 0.0;
|
||||
|
||||
syslog.active = data["syslog"]["active"] | false;
|
||||
syslog.server = data["syslog"]["server"] | "192.168.0.100";
|
||||
syslog.port = data["syslog"]["port"] | 514;
|
||||
|
||||
tnc.enableServer = data["tnc"]["enableServer"] | false;
|
||||
tnc.enableSerial = data["tnc"]["enableSerial"] | false;
|
||||
tnc.acceptOwn = data["tnc"]["acceptOwn"] | false;
|
||||
|
||||
ota.username = data["ota"]["username"] | "";
|
||||
ota.password = data["ota"]["password"] | "";
|
||||
|
||||
webadmin.active = data["webadmin"]["active"] | false;
|
||||
webadmin.username = data["webadmin"]["username"] | "admin";
|
||||
webadmin.password = data["webadmin"]["password"] | "";
|
||||
|
||||
lowPowerMode = data["other"]["lowPowerMode"] | false;
|
||||
lowVoltageCutOff = data["other"]["lowVoltageCutOff"] | 0;
|
||||
|
||||
backupDigiMode = data["other"]["backupDigiMode"] | false;
|
||||
|
||||
rebootMode = data["other"]["rebootMode"] | false;
|
||||
rebootModeTime = data["other"]["rebootModeTime"] | 6;
|
||||
|
||||
personalNote = data["personalNote"] | "personal note here...";
|
||||
|
||||
if (wifiAPs.size() == 0) { // If we don't have any WiFi's from config we need to add "empty" SSID for AUTO AP
|
||||
WiFi_AP wifiap;
|
||||
@@ -269,69 +222,67 @@ bool Configuration::readFile() {
|
||||
}
|
||||
|
||||
void Configuration::init() {
|
||||
reload = false;
|
||||
|
||||
WiFi_AP wifiap;
|
||||
wifiap.ssid = "";
|
||||
wifiap.password = "";
|
||||
wifiap.ssid = "";
|
||||
wifiap.password = "";
|
||||
|
||||
wifiAPs.push_back(wifiap);
|
||||
|
||||
wifiAutoAP.password = "1234567890";
|
||||
wifiAutoAP.powerOff = 15;
|
||||
wifiAutoAP.password = "1234567890";
|
||||
wifiAutoAP.powerOff = 15;
|
||||
|
||||
callsign = "N0CALL";
|
||||
callsign = "N0CALL-10";
|
||||
|
||||
beacon.comment = "LoRa APRS"; // new
|
||||
beacon.latitude = 0.0; // new
|
||||
beacon.longitude = 0.0; // new
|
||||
beacon.interval = 15; // new
|
||||
beacon.overlay = "L"; // new
|
||||
beacon.symbol = "#"; // new
|
||||
beacon.sendViaAPRSIS = true; // new
|
||||
beacon.sendViaRF = false; // new
|
||||
beacon.path = "WIDE1-1"; // new
|
||||
beacon.comment = "LoRa APRS";
|
||||
beacon.latitude = 0.0;
|
||||
beacon.longitude = 0.0;
|
||||
beacon.interval = 15;
|
||||
beacon.overlay = "L";
|
||||
beacon.symbol = "a";
|
||||
beacon.sendViaAPRSIS = true;
|
||||
beacon.sendViaRF = false;
|
||||
beacon.path = "WIDE1-1";
|
||||
|
||||
digi.mode = 0;
|
||||
|
||||
tnc.enableServer = false;
|
||||
tnc.enableSerial = false;
|
||||
tnc.acceptOwn = false;
|
||||
tnc.enableServer = false;
|
||||
tnc.enableSerial = false;
|
||||
tnc.acceptOwn = false;
|
||||
|
||||
aprs_is.active = false; // new
|
||||
aprs_is.passcode = "XYZVW";
|
||||
aprs_is.server = "rotate.aprs2.net";
|
||||
aprs_is.port = 14580;
|
||||
aprs_is.filter = "m/10"; // new
|
||||
aprs_is.messagesToRF = false;
|
||||
aprs_is.objectsToRF = false;
|
||||
aprs_is.active = false;
|
||||
aprs_is.passcode = "XYZVW";
|
||||
aprs_is.server = "rotate.aprs2.net";
|
||||
aprs_is.port = 14580;
|
||||
aprs_is.filter = "m/10";
|
||||
aprs_is.messagesToRF = false;
|
||||
aprs_is.objectsToRF = false;
|
||||
|
||||
loramodule.txFreq = 433775000; // new
|
||||
loramodule.rxFreq = 433775000; // new
|
||||
loramodule.spreadingFactor = 12;
|
||||
loramodule.signalBandwidth = 125000;
|
||||
loramodule.codingRate4 = 5;
|
||||
loramodule.power = 20;
|
||||
loramodule.txActive = false; // new
|
||||
loramodule.rxActive = true; // new
|
||||
loramodule.txFreq = 433775000;
|
||||
loramodule.rxFreq = 433775000;
|
||||
loramodule.spreadingFactor = 12;
|
||||
loramodule.signalBandwidth = 125000;
|
||||
loramodule.codingRate4 = 5;
|
||||
loramodule.power = 20;
|
||||
loramodule.txActive = false;
|
||||
loramodule.rxActive = true;
|
||||
|
||||
display.alwaysOn = true;
|
||||
display.timeout = 4;
|
||||
display.turn180 = false;
|
||||
display.alwaysOn = true;
|
||||
display.timeout = 4;
|
||||
display.turn180 = false;
|
||||
|
||||
syslog.active = false;
|
||||
syslog.server = "192.168.0.100";
|
||||
syslog.port = 514;
|
||||
syslog.active = false;
|
||||
syslog.server = "192.168.0.100";
|
||||
syslog.port = 514;
|
||||
|
||||
bme.active = false;
|
||||
bme.heightCorrection = 0;
|
||||
bme.temperatureCorrection = 0.0;
|
||||
bme.active = false;
|
||||
bme.heightCorrection = 0;
|
||||
bme.temperatureCorrection = 0.0;
|
||||
|
||||
ota.username = "";
|
||||
ota.password = "";
|
||||
ota.username = "";
|
||||
ota.password = "";
|
||||
|
||||
|
||||
rememberStationTime = 30;
|
||||
rememberStationTime = 30;
|
||||
|
||||
battery.sendInternalVoltage = false;
|
||||
battery.monitorInternalVoltage = false;
|
||||
@@ -340,15 +291,23 @@ void Configuration::init() {
|
||||
battery.sendExternalVoltage = false;
|
||||
battery.externalVoltagePin = 34;
|
||||
battery.monitorExternalVoltage = false;
|
||||
battery.externalSleepVoltage = 3.0;
|
||||
battery.externalSleepVoltage = 10.9;
|
||||
battery.voltageDividerR1 = 100.0;
|
||||
battery.voltageDividerR2 = 27.0;
|
||||
|
||||
lowPowerMode = false;
|
||||
lowVoltageCutOff = 0;
|
||||
lowPowerMode = false;
|
||||
lowVoltageCutOff = 0;
|
||||
|
||||
backupDigiMode = false;
|
||||
backupDigiMode = false;
|
||||
|
||||
rebootMode = false;
|
||||
rebootModeTime = 0;
|
||||
rebootMode = false;
|
||||
rebootModeTime = 0;
|
||||
|
||||
personalNote = "";
|
||||
|
||||
webadmin.active = false;
|
||||
webadmin.username = "admin";
|
||||
webadmin.password = "";
|
||||
|
||||
Serial.println("All is Written!");
|
||||
}
|
||||
|
||||
@@ -75,6 +75,8 @@ public:
|
||||
int externalVoltagePin;
|
||||
bool monitorExternalVoltage;
|
||||
float externalSleepVoltage;
|
||||
float voltageDividerR1;
|
||||
float voltageDividerR2;
|
||||
};
|
||||
|
||||
class BME {
|
||||
@@ -104,9 +106,15 @@ public:
|
||||
String password;
|
||||
};
|
||||
|
||||
class WEBADMIN {
|
||||
public:
|
||||
bool active;
|
||||
String username;
|
||||
String password;
|
||||
};
|
||||
|
||||
class Configuration {
|
||||
public:
|
||||
bool reload; // ?
|
||||
String callsign;
|
||||
int rememberStationTime;
|
||||
bool lowPowerMode;
|
||||
@@ -114,6 +122,7 @@ public:
|
||||
bool backupDigiMode;
|
||||
bool rebootMode;
|
||||
int rebootModeTime;
|
||||
String personalNote;
|
||||
std::vector<WiFi_AP> wifiAPs;
|
||||
WiFi_Auto_AP wifiAutoAP;
|
||||
BEACON beacon;
|
||||
@@ -126,10 +135,10 @@ public:
|
||||
SYSLOG syslog;
|
||||
TNC tnc;
|
||||
OTA ota;
|
||||
WEBADMIN webadmin;
|
||||
|
||||
void init();
|
||||
void writeFile();
|
||||
void check();
|
||||
Configuration();
|
||||
|
||||
private:
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "query_utils.h"
|
||||
#include "digi_utils.h"
|
||||
#include "wifi_utils.h"
|
||||
#include "lora_utils.h"
|
||||
#include "gps_utils.h"
|
||||
#include "display.h"
|
||||
#include "utils.h"
|
||||
@@ -24,32 +25,55 @@ extern bool backUpDigiMode;
|
||||
|
||||
namespace DIGI_Utils {
|
||||
|
||||
String generateDigiRepeatedPacket(const String& packet){
|
||||
String temp0, path;
|
||||
temp0 = packet.substring(packet.indexOf(">") + 1, packet.indexOf(":"));
|
||||
if (temp0.indexOf(",") > 2) {
|
||||
path = temp0.substring(temp0.indexOf(",") + 1, temp0.indexOf(":"));
|
||||
if (path.indexOf("WIDE1-") >= 0) {
|
||||
String hop = path.substring(path.indexOf("WIDE1-") + 6, path.indexOf("WIDE1-") + 7);
|
||||
if (hop.toInt() >= 1 && hop.toInt() <= 7) {
|
||||
if (hop.toInt() == 1) {
|
||||
path.replace("WIDE1-1", Config.callsign + "*");
|
||||
} else {
|
||||
path.replace("WIDE1-" + hop, Config.callsign + "*,WIDE1-" + String(hop.toInt() - 1));
|
||||
}
|
||||
String buildPacket(const String& path, const String& packet, bool thirdParty) {
|
||||
String packetToRepeat = packet.substring(0, packet.indexOf(",") + 1);
|
||||
String tempPath = path;
|
||||
|
||||
String repeatedPacket = packet.substring(0, packet.indexOf(">")); // sender
|
||||
repeatedPacket += ">";
|
||||
repeatedPacket += temp0.substring(0, temp0.indexOf(",")); // tocall
|
||||
repeatedPacket += ",";
|
||||
repeatedPacket += path;
|
||||
if (path.indexOf("WIDE1-1") != -1 && (Config.digi.mode == 2 || Config.digi.mode == 3)) {
|
||||
tempPath.replace("WIDE1-1", Config.callsign + "*");
|
||||
} else if (path.indexOf("WIDE2-") != -1 && Config.digi.mode == 3) {
|
||||
if (path.indexOf("*") != 1) {
|
||||
tempPath.remove(path.indexOf("*"), 1);
|
||||
}
|
||||
if (path.indexOf("WIDE2-1") != -1) {
|
||||
tempPath.replace("WIDE2-1", Config.callsign + "*");
|
||||
} else if (path.indexOf("WIDE2-2") != -1) {
|
||||
tempPath.replace("WIDE2-2", Config.callsign + "*,WIDE2-1");
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
packetToRepeat += tempPath;
|
||||
if (thirdParty) {
|
||||
packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":}")));
|
||||
} else {
|
||||
packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":")));
|
||||
}
|
||||
return packetToRepeat;
|
||||
}
|
||||
|
||||
String payload = packet.substring(packet.indexOf(":"));
|
||||
if (payload.indexOf("\x3c\xff\x01") != -1) {
|
||||
payload = payload.substring(0, payload.indexOf("\x3c\xff\x01"));
|
||||
}
|
||||
repeatedPacket += payload;
|
||||
return repeatedPacket;
|
||||
String generateDigiRepeatedPacket(const String& packet, bool thirdParty){
|
||||
String temp;
|
||||
if (thirdParty) { // only header is used
|
||||
const String& header = packet.substring(0, packet.indexOf(":}"));
|
||||
temp = header.substring(header.indexOf(">") + 1);
|
||||
} else {
|
||||
temp = packet.substring(packet.indexOf(">") + 1, packet.indexOf(":"));
|
||||
}
|
||||
if (temp.indexOf(",") > 2) { // checks for path
|
||||
const String& path = temp.substring(temp.indexOf(",") + 1); // after tocall
|
||||
if ((Config.digi.mode == 2 || backUpDigiMode) && path.indexOf("WIDE1-1") != - 1) {
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
} else if (Config.digi.mode == 3) {
|
||||
int wide1Index = path.indexOf("WIDE1-1");
|
||||
int wide2Index = path.indexOf("WIDE2-");
|
||||
|
||||
if (wide1Index != -1 && wide2Index != -1 && wide1Index < wide2Index) { // WIDE1-1 && WIDE2-n
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
} else if (wide1Index != -1 && wide2Index == -1) { // only WIDE1-1
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
} else if (wide1Index == -1 && wide2Index != -1) { // only WIDE2-n
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
@@ -61,27 +85,45 @@ namespace DIGI_Utils {
|
||||
}
|
||||
}
|
||||
|
||||
void processLoRaPacket(const String& packet) {
|
||||
bool queryMessage = false;
|
||||
String loraPacket, Sender, AddresseeAndMessage, Addressee;
|
||||
void processLoRaPacket(const String& packet) {
|
||||
if (packet != "") {
|
||||
if ((packet.substring(0, 3) == "\x3c\xff\x01") && (packet.indexOf("NOGATE") == -1)) {
|
||||
Sender = packet.substring(3, packet.indexOf(">"));
|
||||
if (Sender != Config.callsign && Utils::checkValidCallsign(Sender)) {
|
||||
if (STATION_Utils::check25SegBuffer(Sender, packet.substring(packet.indexOf(":") + 2))) {
|
||||
bool thirdPartyPacket = false;
|
||||
String temp, Sender;
|
||||
int firstColonIndex = packet.indexOf(":");
|
||||
if (firstColonIndex > 5 && firstColonIndex < (packet.length() - 1) && packet[firstColonIndex + 1] == '}' && packet.indexOf("TCPIP") > 0) { // 3rd Party
|
||||
thirdPartyPacket = true;
|
||||
temp = packet.substring(packet.indexOf(":}") + 2);
|
||||
Sender = temp.substring(0, temp.indexOf(">"));
|
||||
} else {
|
||||
temp = packet.substring(3);
|
||||
Sender = packet.substring(3, packet.indexOf(">"));
|
||||
}
|
||||
if (Sender != Config.callsign) { // Avoid listening to own packets
|
||||
if (!thirdPartyPacket && !Utils::checkValidCallsign(Sender)) {
|
||||
return;
|
||||
}
|
||||
if (STATION_Utils::check25SegBuffer(Sender, temp.substring(temp.indexOf(":") + 2)) || Config.lowPowerMode) {
|
||||
STATION_Utils::updateLastHeard(Sender);
|
||||
Utils::typeOfPacket(packet.substring(3), 2); // Digi
|
||||
AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2);
|
||||
Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
||||
Addressee.trim();
|
||||
if (packet.indexOf("::") > 10 && Addressee == Config.callsign) { // its a message for me!
|
||||
queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage);
|
||||
Utils::typeOfPacket(temp, 2); // Digi
|
||||
bool queryMessage = false;
|
||||
if (temp.indexOf("::") > 10) { // it's a message
|
||||
String AddresseeAndMessage = temp.substring(temp.indexOf("::") + 2);
|
||||
String Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
||||
Addressee.trim();
|
||||
if (Addressee == Config.callsign) { // it's a message for me!
|
||||
queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage, thirdPartyPacket);
|
||||
}
|
||||
}
|
||||
if (!queryMessage && packet.indexOf("WIDE1-") > 10 && (Config.digi.mode == 2 || backUpDigiMode)) { // If should repeat packet (WIDE1 Digi)
|
||||
loraPacket = generateDigiRepeatedPacket(packet.substring(3));
|
||||
if (!queryMessage) {
|
||||
String loraPacket = generateDigiRepeatedPacket(packet.substring(3), thirdPartyPacket);
|
||||
if (loraPacket != "") {
|
||||
STATION_Utils::addToOutputPacketBuffer(loraPacket);
|
||||
display_toggle(true);
|
||||
if (Config.lowPowerMode) {
|
||||
LoRa_Utils::sendNewPacket(loraPacket);
|
||||
} else {
|
||||
STATION_Utils::addToOutputPacketBuffer(loraPacket);
|
||||
}
|
||||
displayToggle(true);
|
||||
lastScreenOn = millis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
|
||||
namespace DIGI_Utils {
|
||||
|
||||
String generateDigiRepeatedPacket(const String& packet);
|
||||
String buildPacket(const String& path, const String& packet, bool thirdParty);
|
||||
String generateDigiRepeatedPacket(const String& packet, bool thirdParty);
|
||||
void processLoRaPacket(const String& packet);
|
||||
|
||||
}
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
TFT_eSPI tft = TFT_eSPI();
|
||||
|
||||
#ifdef HELTEC_WIRELESS_TRACKER
|
||||
#define bigSizeFont 2
|
||||
#define smallSizeFont 1
|
||||
#define lineSpacing 9
|
||||
#define bigSizeFont 2.5
|
||||
#define smallSizeFont 1.5
|
||||
#define lineSpacing 12
|
||||
#endif
|
||||
#else
|
||||
#include <Adafruit_GFX.h>
|
||||
@@ -21,7 +21,11 @@
|
||||
#if defined(HELTEC_V3)
|
||||
#define OLED_DISPLAY_HAS_RST_PIN
|
||||
#endif
|
||||
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
|
||||
#ifdef HELTEC_WSL_V3_DISPLAY
|
||||
Adafruit_SSD1306 display(128, 64, &Wire1, OLED_RST);
|
||||
#else
|
||||
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -35,7 +39,7 @@ void cleanTFT() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void setup_display() {
|
||||
void displaySetup() {
|
||||
#ifdef HAS_DISPLAY
|
||||
delay(500);
|
||||
#ifdef HAS_TFT
|
||||
@@ -55,7 +59,10 @@ void setup_display() {
|
||||
delay(20);
|
||||
digitalWrite(OLED_RST, HIGH);
|
||||
#endif
|
||||
Wire.begin(OLED_SDA, OLED_SCL);
|
||||
|
||||
#ifndef HELTEC_WSL_V3_DISPLAY
|
||||
Wire.begin(OLED_SDA, OLED_SCL);
|
||||
#endif
|
||||
|
||||
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
|
||||
Serial.println(F("SSD1306 allocation failed"));
|
||||
@@ -76,7 +83,7 @@ void setup_display() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void display_toggle(bool toggle) {
|
||||
void displayToggle(bool toggle) {
|
||||
#ifdef HAS_DISPLAY
|
||||
if (toggle) {
|
||||
#ifdef HAS_TFT
|
||||
@@ -121,7 +128,7 @@ bool shouldCleanTFT(const String& header, const String& line1, const String& lin
|
||||
}
|
||||
}
|
||||
|
||||
void show_display(const String& header, const String& line1, const String& line2, const String& line3, int wait) {
|
||||
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, int wait) {
|
||||
#ifdef HAS_DISPLAY
|
||||
const String* const lines[] = {&line1, &line2, &line3};
|
||||
#ifdef HAS_TFT
|
||||
@@ -155,7 +162,7 @@ void show_display(const String& header, const String& line1, const String& line2
|
||||
#endif
|
||||
}
|
||||
|
||||
void show_display(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait) {
|
||||
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait) {
|
||||
#ifdef HAS_DISPLAY
|
||||
const String* const lines[] = {&line1, &line2, &line3, &line4, &line5, &line6};
|
||||
#ifdef HAS_TFT
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
|
||||
|
||||
void cleanTFT();
|
||||
void setup_display();
|
||||
void display_toggle(bool toggle);
|
||||
void displaySetup();
|
||||
void displayToggle(bool toggle);
|
||||
|
||||
bool shouldCleanTFT(const String& header, const String& line1, const String& line2, const String& line3);
|
||||
bool shouldCleanTFT(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6);
|
||||
|
||||
void show_display(const String& header, const String& line1, const String& line2, const String& line3, int wait = 0);
|
||||
void show_display(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait = 0);
|
||||
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, int wait = 0);
|
||||
void displayShow(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait = 0);
|
||||
|
||||
#endif
|
||||
@@ -49,14 +49,21 @@ namespace GPS_Utils {
|
||||
for (i = 0; i < 4; i++) {
|
||||
encodedData += helper_base91[i];
|
||||
}
|
||||
encodedData += symbol + " x" + "\x47";
|
||||
encodedData += symbol;
|
||||
encodedData += " x";
|
||||
encodedData += "\x47";
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
void generateBeacons() {
|
||||
if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) {
|
||||
show_display("***** ERROR ******", "CALLSIGN = NOT VALID!", " Use SSID 0-15", " Or Valid Callsign", 0);
|
||||
while (true) {}
|
||||
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
|
||||
Config.loramodule.txActive = false;
|
||||
Config.aprs_is.messagesToRF = false;
|
||||
Config.aprs_is.objectsToRF = false;
|
||||
Config.beacon.sendViaRF = false;
|
||||
Config.digi.mode = 0;
|
||||
Config.backupDigiMode = false;
|
||||
}
|
||||
String beaconPacket = Config.callsign;
|
||||
beaconPacket += ">APLRG1";
|
||||
@@ -80,10 +87,10 @@ namespace GPS_Utils {
|
||||
}
|
||||
|
||||
String decodeEncodedGPS(const String& packet) {
|
||||
String GPSPacket = packet.substring(packet.indexOf(":!")+3);
|
||||
String encodedLatitude = GPSPacket.substring(0,4);
|
||||
String encodedLongtitude = GPSPacket.substring(4,8);
|
||||
String comment = GPSPacket.substring(12);
|
||||
const String& GPSPacket = packet.substring(packet.indexOf(":!")+3);
|
||||
const String& encodedLatitude = GPSPacket.substring(0,4);
|
||||
const String& encodedLongtitude = GPSPacket.substring(4,8);
|
||||
const String& comment = GPSPacket.substring(12);
|
||||
|
||||
int Y1 = int(encodedLatitude[0]);
|
||||
int Y2 = int(encodedLatitude[1]);
|
||||
@@ -96,12 +103,21 @@ namespace GPS_Utils {
|
||||
int X3 = int(encodedLongtitude[2]);
|
||||
int X4 = int(encodedLongtitude[3]);
|
||||
float decodedLongitude = -180.0 + ((((X1-33) * pow(91,3)) + ((X2-33) * pow(91,2)) + ((X3-33) * 91) + X4-33) / 190463.0);
|
||||
|
||||
distance = String(calculateDistanceTo(decodedLatitude, decodedLongitude),1);
|
||||
|
||||
String decodedGPS = String(decodedLatitude,5);
|
||||
decodedGPS += "N / ";
|
||||
decodedGPS += String(decodedLongitude,5);
|
||||
decodedGPS += "E / ";
|
||||
decodedGPS += distance;
|
||||
decodedGPS += "km";
|
||||
|
||||
if (comment != "") {
|
||||
return String(decodedLatitude,5) + "N / " + String(decodedLongitude,5) + "E / " + distance + "km / " + comment;
|
||||
} else {
|
||||
return String(decodedLatitude,5) + "N / " + String(decodedLongitude,5) + "E / " + distance + "km";
|
||||
decodedGPS += " / ";
|
||||
decodedGPS += comment;
|
||||
}
|
||||
return decodedGPS;
|
||||
}
|
||||
|
||||
String getReceivedGPS(const String& packet) {
|
||||
@@ -111,36 +127,43 @@ namespace GPS_Utils {
|
||||
} else if (packet.indexOf(":=") > 10) {
|
||||
infoGPS = packet.substring(packet.indexOf(":=") + 2);
|
||||
}
|
||||
String Latitude = infoGPS.substring(0,8);
|
||||
String Longitude = infoGPS.substring(9,18);
|
||||
String comment = infoGPS.substring(19);
|
||||
|
||||
float convertedLatitude, convertedLongitude;
|
||||
String firstLatPart = Latitude.substring(0,2);
|
||||
String secondLatPart = Latitude.substring(2,4);
|
||||
String thirdLatPart = Latitude.substring(Latitude.indexOf(".") + 1, Latitude.indexOf(".") + 3);
|
||||
String firstLngPart = Longitude.substring(0,3);
|
||||
String secondLngPart = Longitude.substring(3,5);
|
||||
String thirdLngPart = Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3);
|
||||
const String& Latitude = infoGPS.substring(0,8);
|
||||
const String& Longitude = infoGPS.substring(9,18);
|
||||
const String& comment = infoGPS.substring(19);
|
||||
|
||||
float convertedLatitude, convertedLongitude;
|
||||
const String& firstLatPart = Latitude.substring(0,2);
|
||||
const String& secondLatPart = Latitude.substring(2,4);
|
||||
const String& thirdLatPart = Latitude.substring(Latitude.indexOf(".") + 1, Latitude.indexOf(".") + 3);
|
||||
convertedLatitude = firstLatPart.toFloat() + (secondLatPart.toFloat()/60) + (thirdLatPart.toFloat()/(60*100));
|
||||
|
||||
const String& firstLngPart = Longitude.substring(0,3);
|
||||
const String& secondLngPart = Longitude.substring(3,5);
|
||||
const String& thirdLngPart = Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3);
|
||||
convertedLongitude = firstLngPart.toFloat() + (secondLngPart.toFloat()/60) + (thirdLngPart.toFloat()/(60*100));
|
||||
|
||||
String LatSign = String(Latitude[7]);
|
||||
String LngSign = String(Longitude[8]);
|
||||
if (LatSign == "S") {
|
||||
if (String(Latitude[7]) == "S") {
|
||||
convertedLatitude = -convertedLatitude;
|
||||
}
|
||||
if (LngSign == "W") {
|
||||
if (String(Longitude[8]) == "W") {
|
||||
convertedLongitude = -convertedLongitude;
|
||||
}
|
||||
|
||||
distance = String(calculateDistanceTo(convertedLatitude, convertedLongitude),1);
|
||||
|
||||
String decodedGPS = String(convertedLatitude,5);
|
||||
decodedGPS += "N / ";
|
||||
decodedGPS += String(convertedLongitude,5);
|
||||
decodedGPS += "E / ";
|
||||
decodedGPS += distance;
|
||||
decodedGPS += "km";
|
||||
|
||||
if (comment != "") {
|
||||
return String(convertedLatitude,5) + "N / " + String(convertedLongitude,5) + "E / " + distance + "km / " + comment;
|
||||
} else {
|
||||
return String(convertedLatitude,5) + "N / " + String(convertedLongitude,5) + "E / " + distance + "km";
|
||||
decodedGPS += " / ";
|
||||
decodedGPS += comment;
|
||||
}
|
||||
}
|
||||
return decodedGPS;
|
||||
}
|
||||
|
||||
String getDistanceAndComment(const String& packet) {
|
||||
uint8_t encodedBytePosition = 0;
|
||||
|
||||
@@ -43,11 +43,14 @@ namespace LoRa_Utils {
|
||||
void setup() {
|
||||
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
|
||||
float freq = (float)Config.loramodule.rxFreq / 1000000;
|
||||
#if defined(RADIO_HAS_XTAL)
|
||||
radio.XTAL = true;
|
||||
#endif
|
||||
int state = radio.begin(freq);
|
||||
if (state == RADIOLIB_ERR_NONE) {
|
||||
Utils::println("Initializing LoRa Module");
|
||||
} else {
|
||||
Utils::println("Starting LoRa failed!");
|
||||
Utils::println("Starting LoRa failed! State: " + String(state));
|
||||
while (true);
|
||||
}
|
||||
#if defined(HAS_SX1262) || defined(HAS_SX1268)
|
||||
@@ -70,15 +73,15 @@ namespace LoRa_Utils {
|
||||
radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN);
|
||||
#endif
|
||||
|
||||
#if defined(ESP32_DIY_1W_LoRa) || defined(OE5HWN_MeshCom) || defined(ESP32C3_DIY_1W_LoRa)
|
||||
state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 400M30S as it has Low Noise Amp
|
||||
#ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262)
|
||||
state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 1W modules as they have Low Noise Amp
|
||||
radio.setCurrentLimit(140); // to be validated (100 , 120, 140)?
|
||||
#endif
|
||||
#if defined(HAS_SX1278) || defined(HAS_SX1276)
|
||||
state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 400M30S as it has Low Noise Amp
|
||||
radio.setCurrentLimit(100); // to be validated (80 , 100)?
|
||||
#endif
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WS) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262)
|
||||
#if (defined(HAS_SX1268) || defined(HAS_SX1262)) && !defined(HAS_1W_LORA)
|
||||
state = radio.setOutputPower(Config.loramodule.power + 2); // values available: 10, 17, 22 --> if 20 in tracker_conf.json it will be updated to 22.
|
||||
radio.setCurrentLimit(140);
|
||||
#endif
|
||||
@@ -90,7 +93,7 @@ namespace LoRa_Utils {
|
||||
if (state == RADIOLIB_ERR_NONE) {
|
||||
Utils::println("init : LoRa Module ... done!");
|
||||
} else {
|
||||
Utils::println("Starting LoRa failed!");
|
||||
Utils::println("Starting LoRa failed! State: " + String(state));
|
||||
while (true);
|
||||
}
|
||||
}
|
||||
@@ -157,9 +160,9 @@ namespace LoRa_Utils {
|
||||
|
||||
String receivePacket() {
|
||||
String packet = "";
|
||||
if (operationDone) {
|
||||
if (operationDone || Config.lowPowerMode) {
|
||||
operationDone = false;
|
||||
if (transmitFlag) {
|
||||
if (transmitFlag && !Config.lowPowerMode) {
|
||||
radio.startReceive();
|
||||
transmitFlag = false;
|
||||
} else {
|
||||
|
||||
@@ -29,31 +29,31 @@ namespace OTA_Utils {
|
||||
|
||||
void onOTAStart() {
|
||||
Serial.println("OTA update started!");
|
||||
display_toggle(true);
|
||||
displayToggle(true);
|
||||
lastScreenOn = millis();
|
||||
show_display("", "", "", " OTA update started!", "", "", "", 1000);
|
||||
displayShow("", "", "", " OTA update started!", "", "", "", 1000);
|
||||
isUpdatingOTA = true;
|
||||
}
|
||||
|
||||
void onOTAProgress(size_t current, size_t final) {
|
||||
if (millis() - ota_progress_millis > 1000) {
|
||||
display_toggle(true);
|
||||
displayToggle(true);
|
||||
lastScreenOn = millis();
|
||||
ota_progress_millis = millis();
|
||||
Serial.printf("OTA Progress Current: %u bytes, Final: %u bytes\n", current, final);
|
||||
show_display("", "", " OTA Progress : " + String((current*100)/final) + "%", "", "", "", "", 100);
|
||||
displayShow("", "", " OTA Progress : " + String((current*100)/final) + "%", "", "", "", "", 100);
|
||||
}
|
||||
}
|
||||
|
||||
void onOTAEnd(bool success) {
|
||||
display_toggle(true);
|
||||
displayToggle(true);
|
||||
lastScreenOn = millis();
|
||||
if (success) {
|
||||
Serial.println("OTA update finished successfully!");
|
||||
show_display("", "", " OTA update success!", "", " Rebooting ...", "", "", 4000);
|
||||
displayShow("", "", " OTA update success!", "", " Rebooting ...", "", "", 4000);
|
||||
} else {
|
||||
Serial.println("There was an error during OTA update!");
|
||||
show_display("", "", " OTA update fail!", "", "", "", "", 4000);
|
||||
displayShow("", "", " OTA update fail!", "", "", "", "", 4000);
|
||||
}
|
||||
isUpdatingOTA = false;
|
||||
}
|
||||
|
||||
@@ -164,7 +164,7 @@ namespace POWER_Utils {
|
||||
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
|
||||
#endif
|
||||
|
||||
#ifdef HELTEC_V3
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
|
||||
Wire1.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -12,19 +12,21 @@ extern int freqError;
|
||||
|
||||
namespace QUERY_Utils {
|
||||
|
||||
String process(const String& query, const String& station, const uint8_t queryOrigin) {
|
||||
String process(const String& query, const String& station, bool queryFromAPRSIS, bool thirdParty) {
|
||||
String answer;
|
||||
if (query=="?APRS?" || query=="?aprs?" || query=="?Aprs?" || query=="H" || query=="h" || query=="HELP" || query=="Help" || query=="help" || query=="?") {
|
||||
answer = "?APRSV ?APRSP ?APRSL ?APRSH ?WHERE callsign";
|
||||
} else if (query=="?APRSV" || query=="?aprsv" || query=="?Aprsv") {
|
||||
answer = "CA2RXU_LoRa_iGate 1.3 v";
|
||||
String queryQuestion = query;
|
||||
queryQuestion.toUpperCase();
|
||||
if (queryQuestion == "?APRS?" || queryQuestion == "H" || queryQuestion == "HELP" || queryQuestion=="?") {
|
||||
answer.concat("?APRSV ?APRSP ?APRSL ?APRSH ?WHERE callsign");
|
||||
} else if (queryQuestion == "?APRSV") {
|
||||
answer.concat("CA2RXU_LoRa_iGate 1.4 v");
|
||||
answer.concat(versionDate);
|
||||
} else if (query=="?APRSP" || query=="?aprsp" || query=="?Aprsp") {
|
||||
answer = "iGate QTH: ";
|
||||
answer.concat(String(Config.beacon.latitude,2));
|
||||
} else if (queryQuestion == "?APRSP") {
|
||||
answer.concat("iGate QTH: ");
|
||||
answer.concat(String(Config.beacon.latitude,3));
|
||||
answer.concat(" ");
|
||||
answer.concat(String(Config.beacon.longitude,2));
|
||||
} else if (query=="?APRSL" || query=="?aprsl" || query=="?Aprsl") {
|
||||
answer.concat(String(Config.beacon.longitude,3));
|
||||
} else if (queryQuestion == "?APRSL") {
|
||||
if (lastHeardStation.size() == 0) {
|
||||
char answerArray[50];
|
||||
snprintf(answerArray, sizeof(answerArray), "No Station Listened in the last %d min.", Config.rememberStationTime);
|
||||
@@ -35,32 +37,41 @@ namespace QUERY_Utils {
|
||||
}
|
||||
answer.trim();
|
||||
}
|
||||
} else if (query=="?APRSSR" || query=="?aprssr" || query=="?Aprssr") {
|
||||
} else if (queryQuestion == "?APRSSR") {
|
||||
char signalData[35];
|
||||
snprintf(signalData, sizeof(signalData), " %ddBm / %.2fdB / %dHz", rssi, snr, freqError);
|
||||
answer.concat(signalData);
|
||||
} else if (query.indexOf("?APRSH") == 0 || query.indexOf("?aprsh") == 0 || query.indexOf("?Aprsh") == 0) {
|
||||
} else if (queryQuestion.indexOf("?APRSH") == 0) {
|
||||
// sacar callsign despues de ?APRSH
|
||||
Serial.println("escuchaste a X estacion? en las ultimas 24 o 8 horas?");
|
||||
answer = "?APRSH on development 73!";
|
||||
} else if (query.indexOf("?WHERE") == 0) {
|
||||
answer.concat("?APRSH on development 73!");
|
||||
} else if (queryQuestion.indexOf("?WHERE") == 0) {
|
||||
// agregar callsign para completar donde esta X callsign --> posicion
|
||||
Serial.println("estaciones escuchadas directo (ultimos 30 min)");
|
||||
answer = "?WHERE on development 73!";
|
||||
answer.concat("?WHERE on development 73!");
|
||||
}
|
||||
|
||||
String queryAnswer = Config.callsign;
|
||||
queryAnswer += ">APLRG1";
|
||||
if (queryFromAPRSIS) {
|
||||
queryAnswer += ",TCPIP,qAC";
|
||||
} else {
|
||||
if (!thirdParty) queryAnswer += ",RFONLY";
|
||||
if (Config.beacon.path != "") {
|
||||
queryAnswer += ",";
|
||||
queryAnswer += Config.beacon.path;
|
||||
}
|
||||
}
|
||||
queryAnswer += "::";
|
||||
|
||||
String processedStation = station;
|
||||
for (int i = station.length(); i < 9; i++) {
|
||||
processedStation += ' ';
|
||||
}
|
||||
if (queryOrigin == 1) { // from APRS-IS
|
||||
return Config.callsign + ">APLRG1,TCPIP,qAC::" + processedStation + ":" + answer;
|
||||
} else { // else == 0 , from LoRa
|
||||
if (Config.beacon.path == "") {
|
||||
return Config.callsign + ">APLRG1,RFONLY::" + processedStation + ":" + answer;
|
||||
} else {
|
||||
return Config.callsign + ">APLRG1,RFONLY," + Config.beacon.path + "::" + processedStation + ":" + answer;
|
||||
}
|
||||
}
|
||||
queryAnswer += processedStation;
|
||||
queryAnswer += ":";
|
||||
queryAnswer += answer;
|
||||
return queryAnswer;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
namespace QUERY_Utils {
|
||||
|
||||
String process(const String& query, const String& station, const uint8_t queryOrigin);
|
||||
String process(const String& query, const String& station, bool queryFromAPRSIS, bool thirdParty);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -81,9 +81,9 @@ namespace STATION_Utils {
|
||||
if (!packet25SegBuffer.empty()) {
|
||||
bool shouldBeIgnored = false;
|
||||
for (int i = 0; i < packet25SegBuffer.size(); i++) {
|
||||
String temp = packet25SegBuffer[i].substring(packet25SegBuffer[i].indexOf(",") + 1);
|
||||
String bufferStation = temp.substring(0, temp.indexOf(","));
|
||||
String bufferMessage = temp.substring(temp.indexOf(",") + 1);
|
||||
const String& temp = packet25SegBuffer[i].substring(packet25SegBuffer[i].indexOf(",") + 1);
|
||||
const String& bufferStation = temp.substring(0, temp.indexOf(","));
|
||||
const String& bufferMessage = temp.substring(temp.indexOf(",") + 1);
|
||||
if (bufferStation == station && bufferMessage == textMessage) {
|
||||
shouldBeIgnored = true;
|
||||
}
|
||||
@@ -101,9 +101,9 @@ namespace STATION_Utils {
|
||||
}
|
||||
|
||||
void processOutputPacketBuffer() {
|
||||
int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ???
|
||||
uint32_t lastRx = millis() - lastRxTime;
|
||||
uint32_t lastTx = millis() - lastTxTime;
|
||||
int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ???
|
||||
uint32_t lastRx = millis() - lastRxTime;
|
||||
uint32_t lastTx = millis() - lastTxTime;
|
||||
if (outputPacketBuffer.size() > 0 && lastTx > timeToWait && lastRx > timeToWait) {
|
||||
LoRa_Utils::sendNewPacket(outputPacketBuffer[0]);
|
||||
outputPacketBuffer.erase(outputPacketBuffer.begin());
|
||||
|
||||
103
src/utils.cpp
@@ -79,12 +79,12 @@ namespace Utils {
|
||||
}
|
||||
|
||||
void setupDisplay() {
|
||||
setup_display();
|
||||
displaySetup();
|
||||
#ifdef INTERNAL_LED_PIN
|
||||
digitalWrite(INTERNAL_LED_PIN,HIGH);
|
||||
#endif
|
||||
Serial.println("\nStarting Station: " + Config.callsign + " Version: " + versionDate);
|
||||
show_display(" LoRa APRS", "", " ( iGATE & DIGI )", "", "", "Richonguzman / CA2RXU", " " + versionDate, 4000);
|
||||
displayShow(" LoRa APRS", "", "", " ( iGATE & DIGI )", "", "" , " CA2RXU " + versionDate, 4000);
|
||||
#ifdef INTERNAL_LED_PIN
|
||||
digitalWrite(INTERNAL_LED_PIN,LOW);
|
||||
#endif
|
||||
@@ -104,16 +104,13 @@ namespace Utils {
|
||||
|
||||
void checkBeaconInterval() {
|
||||
uint32_t lastTx = millis() - lastBeaconTx;
|
||||
String beaconPacket = iGateBeaconPacket;
|
||||
String secondaryBeaconPacket = iGateLoRaBeaconPacket;
|
||||
|
||||
if (lastBeaconTx == 0 || lastTx >= Config.beacon.interval * 60 * 1000) {
|
||||
beaconUpdate = true;
|
||||
}
|
||||
|
||||
if (beaconUpdate) {
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
display_toggle(true);
|
||||
displayToggle(true);
|
||||
}
|
||||
Utils::println("-- Sending Beacon to APRSIS --");
|
||||
|
||||
@@ -121,6 +118,8 @@ namespace Utils {
|
||||
|
||||
activeStations();
|
||||
|
||||
String beaconPacket = iGateBeaconPacket;
|
||||
String secondaryBeaconPacket = iGateLoRaBeaconPacket;
|
||||
if (Config.bme.active && wxModuleType != 0) {
|
||||
String sensorData = BME_Utils::readDataSensor();
|
||||
beaconPacket += sensorData;
|
||||
@@ -129,26 +128,26 @@ namespace Utils {
|
||||
beaconPacket += ".../...g...t...r...p...P...h..b.....";
|
||||
secondaryBeaconPacket += ".../...g...t...r...p...P...h..b.....";
|
||||
}
|
||||
beaconPacket += Config.beacon.comment;
|
||||
secondaryBeaconPacket += Config.beacon.comment;
|
||||
beaconPacket += Config.beacon.comment;
|
||||
secondaryBeaconPacket += Config.beacon.comment;
|
||||
|
||||
#if defined(BATTERY_PIN) || defined(HAS_AXP192) || defined(HAS_AXP2101)
|
||||
if (Config.battery.sendInternalVoltage || Config.battery.monitorInternalVoltage) {
|
||||
float internalVoltage = BATTERY_Utils::checkInternalVoltage();
|
||||
String internalVoltageInfo = String(internalVoltage,2) + "V";
|
||||
if (Config.battery.sendInternalVoltage) {
|
||||
beaconPacket += " Batt=";
|
||||
beaconPacket += internalVoltageInfo;
|
||||
secondaryBeaconPacket += " Batt=";
|
||||
secondaryBeaconPacket += internalVoltageInfo;
|
||||
sixthLine = " (Batt=";
|
||||
sixthLine += internalVoltageInfo;
|
||||
sixthLine += ")";
|
||||
beaconPacket += " Batt=";
|
||||
beaconPacket += internalVoltageInfo;
|
||||
secondaryBeaconPacket += " Batt=";
|
||||
secondaryBeaconPacket += internalVoltageInfo;
|
||||
sixthLine = " (Batt=";
|
||||
sixthLine += internalVoltageInfo;
|
||||
sixthLine += ")";
|
||||
}
|
||||
if (Config.battery.monitorInternalVoltage && internalVoltage < Config.battery.internalSleepVoltage) {
|
||||
beaconPacket += " **IntBatWarning:SLEEP**";
|
||||
secondaryBeaconPacket += " **IntBatWarning:SLEEP**";
|
||||
shouldSleepLowVoltage = true;
|
||||
beaconPacket += " **IntBatWarning:SLEEP**";
|
||||
secondaryBeaconPacket += " **IntBatWarning:SLEEP**";
|
||||
shouldSleepLowVoltage = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -157,25 +156,25 @@ namespace Utils {
|
||||
float externalVoltage = BATTERY_Utils::checkExternalVoltage();
|
||||
String externalVoltageInfo = String(externalVoltage,2) + "V";
|
||||
if (Config.battery.sendExternalVoltage) {
|
||||
beaconPacket += " Ext=";
|
||||
beaconPacket += externalVoltageInfo;
|
||||
secondaryBeaconPacket += " Ext=";
|
||||
secondaryBeaconPacket += externalVoltageInfo;
|
||||
sixthLine = " (Ext V=";
|
||||
sixthLine += externalVoltageInfo;
|
||||
sixthLine += ")";
|
||||
beaconPacket += " Ext=";
|
||||
beaconPacket += externalVoltageInfo;
|
||||
secondaryBeaconPacket += " Ext=";
|
||||
secondaryBeaconPacket += externalVoltageInfo;
|
||||
sixthLine = " (Ext V=";
|
||||
sixthLine += externalVoltageInfo;
|
||||
sixthLine += ")";
|
||||
}
|
||||
if (Config.battery.monitorExternalVoltage && externalVoltage < Config.battery.externalSleepVoltage) {
|
||||
beaconPacket += " **ExtBatWarning:SLEEP**";
|
||||
secondaryBeaconPacket += " **ExtBatWarning:SLEEP**";
|
||||
shouldSleepLowVoltage = true;
|
||||
beaconPacket += " **ExtBatWarning:SLEEP**";
|
||||
secondaryBeaconPacket += " **ExtBatWarning:SLEEP**";
|
||||
shouldSleepLowVoltage = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (Config.aprs_is.active && Config.beacon.sendViaAPRSIS && !backUpDigiMode) {
|
||||
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING IGATE BEACON", 0);
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING IGATE BEACON", 0);
|
||||
seventhLine = " listening...";
|
||||
#ifdef ESP32_DIY_LoRa_A7670
|
||||
#ifdef HAS_A7670
|
||||
A7670_Utils::uploadToAPRSIS(beaconPacket);
|
||||
#else
|
||||
APRS_IS_Utils::upload(beaconPacket);
|
||||
@@ -183,7 +182,7 @@ namespace Utils {
|
||||
}
|
||||
|
||||
if (Config.beacon.sendViaRF || backUpDigiMode) {
|
||||
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING DIGI BEACON", 0);
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING DIGI BEACON", 0);
|
||||
seventhLine = " listening...";
|
||||
STATION_Utils::addToOutputPacketBuffer(secondaryBeaconPacket);
|
||||
}
|
||||
@@ -201,14 +200,14 @@ namespace Utils {
|
||||
void checkDisplayInterval() {
|
||||
uint32_t lastDisplayTime = millis() - lastScreenOn;
|
||||
if (!Config.display.alwaysOn && lastDisplayTime >= Config.display.timeout * 1000) {
|
||||
display_toggle(false);
|
||||
displayToggle(false);
|
||||
}
|
||||
}
|
||||
|
||||
void validateFreqs() {
|
||||
if (Config.loramodule.txFreq != Config.loramodule.rxFreq && abs(Config.loramodule.txFreq - Config.loramodule.rxFreq) < 125000) {
|
||||
Serial.println("Tx Freq less than 125kHz from Rx Freq ---> NOT VALID");
|
||||
show_display("Tx Freq is less than ", "125kHz from Rx Freq", "device will autofix", "and then reboot", 1000);
|
||||
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.writeFile();
|
||||
ESP.restart();
|
||||
@@ -238,13 +237,14 @@ namespace Utils {
|
||||
seventhLineHelper += String(snr);
|
||||
seventhLineHelper += "dBm";
|
||||
|
||||
if (packet.indexOf("::") >= 10) {
|
||||
int firstColonIndex = packet.indexOf(":");
|
||||
if (packet[firstColonIndex + 1] == ':') {
|
||||
sixthLine += "> MESSAGE";
|
||||
seventhLine = seventhLineHelper;
|
||||
} else if (packet.indexOf(":>") >= 10) {
|
||||
} else if (packet[firstColonIndex + 1] == '>') {
|
||||
sixthLine += "> NEW STATUS";
|
||||
seventhLine = seventhLineHelper;
|
||||
} else if (packet.indexOf(":!") >= 10 || packet.indexOf(":=") >= 10) {
|
||||
} else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=') {
|
||||
sixthLine += "> GPS BEACON";
|
||||
if (!Config.syslog.active) {
|
||||
GPS_Utils::getDistanceAndComment(packet); // to be checked!!!
|
||||
@@ -263,15 +263,15 @@ namespace Utils {
|
||||
seventhLine += "D:";
|
||||
seventhLine += distance;
|
||||
seventhLine += "km";
|
||||
} else if (packet.indexOf(":T#") >= 10 && packet.indexOf(":=/") == -1) {
|
||||
sixthLine += "> TELEMETRY";
|
||||
seventhLine = seventhLineHelper;
|
||||
} else if (packet.indexOf(":`") >= 10) {
|
||||
} else if (packet[firstColonIndex + 1] == '`' || packet[firstColonIndex + 1] == '\'') {
|
||||
sixthLine += "> MIC-E";
|
||||
seventhLine = seventhLineHelper;
|
||||
} else if (packet.indexOf(":;") >= 10) {
|
||||
} else if (packet[firstColonIndex + 1] == ';') {
|
||||
sixthLine += "> OBJECT";
|
||||
seventhLine = seventhLineHelper;
|
||||
} else if (packet.indexOf(":T#") >= 10 && packet.indexOf(":=/") == -1) {
|
||||
sixthLine += "> TELEMETRY";
|
||||
seventhLine = seventhLineHelper;
|
||||
} else {
|
||||
sixthLine += "> ??????????";
|
||||
seventhLine = seventhLineHelper;
|
||||
@@ -313,7 +313,7 @@ namespace Utils {
|
||||
Serial.println("\n\n*** Sleeping Low Battey Voltage ***\n\n");
|
||||
esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // sleep 30 min
|
||||
if (mode == 1) {
|
||||
display_toggle(false);
|
||||
displayToggle(false);
|
||||
}
|
||||
#ifdef VEXT_CTRL
|
||||
#ifndef HELTEC_WSL_V3
|
||||
@@ -331,14 +331,12 @@ namespace Utils {
|
||||
if (callsign == "WLNK-1") return true;
|
||||
|
||||
String cleanCallsign;
|
||||
if (callsign.indexOf("-")) { // SSID Validation
|
||||
if (callsign.indexOf("-") > 0) { // SSID Validation
|
||||
cleanCallsign = callsign.substring(0, callsign.indexOf("-"));
|
||||
String ssid = callsign.substring(callsign.indexOf("-") + 1);
|
||||
int ssidInt = ssid.toInt();
|
||||
if (ssidInt == 0 && ssid != "0") {
|
||||
return false;
|
||||
} else if (ssidInt < 0 || ssidInt > 15) {
|
||||
return false;
|
||||
if (ssid.indexOf("-") != -1 || ssid.length() > 2) return false;
|
||||
for (int i = 0; i < ssid.length(); i++) {
|
||||
if (!isAlphaNumeric(ssid[i])) return false;
|
||||
}
|
||||
} else {
|
||||
cleanCallsign = callsign;
|
||||
@@ -350,22 +348,25 @@ namespace Utils {
|
||||
cleanCallsign = " " + cleanCallsign; // A0AA --> _A0AA
|
||||
}
|
||||
|
||||
if (!isDigit(cleanCallsign[2]) || !isAlpha(cleanCallsign[3])) return false; // __0A must be validated
|
||||
if (!isDigit(cleanCallsign[2]) || !isAlpha(cleanCallsign[3])) { // __0A__ must be validated
|
||||
if (cleanCallsign[0] != 'R' && !isDigit(cleanCallsign[1]) && !isAlpha(cleanCallsign[2])) return false; // to accepto R0A___
|
||||
}
|
||||
|
||||
bool isValid = false;
|
||||
if ((isAlphaNumeric(cleanCallsign[0]) || cleanCallsign[0] == ' ') && isAlpha(cleanCallsign[1])) {
|
||||
isValid = true; // AA0A (+A+A) + _A0AA (+A) + 0A0A (+A+A)
|
||||
} else if (isAlpha(cleanCallsign[0]) && isDigit(cleanCallsign[1])) {
|
||||
isValid = true; // A00A (+A+A)
|
||||
} else if (cleanCallsign[0] == 'R' && cleanCallsign.length() == 6 && isDigit(cleanCallsign[1]) && isAlpha(cleanCallsign[2]) && isAlpha(cleanCallsign[3]) && isAlpha(cleanCallsign[4])) {
|
||||
isValid = true; // R0AA (+A+A)
|
||||
}
|
||||
if (!isValid) return false; // also 00__ avoided
|
||||
|
||||
if (cleanCallsign.length() > 4) {
|
||||
if (cleanCallsign.length() > 4) { // to validate ____AA
|
||||
for (int i = 5; i <= cleanCallsign.length(); i++) {
|
||||
if (!isAlpha(cleanCallsign[i - 1])) return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,10 @@ extern const char web_bootstrap_js[] asm("_binary_data_embed_bootstrap_js_gz_sta
|
||||
extern const char web_bootstrap_js_end[] asm("_binary_data_embed_bootstrap_js_gz_end");
|
||||
extern const size_t web_bootstrap_js_len = web_bootstrap_js_end - web_bootstrap_js;
|
||||
|
||||
// Declare external symbols for the embedded image data
|
||||
extern const unsigned char favicon_data[] asm("_binary_data_embed_favicon_png_gz_start");
|
||||
extern const unsigned char favicon_data_end[] asm("_binary_data_embed_favicon_png_gz_end");
|
||||
extern const size_t favicon_data_len = favicon_data_end - favicon_data;
|
||||
|
||||
namespace WEB_Utils {
|
||||
|
||||
@@ -45,12 +49,24 @@ namespace WEB_Utils {
|
||||
}
|
||||
|
||||
void handleHome(AsyncWebServerRequest *request) {
|
||||
if(Config.webadmin.active && !request->authenticate(Config.webadmin.username.c_str(), Config.webadmin.password.c_str()))
|
||||
return request->requestAuthentication();
|
||||
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", (const uint8_t*)web_index_html, web_index_html_len);
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
void handleFavicon(AsyncWebServerRequest *request) {
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "image/x-icon", (const uint8_t*)favicon_data, favicon_data_len);
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
void handleReadConfiguration(AsyncWebServerRequest *request) {
|
||||
if(Config.webadmin.active && !request->authenticate(Config.webadmin.username.c_str(), Config.webadmin.password.c_str()))
|
||||
return request->requestAuthentication();
|
||||
|
||||
File file = SPIFFS.open("/igate_conf.json");
|
||||
|
||||
String fileContent;
|
||||
@@ -141,16 +157,17 @@ namespace WEB_Utils {
|
||||
|
||||
Config.battery.sendInternalVoltage = request->hasParam("battery.sendInternalVoltage", true);
|
||||
Config.battery.monitorInternalVoltage = request->hasParam("battery.monitorInternalVoltage", true);
|
||||
Config.battery.internalSleepVoltage = request->getParam("battery.internalSleepVoltage", true)->value().toFloat();
|
||||
Config.battery.internalSleepVoltage = request->getParam("battery.internalSleepVoltage", true)->value().toFloat();
|
||||
|
||||
Config.battery.sendExternalVoltage = request->hasParam("battery.sendExternalVoltage", true);
|
||||
if (Config.battery.sendExternalVoltage) {
|
||||
Config.battery.externalVoltagePin = request->getParam("battery.externalVoltagePin", true)->value().toInt();
|
||||
Config.battery.voltageDividerR1 = request->getParam("battery.voltageDividerR1", true)->value().toFloat();
|
||||
Config.battery.voltageDividerR2 = request->getParam("battery.voltageDividerR2", true)->value().toFloat();
|
||||
}
|
||||
Config.battery.monitorExternalVoltage = request->hasParam("battery.monitorExternalVoltage", true);
|
||||
Config.battery.externalSleepVoltage = request->getParam("battery.externalSleepVoltage", true)->value().toFloat();
|
||||
|
||||
|
||||
Config.battery.externalSleepVoltage = request->getParam("battery.externalSleepVoltage", true)->value().toFloat();
|
||||
|
||||
Config.bme.active = request->hasParam("bme.active", true);
|
||||
Config.bme.heightCorrection = request->getParam("bme.heightCorrection", true)->value().toInt();
|
||||
Config.bme.temperatureCorrection = request->getParam("bme.temperatureCorrection", true)->value().toFloat();
|
||||
@@ -158,42 +175,42 @@ namespace WEB_Utils {
|
||||
Config.beacon.symbol = "_";
|
||||
}
|
||||
|
||||
|
||||
Config.syslog.active = request->hasParam("syslog.active", true);
|
||||
if (Config.syslog.active) {
|
||||
Config.syslog.server = request->getParam("syslog.server", true)->value();
|
||||
Config.syslog.port = request->getParam("syslog.port", true)->value().toInt();
|
||||
Config.syslog.server = request->getParam("syslog.server", true)->value();
|
||||
Config.syslog.port = request->getParam("syslog.port", true)->value().toInt();
|
||||
}
|
||||
|
||||
Config.tnc.enableServer = request->hasParam("tnc.enableServer", true);
|
||||
Config.tnc.enableSerial = request->hasParam("tnc.enableSerial", true);
|
||||
Config.tnc.acceptOwn = request->hasParam("tnc.acceptOwn", true);
|
||||
|
||||
Config.tnc.enableServer = request->hasParam("tnc.enableServer", true);
|
||||
Config.tnc.enableSerial = request->hasParam("tnc.enableSerial", true);
|
||||
Config.tnc.acceptOwn = request->hasParam("tnc.acceptOwn", true);
|
||||
|
||||
|
||||
Config.rebootMode = request->hasParam("other.rebootMode", true);
|
||||
Config.rebootModeTime = request->getParam("other.rebootModeTime", true)->value().toInt();
|
||||
|
||||
|
||||
Config.ota.username = request->getParam("ota.username", true)->value();
|
||||
Config.ota.password = request->getParam("ota.password", true)->value();
|
||||
|
||||
Config.rememberStationTime = request->getParam("other.rememberStationTime", true)->value().toInt();
|
||||
|
||||
Config.rememberStationTime = request->getParam("other.rememberStationTime", true)->value().toInt();
|
||||
|
||||
|
||||
Config.backupDigiMode = request->hasParam("other.backupDigiMode", true);
|
||||
|
||||
|
||||
Config.lowPowerMode = request->hasParam("other.lowPowerMode", true);
|
||||
Config.lowVoltageCutOff = request->getParam("other.lowVoltageCutOff", true)->value().toDouble();
|
||||
|
||||
Config.personalNote = request->getParam("personalNote", true)->value();
|
||||
|
||||
Config.webadmin.active = request->hasParam("webadmin.active", true);
|
||||
if (Config.webadmin.active) {
|
||||
Config.webadmin.username = request->getParam("webadmin.username", true)->value();
|
||||
Config.webadmin.password = request->getParam("webadmin.password", true)->value();
|
||||
}
|
||||
|
||||
Config.writeFile();
|
||||
|
||||
AsyncWebServerResponse *response = request->beginResponse(302, "text/html", "");
|
||||
response->addHeader("Location", "/");
|
||||
request->send(response);
|
||||
display_toggle(false);
|
||||
displayToggle(false);
|
||||
ESP.restart();
|
||||
}
|
||||
|
||||
@@ -205,7 +222,7 @@ namespace WEB_Utils {
|
||||
|
||||
request->send(200, "text/plain", "Beacon will be sent in a while");
|
||||
} else if (type == "reboot") {
|
||||
display_toggle(false);
|
||||
displayToggle(false);
|
||||
ESP.restart();
|
||||
} else {
|
||||
request->send(404, "text/plain", "Not Found");
|
||||
@@ -249,6 +266,7 @@ namespace WEB_Utils {
|
||||
server.on("/script.js", HTTP_GET, handleScript);
|
||||
server.on("/bootstrap.css", HTTP_GET, handleBootstrapStyle);
|
||||
server.on("/bootstrap.js", HTTP_GET, handleBootstrapScript);
|
||||
server.on("/favicon.png", HTTP_GET, handleFavicon);
|
||||
|
||||
OTA_Utils::setup(&server); // Include OTA Updater for WebServer
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace WIFI_Utils {
|
||||
Serial.print(millis());
|
||||
Serial.println("Reconnecting to WiFi...");
|
||||
WiFi.disconnect();
|
||||
WiFi.reconnect();
|
||||
WIFI_Utils::startWiFi();//WiFi.reconnect();
|
||||
previousWiFiMillis = millis();
|
||||
|
||||
if (Config.backupDigiMode) {
|
||||
@@ -74,7 +74,7 @@ namespace WIFI_Utils {
|
||||
WiFi.disconnect();
|
||||
delay(500);
|
||||
unsigned long start = millis();
|
||||
show_display("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0);
|
||||
displayShow("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0);
|
||||
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ...");
|
||||
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
|
||||
while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) {
|
||||
@@ -99,7 +99,7 @@ namespace WIFI_Utils {
|
||||
currentWiFi = &Config.wifiAPs[myWiFiAPIndex];
|
||||
start = millis();
|
||||
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ...");
|
||||
show_display("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0);
|
||||
displayShow("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0);
|
||||
WiFi.disconnect();
|
||||
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
|
||||
}
|
||||
@@ -110,18 +110,20 @@ namespace WIFI_Utils {
|
||||
#endif
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
Serial.print("Connected as ");
|
||||
Serial.println(WiFi.localIP());
|
||||
show_display("", " Connected!!", "" , " loading ...", 1000);
|
||||
Serial.print(WiFi.localIP());
|
||||
Serial.print(" / MAC Address: ");
|
||||
Serial.println(WiFi.macAddress());
|
||||
displayShow("", " Connected!!", "" , " loading ...", 1000);
|
||||
} else if (WiFi.status() != WL_CONNECTED) {
|
||||
startAP = true;
|
||||
|
||||
Serial.println("\nNot connected to WiFi! Starting Auto AP");
|
||||
show_display("", " WiFi Not Connected!", "" , " loading ...", 1000);
|
||||
displayShow("", " WiFi Not Connected!", "" , " loading ...", 1000);
|
||||
}
|
||||
WiFiConnected = !startAP;
|
||||
if (startAP) {
|
||||
Serial.println("\nNot connected to WiFi! Starting Auto AP");
|
||||
show_display("", " Starting Auto AP", " Please connect to it " , " loading ...", 1000);
|
||||
displayShow("", " Starting Auto AP", " Please connect to it " , " loading ...", 1000);
|
||||
|
||||
startAutoAP();
|
||||
}
|
||||
|
||||
@@ -9,8 +9,21 @@ files = [
|
||||
'data_embed/style.css',
|
||||
'data_embed/bootstrap.js',
|
||||
'data_embed/bootstrap.css',
|
||||
'data_embed/favicon.png',
|
||||
]
|
||||
|
||||
string_to_find_str = "String"
|
||||
string_to_find_ver = "versionDate"
|
||||
|
||||
with open('src/LoRa_APRS_iGate.cpp', encoding='utf-8') as cpp_file:
|
||||
for line in cpp_file:
|
||||
if string_to_find_str in line and string_to_find_ver in line:
|
||||
start = line.find('"') + 1
|
||||
end = line.find('"', start)
|
||||
if start > 0 and end > start:
|
||||
versionDate = line[start:end]
|
||||
break
|
||||
|
||||
for src in files:
|
||||
out = src + ".gz"
|
||||
|
||||
@@ -19,7 +32,7 @@ for src in files:
|
||||
content = f.read()
|
||||
|
||||
if src == 'data_embed/index.html':
|
||||
env_vars = env["BOARD"] + "<br>" + ','.join(env["BUILD_FLAGS"]).replace('-Werror -Wall,', '').replace(',-DELEGANTOTA_USE_ASYNC_WEBSERVER=1', '')
|
||||
env_vars = env["BOARD"] + "<br>" + ','.join(env["BUILD_FLAGS"]).replace('-Werror -Wall,', '').replace(',-DELEGANTOTA_USE_ASYNC_WEBSERVER=1', '') + "<br>" + "Version date: " + versionDate
|
||||
current_date = datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') + " UTC"
|
||||
build_info = f'{env_vars}<br>Build date: {current_date}'.encode()
|
||||
|
||||
|
||||