Compare commits

..

44 Commits

Author SHA1 Message Date
richonguzman a9bcae62e2 readme update 2024-09-23 15:15:22 -03:00
richonguzman 3e0368383a better writting 2024-09-23 15:11:35 -03:00
richonguzman 8b790ef656 updated libraries for SDK3 2024-09-23 14:31:45 -03:00
richonguzman c110b41b99 build update for new boards 2024-09-23 12:42:03 -03:00
richonguzman be7fe23cd5 Added LLCC68 1W board 2024-09-23 12:37:35 -03:00
richonguzman 202d03c61f shortening reduced Wx report 2024-09-23 12:15:58 -03:00
richonguzman ddb45544db readme UPdate 2024-09-22 22:35:51 -03:00
richonguzman c9ea51c6da update Version 2024-09-22 22:34:00 -03:00
richonguzman 72fd2b45ec added mods to include Telemetry 2024-09-22 22:31:33 -03:00
richonguzman 0e46c64880 primera mejora Telemetria 2024-09-22 13:34:13 -03:00
richonguzman dd12330e85 killing some delays 2024-09-17 14:25:00 -03:00
richonguzman 2edb183cad minor update on Heltec WS 2024-09-11 16:14:40 -03:00
richonguzman 775677d5e8 trying heltec wireless stick oled fix 2024-09-11 15:49:58 -03:00
richonguzman a60a6d6e4b update WIRE 2024-09-10 14:26:10 -03:00
richonguzman 14abe14703 updated structs of last Stations and 25seg buffer 2024-09-10 14:06:10 -03:00
richonguzman 345fb1e937 up 2024-09-02 09:40:17 -04:00
richonguzman 916eb038e5 updated WiFi.setHostName() 2024-09-02 09:12:18 -04:00
richonguzman 40fc177828 small fix on wire begin 2024-08-30 15:46:50 -04:00
richonguzman 5dc6e99972 low external voltage RF Tx fix 2024-08-28 17:11:50 -04:00
richonguzman db5710ec6a test 2024-08-28 12:21:54 -04:00
richonguzman 65acb54dbe wrong external sleep voltage definition fix 2024-08-28 11:45:16 -04:00
richonguzman 6088c61e73 versionUpdate + utils beacon message update 2024-08-26 10:33:49 -04:00
Ricardo Guzman (Richonguzman) a8c972c5e1 Merge pull request #157 from S57PNX/main
Correct logic of serial notifications for APRS-IS and RF beacons
2024-08-26 10:32:01 -04:00
S57PNX bd3a9f91d6 Merge branch 'richonguzman:main' into main 2024-08-26 10:25:17 +02:00
richonguzman 643a18f40c Wemos S2 Mini DIY LoRa added 2024-08-23 18:05:27 -04:00
richonguzman 46e5bdd21e added led 2024-08-23 18:00:25 -04:00
richonguzman ea426f4126 board update 2024-08-22 16:27:41 -04:00
richonguzman 5cbdd318a2 test for WEMOS S2 Mini DIY LORA 2024-08-22 15:00:56 -04:00
richonguzman 735988ee1c adding WEMOS S2 MINI 2024-08-22 14:24:30 -04:00
richonguzman d5b666f458 HELTEC WS update 2024-08-22 13:25:46 -04:00
richonguzman 702f4abcbb update for gps beacon with timestamp 2024-08-21 19:11:05 -04:00
richonguzman d0070e4381 updated config 2024-08-20 19:01:04 -04:00
richonguzman f4744eab6a Heltec Wireless Paper base 2024-08-19 11:37:55 -04:00
richonguzman bd672857f4 testing for external battery block 2024-08-19 10:41:46 -04:00
richonguzman 9cc26ccdae wireless paper battery reading fix 2024-08-18 21:06:57 -04:00
richonguzman 8863838210 updated battery readings 2024-08-17 13:16:44 -04:00
richonguzman f11b6de57a fix for normal display 2024-08-16 16:00:58 -04:00
richonguzman 55d6bc325f version update 2024-08-16 15:52:55 -04:00
richonguzman ee687e6959 first test 2024-08-16 15:52:20 -04:00
S57PNX d1732a6bba Correct logic of serial notifications for APRS-IS
and RF beacons
2024-08-15 20:54:26 +02:00
richonguzman 4fb4712a33 backupDigimode avoided in only rx mode 2024-08-14 13:37:52 -04:00
richonguzman 39276b0d32 update to display h and cpp 2024-08-14 12:32:34 -04:00
richonguzman 22203a7c24 just code cleaning 2024-08-14 12:07:17 -04:00
richonguzman d8d832fde9 configuration test without fails 2024-08-14 11:50:39 -04:00
29 changed files with 730 additions and 492 deletions
+17
View File
@@ -33,6 +33,8 @@ jobs:
chip: esp32 chip: esp32
- name: ESP32_DIY_1W_LoRa_915 - name: ESP32_DIY_1W_LoRa_915
chip: esp32 chip: esp32
- name: ESP32_DIY_1W_LoRa_LLCC68
chip: esp32
- name: ESP32_DIY_1W_LoRa_Mesh_V1_2 - name: ESP32_DIY_1W_LoRa_Mesh_V1_2
chip: esp32 chip: esp32
- name: ttgo-t-beam-v1_2 - name: ttgo-t-beam-v1_2
@@ -55,12 +57,16 @@ jobs:
chip: esp32s3 chip: esp32s3
- name: heltec_ht-ct62 - name: heltec_ht-ct62
chip: esp32c3 chip: esp32c3
- name: heltec_wireless_paper
chip: esp32s3
- name: OE5HWN_MeshCom - name: OE5HWN_MeshCom
chip: esp32 chip: esp32
- name: WEMOS-LOLIN32-OLED-DIY - name: WEMOS-LOLIN32-OLED-DIY
chip: esp32 chip: esp32
- name: WEMOS-D1-R32-RA02 - name: WEMOS-D1-R32-RA02
chip: esp32 chip: esp32
- name: WEMOS_S2_MINI_DIY_LoRa
chip: esp32s2
- name: esp32c3_DIY_1W_LoRa - name: esp32c3_DIY_1W_LoRa
chip: esp32c3 chip: esp32c3
- name: esp32c3_DIY_1W_LoRa_915 - name: esp32c3_DIY_1W_LoRa_915
@@ -108,6 +114,17 @@ jobs:
0xe000 installer/firmware/boot_app0.bin \ 0xe000 installer/firmware/boot_app0.bin \
0x10000 installer/firmware/firmware.bin \ 0x10000 installer/firmware/firmware.bin \
0x3D0000 installer/firmware/spiffs.bin 0x3D0000 installer/firmware/spiffs.bin
elif [ "${{ matrix.target.chip }}" == "esp32s2" ]; then
python installer/bin/esptool/esptool.py --chip esp32s2 merge_bin \
-o installer/web_factory.bin \
--flash_mode dio \
--flash_freq 40m \
--flash_size 4MB \
0x1000 installer/firmware/bootloader.bin \
0x8000 installer/firmware/partitions.bin \
0xe000 installer/firmware/boot_app0.bin \
0x10000 installer/firmware/firmware.bin \
0x3D0000 installer/firmware/spiffs.bin
elif [ "${{ matrix.target.chip }}" == "esp32s3" ]; then elif [ "${{ matrix.target.chip }}" == "esp32s3" ]; then
python installer/bin/esptool/esptool.py --chip esp32s3 merge_bin \ python installer/bin/esptool/esptool.py --chip esp32s3 merge_bin \
-o installer/web_factory.bin \ -o installer/web_factory.bin \
+4
View File
@@ -47,6 +47,10 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a
## Timeline (Versions): ## Timeline (Versions):
- 2024.09.23 Libraries Update for SDK3
- 2024.09.23 Added Enconded Telemetry for Battery (+ External Voltage) in Station GPS Beacon Packet.
- 2024.08.23 Wemos S2 Mini DIY LoRa added.
- 2024.08.19 HELTEC Wireless Paper working (still missing Epaper code).
- 2024.08.13 Web Authentication for WebUI. Thanks Mitja S57PNX. - 2024.08.13 Web Authentication for WebUI. Thanks Mitja S57PNX.
- 2024.08.05 WIDE2-n added to WIDE1-n in Digirepeater Modes. - 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.27 External Voltage Divider Resistor configuration on WebUI. Thanks Tilen S54B.
+2 -1
View File
@@ -54,7 +54,8 @@
"monitorExternalVoltage": false, "monitorExternalVoltage": false,
"externalSleepVoltage": 10.9, "externalSleepVoltage": 10.9,
"voltageDividerR1": 100.0, "voltageDividerR1": 100.0,
"voltageDividerR2": 27.0 "voltageDividerR2": 27.0,
"sendVoltageAsTelemetry": true
}, },
"bme": { "bme": {
"active": false, "active": false,
+15 -1
View File
@@ -973,6 +973,20 @@
>Send Internal Voltage</label >Send Internal Voltage</label
> >
</div> </div>
<div class="form-check form-switch">
<input
type="checkbox"
name="battery.sendVoltageAsTelemetry"
id="battery.sendVoltageAsTelemetry"
class="form-check-input"
/>
<label
for="battery.sendVoltageAsTelemetry"
class="form-label"
style="font-style: italic;"
>(Send Voltage As Telemetry)</label
>
</div>
<div class="form-check form-switch mt-3"> <div class="form-check form-switch mt-3">
<input <input
type="checkbox" type="checkbox"
@@ -1021,7 +1035,7 @@
>Send External Voltage</label >Send External Voltage</label
> >
</div> </div>
<div class="form-check form-switch mt-3"> <div class="form-check form-switch mt-5">
<input <input
type="checkbox" type="checkbox"
name="battery.monitorExternalVoltage" name="battery.monitorExternalVoltage"
+3 -2
View File
@@ -162,10 +162,11 @@ function loadSettings(settings) {
document.getElementById("battery.internalSleepVoltage").value = settings.battery.internalSleepVoltage.toFixed(1); document.getElementById("battery.internalSleepVoltage").value = settings.battery.internalSleepVoltage.toFixed(1);
document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage; document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage;
document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin; document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin;
document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1); document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1);
document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.toFixed(1); document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.toFixed(1);
document.getElementById("battery.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage; document.getElementById("battery.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage;
document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1); document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1);
document.getElementById("battery.sendVoltageAsTelemetry").checked = settings.battery.sendVoltageAsTelemetry;
// TELEMETRY BME/WX // TELEMETRY BME/WX
document.getElementById("bme.active").checked = settings.bme.active; document.getElementById("bme.active").checked = settings.bme.active;
+43 -4
View File
@@ -37,9 +37,9 @@ lib_deps =
adafruit/Adafruit BMP280 Library @ 2.6.8 adafruit/Adafruit BMP280 Library @ 2.6.8
adafruit/Adafruit BME680 Library @ 2.0.4 adafruit/Adafruit BME680 Library @ 2.0.4
adafruit/Adafruit Si7021 Library @ 1.5.3 adafruit/Adafruit Si7021 Library @ 1.5.3
ayushsharma82/ElegantOTA @ 3.1.1 ayushsharma82/ElegantOTA @ 3.1.5
ottowinter/ESPAsyncWebServer-esphome @ 3.2.2 mathieucarbou/ESPAsyncWebServer @ 3.2.3
esphome/AsyncTCP-esphome @ 2.1.1 mathieucarbou/AsyncTCP @ 3.2.5
[env:ttgo-lora32-v21] [env:ttgo-lora32-v21]
board = ttgo-lora32-v21 board = ttgo-lora32-v21
@@ -93,7 +93,7 @@ lib_deps =
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:heltec_wireless_stick] [env:heltec_wireless_stick]
board = heltec_wifi_lora_32_V3 board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
-Werror -Wall -Werror -Wall
@@ -177,6 +177,19 @@ lib_deps =
adafruit/Adafruit GFX Library @ 1.11.9 adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:ESP32_DIY_1W_LoRa_LLCC68]
board = esp32dev
build_flags =
-Werror -Wall
-DESP32_DIY_1W_LoRa_LLCC68
-DHAS_LLCC68
-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] [env:ESP32_DIY_1W_LoRa_Mesh_V1_2]
board = esp32dev board = esp32dev
build_flags = build_flags =
@@ -305,6 +318,7 @@ lib_deps =
vshymanskyy/TinyGSM @ 0.12.0 vshymanskyy/TinyGSM @ 0.12.0
vshymanskyy/StreamDebugger @ 1.0.1 vshymanskyy/StreamDebugger @ 1.0.1
[env:heltec_wireless_tracker] [env:heltec_wireless_tracker]
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
@@ -355,6 +369,19 @@ lib_deps =
adafruit/Adafruit GFX Library @ 1.11.9 adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:heltec_wireless_paper]
board = esp32-s3-devkitc-1
board_build.mcu = esp32s3
build_flags =
-Werror -Wall
-DHELTEC_WP
-DHAS_SX1262
-DHAS_EPAPER
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps =
${common.lib_deps}
[env:OE5HWN_MeshCom] [env:OE5HWN_MeshCom]
board = esp32dev board = esp32dev
build_flags = build_flags =
@@ -392,6 +419,18 @@ lib_deps =
adafruit/Adafruit GFX Library @ 1.11.9 adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:WEMOS_S2_MINI_DIY_LoRa]
board = lolin_s2_mini
build_flags =
-Werror -Wall
-DWEMOS_S2_MINI_DIY_LoRa
-DHAS_SX1278
-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] [env:esp32c3_DIY_1W_LoRa]
board = esp32-c3-devkitm-1 board = esp32-c3-devkitm-1
board_build.mcu = esp32c3 board_build.mcu = esp32c3
+10 -10
View File
@@ -33,7 +33,7 @@
bool checkModemOn() { bool checkModemOn() {
bool modemReady = false; bool modemReady = false;
Serial.print("Starting Modem ... "); Serial.print("Starting Modem ... ");
show_display(firstLine, "Starting Modem...", " ", " ", 0); displayShow(firstLine, "Starting Modem...", " ", " ", 0);
pinMode(A7670_ResetPin, OUTPUT); //A7670 Reset pinMode(A7670_ResetPin, OUTPUT); //A7670 Reset
digitalWrite(A7670_ResetPin, LOW); digitalWrite(A7670_ResetPin, LOW);
@@ -60,7 +60,7 @@
modemReady = true; modemReady = true;
i = 1; i = 1;
Serial.println("Modem Ready!\n"); Serial.println("Modem Ready!\n");
show_display(firstLine, "Starting Modem...", "---> Modem Ready", " ", 0); displayShow(firstLine, "Starting Modem...", "---> Modem Ready", " ", 0);
return true; return true;
} }
} }
@@ -78,7 +78,7 @@
delay(1000); delay(1000);
//setup_gps(); // if gps active / won't be need for now //setup_gps(); // if gps active / won't be need for now
} else { } else {
show_display(firstLine, "Starting Modem...", "---> Failed !!!", " ", 0); displayShow(firstLine, "Starting Modem...", "---> Failed !!!", " ", 0);
Serial.println(F("*********** Failed to connect to the modem! ***********")); Serial.println(F("*********** Failed to connect to the modem! ***********"));
} }
} }
@@ -98,26 +98,26 @@
//Serial.println(response); // DEBUG of Modem AT message //Serial.println(response); // DEBUG of Modem AT message
if(response.indexOf("verified") >= 0) { if(response.indexOf("verified") >= 0) {
Serial.println("Logged! (User Validated)\n"); 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 ####################"); Serial.println("#################### APRS-IS FEED ####################");
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
} else if (ATMessage == "AT+NETOPEN" && response.indexOf("OK") >= 0) { } else if (ATMessage == "AT+NETOPEN" && response.indexOf("OK") >= 0) {
Serial.println("Port Open!"); Serial.println("Port Open!");
show_display(firstLine, "Opening Port...", "---> Port Open", " ", 0); displayShow(firstLine, "Opening Port...", "---> Port Open", " ", 0);
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
} else if (ATMessage == "AT+NETOPEN" && response.indexOf("Network is already opened") >= 0) { } else if (ATMessage == "AT+NETOPEN" && response.indexOf("Network is already opened") >= 0) {
Serial.println("Port Open! (was already opened)"); Serial.println("Port Open! (was already opened)");
show_display(firstLine, "Opening Port...", "---> Port Open", " ", 0); displayShow(firstLine, "Opening Port...", "---> Port Open", " ", 0);
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
} else if (ATMessage.indexOf("AT+CIPOPEN") == 0 && response.indexOf("PB DONE") >= 0) { } else if (ATMessage.indexOf("AT+CIPOPEN") == 0 && response.indexOf("PB DONE") >= 0) {
Serial.println("Contacted!"); Serial.println("Contacted!");
show_display(firstLine, "Connecting APRS-IS...", "---> Contacted", " ", 0); displayShow(firstLine, "Connecting APRS-IS...", "---> Contacted", " ", 0);
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
@@ -155,17 +155,17 @@
Serial.println("-----> Connecting to APRS IS"); Serial.println("-----> Connecting to APRS IS");
while (!modemStartUp) { while (!modemStartUp) {
Serial.print("Opening Port... "); Serial.print("Opening Port... ");
show_display(firstLine, "Opening Port...", " ", " ", 0); displayShow(firstLine, "Opening Port...", " ", " ", 0);
modemStartUp = checkATResponse("AT+NETOPEN"); modemStartUp = checkATResponse("AT+NETOPEN");
delay(2000); delay(2000);
} while (!serverStartUp) { } while (!serverStartUp) {
Serial.print("Connecting APRS-IS Server... "); 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)); serverStartUp = checkATResponse("AT+CIPOPEN=0,\"TCP\",\"" + String(Config.aprs_is.server) + "\"," + String(Config.aprs_is.port));
delay(2000); delay(2000);
} while (!userBytesSended) { } while (!userBytesSended) {
Serial.print("Writing User Login Data "); 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)); userBytesSended = checkATResponse("AT+CIPSEND=0," + String(loginInfo.length()+1));
delay(2000); delay(2000);
} while (!modemLoggedToAPRSIS) { } while (!modemLoggedToAPRSIS) {
+4 -6
View File
@@ -38,7 +38,7 @@ ________________________________________________________________________________
#include "A7670_utils.h" #include "A7670_utils.h"
#endif #endif
String versionDate = "2024.08.13"; String versionDate = "2024.09.23";
Configuration Config; Configuration Config;
WiFiClient espClient; WiFiClient espClient;
@@ -61,15 +61,13 @@ String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seven
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
POWER_Utils::setup(); POWER_Utils::setup();
BATTERY_Utils::setup();
Utils::setupDisplay(); Utils::setupDisplay();
Config.check();
LoRa_Utils::setup(); LoRa_Utils::setup();
Utils::validateFreqs(); Utils::validateFreqs();
GPS_Utils::generateBeacons(); GPS_Utils::generateBeacons();
#ifdef STARTUP_DELAY // (TEST) just to wait for WiFi init of Routers #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); delay(STARTUP_DELAY * 60 * 1000);
#endif #endif
@@ -163,7 +161,7 @@ void loop() {
APRS_IS_Utils::processLoRaPacket(packet); // Send received packet to APRSIS APRS_IS_Utils::processLoRaPacket(packet); // Send received packet to APRSIS
} }
if (Config.digi.mode == 2 || Config.digi.mode == 3 || backUpDigiMode) { // If Digi enabled if (Config.loramodule.txActive && (Config.digi.mode == 2 || Config.digi.mode == 3 || backUpDigiMode)) { // If Digi enabled
STATION_Utils::clean25SegBuffer(); STATION_Utils::clean25SegBuffer();
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
} }
@@ -182,7 +180,7 @@ void loop() {
STATION_Utils::processOutputPacketBuffer(); STATION_Utils::processOutputPacketBuffer();
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0); displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
Utils::checkRebootTime(); Utils::checkRebootTime();
Utils::checkSleepByLowBatteryVoltage(1); Utils::checkSleepByLowBatteryVoltage(1);
} }
+12 -12
View File
@@ -59,7 +59,7 @@ namespace APRS_IS_Utils {
aprsAuth += Config.callsign; aprsAuth += Config.callsign;
aprsAuth += " pass "; aprsAuth += " pass ";
aprsAuth += Config.aprs_is.passcode; aprsAuth += Config.aprs_is.passcode;
aprsAuth += " vers CA2RXU_LoRa_iGate 1.4 filter "; aprsAuth += " vers CA2RXU_LoRa_iGate 2.0 filter ";
aprsAuth += Config.aprs_is.filter; aprsAuth += Config.aprs_is.filter;
upload(aprsAuth); upload(aprsAuth);
delay(200); delay(200);
@@ -77,7 +77,7 @@ namespace APRS_IS_Utils {
wifiState = "AP"; wifiState = "AP";
} }
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
lastScreenOn = millis(); lastScreenOn = millis();
} }
@@ -99,7 +99,7 @@ namespace APRS_IS_Utils {
} }
#endif #endif
if(aprsisState == "--" && !Config.display.alwaysOn && Config.display.timeout != 0) { if(aprsisState == "--" && !Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
} }
} }
@@ -160,11 +160,11 @@ namespace APRS_IS_Utils {
} }
if (receivedMessage.indexOf("?") == 0) { if (receivedMessage.indexOf("?") == 0) {
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
STATION_Utils::addToOutputPacketBuffer(QUERY_Utils::process(receivedMessage, sender, false, thirdParty)); STATION_Utils::addToOutputPacketBuffer(QUERY_Utils::process(receivedMessage, sender, false, thirdParty));
lastScreenOn = millis(); lastScreenOn = millis();
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, "Callsign = " + sender, "TYPE --> QUERY", 0); displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, "Callsign = " + sender, "TYPE --> QUERY", 0);
return true; return true;
} }
else { else {
@@ -192,7 +192,7 @@ namespace APRS_IS_Utils {
if (!queryMessage) { if (!queryMessage) {
const String& aprsPacket = buildPacketToUpload(packet); const String& aprsPacket = buildPacketToUpload(packet);
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
lastScreenOn = millis(); lastScreenOn = millis();
#ifdef HAS_A7670 #ifdef HAS_A7670
@@ -203,7 +203,7 @@ namespace APRS_IS_Utils {
upload(aprsPacket); upload(aprsPacket);
#endif #endif
Utils::println("---> Uploaded to APRS-IS"); Utils::println("---> Uploaded to APRS-IS");
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0); displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
} }
} }
} }
@@ -294,7 +294,7 @@ namespace APRS_IS_Utils {
String queryAnswer = QUERY_Utils::process(receivedMessage, Sender, true, false); String queryAnswer = QUERY_Utils::process(receivedMessage, Sender, true, false);
//Serial.println("---> QUERY Answer : " + queryAnswer.substring(0,queryAnswer.indexOf("\n"))); //Serial.println("---> QUERY Answer : " + queryAnswer.substring(0,queryAnswer.indexOf("\n")));
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
lastScreenOn = millis(); lastScreenOn = millis();
delay(500); delay(500);
@@ -302,7 +302,7 @@ namespace APRS_IS_Utils {
A7670_Utils::uploadToAPRSIS(queryAnswer); A7670_Utils::uploadToAPRSIS(queryAnswer);
#else #else
upload(queryAnswer); upload(queryAnswer);
#endif #endif
SYSLOG_Utils::log(2, queryAnswer, 0, 0.0, 0); // APRSIS TX SYSLOG_Utils::log(2, queryAnswer, 0, 0.0, 0); // APRSIS TX
fifthLine = "APRS-IS ----> APRS-IS"; fifthLine = "APRS-IS ----> APRS-IS";
sixthLine = Config.callsign; sixthLine = Config.callsign;
@@ -318,16 +318,16 @@ namespace APRS_IS_Utils {
Utils::print("Received Message from APRS-IS : " + packet); Utils::print("Received Message from APRS-IS : " + packet);
if (STATION_Utils::wasHeard(Addressee)) { if (STATION_Utils::wasHeard(Addressee)) {
STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 1)); STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 1));
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
Utils::typeOfPacket(packet, 1); // APRS-LoRa 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) { } else if (Config.aprs_is.objectsToRF && packet.indexOf(":;") > 0) {
Utils::println("Received Object from APRS-IS : " + packet); Utils::println("Received Object from APRS-IS : " + packet);
STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 5)); STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 5));
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
Utils::typeOfPacket(packet, 1); // APRS-LoRa Utils::typeOfPacket(packet, 1); // APRS-LoRa
} }
+57 -5
View File
@@ -17,6 +17,8 @@ float multiplyCorrection = 0.035;
float voltageDividerTransformation = 0.0; float voltageDividerTransformation = 0.0;
int telemetryCounter = random(1,999);
#ifdef HAS_ADC_CALIBRATION #ifdef HAS_ADC_CALIBRATION
#include <esp_adc_cal.h> #include <esp_adc_cal.h>
@@ -102,7 +104,7 @@ namespace BATTERY_Utils {
#if defined(HELTEC_WIRELESS_TRACKER) #if defined(HELTEC_WIRELESS_TRACKER)
digitalWrite(ADC_CTRL, HIGH); digitalWrite(ADC_CTRL, HIGH);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP)
digitalWrite(ADC_CTRL, LOW); digitalWrite(ADC_CTRL, LOW);
#endif #endif
#endif #endif
@@ -133,10 +135,15 @@ namespace BATTERY_Utils {
#if defined(HELTEC_WIRELESS_TRACKER) #if defined(HELTEC_WIRELESS_TRACKER)
digitalWrite(ADC_CTRL, LOW); digitalWrite(ADC_CTRL, LOW);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP)
digitalWrite(ADC_CTRL, HIGH); digitalWrite(ADC_CTRL, HIGH);
#endif #endif
#ifdef HELTEC_WP
double inputDivider = (1.0 / (10.0 + 10.0)) * 10.0; // The voltage divider is a 10k + 10k resistor in series
#else
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. 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.
#endif
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. 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 #else
#ifdef HAS_ADC_CALIBRATION #ifdef HAS_ADC_CALIBRATION
@@ -205,12 +212,57 @@ namespace BATTERY_Utils {
shouldSleepLowVoltage = true; shouldSleepLowVoltage = true;
} }
#endif #endif
if (Config.battery.monitorExternalVoltage && checkExternalVoltage() < Config.battery.externalSleepVoltage + 0.1) { #ifndef HELTEC_WP
shouldSleepLowVoltage = true; if (Config.battery.monitorExternalVoltage && checkExternalVoltage() < Config.battery.externalSleepVoltage + 0.1) {
} shouldSleepLowVoltage = true;
}
#endif
if (shouldSleepLowVoltage) { if (shouldSleepLowVoltage) {
Utils::checkSleepByLowBatteryVoltage(0); Utils::checkSleepByLowBatteryVoltage(0);
} }
} }
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType) { // 0 = internal battery(0-4,2V) , 1 = external battery(0-15V)
String encodedBytes;
int tempValue;
if (firstBytes) {
tempValue = value;
} else {
switch (voltageType) {
case 0:
tempValue = value * 100; // Internal voltage calculation
break;
case 1:
tempValue = (value * 100) / 2; // External voltage calculation
break;
default:
tempValue = value;
break;
}
}
int firstByte = tempValue / 91;
tempValue -= firstByte * 91;
encodedBytes = char(firstByte + 33);
encodedBytes += char(tempValue + 33);
return encodedBytes;
}
String generateEncodedTelemetry() {
String telemetry = "|";
telemetry += generateEncodedTelemetryBytes(telemetryCounter, true, 0);
telemetryCounter++;
if (telemetryCounter == 1000) {
telemetryCounter = 0;
}
if (Config.battery.sendInternalVoltage) telemetry += generateEncodedTelemetryBytes(checkInternalVoltage(), false, 0);
if (Config.battery.sendExternalVoltage) telemetry += generateEncodedTelemetryBytes(checkExternalVoltage(), false, 1);
telemetry += "|";
return telemetry;
}
} }
+3
View File
@@ -14,6 +14,9 @@ namespace BATTERY_Utils {
void checkIfShouldSleep(); // ???? void checkIfShouldSleep(); // ????
void startupBatteryHealth(); void startupBatteryHealth();
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType);
String generateEncodedTelemetry();
} }
#endif #endif
+7 -7
View File
@@ -33,11 +33,11 @@ namespace BME_Utils {
uint8_t err, addr; uint8_t err, addr;
for(addr = 1; addr < 0x7F; addr++) { for(addr = 1; addr < 0x7F; addr++) {
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) #if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
Wire1.beginTransmission(addr); Wire1.beginTransmission(addr);
err = Wire1.endTransmission(); err = Wire1.endTransmission();
#else #else
Wire.beginTransmission(addr); Wire.beginTransmission(addr);
err = Wire.endTransmission(); err = Wire.endTransmission();
#endif #endif
if (err == 0) { if (err == 0) {
//Serial.println(addr); this shows any connected board to I2C //Serial.println(addr); this shows any connected board to I2C
@@ -93,7 +93,7 @@ namespace BME_Utils {
} }
} }
if (!wxModuleFound) { 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"); Serial.println("BME/BMP/Si7021 sensor Active in config but not found! Check Wiring");
} else { } else {
switch (wxModuleType) { switch (wxModuleType) {
@@ -216,7 +216,7 @@ namespace BME_Utils {
String wx; String wx;
if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) { if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) {
Serial.println("BME/BMP/Si7021 Module data failed"); Serial.println("BME/BMP/Si7021 Module data failed");
wx = ".../...g...t...r...p...P...h..b....."; wx = ".../...g...t...";
fifthLine = ""; fifthLine = "";
return wx; return wx;
} else { } else {
@@ -246,7 +246,7 @@ namespace BME_Utils {
wx = ".../...g...t"; wx = ".../...g...t";
wx += tempStr; wx += tempStr;
wx += "r...p...P...h"; wx += "h";
wx += humStr; wx += humStr;
wx += "b"; wx += "b";
wx += presStr; wx += presStr;
+35 -8
View File
@@ -18,7 +18,7 @@
#define RADIO_BUSY_PIN 26 // GPIO26 - SX1278 IRQ ---->DIO0 #define RADIO_BUSY_PIN 26 // GPIO26 - SX1278 IRQ ---->DIO0
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || 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) || defined(HELTEC_WP)
#define RADIO_SCLK_PIN 9 // SX1262 SCK #define RADIO_SCLK_PIN 9 // SX1262 SCK
#define RADIO_MISO_PIN 11 // SX1262 MISO #define RADIO_MISO_PIN 11 // SX1262 MISO
#define RADIO_MOSI_PIN 10 // SX1262 MOSI #define RADIO_MOSI_PIN 10 // SX1262 MOSI
@@ -28,7 +28,7 @@
#define RADIO_BUSY_PIN 13 // SX1262 BUSY #define RADIO_BUSY_PIN 13 // SX1262 BUSY
#endif #endif
#if defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) // Ebyte E22 400M30S (SX1268) or E22 900M30S (SX1262) #if defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_LLCC68) // Ebyte E22 400M30S (SX1268) or E22 900M30S (SX1262) or E220 LLCC68
#define RADIO_SCLK_PIN 18 #define RADIO_SCLK_PIN 18
#define RADIO_MISO_PIN 19 #define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 23 #define RADIO_MOSI_PIN 23
@@ -84,7 +84,7 @@
#define RADIO_TXEN 13 #define RADIO_TXEN 13
#endif #endif
#ifdef HELTEC_HTCT62 #if defined(HELTEC_HTCT62)
#define RADIO_SCLK_PIN 10 // SX1262 SCK #define RADIO_SCLK_PIN 10 // SX1262 SCK
#define RADIO_MISO_PIN 6 // SX1262 MISO #define RADIO_MISO_PIN 6 // SX1262 MISO
#define RADIO_MOSI_PIN 7 // SX1262 MOSI #define RADIO_MOSI_PIN 7 // SX1262 MOSI
@@ -132,21 +132,30 @@
#define RADIO_TXEN 7 #define RADIO_TXEN 7
#endif #endif
#ifdef WEMOS_S2_MINI_DIY_LoRa
#define RADIO_SCLK_PIN 36
#define RADIO_MISO_PIN 37
#define RADIO_MOSI_PIN 35
#define RADIO_CS_PIN 34
#define RADIO_BUSY_PIN 38
#define RADIO_RST_PIN 33
#endif
// OLED // 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) || 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) #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_LLCC68) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2)
#define OLED_SDA 21 #define OLED_SDA 21
#define OLED_SCL 22 #define OLED_SCL 22
#define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#endif #endif
#ifdef HELTEC_V2 #if defined(HELTEC_V2) || defined(HELTEC_WS)
#define OLED_SDA 4 #define OLED_SDA 4
#define OLED_SCL 15 #define OLED_SCL 15
#define OLED_RST 16 #define OLED_RST 16
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WS) #if defined(HELTEC_V3)
#define OLED_SDA 17 #define OLED_SDA 17
#define OLED_SCL 18 #define OLED_SCL 18
#define OLED_RST 21 #define OLED_RST 21
@@ -158,7 +167,7 @@
#define OLED_RST -1 #define OLED_RST -1
#endif #endif
#if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa) && !defined(ESP32C3_DIY_1W_LoRa_915) #if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa) && !defined(ESP32C3_DIY_1W_LoRa_915) && !defined(WEMOS_S2_MINI_DIY_LoRa)
#define HAS_DISPLAY #define HAS_DISPLAY
#endif #endif
@@ -166,6 +175,9 @@
#ifdef HELTEC_HTCT62 #ifdef HELTEC_HTCT62
#define BATTERY_PIN 1 #define BATTERY_PIN 1
#endif #endif
#ifdef WEMOS_S2_MINI_DIY_LoRa
#define INTERNAL_LED_PIN 15
#endif
#if defined(TTGO_T_LORA32_V2_1) || defined(TTGO_T_LORA32_V2_1_915) #if defined(TTGO_T_LORA32_V2_1) || defined(TTGO_T_LORA32_V2_1_915)
#define INTERNAL_LED_PIN 25 // Green Led #define INTERNAL_LED_PIN 25 // Green Led
#define BATTERY_PIN 35 #define BATTERY_PIN 35
@@ -179,7 +191,7 @@
#define INTERNAL_LED_PIN 35 #define INTERNAL_LED_PIN 35
#define BATTERY_PIN 1 #define BATTERY_PIN 1
#define VEXT_CTRL 36 #define VEXT_CTRL 36
#define ADC_CTRL 37 // Heltec WSL_V3 just like Heltec WT #define ADC_CTRL 37
#define BOARD_I2C_SDA 41 #define BOARD_I2C_SDA 41
#define BOARD_I2C_SCL 42 #define BOARD_I2C_SCL 42
#ifdef HELTEC_WSL_V3_DISPLAY #ifdef HELTEC_WSL_V3_DISPLAY
@@ -204,6 +216,21 @@
#define BOARD_I2C_SCL 6 #define BOARD_I2C_SCL 6
#endif #endif
#ifdef HELTEC_WP
#define INTERNAL_LED_PIN 18
#define BATTERY_PIN 20
#define ADC_CTRL 19
#define VEXT_CTRL 45
#define BOARD_I2C_SDA 37
#define BOARD_I2C_SCL 36
#define EPAPER_BUSY 7
#define EPAPER_RST 6
#define EPAPER_DC 5
#define EPAPER_CS 4
#define EPAPER_SCL 3
#define EPAPER_SDA 2
#endif
#ifdef ESP32_C3_DIY_LoRa // just testing! #ifdef ESP32_C3_DIY_LoRa // just testing!
#define OLED_SDA 8 #define OLED_SDA 8
#define OLED_SCL 9 #define OLED_SCL 9
+186 -245
View File
@@ -4,16 +4,6 @@
#include "display.h" #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() { void Configuration::writeFile() {
Serial.println("Saving config.."); Serial.println("Saving config..");
@@ -27,43 +17,43 @@ void Configuration::writeFile() {
} }
} }
data["wifi"]["autoAP"]["password"] = wifiAutoAP.password; data["wifi"]["autoAP"]["password"] = wifiAutoAP.password;
data["wifi"]["autoAP"]["powerOff"] = wifiAutoAP.powerOff; data["wifi"]["autoAP"]["powerOff"] = wifiAutoAP.powerOff;
data["callsign"] = callsign; data["callsign"] = callsign;
data["aprs_is"]["active"] = aprs_is.active; data["aprs_is"]["active"] = aprs_is.active;
data["aprs_is"]["passcode"] = aprs_is.passcode; data["aprs_is"]["passcode"] = aprs_is.passcode;
data["aprs_is"]["server"] = aprs_is.server; data["aprs_is"]["server"] = aprs_is.server;
data["aprs_is"]["port"] = aprs_is.port; data["aprs_is"]["port"] = aprs_is.port;
data["aprs_is"]["filter"] = aprs_is.filter; data["aprs_is"]["filter"] = aprs_is.filter;
data["aprs_is"]["messagesToRF"] = aprs_is.messagesToRF; data["aprs_is"]["messagesToRF"] = aprs_is.messagesToRF;
data["aprs_is"]["objectsToRF"] = aprs_is.objectsToRF; data["aprs_is"]["objectsToRF"] = aprs_is.objectsToRF;
data["beacon"]["comment"] = beacon.comment; data["beacon"]["comment"] = beacon.comment;
data["beacon"]["interval"] = beacon.interval; data["beacon"]["interval"] = beacon.interval;
data["beacon"]["latitude"] = beacon.latitude; data["beacon"]["latitude"] = beacon.latitude;
data["beacon"]["longitude"] = beacon.longitude; data["beacon"]["longitude"] = beacon.longitude;
data["beacon"]["overlay"] = beacon.overlay; data["beacon"]["overlay"] = beacon.overlay;
data["beacon"]["symbol"] = beacon.symbol; data["beacon"]["symbol"] = beacon.symbol;
data["beacon"]["sendViaAPRSIS"] = beacon.sendViaAPRSIS; data["beacon"]["sendViaAPRSIS"] = beacon.sendViaAPRSIS;
data["beacon"]["sendViaRF"] = beacon.sendViaRF; data["beacon"]["sendViaRF"] = beacon.sendViaRF;
data["beacon"]["path"] = beacon.path; data["beacon"]["path"] = beacon.path;
data["digi"]["mode"] = digi.mode; data["digi"]["mode"] = digi.mode;
data["lora"]["rxFreq"] = loramodule.rxFreq; data["lora"]["rxFreq"] = loramodule.rxFreq;
data["lora"]["txFreq"] = loramodule.txFreq; data["lora"]["txFreq"] = loramodule.txFreq;
data["lora"]["spreadingFactor"] = loramodule.spreadingFactor; data["lora"]["spreadingFactor"] = loramodule.spreadingFactor;
data["lora"]["signalBandwidth"] = loramodule.signalBandwidth; data["lora"]["signalBandwidth"] = loramodule.signalBandwidth;
data["lora"]["codingRate4"] = loramodule.codingRate4; data["lora"]["codingRate4"] = loramodule.codingRate4;
data["lora"]["power"] = loramodule.power; data["lora"]["power"] = loramodule.power;
data["lora"]["txActive"] = loramodule.txActive; data["lora"]["txActive"] = loramodule.txActive;
data["lora"]["rxActive"] = loramodule.rxActive; data["lora"]["rxActive"] = loramodule.rxActive;
data["display"]["alwaysOn"] = display.alwaysOn; data["display"]["alwaysOn"] = display.alwaysOn;
data["display"]["timeout"] = display.timeout; data["display"]["timeout"] = display.timeout;
data["display"]["turn180"] = display.turn180; data["display"]["turn180"] = display.turn180;
data["battery"]["sendInternalVoltage"] = battery.sendInternalVoltage; data["battery"]["sendInternalVoltage"] = battery.sendInternalVoltage;
data["battery"]["monitorInternalVoltage"] = battery.monitorInternalVoltage; data["battery"]["monitorInternalVoltage"] = battery.monitorInternalVoltage;
@@ -73,40 +63,41 @@ void Configuration::writeFile() {
data["battery"]["externalVoltagePin"] = battery.externalVoltagePin; data["battery"]["externalVoltagePin"] = battery.externalVoltagePin;
data["battery"]["monitorExternalVoltage"] = battery.monitorExternalVoltage; data["battery"]["monitorExternalVoltage"] = battery.monitorExternalVoltage;
data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage; data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage;
data["battery"]["voltageDividerR1"] = battery.voltageDividerR1; data["battery"]["voltageDividerR1"] = battery.voltageDividerR1;
data["battery"]["voltageDividerR2"] = battery.voltageDividerR2; data["battery"]["voltageDividerR2"] = battery.voltageDividerR2;
data["battery"]["sendVoltageAsTelemetry"] = battery.sendVoltageAsTelemetry;
data["bme"]["active"] = bme.active;
data["bme"]["heightCorrection"] = bme.heightCorrection;
data["bme"]["temperatureCorrection"] = bme.temperatureCorrection;
data["bme"]["active"] = bme.active; data["syslog"]["active"] = syslog.active;
data["bme"]["heightCorrection"] = bme.heightCorrection; data["syslog"]["server"] = syslog.server;
data["bme"]["temperatureCorrection"] = bme.temperatureCorrection; data["syslog"]["port"] = syslog.port;
data["syslog"]["active"] = syslog.active; data["tnc"]["enableServer"] = tnc.enableServer;
data["syslog"]["server"] = syslog.server; data["tnc"]["enableSerial"] = tnc.enableSerial;
data["syslog"]["port"] = syslog.port; data["tnc"]["acceptOwn"] = tnc.acceptOwn;
data["tnc"]["enableServer"] = tnc.enableServer; data["other"]["rebootMode"] = rebootMode;
data["tnc"]["enableSerial"] = tnc.enableSerial; data["other"]["rebootModeTime"] = rebootModeTime;
data["tnc"]["acceptOwn"] = tnc.acceptOwn;
data["other"]["rebootMode"] = rebootMode; data["ota"]["username"] = ota.username;
data["other"]["rebootModeTime"] = rebootModeTime; data["ota"]["password"] = ota.password;
data["ota"]["username"] = ota.username;
data["ota"]["password"] = ota.password;
data["other"]["rememberStationTime"] = rememberStationTime; data["other"]["rememberStationTime"] = rememberStationTime;
data["other"]["backupDigiMode"] = backupDigiMode; data["other"]["backupDigiMode"] = backupDigiMode;
data["other"]["lowPowerMode"] = lowPowerMode; data["other"]["lowPowerMode"] = lowPowerMode;
data["other"]["lowVoltageCutOff"] = lowVoltageCutOff; data["other"]["lowVoltageCutOff"] = lowVoltageCutOff;
data["personalNote"] = personalNote; data["personalNote"] = personalNote;
data["webadmin"]["active"] = webadmin.active; data["webadmin"]["active"] = webadmin.active;
data["webadmin"]["username"] = webadmin.username; data["webadmin"]["username"] = webadmin.username;
data["webadmin"]["password"] = webadmin.password; data["webadmin"]["password"] = webadmin.password;
serializeJson(data, configFile); serializeJson(data, configFile);
@@ -137,137 +128,86 @@ bool Configuration::readFile() {
wifiAPs.push_back(wifiap); wifiAPs.push_back(wifiap);
} }
wifiAutoAP.password = data["wifi"]["autoAP"]["password"].as<String>(); wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890";
wifiAutoAP.powerOff = data["wifi"]["autoAP"]["powerOff"].as<int>(); wifiAutoAP.powerOff = data["wifi"]["autoAP"]["powerOff"] | 10;
callsign = data["callsign"].as<String>(); callsign = data["callsign"] | "NOCALL-10";
rememberStationTime = data["other"]["rememberStationTime"].as<int>(); rememberStationTime = data["other"]["rememberStationTime"] | 30;
battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"].as<bool>(); beacon.latitude = data["beacon"]["latitude"] | 0.0;
battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"].as<bool>(); beacon.longitude = data["beacon"]["longitude"] | 0.0;
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"].as<float>(); beacon.comment = data["beacon"]["comment"] | "LoRa APRS";
beacon.interval = data["beacon"]["interval"] | 15;
battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"].as<bool>(); beacon.overlay = data["beacon"]["overlay"] | "L";
battery.externalVoltagePin = data["battery"]["externalVoltagePin"].as<int>(); beacon.symbol = data["beacon"]["symbol"] | "a";
battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"].as<bool>(); beacon.path = data["beacon"]["path"] | "WIDE1-1";
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"].as<float>(); beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"].as<float>(); beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"].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>();
personalNote = data["personalNote"].as<String>();
webadmin.active = data["webadmin"]["active"].as<bool>();
webadmin.username = data["webadmin"]["username"].as<String>();
webadmin.password = data["webadmin"]["password"].as<String>();
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>();
String digiComment = data["digi"]["comment"].as<String>(); aprs_is.active = data["aprs_is"]["active"] | false;
double digiLatitude = data["digi"]["latitude"].as<double>(); aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV";
double digiLongitude = data["digi"]["longitude"].as<double>(); 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"] | 0;
beacon.latitude = digiLatitude; loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
beacon.longitude = digiLongitude; loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000;
beacon.interval = beaconInterval; 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; display.alwaysOn = data["display"]["alwaysOn"] | true;
loramodule.rxFreq = digirepeaterRxFreq; display.timeout = data["display"]["timeout"] | 4;
loramodule.rxActive = true; display.turn180 = data["display"]["turn180"] | false;
beacon.sendViaAPRSIS = true;
beacon.sendViaRF = false;
switch (stationMode) { battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false;
case 1: // IGate only battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false;
// aprs_is.active = true; // better don't do that automatically battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 3.0;
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;
}
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"] | 10.9;
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0;
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0;
battery.sendVoltageAsTelemetry = data["battery"]["sendVoltageAsTelemetry"] | true;
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 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; WiFi_AP wifiap;
@@ -286,68 +226,67 @@ bool Configuration::readFile() {
} }
void Configuration::init() { void Configuration::init() {
reload = false;
WiFi_AP wifiap; WiFi_AP wifiap;
wifiap.ssid = ""; wifiap.ssid = "";
wifiap.password = ""; wifiap.password = "";
wifiAPs.push_back(wifiap); wifiAPs.push_back(wifiap);
wifiAutoAP.password = "1234567890"; wifiAutoAP.password = "1234567890";
wifiAutoAP.powerOff = 15; wifiAutoAP.powerOff = 15;
callsign = "N0CALL"; callsign = "N0CALL-10";
beacon.comment = "LoRa APRS"; // new beacon.comment = "LoRa APRS";
beacon.latitude = 0.0; // new beacon.latitude = 0.0;
beacon.longitude = 0.0; // new beacon.longitude = 0.0;
beacon.interval = 15; // new beacon.interval = 15;
beacon.overlay = "L"; // new beacon.overlay = "L";
beacon.symbol = "#"; // new beacon.symbol = "a";
beacon.sendViaAPRSIS = true; // new beacon.sendViaAPRSIS = true;
beacon.sendViaRF = false; // new beacon.sendViaRF = false;
beacon.path = "WIDE1-1"; // new beacon.path = "WIDE1-1";
digi.mode = 0; digi.mode = 0;
tnc.enableServer = false; tnc.enableServer = false;
tnc.enableSerial = false; tnc.enableSerial = false;
tnc.acceptOwn = false; tnc.acceptOwn = false;
aprs_is.active = false; // new aprs_is.active = false;
aprs_is.passcode = "XYZVW"; aprs_is.passcode = "XYZVW";
aprs_is.server = "rotate.aprs2.net"; aprs_is.server = "rotate.aprs2.net";
aprs_is.port = 14580; aprs_is.port = 14580;
aprs_is.filter = "m/10"; // new aprs_is.filter = "m/10";
aprs_is.messagesToRF = false; aprs_is.messagesToRF = false;
aprs_is.objectsToRF = false; aprs_is.objectsToRF = false;
loramodule.txFreq = 433775000; // new loramodule.txFreq = 433775000;
loramodule.rxFreq = 433775000; // new loramodule.rxFreq = 433775000;
loramodule.spreadingFactor = 12; loramodule.spreadingFactor = 12;
loramodule.signalBandwidth = 125000; loramodule.signalBandwidth = 125000;
loramodule.codingRate4 = 5; loramodule.codingRate4 = 5;
loramodule.power = 20; loramodule.power = 20;
loramodule.txActive = false; // new loramodule.txActive = false;
loramodule.rxActive = true; // new loramodule.rxActive = true;
display.alwaysOn = true; display.alwaysOn = true;
display.timeout = 4; display.timeout = 4;
display.turn180 = false; display.turn180 = false;
syslog.active = false; syslog.active = false;
syslog.server = "192.168.0.100"; syslog.server = "192.168.0.100";
syslog.port = 514; syslog.port = 514;
bme.active = false; bme.active = false;
bme.heightCorrection = 0; bme.heightCorrection = 0;
bme.temperatureCorrection = 0.0; bme.temperatureCorrection = 0.0;
ota.username = ""; ota.username = "";
ota.password = ""; ota.password = "";
rememberStationTime = 30; rememberStationTime = 30;
battery.sendInternalVoltage = false; battery.sendInternalVoltage = false;
battery.monitorInternalVoltage = false; battery.monitorInternalVoltage = false;
@@ -356,23 +295,25 @@ void Configuration::init() {
battery.sendExternalVoltage = false; battery.sendExternalVoltage = false;
battery.externalVoltagePin = 34; battery.externalVoltagePin = 34;
battery.monitorExternalVoltage = false; battery.monitorExternalVoltage = false;
battery.externalSleepVoltage = 3.0; battery.externalSleepVoltage = 10.9;
battery.voltageDividerR1 = 100.0; battery.voltageDividerR1 = 100.0;
battery.voltageDividerR2 = 27.0; battery.voltageDividerR2 = 27.0;
lowPowerMode = false; battery.sendVoltageAsTelemetry = true;
lowVoltageCutOff = 0;
backupDigiMode = false; lowPowerMode = false;
lowVoltageCutOff = 0;
rebootMode = false; backupDigiMode = false;
rebootModeTime = 0;
personalNote = ""; rebootMode = false;
rebootModeTime = 0;
webadmin.active = false; personalNote = "";
webadmin.username = "admin";
webadmin.password = ""; webadmin.active = false;
webadmin.username = "admin";
webadmin.password = "";
Serial.println("All is Written!"); Serial.println("All is Written!");
} }
+1 -2
View File
@@ -77,6 +77,7 @@ public:
float externalSleepVoltage; float externalSleepVoltage;
float voltageDividerR1; float voltageDividerR1;
float voltageDividerR2; float voltageDividerR2;
bool sendVoltageAsTelemetry;
}; };
class BME { class BME {
@@ -115,7 +116,6 @@ public:
class Configuration { class Configuration {
public: public:
bool reload; // ?
String callsign; String callsign;
int rememberStationTime; int rememberStationTime;
bool lowPowerMode; bool lowPowerMode;
@@ -140,7 +140,6 @@ public:
void init(); void init();
void writeFile(); void writeFile();
void check();
Configuration(); Configuration();
private: private:
+1 -1
View File
@@ -123,7 +123,7 @@ namespace DIGI_Utils {
} else { } else {
STATION_Utils::addToOutputPacketBuffer(loraPacket); STATION_Utils::addToOutputPacketBuffer(loraPacket);
} }
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
} }
} }
+83 -63
View File
@@ -16,15 +16,19 @@
#define lineSpacing 12 #define lineSpacing 12
#endif #endif
#else #else
#include <Adafruit_GFX.h> #if HAS_EPAPER
#include <Adafruit_SSD1306.h> //
#if defined(HELTEC_V3)
#define OLED_DISPLAY_HAS_RST_PIN
#endif
#ifdef HELTEC_WSL_V3_DISPLAY
Adafruit_SSD1306 display(128, 64, &Wire1, OLED_RST);
#else #else
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST); #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#if defined(HELTEC_V3) || defined(HELTEC_WS)
#define OLED_DISPLAY_HAS_RST_PIN
#endif
#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
#endif #endif
#endif #endif
@@ -39,7 +43,7 @@ void cleanTFT() {
#endif #endif
} }
void setup_display() { void displaySetup() {
#ifdef HAS_DISPLAY #ifdef HAS_DISPLAY
delay(500); delay(500);
#ifdef HAS_TFT #ifdef HAS_TFT
@@ -52,50 +56,58 @@ void setup_display() {
} }
tft.setTextFont(0); tft.setTextFont(0);
tft.fillScreen(TFT_BLACK); tft.fillScreen(TFT_BLACK);
#else #else
#ifdef OLED_DISPLAY_HAS_RST_PIN #if HAS_EPAPER
pinMode(OLED_RST, OUTPUT); //
digitalWrite(OLED_RST, LOW); #else
delay(20); #ifdef OLED_DISPLAY_HAS_RST_PIN
digitalWrite(OLED_RST, HIGH); pinMode(OLED_RST, OUTPUT);
#endif digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
#endif
#ifndef HELTEC_WSL_V3_DISPLAY if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Wire.begin(OLED_SDA, OLED_SCL); Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
if (Config.display.turn180) {
display.setRotation(2);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif #endif
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
if (Config.display.turn180) {
display.setRotation(2);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif #endif
delay(1000); delay(1000);
#endif #endif
} }
void display_toggle(bool toggle) { void displayToggle(bool toggle) {
#ifdef HAS_DISPLAY #ifdef HAS_DISPLAY
if (toggle) { if (toggle) {
#ifdef HAS_TFT #ifdef HAS_TFT
digitalWrite(TFT_BL, HIGH); digitalWrite(TFT_BL, HIGH);
#else #else
display.ssd1306_command(SSD1306_DISPLAYON); #if HAS_EPAPER
// ... to be continued
#else
display.ssd1306_command(SSD1306_DISPLAYON);
#endif
#endif #endif
} else { } else {
#ifdef HAS_TFT #ifdef HAS_TFT
digitalWrite(TFT_BL, LOW); digitalWrite(TFT_BL, LOW);
#else #else
display.ssd1306_command(SSD1306_DISPLAYOFF); #if HAS_EPAPER
// ... to be continued
#else
display.ssd1306_command(SSD1306_DISPLAYOFF);
#endif
#endif #endif
} }
#endif #endif
@@ -128,7 +140,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 #ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3}; const String* const lines[] = {&line1, &line2, &line3};
#ifdef HAS_TFT #ifdef HAS_TFT
@@ -145,24 +157,28 @@ void show_display(const String& header, const String& line1, const String& line2
tft.print(*lines[i]); tft.print(*lines[i]);
} }
#else #else
display.clearDisplay(); #ifdef HAS_EPAPER
display.setTextColor(WHITE); // ... to be continued
display.setTextSize(1); #else
display.setCursor(0, 0); display.clearDisplay();
display.println(header); display.setTextColor(WHITE);
for (int i = 0; i < 3; i++) { display.setTextSize(1);
display.setCursor(0, 8 + (8 * i)); display.setCursor(0, 0);
display.println(*lines[i]); display.println(header);
} for (int i = 0; i < 3; i++) {
display.ssd1306_command(SSD1306_SETCONTRAST); display.setCursor(0, 8 + (8 * i));
display.ssd1306_command(1); display.println(*lines[i]);
display.display(); }
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif
#endif #endif
delay(wait); delay(wait);
#endif #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 #ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3, &line4, &line5, &line6}; const String* const lines[] = {&line1, &line2, &line3, &line4, &line5, &line6};
#ifdef HAS_TFT #ifdef HAS_TFT
@@ -179,19 +195,23 @@ void show_display(const String& header, const String& line1, const String& line2
tft.print(*lines[i]); tft.print(*lines[i]);
} }
#else #else
display.clearDisplay(); #ifdef HAS_EPAPER
display.setTextColor(WHITE); // ... to be continued
display.setTextSize(2); #else
display.setCursor(0, 0); display.clearDisplay();
display.println(header); display.setTextColor(WHITE);
display.setTextSize(1); display.setTextSize(2);
for (int i = 0; i < 6; i++) { display.setCursor(0, 0);
display.setCursor(0, 16 + (8 * i)); display.println(header);
display.println(*lines[i]); display.setTextSize(1);
} for (int i = 0; i < 6; i++) {
display.ssd1306_command(SSD1306_SETCONTRAST); display.setCursor(0, 16 + (8 * i));
display.ssd1306_command(1); display.println(*lines[i]);
display.display(); }
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif
#endif #endif
delay(wait); delay(wait);
#endif #endif
+4 -4
View File
@@ -6,13 +6,13 @@
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
void cleanTFT(); void cleanTFT();
void setup_display(); void displaySetup();
void display_toggle(bool toggle); 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);
bool shouldCleanTFT(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6); 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 displayShow(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, const String& line4, const String& line5, const String& line6, int wait = 0);
#endif #endif
+3 -2
View File
@@ -50,19 +50,20 @@ namespace GPS_Utils {
encodedData += helper_base91[i]; encodedData += helper_base91[i];
} }
encodedData += symbol; encodedData += symbol;
encodedData += " x"; encodedData += " ";
encodedData += "\x47"; encodedData += "\x47";
return encodedData; return encodedData;
} }
void generateBeacons() { void generateBeacons() {
if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) { if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) {
show_display("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000); displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
Config.loramodule.txActive = false; Config.loramodule.txActive = false;
Config.aprs_is.messagesToRF = false; Config.aprs_is.messagesToRF = false;
Config.aprs_is.objectsToRF = false; Config.aprs_is.objectsToRF = false;
Config.beacon.sendViaRF = false; Config.beacon.sendViaRF = false;
Config.digi.mode = 0; Config.digi.mode = 0;
Config.backupDigiMode = false;
} }
String beaconPacket = Config.callsign; String beaconPacket = Config.callsign;
beaconPacket += ">APLRG1"; beaconPacket += ">APLRG1";
+6 -6
View File
@@ -18,18 +18,18 @@ bool transmitFlag = true;
#ifdef HAS_SX1262 #ifdef HAS_SX1262
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN); SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#endif #endif
#ifdef HAS_SX1268 #ifdef HAS_SX1268
SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN); SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#endif #endif
#ifdef HAS_SX1278 #ifdef HAS_SX1278
SX1278 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN); SX1278 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN);
#endif #endif
#ifdef HAS_SX1276 #ifdef HAS_SX1276
SX1276 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN); SX1276 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN);
#endif #endif
#if defined(HAS_LLCC68) //LLCC68 supports spreading factor only in range of 5-11!
LLCC68 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#endif
int rssi, freqError; int rssi, freqError;
float snr; float snr;
@@ -53,7 +53,7 @@ namespace LoRa_Utils {
Utils::println("Starting LoRa failed! State: " + String(state)); Utils::println("Starting LoRa failed! State: " + String(state));
while (true); while (true);
} }
#if defined(HAS_SX1262) || defined(HAS_SX1268) #if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
if (!Config.lowPowerMode) { if (!Config.lowPowerMode) {
radio.setDio1Action(setFlag); radio.setDio1Action(setFlag);
} else { } else {
@@ -73,7 +73,7 @@ namespace LoRa_Utils {
radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN); radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN);
#endif #endif
#ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262) #ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262) / Ebyte E220 400M30S (LLCC68)
state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 1W modules as they have Low Noise Amp 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)? radio.setCurrentLimit(140); // to be validated (100 , 120, 140)?
#endif #endif
@@ -86,7 +86,7 @@ namespace LoRa_Utils {
radio.setCurrentLimit(140); radio.setCurrentLimit(140);
#endif #endif
#if defined(HAS_SX1262) || defined(HAS_SX1268) #if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
radio.setRxBoostedGainMode(true); radio.setRxBoostedGainMode(true);
#endif #endif
+7 -7
View File
@@ -29,31 +29,31 @@ namespace OTA_Utils {
void onOTAStart() { void onOTAStart() {
Serial.println("OTA update started!"); Serial.println("OTA update started!");
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
show_display("", "", "", " OTA update started!", "", "", "", 1000); displayShow("", "", "", " OTA update started!", "", "", "", 1000);
isUpdatingOTA = true; isUpdatingOTA = true;
} }
void onOTAProgress(size_t current, size_t final) { void onOTAProgress(size_t current, size_t final) {
if (millis() - ota_progress_millis > 1000) { if (millis() - ota_progress_millis > 1000) {
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
ota_progress_millis = millis(); ota_progress_millis = millis();
Serial.printf("OTA Progress Current: %u bytes, Final: %u bytes\n", current, final); 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) { void onOTAEnd(bool success) {
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
if (success) { if (success) {
Serial.println("OTA update finished successfully!"); Serial.println("OTA update finished successfully!");
show_display("", "", " OTA update success!", "", " Rebooting ...", "", "", 4000); displayShow("", "", " OTA update success!", "", " Rebooting ...", "", "", 4000);
} else { } else {
Serial.println("There was an error during OTA update!"); Serial.println("There was an error during OTA update!");
show_display("", "", " OTA update fail!", "", "", "", "", 4000); displayShow("", "", " OTA update fail!", "", "", "", "", 4000);
} }
isUpdatingOTA = false; isUpdatingOTA = false;
} }
+10 -3
View File
@@ -154,22 +154,29 @@ namespace POWER_Utils {
#ifndef HELTEC_WSL_V3 #ifndef HELTEC_WSL_V3
digitalWrite(VEXT_CTRL, HIGH); digitalWrite(VEXT_CTRL, HIGH);
#endif #endif
#ifdef HELTEC_WP
digitalWrite(VEXT_CTRL, LOW);
#endif
#endif #endif
#ifdef ADC_CTRL #ifdef ADC_CTRL
pinMode(ADC_CTRL, OUTPUT); pinMode(ADC_CTRL, OUTPUT);
#endif #endif
#ifdef HELTEC_WIRELESS_TRACKER #if defined(HELTEC_WIRELESS_TRACKER)
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL); Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) #if defined(HELTEC_V3) || defined(HELTEC_WP) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
Wire1.begin(BOARD_I2C_SDA, BOARD_I2C_SCL); Wire1.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WS)
Wire.begin(OLED_SDA, OLED_SCL);
#endif
delay(1000); delay(1000);
BATTERY_Utils::setup();
BATTERY_Utils::startupBatteryHealth(); BATTERY_Utils::startupBatteryHealth();
} }
+11 -10
View File
@@ -1,13 +1,14 @@
#include "configuration.h" #include "configuration.h"
#include "station_utils.h"
#include "query_utils.h" #include "query_utils.h"
#include "lora_utils.h" #include "lora_utils.h"
extern Configuration Config; extern Configuration Config;
extern std::vector<String> lastHeardStation; extern std::vector<LastHeardStation> lastHeardStations;
extern String versionDate; extern String versionDate;
extern int rssi; extern int rssi;
extern float snr; extern float snr;
extern int freqError; extern int freqError;
namespace QUERY_Utils { namespace QUERY_Utils {
@@ -19,7 +20,7 @@ namespace QUERY_Utils {
if (queryQuestion == "?APRS?" || queryQuestion == "H" || queryQuestion == "HELP" || queryQuestion=="?") { if (queryQuestion == "?APRS?" || queryQuestion == "H" || queryQuestion == "HELP" || queryQuestion=="?") {
answer.concat("?APRSV ?APRSP ?APRSL ?APRSH ?WHERE callsign"); answer.concat("?APRSV ?APRSP ?APRSL ?APRSH ?WHERE callsign");
} else if (queryQuestion == "?APRSV") { } else if (queryQuestion == "?APRSV") {
answer.concat("CA2RXU_LoRa_iGate 1.4 v"); answer.concat("CA2RXU_LoRa_iGate 2.0 v");
answer.concat(versionDate); answer.concat(versionDate);
} else if (queryQuestion == "?APRSP") { } else if (queryQuestion == "?APRSP") {
answer.concat("iGate QTH: "); answer.concat("iGate QTH: ");
@@ -27,13 +28,13 @@ namespace QUERY_Utils {
answer.concat(" "); answer.concat(" ");
answer.concat(String(Config.beacon.longitude,3)); answer.concat(String(Config.beacon.longitude,3));
} else if (queryQuestion == "?APRSL") { } else if (queryQuestion == "?APRSL") {
if (lastHeardStation.size() == 0) { if (lastHeardStations.size() == 0) {
char answerArray[50]; char answerArray[50];
snprintf(answerArray, sizeof(answerArray), "No Station Listened in the last %d min.", Config.rememberStationTime); snprintf(answerArray, sizeof(answerArray), "No Station Listened in the last %d min.", Config.rememberStationTime);
answer.concat(answerArray); answer.concat(answerArray);
} else { } else {
for (int i=0; i<lastHeardStation.size(); i++) { for (int i=0; i<lastHeardStations.size(); i++) {
answer += lastHeardStation[i].substring(0,lastHeardStation[i].indexOf(",")) + " "; answer += lastHeardStations[i].station + " ";
} }
answer.trim(); answer.trim();
} }
+40 -34
View File
@@ -1,4 +1,5 @@
#include "station_utils.h" #include "station_utils.h"
#include "battery_utils.h"
#include "aprs_is_utils.h" #include "aprs_is_utils.h"
#include "configuration.h" #include "configuration.h"
#include "lora_utils.h" #include "lora_utils.h"
@@ -8,27 +9,26 @@
extern Configuration Config; extern Configuration Config;
extern uint32_t lastRxTime; extern uint32_t lastRxTime;
extern String fourthLine; extern String fourthLine;
extern bool shouldSleepLowVoltage;
uint32_t lastTxTime = millis(); uint32_t lastTxTime = millis();
std::vector<String> lastHeardStation; std::vector<LastHeardStation> lastHeardStations;
std::vector<String> outputPacketBuffer; std::vector<String> outputPacketBuffer;
std::vector<String> packet25SegBuffer; std::vector<Packet25SegBuffer> packet25SegBuffer;
namespace STATION_Utils { namespace STATION_Utils {
void deleteNotHeard() { void deleteNotHeard() {
std::vector<String> lastHeardStation_temp; std::vector<LastHeardStation> lastHeardStation_temp;
for (int i = 0; i < lastHeardStation.size(); i++) { for (int i = 0; i < lastHeardStations.size(); i++) {
String deltaTimeString = lastHeardStation[i].substring(lastHeardStation[i].indexOf(",") + 1); if (millis() - lastHeardStations[i].lastHeardTime < Config.rememberStationTime * 60 * 1000) {
uint32_t deltaTime = deltaTimeString.toInt(); lastHeardStation_temp.push_back(lastHeardStations[i]);
if ((millis() - deltaTime) < Config.rememberStationTime * 60 * 1000) {
lastHeardStation_temp.push_back(lastHeardStation[i]);
} }
} }
lastHeardStation.clear(); lastHeardStations.clear();
for (int j = 0; j < lastHeardStation_temp.size(); j++) { for (int j = 0; j < lastHeardStation_temp.size(); j++) {
lastHeardStation.push_back(lastHeardStation_temp[j]); lastHeardStations.push_back(lastHeardStation_temp[j]);
} }
lastHeardStation_temp.clear(); lastHeardStation_temp.clear();
} }
@@ -36,29 +36,32 @@ namespace STATION_Utils {
void updateLastHeard(const String& station) { void updateLastHeard(const String& station) {
deleteNotHeard(); deleteNotHeard();
bool stationHeard = false; bool stationHeard = false;
for (int i = 0; i < lastHeardStation.size(); i++) { for (int i = 0; i < lastHeardStations.size(); i++) {
if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) { if (lastHeardStations[i].station == station) {
lastHeardStation[i] = station + "," + String(millis()); lastHeardStations[i].lastHeardTime = millis();
stationHeard = true; stationHeard = true;
} }
} }
if (!stationHeard) { if (!stationHeard) {
lastHeardStation.push_back(station + "," + String(millis())); LastHeardStation lastStation;
lastStation.lastHeardTime = millis();
lastStation.station = station;
lastHeardStations.push_back(lastStation);
} }
fourthLine = "Stations ("; fourthLine = "Stations (";
fourthLine += String(Config.rememberStationTime); fourthLine += String(Config.rememberStationTime);
fourthLine += "min) = "; fourthLine += "min) = ";
if (lastHeardStation.size() < 10) { if (lastHeardStations.size() < 10) {
fourthLine += " "; fourthLine += " ";
} }
fourthLine += String(lastHeardStation.size()); fourthLine += String(lastHeardStations.size());
} }
bool wasHeard(const String& station) { bool wasHeard(const String& station) {
deleteNotHeard(); deleteNotHeard();
for (int i = 0; i < lastHeardStation.size(); i++) { for (int i = 0; i < lastHeardStations.size(); i++) {
if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) { if (lastHeardStations[i].station == station) {
Utils::println(" ---> Listened Station"); Utils::println(" ---> Listened Station");
return true; return true;
} }
@@ -69,35 +72,31 @@ namespace STATION_Utils {
void clean25SegBuffer() { void clean25SegBuffer() {
if (!packet25SegBuffer.empty()) { if (!packet25SegBuffer.empty()) {
String deltaTimeString = packet25SegBuffer[0].substring(0, packet25SegBuffer[0].indexOf(",")); if ((millis() - packet25SegBuffer[0].receivedTime) > 25 * 1000) {
uint32_t deltaTime = deltaTimeString.toInt();
if ((millis() - deltaTime) > 25 * 1000) {
packet25SegBuffer.erase(packet25SegBuffer.begin()); packet25SegBuffer.erase(packet25SegBuffer.begin());
} }
} }
} }
bool check25SegBuffer(const String& station, const String& textMessage) { bool check25SegBuffer(const String& station, const String& textMessage) {
bool shouldBeIgnored = false;
if (!packet25SegBuffer.empty()) { if (!packet25SegBuffer.empty()) {
bool shouldBeIgnored = false;
for (int i = 0; i < packet25SegBuffer.size(); i++) { for (int i = 0; i < packet25SegBuffer.size(); i++) {
const String& temp = packet25SegBuffer[i].substring(packet25SegBuffer[i].indexOf(",") + 1); if (packet25SegBuffer[i].station == station && packet25SegBuffer[i].payload == textMessage) {
const String& bufferStation = temp.substring(0, temp.indexOf(","));
const String& bufferMessage = temp.substring(temp.indexOf(",") + 1);
if (bufferStation == station && bufferMessage == textMessage) {
shouldBeIgnored = true; shouldBeIgnored = true;
} }
} }
if (shouldBeIgnored) { }
return false; if (shouldBeIgnored) {
} else { return false;
packet25SegBuffer.push_back(String(millis()) + "," + station + "," + textMessage);
return true;
}
} else { } else {
packet25SegBuffer.push_back(String(millis()) + "," + station + "," + textMessage); Packet25SegBuffer packet;
packet.receivedTime = millis();
packet.station = station;
packet.payload = textMessage;
packet25SegBuffer.push_back(packet);
return true; return true;
} }
} }
void processOutputPacketBuffer() { void processOutputPacketBuffer() {
@@ -109,6 +108,13 @@ namespace STATION_Utils {
outputPacketBuffer.erase(outputPacketBuffer.begin()); outputPacketBuffer.erase(outputPacketBuffer.begin());
lastTxTime = millis(); lastTxTime = millis();
} }
if (shouldSleepLowVoltage) {
while (outputPacketBuffer.size() > 0) {
LoRa_Utils::sendNewPacket(outputPacketBuffer[0]);
outputPacketBuffer.erase(outputPacketBuffer.begin());
delay(4000);
}
}
} }
void addToOutputPacketBuffer(const String& packet) { void addToOutputPacketBuffer(const String& packet) {
+13
View File
@@ -1,9 +1,22 @@
#ifndef STATION_UTILS_H_ #ifndef STATION_UTILS_H_
#define STATION_UTILS_H_ #define STATION_UTILS_H_
#include <Arduino.h> #include <Arduino.h>
struct Packet25SegBuffer {
uint32_t receivedTime;
String station;
String payload;
};
struct LastHeardStation {
uint32_t lastHeardTime;
String station;
};
namespace STATION_Utils { namespace STATION_Utils {
void deleteNotHeard(); void deleteNotHeard();
+1 -1
View File
@@ -29,7 +29,7 @@ namespace TNC_Utils {
} }
void checkNewClients() { void checkNewClients() {
WiFiClient new_client = tncServer.available(); WiFiClient new_client = tncServer.accept();
if (new_client.connected()) { if (new_client.connected()) {
for (int i = 0; i < MAX_CLIENTS; i++) { for (int i = 0; i < MAX_CLIENTS; i++) {
WiFiClient* client = clients[i]; WiFiClient* client = clients[i];
+135 -45
View File
@@ -25,7 +25,6 @@ extern String sixthLine;
extern String seventhLine; extern String seventhLine;
extern String iGateBeaconPacket; extern String iGateBeaconPacket;
extern String iGateLoRaBeaconPacket; extern String iGateLoRaBeaconPacket;
extern std::vector<String> lastHeardStation;
extern int rssi; extern int rssi;
extern float snr; extern float snr;
extern int freqError; extern int freqError;
@@ -36,7 +35,10 @@ extern bool backUpDigiMode;
extern bool shouldSleepLowVoltage; extern bool shouldSleepLowVoltage;
extern bool transmitFlag; extern bool transmitFlag;
extern std::vector<LastHeardStation> lastHeardStations;
bool statusAfterBoot = true; bool statusAfterBoot = true;
bool sendStartTelemetry = true;
bool beaconUpdate = true; bool beaconUpdate = true;
uint32_t lastBeaconTx = 0; uint32_t lastBeaconTx = 0;
uint32_t lastScreenOn = millis(); uint32_t lastScreenOn = millis();
@@ -60,7 +62,6 @@ namespace Utils {
statusAfterBoot = false; statusAfterBoot = false;
} }
if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) { if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) {
delay(2000);
status.concat(":>https://github.com/richonguzman/LoRa_APRS_iGate "); status.concat(":>https://github.com/richonguzman/LoRa_APRS_iGate ");
status.concat(versionDate); status.concat(versionDate);
STATION_Utils::addToOutputPacketBuffer(status); STATION_Utils::addToOutputPacketBuffer(status);
@@ -79,12 +80,12 @@ namespace Utils {
} }
void setupDisplay() { void setupDisplay() {
setup_display(); displaySetup();
#ifdef INTERNAL_LED_PIN #ifdef INTERNAL_LED_PIN
digitalWrite(INTERNAL_LED_PIN,HIGH); digitalWrite(INTERNAL_LED_PIN,HIGH);
#endif #endif
Serial.println("\nStarting Station: " + Config.callsign + " Version: " + versionDate); 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 #ifdef INTERNAL_LED_PIN
digitalWrite(INTERNAL_LED_PIN,LOW); digitalWrite(INTERNAL_LED_PIN,LOW);
#endif #endif
@@ -96,12 +97,82 @@ namespace Utils {
fourthLine = "Stations ("; fourthLine = "Stations (";
fourthLine.concat(String(Config.rememberStationTime)); fourthLine.concat(String(Config.rememberStationTime));
fourthLine.concat("min) = "); fourthLine.concat("min) = ");
if (lastHeardStation.size() < 10) { if (lastHeardStations.size() < 10) {
fourthLine += " "; fourthLine += " ";
} }
fourthLine.concat(String(lastHeardStation.size())); fourthLine.concat(String(lastHeardStations.size()));
} }
void sendInitialTelemetryPackets() {
String sender = Config.callsign;
for (int i = sender.length(); i < 9; i++) {
sender += ' ';
}
String baseAPRSISTelemetryPacket = Config.callsign;
baseAPRSISTelemetryPacket += ">APLRG1,TCPIP,qAC::";
baseAPRSISTelemetryPacket += sender;
baseAPRSISTelemetryPacket += ":";
String baseRFTelemetryPacket = Config.callsign;
baseRFTelemetryPacket += ">APLRG1,WIDE1-1::";
baseRFTelemetryPacket += sender;
baseRFTelemetryPacket += ":";
String telemetryPacket1 = "EQNS.";
if (Config.battery.sendInternalVoltage) {
telemetryPacket1 += "0,0.01,0";
}
if (Config.battery.sendExternalVoltage) {
telemetryPacket1 += String(Config.battery.sendInternalVoltage ? "," : "") + "0,0.02,0";
}
String telemetryPacket2 = "UNIT.";
if (Config.battery.sendInternalVoltage) {
telemetryPacket2 += "VDC";
}
if (Config.battery.sendExternalVoltage) {
telemetryPacket2 += String(Config.battery.sendInternalVoltage ? "," : "") + "VDC";
}
String telemetryPacket3 = "PARM.";
if (Config.battery.sendInternalVoltage) {
telemetryPacket3 += "V_Batt";
}
if (Config.battery.sendExternalVoltage) {
telemetryPacket3 += String(Config.battery.sendInternalVoltage ? "," : "") + "V_Ext";
}
if (Config.beacon.sendViaAPRSIS) {
#ifdef HAS_A7670
A7670_Utils::uploadToAPRSIS(baseAPRSISTelemetryPacket + telemetryPacket1);
delay(300);
A7670_Utils::uploadToAPRSIS(baseAPRSISTelemetryPacket + telemetryPacket2);
delay(300);
A7670_Utils::uploadToAPRSIS(baseAPRSISTelemetryPacket + telemetryPacket3);
delay(300);
#else
APRS_IS_Utils::upload(baseAPRSISTelemetryPacket + telemetryPacket1);
delay(300);
APRS_IS_Utils::upload(baseAPRSISTelemetryPacket + telemetryPacket2);
delay(300);
APRS_IS_Utils::upload(baseAPRSISTelemetryPacket + telemetryPacket3);
delay(300);
#endif
delay(300);
} else if (Config.beacon.sendViaRF) {
LoRa_Utils::sendNewPacket(baseRFTelemetryPacket + telemetryPacket1);
delay(3000);
LoRa_Utils::sendNewPacket(baseRFTelemetryPacket + telemetryPacket2);
delay(3000);
LoRa_Utils::sendNewPacket(baseRFTelemetryPacket + telemetryPacket3);
delay(3000);
}
sendStartTelemetry = false;
}
void checkBeaconInterval() { void checkBeaconInterval() {
uint32_t lastTx = millis() - lastBeaconTx; uint32_t lastTx = millis() - lastBeaconTx;
if (lastBeaconTx == 0 || lastTx >= Config.beacon.interval * 60 * 1000) { if (lastBeaconTx == 0 || lastTx >= Config.beacon.interval * 60 * 1000) {
@@ -110,10 +181,13 @@ namespace Utils {
if (beaconUpdate) { if (beaconUpdate) {
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
Utils::println("-- Sending Beacon to APRSIS --");
if (sendStartTelemetry && Config.battery.sendVoltageAsTelemetry && !Config.bme.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)) {
sendInitialTelemetryPackets();
}
STATION_Utils::deleteNotHeard(); STATION_Utils::deleteNotHeard();
activeStations(); activeStations();
@@ -125,8 +199,8 @@ namespace Utils {
beaconPacket += sensorData; beaconPacket += sensorData;
secondaryBeaconPacket += sensorData; secondaryBeaconPacket += sensorData;
} else if (Config.bme.active && wxModuleType == 0) { } else if (Config.bme.active && wxModuleType == 0) {
beaconPacket += ".../...g...t...r...p...P...h..b....."; beaconPacket += ".../...g...t...";
secondaryBeaconPacket += ".../...g...t...r...p...P...h..b....."; secondaryBeaconPacket += ".../...g...t...";
} }
beaconPacket += Config.beacon.comment; beaconPacket += Config.beacon.comment;
secondaryBeaconPacket += Config.beacon.comment; secondaryBeaconPacket += Config.beacon.comment;
@@ -134,45 +208,60 @@ namespace Utils {
#if defined(BATTERY_PIN) || defined(HAS_AXP192) || defined(HAS_AXP2101) #if defined(BATTERY_PIN) || defined(HAS_AXP192) || defined(HAS_AXP2101)
if (Config.battery.sendInternalVoltage || Config.battery.monitorInternalVoltage) { if (Config.battery.sendInternalVoltage || Config.battery.monitorInternalVoltage) {
float internalVoltage = BATTERY_Utils::checkInternalVoltage(); 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 += ")";
}
if (Config.battery.monitorInternalVoltage && internalVoltage < Config.battery.internalSleepVoltage) { if (Config.battery.monitorInternalVoltage && internalVoltage < Config.battery.internalSleepVoltage) {
beaconPacket += " **IntBatWarning:SLEEP**"; beaconPacket += " **IntBatWarning:SLEEP**";
secondaryBeaconPacket += " **IntBatWarning:SLEEP**"; secondaryBeaconPacket += " **IntBatWarning:SLEEP**";
shouldSleepLowVoltage = true; shouldSleepLowVoltage = true;
}
String internalVoltageInfo = String(internalVoltage,2) + "V";
if (Config.battery.sendInternalVoltage) {
sixthLine = " (Batt=";
sixthLine += internalVoltageInfo;
sixthLine += ")";
if (!Config.battery.sendVoltageAsTelemetry) {
beaconPacket += " Batt=";
beaconPacket += internalVoltageInfo;
secondaryBeaconPacket += " Batt=";
secondaryBeaconPacket += internalVoltageInfo;
}
}
}
#endif
#ifndef HELTEC_WP
if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) {
float externalVoltage = BATTERY_Utils::checkExternalVoltage();
if (Config.battery.monitorExternalVoltage && externalVoltage < Config.battery.externalSleepVoltage) {
beaconPacket += " **ExtBatWarning:SLEEP**";
secondaryBeaconPacket += " **ExtBatWarning:SLEEP**";
shouldSleepLowVoltage = true;
}
String externalVoltageInfo = String(externalVoltage,2) + "V";
if (Config.battery.sendExternalVoltage) {
sixthLine = " (Ext V=";
sixthLine += externalVoltageInfo;
sixthLine += ")";
if (!Config.battery.sendVoltageAsTelemetry) {
beaconPacket += " Ext=";
beaconPacket += externalVoltageInfo;
secondaryBeaconPacket += " Ext=";
secondaryBeaconPacket += externalVoltageInfo;
}
} }
} }
#endif #endif
if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) { if (Config.battery.sendVoltageAsTelemetry && !Config.bme.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)){
float externalVoltage = BATTERY_Utils::checkExternalVoltage(); String encodedTelemetry = BATTERY_Utils::generateEncodedTelemetry();
String externalVoltageInfo = String(externalVoltage,2) + "V"; beaconPacket += encodedTelemetry;
if (Config.battery.sendExternalVoltage) { secondaryBeaconPacket += encodedTelemetry;
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;
}
} }
if (Config.aprs_is.active && Config.beacon.sendViaAPRSIS && !backUpDigiMode) { if (Config.aprs_is.active && Config.beacon.sendViaAPRSIS && !backUpDigiMode) {
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING IGATE BEACON", 0); Utils::println("-- Sending Beacon to APRSIS --");
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING IGATE BEACON", 0);
seventhLine = " listening..."; seventhLine = " listening...";
#ifdef HAS_A7670 #ifdef HAS_A7670
A7670_Utils::uploadToAPRSIS(beaconPacket); A7670_Utils::uploadToAPRSIS(beaconPacket);
@@ -182,7 +271,8 @@ namespace Utils {
} }
if (Config.beacon.sendViaRF || backUpDigiMode) { if (Config.beacon.sendViaRF || backUpDigiMode) {
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING DIGI BEACON", 0); Utils::println("-- Sending Beacon to RF --");
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING DIGI BEACON", 0);
seventhLine = " listening..."; seventhLine = " listening...";
STATION_Utils::addToOutputPacketBuffer(secondaryBeaconPacket); STATION_Utils::addToOutputPacketBuffer(secondaryBeaconPacket);
} }
@@ -200,14 +290,14 @@ namespace Utils {
void checkDisplayInterval() { void checkDisplayInterval() {
uint32_t lastDisplayTime = millis() - lastScreenOn; uint32_t lastDisplayTime = millis() - lastScreenOn;
if (!Config.display.alwaysOn && lastDisplayTime >= Config.display.timeout * 1000) { if (!Config.display.alwaysOn && lastDisplayTime >= Config.display.timeout * 1000) {
display_toggle(false); displayToggle(false);
} }
} }
void validateFreqs() { void validateFreqs() {
if (Config.loramodule.txFreq != Config.loramodule.rxFreq && abs(Config.loramodule.txFreq - Config.loramodule.rxFreq) < 125000) { 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"); 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.loramodule.txFreq = Config.loramodule.rxFreq; // Inform about that but then change the TX QRG to RX QRG and reset the device
Config.writeFile(); Config.writeFile();
ESP.restart(); ESP.restart();
@@ -244,7 +334,7 @@ namespace Utils {
} else if (packet[firstColonIndex + 1] == '>') { } else if (packet[firstColonIndex + 1] == '>') {
sixthLine += "> NEW STATUS"; sixthLine += "> NEW STATUS";
seventhLine = seventhLineHelper; seventhLine = seventhLineHelper;
} else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=') { } else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=' || packet[firstColonIndex + 1] == '@') {
sixthLine += "> GPS BEACON"; sixthLine += "> GPS BEACON";
if (!Config.syslog.active) { if (!Config.syslog.active) {
GPS_Utils::getDistanceAndComment(packet); // to be checked!!! GPS_Utils::getDistanceAndComment(packet); // to be checked!!!
@@ -307,13 +397,13 @@ namespace Utils {
void checkSleepByLowBatteryVoltage(uint8_t mode) { void checkSleepByLowBatteryVoltage(uint8_t mode) {
if (shouldSleepLowVoltage) { if (shouldSleepLowVoltage) {
if (mode == 0) { if (mode == 0) { // at startup
delay(3000); delay(3000);
} }
Serial.println("\n\n*** Sleeping Low Battey Voltage ***\n\n"); Serial.println("\n\n*** Sleeping Low Battey Voltage ***\n\n");
esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // sleep 30 min esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // sleep 30 min
if (mode == 1) { if (mode == 1) { // low voltage detected after a while
display_toggle(false); displayToggle(false);
} }
#ifdef VEXT_CTRL #ifdef VEXT_CTRL
#ifndef HELTEC_WSL_V3 #ifndef HELTEC_WSL_V3
+10 -8
View File
@@ -52,13 +52,13 @@ namespace WEB_Utils {
if(Config.webadmin.active && !request->authenticate(Config.webadmin.username.c_str(), Config.webadmin.password.c_str())) if(Config.webadmin.active && !request->authenticate(Config.webadmin.username.c_str(), Config.webadmin.password.c_str()))
return request->requestAuthentication(); return request->requestAuthentication();
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", (const uint8_t*)web_index_html, web_index_html_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/html", (const uint8_t*)web_index_html, web_index_html_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
void handleFavicon(AsyncWebServerRequest *request) { void handleFavicon(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "image/x-icon", (const uint8_t*)favicon_data, favicon_data_len); AsyncWebServerResponse *response = request->beginResponse(200, "image/x-icon", (const uint8_t*)favicon_data, favicon_data_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
@@ -167,6 +167,8 @@ namespace WEB_Utils {
} }
Config.battery.monitorExternalVoltage = request->hasParam("battery.monitorExternalVoltage", true); 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.battery.sendVoltageAsTelemetry = request->hasParam("battery.sendVoltageAsTelemetry", true);
Config.bme.active = request->hasParam("bme.active", true); Config.bme.active = request->hasParam("bme.active", true);
Config.bme.heightCorrection = request->getParam("bme.heightCorrection", true)->value().toInt(); Config.bme.heightCorrection = request->getParam("bme.heightCorrection", true)->value().toInt();
@@ -210,7 +212,7 @@ namespace WEB_Utils {
AsyncWebServerResponse *response = request->beginResponse(302, "text/html", ""); AsyncWebServerResponse *response = request->beginResponse(302, "text/html", "");
response->addHeader("Location", "/"); response->addHeader("Location", "/");
request->send(response); request->send(response);
display_toggle(false); displayToggle(false);
ESP.restart(); ESP.restart();
} }
@@ -222,7 +224,7 @@ namespace WEB_Utils {
request->send(200, "text/plain", "Beacon will be sent in a while"); request->send(200, "text/plain", "Beacon will be sent in a while");
} else if (type == "reboot") { } else if (type == "reboot") {
display_toggle(false); displayToggle(false);
ESP.restart(); ESP.restart();
} else { } else {
request->send(404, "text/plain", "Not Found"); request->send(404, "text/plain", "Not Found");
@@ -230,26 +232,26 @@ namespace WEB_Utils {
} }
void handleStyle(AsyncWebServerRequest *request) { void handleStyle(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", (const uint8_t*)web_style_css, web_style_css_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/css", (const uint8_t*)web_style_css, web_style_css_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
void handleScript(AsyncWebServerRequest *request) { void handleScript(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/javascript", (const uint8_t*)web_script_js, web_script_js_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/javascript", (const uint8_t*)web_script_js, web_script_js_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
void handleBootstrapStyle(AsyncWebServerRequest *request) { void handleBootstrapStyle(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", (const uint8_t*)web_bootstrap_css, web_bootstrap_css_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/css", (const uint8_t*)web_bootstrap_css, web_bootstrap_css_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", "max-age=3600"); response->addHeader("Cache-Control", "max-age=3600");
request->send(response); request->send(response);
} }
void handleBootstrapScript(AsyncWebServerRequest *request) { void handleBootstrapScript(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/javascript", (const uint8_t*)web_bootstrap_js, web_bootstrap_js_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/javascript", (const uint8_t*)web_bootstrap_js, web_bootstrap_js_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", "max-age=3600"); response->addHeader("Cache-Control", "max-age=3600");
request->send(response); request->send(response);
+7 -5
View File
@@ -70,11 +70,13 @@ namespace WIFI_Utils {
startAP = true; startAP = true;
} else { } else {
uint8_t wifiCounter = 0; uint8_t wifiCounter = 0;
String hostName = "iGATE-" + Config.callsign;
WiFi.setHostname(hostName.c_str());
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
WiFi.disconnect(); WiFi.disconnect();
delay(500); delay(500);
unsigned long start = millis(); 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("' ..."); Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ...");
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) { while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) {
@@ -99,7 +101,7 @@ namespace WIFI_Utils {
currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; currentWiFi = &Config.wifiAPs[myWiFiAPIndex];
start = millis(); start = millis();
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ..."); 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.disconnect();
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
} }
@@ -113,17 +115,17 @@ namespace WIFI_Utils {
Serial.print(WiFi.localIP()); Serial.print(WiFi.localIP());
Serial.print(" / MAC Address: "); Serial.print(" / MAC Address: ");
Serial.println(WiFi.macAddress()); Serial.println(WiFi.macAddress());
show_display("", " Connected!!", "" , " loading ...", 1000); displayShow("", " Connected!!", "" , " loading ...", 1000);
} else if (WiFi.status() != WL_CONNECTED) { } else if (WiFi.status() != WL_CONNECTED) {
startAP = true; startAP = true;
Serial.println("\nNot connected to WiFi! Starting Auto AP"); Serial.println("\nNot connected to WiFi! Starting Auto AP");
show_display("", " WiFi Not Connected!", "" , " loading ...", 1000); displayShow("", " WiFi Not Connected!", "" , " loading ...", 1000);
} }
WiFiConnected = !startAP; WiFiConnected = !startAP;
if (startAP) { if (startAP) {
Serial.println("\nNot connected to WiFi! Starting Auto AP"); 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(); startAutoAP();
} }