mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-07-18 15:43:14 +02:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ceff0064f | |||
| 8beb7c0465 | |||
| 112e38312d | |||
| 5a1c6e7ed9 | |||
| 0defd5b289 | |||
| cdac54c34e | |||
| 71e98487f6 | |||
| 510b5bdc59 | |||
| 00db358cc3 | |||
| c0641986aa | |||
| 55378bb9f3 | |||
| 79cf50a630 | |||
| 03ccd2b12e | |||
| d5ffd26c3c |
@@ -50,6 +50,8 @@ ____________________________________________________
|
|||||||
|
|
||||||
## Timeline (Versions):
|
## Timeline (Versions):
|
||||||
|
|
||||||
|
- 2024.10.21 Boards with GPS can now send Real-GPS Beacon (also posible: GPS ambiguity of ~ 1 km).
|
||||||
|
- 2024.10.14 Received Packets in WebUI show real Local Time (NTP with GMT offset).
|
||||||
- 2024.10.08 New EcoMode for Remote Digirepeaters without WiFi/WiFiAP, Screen, Leds (Example: LILYGO LoRa32 uses only 24mA, with WifiAP and all was 150mA). APRS Message/Queries can start/stop this mode too.
|
- 2024.10.08 New EcoMode for Remote Digirepeaters without WiFi/WiFiAP, Screen, Leds (Example: LILYGO LoRa32 uses only 24mA, with WifiAP and all was 150mA). APRS Message/Queries can start/stop this mode too.
|
||||||
- 2024.10.06 Cross Frequency Digirepeater Rules added.
|
- 2024.10.06 Cross Frequency Digirepeater Rules added.
|
||||||
- 2024.09.23 Libraries Update for SDK3
|
- 2024.09.23 Libraries Update for SDK3
|
||||||
@@ -116,4 +118,4 @@ ____________________________________________________
|
|||||||
|
|
||||||
__________________________________________
|
__________________________________________
|
||||||
|
|
||||||
# Hope You Enjoy this, 73 !! CA2RXU , Valparaiso, Chile
|
# Hope You Enjoy this, 73! CA2RXU, Valparaiso, Chile
|
||||||
@@ -81,6 +81,9 @@
|
|||||||
"username": "admin",
|
"username": "admin",
|
||||||
"password": ""
|
"password": ""
|
||||||
},
|
},
|
||||||
|
"ntp": {
|
||||||
|
"gmtCorrection": 0
|
||||||
|
},
|
||||||
"other": {
|
"other": {
|
||||||
"rememberStationTime": 30,
|
"rememberStationTime": 30,
|
||||||
"lowPowerMode": false,
|
"lowPowerMode": false,
|
||||||
|
|||||||
+83
-5
@@ -62,11 +62,11 @@
|
|||||||
<div class="container d-none" id="received-packets">
|
<div class="container d-none" id="received-packets">
|
||||||
<div class="row my-5 d-flex align-items-top">
|
<div class="row my-5 d-flex align-items-top">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h3>Last 20 received packets list</h3>
|
<h3>Last 10 received packets list</h3>
|
||||||
<table class="table mt-4">
|
<table class="table mt-4">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">Time*</th>
|
<th scope="col">Time</th>
|
||||||
<th scope="col">Frame</th>
|
<th scope="col">Frame</th>
|
||||||
<th scope="col">RSSI</th>
|
<th scope="col">RSSI</th>
|
||||||
<th scope="col">SNR</th>
|
<th scope="col">SNR</th>
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<span>List refresh automatically every 15 seconds.</span><br>
|
<span>List refresh automatically every 15 seconds.</span><br>
|
||||||
<small>* - For now time is measured from board boot up.</small>
|
<small>(Local Time is NPT-Time adjusted with your GMT Offset)</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
@@ -532,7 +532,7 @@
|
|||||||
class="form-control"
|
class="form-control"
|
||||||
required=""
|
required=""
|
||||||
step="1"
|
step="1"
|
||||||
min="1"
|
min="15"
|
||||||
/>
|
/>
|
||||||
<span class="input-group-text"
|
<span class="input-group-text"
|
||||||
>minutes
|
>minutes
|
||||||
@@ -540,6 +540,36 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-12 mt-3">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="beacon.gpsActive"
|
||||||
|
id="beacon.gpsActive"
|
||||||
|
class="form-check-input"
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
for="beacon.gpsActive"
|
||||||
|
class="form-label"
|
||||||
|
>Send Real-GPS Beacon <small>(Only for Boards with GPS Modules)</small>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="beacon.gpsAmbiguity"
|
||||||
|
id="beacon.gpsAmbiguity"
|
||||||
|
class="form-check-input"
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
for="beacon.gpsAmbiguity"
|
||||||
|
class="form-label"
|
||||||
|
>Send Real-GPS Beacon with Ambiguity <small>(~ 1 Km of Random Error)</small>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
@@ -806,7 +836,6 @@
|
|||||||
id="lora.codingRate4"
|
id="lora.codingRate4"
|
||||||
required=""
|
required=""
|
||||||
>
|
>
|
||||||
<option value="4">4</option>
|
|
||||||
<option value="5">5</option>
|
<option value="5">5</option>
|
||||||
<option value="6">6</option>
|
<option value="6">6</option>
|
||||||
<option value="7">7</option>
|
<option value="7">7</option>
|
||||||
@@ -1639,6 +1668,55 @@
|
|||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
|
<div class="row my-5 d-flex align-items-top">
|
||||||
|
<div class="col-lg-3 col-sm-12">
|
||||||
|
<h5>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
fill="currentColor"
|
||||||
|
class="bi bi-cloud-upload-fill"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
d="M8 0a5.53 5.53 0 0 0-3.594 1.342c-.766.66-1.321 1.52-1.464 2.383C1.266 4.095 0 5.555 0 7.318 0 9.366 1.708 11 3.781 11H7.5V5.707L5.354 7.854a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 5.707V11h4.188C14.502 11 16 9.57 16 7.773c0-1.636-1.242-2.969-2.834-3.194C12.923 1.999 10.69 0 8 0m-.5 14.5V11h1v3.5a.5.5 0 0 1-1 0"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
NTP
|
||||||
|
</h5>
|
||||||
|
<small
|
||||||
|
>Set your GMT Time Zone.
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-9 col-sm-12">
|
||||||
|
<div class="col-12">
|
||||||
|
<label
|
||||||
|
for="ntp.gmtCorrection"
|
||||||
|
class="form-label"
|
||||||
|
>GMT Time Correction for accurate Local Time</label
|
||||||
|
>
|
||||||
|
<div class="input-group">
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
name="ntp.gmtCorrection"
|
||||||
|
id="ntp.gmtCorrection"
|
||||||
|
placeholder="0"
|
||||||
|
class="form-control"
|
||||||
|
step="1"
|
||||||
|
min="-23"
|
||||||
|
max="23"
|
||||||
|
/>
|
||||||
|
<span class="input-group-text"
|
||||||
|
>hours</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
|
||||||
<div class="row my-5 d-flex align-items-top">
|
<div class="row my-5 d-flex align-items-top">
|
||||||
<div class="col-lg-3 col-sm-12">
|
<div class="col-lg-3 col-sm-12">
|
||||||
<h5>
|
<h5>
|
||||||
|
|||||||
@@ -134,6 +134,9 @@ function loadSettings(settings) {
|
|||||||
document.getElementById("beacon.sendViaAPRSIS").checked = settings.beacon.sendViaAPRSIS;
|
document.getElementById("beacon.sendViaAPRSIS").checked = settings.beacon.sendViaAPRSIS;
|
||||||
document.getElementById("beacon.sendViaRF").checked = settings.beacon.sendViaRF;
|
document.getElementById("beacon.sendViaRF").checked = settings.beacon.sendViaRF;
|
||||||
|
|
||||||
|
document.getElementById("beacon.gpsActive").checked = settings.beacon.gpsActive;
|
||||||
|
document.getElementById("beacon.gpsAmbiguity").checked = settings.beacon.gpsAmbiguity;
|
||||||
|
|
||||||
// Digi
|
// Digi
|
||||||
document.getElementById("digi.mode").value = settings.digi.mode;
|
document.getElementById("digi.mode").value = settings.digi.mode;
|
||||||
document.getElementById("digi.ecoMode").checked = settings.digi.ecoMode;
|
document.getElementById("digi.ecoMode").checked = settings.digi.ecoMode;
|
||||||
@@ -208,6 +211,9 @@ function loadSettings(settings) {
|
|||||||
document.getElementById("webadmin.username").value = settings.webadmin.username;
|
document.getElementById("webadmin.username").value = settings.webadmin.username;
|
||||||
document.getElementById("webadmin.password").value = settings.webadmin.password;
|
document.getElementById("webadmin.password").value = settings.webadmin.password;
|
||||||
|
|
||||||
|
// NTP
|
||||||
|
document.getElementById("ntp.gmtCorrection").value = settings.ntp.gmtCorrection;
|
||||||
|
|
||||||
// Experimental
|
// Experimental
|
||||||
document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode;
|
document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode;
|
||||||
|
|
||||||
@@ -507,13 +513,9 @@ function loadReceivedPackets(packets) {
|
|||||||
|
|
||||||
packets.forEach((packet) => {
|
packets.forEach((packet) => {
|
||||||
const element = document.createElement("tr");
|
const element = document.createElement("tr");
|
||||||
|
|
||||||
date.setTime(packet.millis);
|
|
||||||
|
|
||||||
const p = date.toUTCString().split(' ')
|
|
||||||
|
|
||||||
element.innerHTML = `
|
element.innerHTML = `
|
||||||
<td>${p[p.length-2]}</td>
|
<td>${packet.rxTime}</td>
|
||||||
<td>${packet.packet}</td>
|
<td>${packet.packet}</td>
|
||||||
<td>${packet.RSSI}</td>
|
<td>${packet.RSSI}</td>
|
||||||
<td>${packet.SNR}</td>
|
<td>${packet.SNR}</td>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ lib_deps =
|
|||||||
ayushsharma82/ElegantOTA @ 3.1.5
|
ayushsharma82/ElegantOTA @ 3.1.5
|
||||||
mathieucarbou/ESPAsyncWebServer @ 3.2.3
|
mathieucarbou/ESPAsyncWebServer @ 3.2.3
|
||||||
mathieucarbou/AsyncTCP @ 3.2.5
|
mathieucarbou/AsyncTCP @ 3.2.5
|
||||||
|
arduino-libraries/NTPClient @ 3.2.1
|
||||||
|
|
||||||
[env:ttgo-lora32-v21]
|
[env:ttgo-lora32-v21]
|
||||||
board = ttgo-lora32-v21
|
board = ttgo-lora32-v21
|
||||||
@@ -211,6 +212,7 @@ build_flags =
|
|||||||
-DTTGO_T_Beam_V1_2
|
-DTTGO_T_Beam_V1_2
|
||||||
-DHAS_SX1278
|
-DHAS_SX1278
|
||||||
-DHAS_AXP2101
|
-DHAS_AXP2101
|
||||||
|
-DHAS_GPS
|
||||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps}
|
${common.lib_deps}
|
||||||
@@ -225,6 +227,7 @@ build_flags =
|
|||||||
-DTTGO_T_Beam_V1_2_915
|
-DTTGO_T_Beam_V1_2_915
|
||||||
-DHAS_SX1276
|
-DHAS_SX1276
|
||||||
-DHAS_AXP2101
|
-DHAS_AXP2101
|
||||||
|
-DHAS_GPS
|
||||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps}
|
${common.lib_deps}
|
||||||
@@ -239,6 +242,7 @@ build_flags =
|
|||||||
-DTTGO_T_Beam_V1_0
|
-DTTGO_T_Beam_V1_0
|
||||||
-DHAS_SX1278
|
-DHAS_SX1278
|
||||||
-DHAS_AXP192
|
-DHAS_AXP192
|
||||||
|
-DHAS_GPS
|
||||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps}
|
${common.lib_deps}
|
||||||
@@ -253,6 +257,7 @@ build_flags =
|
|||||||
-DTTGO_T_Beam_V1_0_915
|
-DTTGO_T_Beam_V1_0_915
|
||||||
-DHAS_SX1276
|
-DHAS_SX1276
|
||||||
-DHAS_AXP192
|
-DHAS_AXP192
|
||||||
|
-DHAS_GPS
|
||||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps}
|
${common.lib_deps}
|
||||||
@@ -267,6 +272,7 @@ build_flags =
|
|||||||
-DTTGO_T_Beam_V1_0_SX1268
|
-DTTGO_T_Beam_V1_0_SX1268
|
||||||
-DHAS_SX1268
|
-DHAS_SX1268
|
||||||
-DHAS_AXP192
|
-DHAS_AXP192
|
||||||
|
-DHAS_GPS
|
||||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps}
|
${common.lib_deps}
|
||||||
@@ -281,6 +287,7 @@ build_flags =
|
|||||||
-DTTGO_T_Beam_V1_2_SX1262
|
-DTTGO_T_Beam_V1_2_SX1262
|
||||||
-DHAS_SX1262
|
-DHAS_SX1262
|
||||||
-DHAS_AXP2101
|
-DHAS_AXP2101
|
||||||
|
-DHAS_GPS
|
||||||
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps}
|
${common.lib_deps}
|
||||||
@@ -326,6 +333,8 @@ build_flags =
|
|||||||
-Werror -Wall
|
-Werror -Wall
|
||||||
-DHELTEC_WIRELESS_TRACKER
|
-DHELTEC_WIRELESS_TRACKER
|
||||||
-DHAS_SX1262
|
-DHAS_SX1262
|
||||||
|
-DHAS_GPS
|
||||||
|
-DGPS_BAUDRATE=115200
|
||||||
-DHAS_TFT
|
-DHAS_TFT
|
||||||
-D USER_SETUP_LOADED
|
-D USER_SETUP_LOADED
|
||||||
-D TFT_WIDTH=80
|
-D TFT_WIDTH=80
|
||||||
|
|||||||
+21
-13
@@ -13,6 +13,7 @@
|
|||||||
______________________________________________________________________________________________________________*/
|
______________________________________________________________________________________________________________*/
|
||||||
|
|
||||||
#include <ElegantOTA.h>
|
#include <ElegantOTA.h>
|
||||||
|
#include <TinyGPS++.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -31,6 +32,7 @@ ________________________________________________________________________________
|
|||||||
#include "gps_utils.h"
|
#include "gps_utils.h"
|
||||||
#include "web_utils.h"
|
#include "web_utils.h"
|
||||||
#include "tnc_utils.h"
|
#include "tnc_utils.h"
|
||||||
|
#include "ntp_utils.h"
|
||||||
#include "wx_utils.h"
|
#include "wx_utils.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
@@ -38,19 +40,23 @@ ________________________________________________________________________________
|
|||||||
#include "A7670_utils.h"
|
#include "A7670_utils.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
String versionDate = "2024.10.08";
|
String versionDate = "2024.10.21";
|
||||||
Configuration Config;
|
Configuration Config;
|
||||||
WiFiClient espClient;
|
WiFiClient espClient;
|
||||||
|
#ifdef HAS_GPS
|
||||||
|
HardwareSerial gpsSerial(1);
|
||||||
|
TinyGPSPlus gps;
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t myWiFiAPIndex = 0;
|
uint8_t myWiFiAPIndex = 0;
|
||||||
int myWiFiAPSize = Config.wifiAPs.size();
|
int myWiFiAPSize = Config.wifiAPs.size();
|
||||||
WiFi_AP *currentWiFi = &Config.wifiAPs[myWiFiAPIndex];
|
WiFi_AP *currentWiFi = &Config.wifiAPs[myWiFiAPIndex];
|
||||||
|
|
||||||
bool isUpdatingOTA = false;
|
bool isUpdatingOTA = false;
|
||||||
uint32_t lastBatteryCheck = 0;
|
uint32_t lastBatteryCheck = 0;
|
||||||
|
|
||||||
bool backUpDigiMode = false;
|
bool backUpDigiMode = false;
|
||||||
bool modemLoggedToAPRSIS = false;
|
bool modemLoggedToAPRSIS = false;
|
||||||
|
|
||||||
std::vector<ReceivedPacket> receivedPackets;
|
std::vector<ReceivedPacket> receivedPackets;
|
||||||
|
|
||||||
@@ -64,11 +70,11 @@ void setup() {
|
|||||||
Utils::setupDisplay();
|
Utils::setupDisplay();
|
||||||
LoRa_Utils::setup();
|
LoRa_Utils::setup();
|
||||||
Utils::validateFreqs();
|
Utils::validateFreqs();
|
||||||
GPS_Utils::generateBeacons();
|
GPS_Utils::setup();
|
||||||
|
|
||||||
#ifdef STARTUP_DELAY // (TEST) just to wait for WiFi init of Routers
|
#ifdef STARTUP_DELAY // (TEST) just to wait for WiFi init of Routers
|
||||||
displayShow("", " STARTUP DELAY ...", "", "", 0);
|
displayShow("", " STARTUP DELAY ...", "", "", 0);
|
||||||
delay(STARTUP_DELAY * 60 * 1000);
|
delay(STARTUP_DELAY * 60 * 1000);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HELTEC_HTCT62
|
#ifdef HELTEC_HTCT62
|
||||||
@@ -113,6 +119,7 @@ void setup() {
|
|||||||
#endif
|
#endif
|
||||||
DIGI_Utils::checkEcoMode();
|
DIGI_Utils::checkEcoMode();
|
||||||
WIFI_Utils::setup();
|
WIFI_Utils::setup();
|
||||||
|
NTP_Utils::setup();
|
||||||
SYSLOG_Utils::setup();
|
SYSLOG_Utils::setup();
|
||||||
WX_Utils::setup();
|
WX_Utils::setup();
|
||||||
WEB_Utils::setup();
|
WEB_Utils::setup();
|
||||||
@@ -145,6 +152,7 @@ void loop() {
|
|||||||
if (Config.aprs_is.active && (WiFi.status() == WL_CONNECTED) && !espClient.connected()) APRS_IS_Utils::connect();
|
if (Config.aprs_is.active && (WiFi.status() == WL_CONNECTED) && !espClient.connected()) APRS_IS_Utils::connect();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
NTP_Utils::update();
|
||||||
TNC_Utils::loop();
|
TNC_Utils::loop();
|
||||||
|
|
||||||
Utils::checkDisplayInterval();
|
Utils::checkDisplayInterval();
|
||||||
|
|||||||
@@ -256,6 +256,16 @@
|
|||||||
#define RADIO_BUSY_PIN 8
|
#define RADIO_BUSY_PIN 8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_915) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_915) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262)
|
||||||
|
#define GPS_RX 12
|
||||||
|
#define GPS_TX 34
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( HELTEC_WIRELESS_TRACKER)
|
||||||
|
#define GPS_RX 34
|
||||||
|
#define GPS_TX 33
|
||||||
|
#endif
|
||||||
|
|
||||||
/* (Same pins for LILYGO LoRa32 and ESP32 Wroom Dev )
|
/* (Same pins for LILYGO LoRa32 and ESP32 Wroom Dev )
|
||||||
SX1278-------------------> ESP32 ttgo-lora32-v21 and ESP32 WROOM Dev
|
SX1278-------------------> ESP32 ttgo-lora32-v21 and ESP32 WROOM Dev
|
||||||
GND GND
|
GND GND
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ void Configuration::writeFile() {
|
|||||||
data["beacon"]["sendViaRF"] = beacon.sendViaRF;
|
data["beacon"]["sendViaRF"] = beacon.sendViaRF;
|
||||||
data["beacon"]["path"] = beacon.path;
|
data["beacon"]["path"] = beacon.path;
|
||||||
|
|
||||||
|
data["beacon"]["gpsActive"] = beacon.gpsActive;
|
||||||
|
data["beacon"]["gpsAmbiguity"] = beacon.gpsAmbiguity;
|
||||||
|
|
||||||
data["digi"]["mode"] = digi.mode;
|
data["digi"]["mode"] = digi.mode;
|
||||||
data["digi"]["ecoMode"] = digi.ecoMode;
|
data["digi"]["ecoMode"] = digi.ecoMode;
|
||||||
|
|
||||||
@@ -100,6 +103,8 @@ void Configuration::writeFile() {
|
|||||||
data["webadmin"]["username"] = webadmin.username;
|
data["webadmin"]["username"] = webadmin.username;
|
||||||
data["webadmin"]["password"] = webadmin.password;
|
data["webadmin"]["password"] = webadmin.password;
|
||||||
|
|
||||||
|
data["ntp"]["gmtCorrection"] = ntp.gmtCorrection;
|
||||||
|
|
||||||
serializeJson(data, configFile);
|
serializeJson(data, configFile);
|
||||||
|
|
||||||
configFile.close();
|
configFile.close();
|
||||||
@@ -144,6 +149,9 @@ bool Configuration::readFile() {
|
|||||||
beacon.path = data["beacon"]["path"] | "WIDE1-1";
|
beacon.path = data["beacon"]["path"] | "WIDE1-1";
|
||||||
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
|
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
|
||||||
beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
|
beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
|
||||||
|
|
||||||
|
beacon.gpsActive = data["beacon"]["gpsActive"] | false;
|
||||||
|
beacon.gpsAmbiguity = data["beacon"]["gpsAmbiguity"] | false;
|
||||||
|
|
||||||
aprs_is.active = data["aprs_is"]["active"] | false;
|
aprs_is.active = data["aprs_is"]["active"] | false;
|
||||||
aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV";
|
aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV";
|
||||||
@@ -201,6 +209,8 @@ bool Configuration::readFile() {
|
|||||||
webadmin.username = data["webadmin"]["username"] | "admin";
|
webadmin.username = data["webadmin"]["username"] | "admin";
|
||||||
webadmin.password = data["webadmin"]["password"] | "";
|
webadmin.password = data["webadmin"]["password"] | "";
|
||||||
|
|
||||||
|
ntp.gmtCorrection = data["ntp"]["gmtCorrection"] | 0;
|
||||||
|
|
||||||
lowPowerMode = data["other"]["lowPowerMode"] | false;
|
lowPowerMode = data["other"]["lowPowerMode"] | false;
|
||||||
lowVoltageCutOff = data["other"]["lowVoltageCutOff"] | 0;
|
lowVoltageCutOff = data["other"]["lowVoltageCutOff"] | 0;
|
||||||
|
|
||||||
@@ -249,6 +259,9 @@ void Configuration::init() {
|
|||||||
beacon.sendViaAPRSIS = true;
|
beacon.sendViaAPRSIS = true;
|
||||||
beacon.sendViaRF = false;
|
beacon.sendViaRF = false;
|
||||||
beacon.path = "WIDE1-1";
|
beacon.path = "WIDE1-1";
|
||||||
|
|
||||||
|
beacon.gpsActive = false;
|
||||||
|
beacon.gpsAmbiguity = false;
|
||||||
|
|
||||||
digi.mode = 0;
|
digi.mode = 0;
|
||||||
digi.ecoMode = false;
|
digi.ecoMode = false;
|
||||||
@@ -318,6 +331,8 @@ void Configuration::init() {
|
|||||||
webadmin.username = "admin";
|
webadmin.username = "admin";
|
||||||
webadmin.password = "";
|
webadmin.password = "";
|
||||||
|
|
||||||
|
ntp.gmtCorrection = 0;
|
||||||
|
|
||||||
Serial.println("All is Written!");
|
Serial.println("All is Written!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ public:
|
|||||||
String path;
|
String path;
|
||||||
bool sendViaRF;
|
bool sendViaRF;
|
||||||
bool sendViaAPRSIS;
|
bool sendViaAPRSIS;
|
||||||
|
bool gpsActive;
|
||||||
|
bool gpsAmbiguity;
|
||||||
};
|
};
|
||||||
|
|
||||||
class APRS_IS {
|
class APRS_IS {
|
||||||
@@ -115,6 +117,13 @@ public:
|
|||||||
String password;
|
String password;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class NTP {
|
||||||
|
public:
|
||||||
|
int gmtCorrection;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Configuration {
|
class Configuration {
|
||||||
public:
|
public:
|
||||||
String callsign;
|
String callsign;
|
||||||
@@ -138,6 +147,7 @@ public:
|
|||||||
TNC tnc;
|
TNC tnc;
|
||||||
OTA ota;
|
OTA ota;
|
||||||
WEBADMIN webadmin;
|
WEBADMIN webadmin;
|
||||||
|
NTP ntp;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
void writeFile();
|
void writeFile();
|
||||||
|
|||||||
+59
-21
@@ -1,13 +1,22 @@
|
|||||||
#include <TinyGPS++.h>
|
#include <TinyGPS++.h>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
#include "boards_pinout.h"
|
||||||
#include "gps_utils.h"
|
#include "gps_utils.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
extern Configuration Config;
|
#ifdef GPS_BAUDRATE
|
||||||
extern WiFiClient espClient;
|
#define GPS_BAUD GPS_BAUDRATE
|
||||||
String distance, iGateBeaconPacket, iGateLoRaBeaconPacket;
|
#else
|
||||||
|
#define GPS_BAUD 9600
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern Configuration Config;
|
||||||
|
extern WiFiClient espClient;
|
||||||
|
extern HardwareSerial gpsSerial;
|
||||||
|
extern TinyGPSPlus gps;
|
||||||
|
String distance, iGateBeaconPacket, iGateLoRaBeaconPacket;
|
||||||
|
|
||||||
|
|
||||||
namespace GPS_Utils {
|
namespace GPS_Utils {
|
||||||
@@ -24,20 +33,32 @@ namespace GPS_Utils {
|
|||||||
return(s);
|
return(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float roundToTwoDecimals(float degrees) {
|
||||||
|
return round(degrees * 100) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol) {
|
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol) {
|
||||||
String encodedData = overlay;
|
String encodedData = overlay;
|
||||||
uint32_t aprs_lat, aprs_lon;
|
uint32_t aprs_lat, aprs_lon;
|
||||||
aprs_lat = 900000000 - latitude * 10000000;
|
|
||||||
|
float processedLatitude = latitude;
|
||||||
|
float processedLongitude = longitude;
|
||||||
|
if (Config.beacon.gpsActive && Config.beacon.gpsAmbiguity) {
|
||||||
|
processedLatitude = roundToTwoDecimals(latitude);
|
||||||
|
processedLongitude = roundToTwoDecimals(longitude);
|
||||||
|
}
|
||||||
|
|
||||||
|
aprs_lat = 900000000 - processedLatitude * 10000000;
|
||||||
aprs_lat = aprs_lat / 26 - aprs_lat / 2710 + aprs_lat / 15384615;
|
aprs_lat = aprs_lat / 26 - aprs_lat / 2710 + aprs_lat / 15384615;
|
||||||
aprs_lon = 900000000 + longitude * 10000000 / 2;
|
aprs_lon = 900000000 + processedLongitude * 10000000 / 2;
|
||||||
aprs_lon = aprs_lon / 26 - aprs_lon / 2710 + aprs_lon / 15384615;
|
aprs_lon = aprs_lon / 26 - aprs_lon / 2710 + aprs_lon / 15384615;
|
||||||
|
|
||||||
String Ns, Ew, helper;
|
String Ns, Ew, helper;
|
||||||
if(latitude < 0) { Ns = "S"; } else { Ns = "N"; }
|
if(processedLatitude < 0) { Ns = "S"; } else { Ns = "N"; }
|
||||||
if(latitude < 0) { latitude= -latitude; }
|
if(processedLatitude < 0) { processedLatitude = -processedLatitude; }
|
||||||
|
|
||||||
if(longitude < 0) { Ew = "W"; } else { Ew = "E"; }
|
if(processedLongitude < 0) { Ew = "W"; } else { Ew = "E"; }
|
||||||
if(longitude < 0) { longitude= -longitude; }
|
if(processedLongitude < 0) { processedLongitude = -processedLongitude; }
|
||||||
|
|
||||||
char helper_base91[] = {"0000\0"};
|
char helper_base91[] = {"0000\0"};
|
||||||
int i;
|
int i;
|
||||||
@@ -55,6 +76,19 @@ namespace GPS_Utils {
|
|||||||
return encodedData;
|
return encodedData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generateBeaconFirstPart() {
|
||||||
|
String beaconPacket = Config.callsign;
|
||||||
|
beaconPacket += ">APLRG1";
|
||||||
|
if (Config.beacon.path.indexOf("WIDE") == 0) {
|
||||||
|
beaconPacket += ",";
|
||||||
|
beaconPacket += Config.beacon.path;
|
||||||
|
}
|
||||||
|
iGateBeaconPacket = beaconPacket;
|
||||||
|
iGateBeaconPacket += ",qAC:!";
|
||||||
|
iGateLoRaBeaconPacket = beaconPacket;
|
||||||
|
iGateLoRaBeaconPacket += ":!";
|
||||||
|
}
|
||||||
|
|
||||||
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)) {
|
||||||
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
|
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
|
||||||
@@ -64,19 +98,8 @@ namespace GPS_Utils {
|
|||||||
Config.beacon.sendViaRF = false;
|
Config.beacon.sendViaRF = false;
|
||||||
Config.digi.mode = 0;
|
Config.digi.mode = 0;
|
||||||
Config.backupDigiMode = false;
|
Config.backupDigiMode = false;
|
||||||
}
|
|
||||||
String beaconPacket = Config.callsign;
|
|
||||||
beaconPacket += ">APLRG1";
|
|
||||||
if (Config.beacon.path.indexOf("WIDE") == 0) {
|
|
||||||
beaconPacket += ",";
|
|
||||||
beaconPacket += Config.beacon.path;
|
|
||||||
}
|
}
|
||||||
|
generateBeaconFirstPart();
|
||||||
iGateBeaconPacket = beaconPacket;
|
|
||||||
iGateBeaconPacket += ",qAC:!";
|
|
||||||
iGateLoRaBeaconPacket = beaconPacket;
|
|
||||||
iGateLoRaBeaconPacket += ":!";
|
|
||||||
|
|
||||||
String encodedGPS = encodeGPS(Config.beacon.latitude, Config.beacon.longitude, Config.beacon.overlay, Config.beacon.symbol);
|
String encodedGPS = encodeGPS(Config.beacon.latitude, Config.beacon.longitude, Config.beacon.overlay, Config.beacon.symbol);
|
||||||
iGateBeaconPacket += encodedGPS;
|
iGateBeaconPacket += encodedGPS;
|
||||||
iGateLoRaBeaconPacket += encodedGPS;
|
iGateLoRaBeaconPacket += encodedGPS;
|
||||||
@@ -184,4 +207,19 @@ namespace GPS_Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
#ifdef HAS_GPS
|
||||||
|
if (Config.beacon.gpsActive) {
|
||||||
|
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_TX, GPS_RX);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
generateBeacons();
|
||||||
|
}
|
||||||
|
|
||||||
|
void getData() {
|
||||||
|
while (gpsSerial.available() > 0) {
|
||||||
|
gps.encode(gpsSerial.read());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+5
-2
@@ -5,16 +5,19 @@
|
|||||||
|
|
||||||
|
|
||||||
namespace GPS_Utils {
|
namespace GPS_Utils {
|
||||||
|
|
||||||
String getiGateLoRaBeaconPacket();
|
String getiGateLoRaBeaconPacket();
|
||||||
char *ax25_base91enc(char *s, uint8_t n, uint32_t v);
|
char *ax25_base91enc(char *s, uint8_t n, uint32_t v);
|
||||||
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol);
|
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol);
|
||||||
|
void generateBeaconFirstPart();
|
||||||
void generateBeacons();
|
void generateBeacons();
|
||||||
//double calculateDistanceCourse(double latitude, double longitude);
|
|
||||||
String decodeEncodedGPS(const String& packet);
|
String decodeEncodedGPS(const String& packet);
|
||||||
String getReceivedGPS(const String& packet);
|
String getReceivedGPS(const String& packet);
|
||||||
String getDistanceAndComment(const String& packet);
|
String getDistanceAndComment(const String& packet);
|
||||||
|
|
||||||
|
void setup();
|
||||||
|
void getData();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+6
-5
@@ -4,6 +4,7 @@
|
|||||||
#include "aprs_is_utils.h"
|
#include "aprs_is_utils.h"
|
||||||
#include "boards_pinout.h"
|
#include "boards_pinout.h"
|
||||||
#include "syslog_utils.h"
|
#include "syslog_utils.h"
|
||||||
|
#include "ntp_utils.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
@@ -175,15 +176,15 @@ namespace LoRa_Utils {
|
|||||||
Utils::println("<--- LoRa Packet Rx : " + packet.substring(3));
|
Utils::println("<--- LoRa Packet Rx : " + packet.substring(3));
|
||||||
Utils::println("(RSSI:" + String(rssi) + " / SNR:" + String(snr) + " / FreqErr:" + String(freqError) + ")");
|
Utils::println("(RSSI:" + String(rssi) + " / SNR:" + String(snr) + " / FreqErr:" + String(freqError) + ")");
|
||||||
|
|
||||||
if (!Config.lowPowerMode) {
|
if (!Config.lowPowerMode && !Config.digi.ecoMode) {
|
||||||
|
if (receivedPackets.size() >= 10) {
|
||||||
|
receivedPackets.erase(receivedPackets.begin());
|
||||||
|
}
|
||||||
ReceivedPacket receivedPacket;
|
ReceivedPacket receivedPacket;
|
||||||
receivedPacket.millis = millis();
|
receivedPacket.rxTime = NTP_Utils::getFormatedTime();
|
||||||
receivedPacket.packet = packet.substring(3);
|
receivedPacket.packet = packet.substring(3);
|
||||||
receivedPacket.RSSI = rssi;
|
receivedPacket.RSSI = rssi;
|
||||||
receivedPacket.SNR = snr;
|
receivedPacket.SNR = snr;
|
||||||
if (receivedPackets.size() >= 20) {
|
|
||||||
receivedPackets.erase(receivedPackets.begin());
|
|
||||||
}
|
|
||||||
receivedPackets.push_back(receivedPacket);
|
receivedPackets.push_back(receivedPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#include <NTPClient.h>
|
||||||
|
#include <WiFiUdp.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include "configuration.h"
|
||||||
|
#include "ntp_utils.h"
|
||||||
|
#include "time.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern Configuration Config;
|
||||||
|
|
||||||
|
WiFiUDP ntpUDP;
|
||||||
|
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0, 15 * 60 * 1000); // Update interval 15 min
|
||||||
|
|
||||||
|
|
||||||
|
namespace NTP_Utils {
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
if (WiFi.status() == WL_CONNECTED && !Config.digi.ecoMode && Config.callsign != "NOCALL-10") {
|
||||||
|
int gmt = Config.ntp.gmtCorrection * 3600;
|
||||||
|
timeClient.setTimeOffset(gmt);
|
||||||
|
timeClient.begin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void update() {
|
||||||
|
if (WiFi.status() == WL_CONNECTED && !Config.digi.ecoMode && Config.callsign != "NOCALL-10") timeClient.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
String getFormatedTime() {
|
||||||
|
if (!Config.digi.ecoMode) return timeClient.getFormattedTime();
|
||||||
|
return "DigiEcoMode Active";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#ifndef NTP_UTILS_H_
|
||||||
|
#define NTP_UTILS_H_
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
namespace NTP_Utils {
|
||||||
|
|
||||||
|
void setup();
|
||||||
|
void update();
|
||||||
|
String getFormatedTime();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -47,6 +47,36 @@ namespace POWER_Utils {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void activateGPS() {
|
||||||
|
#ifdef HAS_AXP192
|
||||||
|
PMU.setLDO3Voltage(3300);
|
||||||
|
PMU.enableLDO3();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_AXP2101
|
||||||
|
PMU.setALDO3Voltage(3300);
|
||||||
|
PMU.enableALDO3();
|
||||||
|
#endif
|
||||||
|
#ifdef HELTEC_WIRELESS_TRACKER
|
||||||
|
digitalWrite(VEXT_CTRL, HIGH);
|
||||||
|
#endif
|
||||||
|
//gpsIsActive = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deactivateGPS() {
|
||||||
|
#ifdef HAS_AXP192
|
||||||
|
PMU.disableLDO3();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_AXP2101
|
||||||
|
PMU.disableALDO3();
|
||||||
|
#endif
|
||||||
|
#ifdef HELTEC_WIRELESS_TRACKER
|
||||||
|
digitalWrite(VEXT_CTRL, LOW);
|
||||||
|
#endif
|
||||||
|
//gpsIsActive = false;
|
||||||
|
}
|
||||||
|
|
||||||
void activateLoRa() {
|
void activateLoRa() {
|
||||||
#ifdef HAS_AXP192
|
#ifdef HAS_AXP192
|
||||||
PMU.setLDO2Voltage(3300);
|
PMU.setLDO2Voltage(3300);
|
||||||
@@ -159,6 +189,10 @@ namespace POWER_Utils {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_GPS
|
||||||
|
if (Config.beacon.gpsActive) activateGPS();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ADC_CTRL
|
#ifdef ADC_CTRL
|
||||||
pinMode(ADC_CTRL, OUTPUT);
|
pinMode(ADC_CTRL, OUTPUT);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ namespace POWER_Utils {
|
|||||||
double getBatteryVoltage();
|
double getBatteryVoltage();
|
||||||
bool isBatteryConnected();
|
bool isBatteryConnected();
|
||||||
void activateMeasurement();
|
void activateMeasurement();
|
||||||
|
void activateGPS();
|
||||||
|
void deactivateGPS();
|
||||||
void activateLoRa();
|
void activateLoRa();
|
||||||
void deactivateLoRa();
|
void deactivateLoRa();
|
||||||
bool begin(TwoWire &port);
|
bool begin(TwoWire &port);
|
||||||
|
|||||||
+2
-2
@@ -51,12 +51,12 @@ namespace QUERY_Utils {
|
|||||||
// agregar callsign para completar donde esta X callsign --> posicion
|
// agregar callsign para completar donde esta X callsign --> posicion
|
||||||
Serial.println("estaciones escuchadas directo (ultimos 30 min)");
|
Serial.println("estaciones escuchadas directo (ultimos 30 min)");
|
||||||
answer.concat("?WHERE on development 73!");
|
answer.concat("?WHERE on development 73!");
|
||||||
} else if (queryQuestion.indexOf("?APRSEEM") == 0) { // Exit DigiRepeater EcoMode
|
} else if (queryQuestion.indexOf("?APRSEEM") == 0 && Config.digi.ecoMode == true) { // Exit DigiRepeater EcoMode
|
||||||
answer = "DigiEcoMode:Stop";
|
answer = "DigiEcoMode:Stop";
|
||||||
Config.digi.ecoMode = false;
|
Config.digi.ecoMode = false;
|
||||||
Config.display.alwaysOn = true;
|
Config.display.alwaysOn = true;
|
||||||
Config.display.timeout = 10;
|
Config.display.timeout = 10;
|
||||||
} else if (queryQuestion.indexOf("?APRSSEM") == 0) { // Start DigiRepeater EcoMode
|
} else if (queryQuestion.indexOf("?APRSSEM") == 0 && Config.digi.ecoMode == false) { // Start DigiRepeater EcoMode
|
||||||
answer = "DigiEcoMode:Start";
|
answer = "DigiEcoMode:Start";
|
||||||
Config.digi.ecoMode = true;
|
Config.digi.ecoMode = true;
|
||||||
} else if (queryQuestion.indexOf("?APRSEMS") == 0) { // DigiRepeater EcoMode Status
|
} else if (queryQuestion.indexOf("?APRSEMS") == 0) { // DigiRepeater EcoMode Status
|
||||||
|
|||||||
+26
-4
@@ -1,3 +1,4 @@
|
|||||||
|
#include <TinyGPS++.h>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "station_utils.h"
|
#include "station_utils.h"
|
||||||
@@ -13,8 +14,10 @@
|
|||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
extern Configuration Config;
|
extern Configuration Config;
|
||||||
extern WiFiClient espClient;
|
extern WiFiClient espClient;
|
||||||
|
extern TinyGPSPlus gps;
|
||||||
extern String versionDate;
|
extern String versionDate;
|
||||||
extern String firstLine;
|
extern String firstLine;
|
||||||
extern String secondLine;
|
extern String secondLine;
|
||||||
@@ -42,6 +45,8 @@ 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();
|
||||||
|
String beaconPacket;
|
||||||
|
String secondaryBeaconPacket;
|
||||||
|
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
@@ -106,7 +111,6 @@ namespace Utils {
|
|||||||
fourthLine.concat(String(lastHeardStations.size()));
|
fourthLine.concat(String(lastHeardStations.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sendInitialTelemetryPackets() {
|
void sendInitialTelemetryPackets() {
|
||||||
String sender = Config.callsign;
|
String sender = Config.callsign;
|
||||||
for (int i = sender.length(); i < 9; i++) {
|
for (int i = sender.length(); i < 9; i++) {
|
||||||
@@ -175,13 +179,19 @@ namespace Utils {
|
|||||||
sendStartTelemetry = false;
|
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) {
|
||||||
beaconUpdate = true;
|
beaconUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAS_GPS
|
||||||
|
if (Config.beacon.gpsActive && gps.location.lat() == 0.0 && gps.location.lng() == 0.0 && Config.beacon.latitude == 0.0 && Config.beacon.longitude == 0.0) {
|
||||||
|
GPS_Utils::getData();
|
||||||
|
beaconUpdate = false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (beaconUpdate) {
|
if (beaconUpdate) {
|
||||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||||
displayToggle(true);
|
displayToggle(true);
|
||||||
@@ -195,8 +205,20 @@ namespace Utils {
|
|||||||
|
|
||||||
activeStations();
|
activeStations();
|
||||||
|
|
||||||
String beaconPacket = iGateBeaconPacket;
|
beaconPacket = iGateBeaconPacket;
|
||||||
String secondaryBeaconPacket = iGateLoRaBeaconPacket;
|
secondaryBeaconPacket = iGateLoRaBeaconPacket;
|
||||||
|
#ifdef HAS_GPS
|
||||||
|
if (Config.beacon.gpsActive && !Config.digi.ecoMode) {
|
||||||
|
GPS_Utils::getData();
|
||||||
|
if (gps.location.isUpdated() && gps.location.lat() != 0.0 && gps.location.lng() != 0.0) {
|
||||||
|
GPS_Utils::generateBeaconFirstPart();
|
||||||
|
String encodedGPS = GPS_Utils::encodeGPS(gps.location.lat(), gps.location.lng(), Config.beacon.overlay, Config.beacon.symbol);
|
||||||
|
beaconPacket = iGateBeaconPacket + encodedGPS;
|
||||||
|
secondaryBeaconPacket = iGateLoRaBeaconPacket + encodedGPS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (Config.wxsensor.active && wxModuleType != 0) {
|
if (Config.wxsensor.active && wxModuleType != 0) {
|
||||||
String sensorData = WX_Utils::readDataSensor();
|
String sensorData = WX_Utils::readDataSensor();
|
||||||
beaconPacket += sensorData;
|
beaconPacket += sensorData;
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
class ReceivedPacket {
|
class ReceivedPacket {
|
||||||
public:
|
public:
|
||||||
long millis;
|
String rxTime;
|
||||||
String packet;
|
String packet;
|
||||||
int RSSI;
|
int RSSI;
|
||||||
float SNR;
|
float SNR;
|
||||||
|
|||||||
+9
-4
@@ -81,10 +81,10 @@ namespace WEB_Utils {
|
|||||||
StaticJsonDocument<1536> data;
|
StaticJsonDocument<1536> data;
|
||||||
|
|
||||||
for (int i = 0; i < receivedPackets.size(); i++) {
|
for (int i = 0; i < receivedPackets.size(); i++) {
|
||||||
data[i]["millis"] = receivedPackets[i].millis;
|
data[i]["rxTime"] = receivedPackets[i].rxTime;
|
||||||
data[i]["packet"] = receivedPackets[i].packet;
|
data[i]["packet"] = receivedPackets[i].packet;
|
||||||
data[i]["RSSI"] = receivedPackets[i].RSSI;
|
data[i]["RSSI"] = receivedPackets[i].RSSI;
|
||||||
data[i]["SNR"] = receivedPackets[i].SNR;
|
data[i]["SNR"] = receivedPackets[i].SNR;
|
||||||
}
|
}
|
||||||
|
|
||||||
String buffer;
|
String buffer;
|
||||||
@@ -134,6 +134,9 @@ namespace WEB_Utils {
|
|||||||
Config.beacon.symbol = request->getParam("beacon.symbol", true)->value();
|
Config.beacon.symbol = request->getParam("beacon.symbol", true)->value();
|
||||||
Config.beacon.path = request->getParam("beacon.path", true)->value();
|
Config.beacon.path = request->getParam("beacon.path", true)->value();
|
||||||
|
|
||||||
|
Config.beacon.gpsActive = request->hasParam("beacon.gpsActive", true);
|
||||||
|
Config.beacon.gpsAmbiguity = request->hasParam("beacon.gpsAmbiguity", true);
|
||||||
|
|
||||||
|
|
||||||
Config.digi.mode = request->getParam("digi.mode", true)->value().toInt();
|
Config.digi.mode = request->getParam("digi.mode", true)->value().toInt();
|
||||||
Config.digi.ecoMode = request->hasParam("digi.ecoMode", true);
|
Config.digi.ecoMode = request->hasParam("digi.ecoMode", true);
|
||||||
@@ -208,6 +211,8 @@ namespace WEB_Utils {
|
|||||||
Config.webadmin.password = request->getParam("webadmin.password", true)->value();
|
Config.webadmin.password = request->getParam("webadmin.password", true)->value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Config.ntp.gmtCorrection = request->getParam("ntp.gmtCorrection", true)->value().toInt();
|
||||||
|
|
||||||
Config.writeFile();
|
Config.writeFile();
|
||||||
|
|
||||||
AsyncWebServerResponse *response = request->beginResponse(302, "text/html", "");
|
AsyncWebServerResponse *response = request->beginResponse(302, "text/html", "");
|
||||||
|
|||||||
+2
-3
@@ -1,11 +1,10 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "gps_utils.h"
|
|
||||||
#include "wx_utils.h"
|
#include "wx_utils.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
|
|
||||||
|
|
||||||
#define SEALEVELPRESSURE_HPA (1013.25)
|
#define SEALEVELPRESSURE_HPA (1013.25)
|
||||||
#define CORRECTION_FACTOR (8.2296) // for meters
|
#define CORRECTION_FACTOR (8.2296) // for meters
|
||||||
|
|
||||||
extern Configuration Config;
|
extern Configuration Config;
|
||||||
extern String fifthLine;
|
extern String fifthLine;
|
||||||
|
|||||||
Reference in New Issue
Block a user