Compare commits

...

30 Commits

Author SHA1 Message Date
richonguzman d2b7c063f7 hwt not ready 2025-04-24 18:02:29 -04:00
richonguzman eaced15265 pruebas3 2025-04-24 18:01:00 -04:00
richonguzman af4bc20ac2 t-beam ok 2025-04-24 16:32:58 -04:00
richonguzman 14473cb7c7 Sleep fix when saving Config 2025-04-24 16:17:29 -04:00
richonguzman aba82ef3e0 prueba5 2025-04-24 15:56:13 -04:00
richonguzman 79405abe06 prueba5 2025-04-24 14:47:12 -04:00
richonguzman c623c0502e prueba3 2025-04-24 14:43:47 -04:00
richonguzman a6ae8523fa prueba2 2025-04-24 14:05:00 -04:00
richonguzman d454ab4ba2 pruebas1 2025-04-24 13:26:34 -04:00
richonguzman 5146db796e cambio8 2025-04-24 11:30:03 -04:00
richonguzman 93e536e739 cambio7 2025-04-24 11:18:02 -04:00
richonguzman 0af4670dee cambio6 2025-04-24 11:09:39 -04:00
richonguzman d70a35de1c cambio5 2025-04-24 10:46:04 -04:00
richonguzman eb5b3aaa25 cambio4 2025-04-24 10:36:08 -04:00
richonguzman ae3947b7ea cambio3 2025-04-24 09:50:58 -04:00
richonguzman 4f9eac9e5c cambio2 2025-04-24 09:44:57 -04:00
richonguzman e689bb592c cambio1 2025-04-24 08:07:29 -04:00
richonguzman 786f5bdc0e update uppercase warning 2025-04-22 16:27:55 -04:00
richonguzman ea2a83bc26 readme update 2025-03-23 22:23:29 -03:00
richonguzman c406b67484 rename Web015-Manager.pnh 2025-03-20 17:52:32 -03:00
richonguzman 7cc397ea33 add Web15-Manager.png 2025-03-20 17:51:59 -03:00
richonguzman 503aba71d0 readme update 2025-03-20 16:02:19 -03:00
richonguzman 8b7e0fdcef minor correction to EM activation 2025-03-20 15:54:19 -03:00
richonguzman ad996c8a49 encoded byte update 2025-03-18 19:10:15 -03:00
richonguzman dedd7152d9 first update of timestamp 2025-03-18 18:50:08 -03:00
richonguzman 5f5d7d7868 ready for test 2025-03-18 14:02:09 -03:00
richonguzman 2e3cafd0f0 3 2025-03-10 03:02:48 -03:00
richonguzman 1c07c2fb2b 2 2025-03-09 10:48:18 -03:00
richonguzman 4c63dd8bb7 start1 2025-03-09 10:23:34 -03:00
richonguzman b00fba9693 readme update 2025-03-03 13:53:29 -03:00
69 changed files with 706 additions and 427 deletions
+2
View File
@@ -54,6 +54,8 @@ ____________________________________________________
## Timeline (Versions): ## Timeline (Versions):
- 2025.03.20 Manager List added to enable/disable DigiEcoMode and Tx Control. Thanks LB5JJ.
- 2025.03.03 T-Beam Supreme board added and more BlackList rules added.
- 2025.02.28 Heltec Wireless Paper with Epaper working. Thanks SzymonPriv for pointing to the right library. - 2025.02.28 Heltec Wireless Paper with Epaper working. Thanks SzymonPriv for pointing to the right library.
- 2025.02.25 Objects Rules update, GPS Boards: Satellites on Screen, Wx Height Correction from GPS Data. - 2025.02.25 Objects Rules update, GPS Boards: Satellites on Screen, Wx Height Correction from GPS Data.
- 2025.01.22 Added LILYGO T-DECK PLUS (and DIY+GPS version) board support. - 2025.01.22 Added LILYGO T-DECK PLUS (and DIY+GPS version) board support.
+6 -4
View File
@@ -29,7 +29,7 @@
}, },
"digi": { "digi": {
"mode": 0, "mode": 0,
"ecoMode": false "ecoMode": 0
}, },
"lora": { "lora": {
"txFreq": 433775000, "txFreq": 433775000,
@@ -84,14 +84,16 @@
"ntp": { "ntp": {
"gmtCorrection": 0.0 "gmtCorrection": 0.0
}, },
"remoteManagement": {
"managers": "",
"rfOnly": true
},
"other": { "other": {
"rememberStationTime": 30, "rememberStationTime": 30,
"lowPowerMode": false,
"lowVoltageCutOff": 0,
"backupDigiMode": false, "backupDigiMode": false,
"rebootMode": false, "rebootMode": false,
"rebootModeTime": 6 "rebootModeTime": 6
}, },
"personalNote": "", "personalNote": "",
"blackList": "" "blacklist": ""
} }
+88 -60
View File
@@ -590,20 +590,20 @@
</svg> </svg>
Black List Black List
</h5> </h5>
<small>Add Callsigns with space between them to Black List them (* wild card allowed)</small> <small>Add Callsigns with space between them to Blacklist them (* wild card allowed)</small>
</div> </div>
<div class="col-9 mt-2"> <div class="col-9 mt-2">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<label <label
for="blackList" for="blacklist"
class="form-label" class="form-label"
>Black List</label >Blacklist</label
> >
<input <input
type="text" type="text"
name="blackList" name="blacklist"
id="blackList" id="blacklist"
class="form-control" class="form-control"
placeholder="Station Callsign" placeholder="Station Callsign"
oninput="this.value = this.value.toUpperCase();" oninput="this.value = this.value.toUpperCase();"
@@ -646,7 +646,9 @@
name="digi.mode" name="digi.mode"
id="digi.mode" id="digi.mode"
> >
<option value="0">off</option> <option value="0">
OFF
</option>
<option value="2"> <option value="2">
WIDE1 (fill-in) Digi WIDE1 (fill-in) Digi
</option> </option>
@@ -655,20 +657,27 @@
</option> </option>
</select> </select>
</div> </div>
<div class="col-12 mt-5"> <div class="col-12 mt-3">
<div class="form-check form-switch"> <label
<input for="digi.ecoMode"
type="checkbox" class="form-label"
name="digi.ecoMode" >Eco Mode</label
id="digi.ecoMode" >
class="form-check-input" <select
/> class="form-select form-select"
<label name="digi.ecoMode"
for="digi.ecoMode" id="digi.ecoMode"
class="form-label" >
>Eco Mode<small> This will disable WiFi, Display, Leds and lower CPU Speed for Low Power Digipeater. (<strong>Caution:</strong> Active means No WebUI Configuration, so <strong>ONLY</strong> activate this for Remote Digipeater)</small></label <option value="0">
> OFF (Normal Mode)
</div> </option>
<option value="1">
Ultra Eco Mode (Sleep till Packet Rx (WiFiAP/WebUI & Display disabled))
</option>
<option value="2">
OFF (Normal Mode without WiFiAP)
</option>
</select>
</div> </div>
</div> </div>
</div> </div>
@@ -1708,6 +1717,65 @@
</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>
Remote Management
</h5>
<small
>Manage Station via APRS Messages. Leave empty to disable!
</small>
</div>
<div class="col-lg-9 col-sm-12">
<div class="col-12">
<label
for="remoteManagement.managers"
class="form-label"
>Callsign-SSID of Managers, space separated, trailing * wildcard allowed (ex: AB1CDE-9, AB1CDE*)</label
>
<div class="input-group">
<input
type="text"
name="remoteManagement.managers"
id="remoteManagement.managers"
class="form-control"
/>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="form-check form-switch">
<input
type="checkbox"
name="remoteManagement.rfOnly"
id="remoteManagement.rfOnly"
class="form-check-input"
/>
<label
for="remoteManagement.rfOnly"
class="form-label"
>Managers commands only via RF (not APRS-IS)</label
>
</div>
</div>
</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>
@@ -1799,46 +1867,6 @@
> >
</div> </div>
</div> </div>
<div class="col-12">
<div class="form-check form-switch">
<div class="form-text">
WiFi disabled. Sleep mode. Best for solar Digi with SX126X.
</div>
<input
type="checkbox"
name="other.lowPowerMode"
id="other.lowPowerMode"
class="form-check-input"
/>
<label
for="other.lowPowerMode"
class="form-label"
>Low power mode (only for HT-CT62)</label
>
</div>
</div>
<div class="col-12 mt-3">
<label
for="other.lowVoltageCutOff"
class="form-label"
>Low voltage cut off <small>(Deep sleep below specific voltage)</small></label
>
<input
type="text"
name="other.lowVoltageCutOff"
id="other.lowVoltageCutOff"
placeholder="0"
min="0"
step="0.01"
class="form-control"
/>
<span class="input-group-text"
>Volts</span
>
<div class="form-text">
MCU will deep sleep when below provided battery voltage to save power. Set to <strong>0</strong> if you don't want this option. <u>Please calibrate your voltage reading first!</u>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
+4 -3
View File
@@ -138,7 +138,7 @@ function loadSettings(settings) {
document.getElementById("beacon.gpsAmbiguity").checked = settings.beacon.gpsAmbiguity; document.getElementById("beacon.gpsAmbiguity").checked = settings.beacon.gpsAmbiguity;
// Black List // Black List
document.getElementById("blackList").value = settings.blackList; document.getElementById("blacklist").value = settings.blacklist;
// Digi // Digi
document.getElementById("digi.mode").value = settings.digi.mode; document.getElementById("digi.mode").value = settings.digi.mode;
@@ -220,8 +220,9 @@ function loadSettings(settings) {
// Experimental // Experimental
document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode; document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode;
document.getElementById("other.lowPowerMode").checked = settings.other.lowPowerMode; // Management over APRS
document.getElementById("other.lowVoltageCutOff").value = settings.other.lowVoltageCutOff || 0 document.getElementById("remoteManagement.managers").value = settings.remoteManagement.managers;
document.getElementById("remoteManagement.rfOnly").checked = settings.remoteManagement.rfOnly;
updateImage(); updateImage();
refreshSpeedStandard(); refreshSpeedStandard();
Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

+1 -1
View File
@@ -8,10 +8,10 @@ namespace BATTERY_Utils {
void adcCalibration(); void adcCalibration();
void adcCalibrationCheck(); void adcCalibrationCheck();
void setup(); void setup();
float checkInternalVoltage(); float checkInternalVoltage();
float checkExternalVoltage(); float checkExternalVoltage();
void checkIfShouldSleep(); // ????
void startupBatteryHealth(); void startupBatteryHealth();
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType); String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType);
+9 -5
View File
@@ -47,7 +47,7 @@ public:
class DIGI { class DIGI {
public: public:
int mode; int mode;
bool ecoMode; int ecoMode; // 0 = Not Active | 1 = Ultra EcoMode | 2 = Not Active (WiFi OFF, Serial ON)
}; };
class LoraModule { class LoraModule {
@@ -122,18 +122,21 @@ public:
float gmtCorrection; float gmtCorrection;
}; };
class REMOTE_MANAGEMENT {
public:
String managers;
bool rfOnly;
};
class Configuration { class Configuration {
public: public:
String callsign; String callsign;
int rememberStationTime; int rememberStationTime;
bool lowPowerMode;
double lowVoltageCutOff;
bool backupDigiMode; bool backupDigiMode;
bool rebootMode; bool rebootMode;
int rebootModeTime; int rebootModeTime;
String personalNote; String personalNote;
String blackList; String blacklist;
std::vector<WiFi_AP> wifiAPs; std::vector<WiFi_AP> wifiAPs;
WiFi_Auto_AP wifiAutoAP; WiFi_Auto_AP wifiAutoAP;
BEACON beacon; BEACON beacon;
@@ -147,7 +150,8 @@ public:
TNC tnc; TNC tnc;
OTA ota; OTA ota;
WEBADMIN webadmin; WEBADMIN webadmin;
NTP ntp; NTP ntp;
REMOTE_MANAGEMENT remoteManagement;
void init(); void init();
void writeFile(); void writeFile();
+3 -2
View File
@@ -8,11 +8,12 @@ namespace LoRa_Utils {
void setup(); void setup();
void sendNewPacket(const String& newPacket); void sendNewPacket(const String& newPacket);
//String packetSanitization(const String& packet); String receivePacketFromSleep();
String receivePacket(); String receivePacket();
void changeFreqTx(); void changeFreqTx();
void changeFreqRx(); void changeFreqRx();
void startReceive(); void wakeRadio();
//void startReceive();
void sleepRadio(); void sleepRadio();
} }
+14
View File
@@ -0,0 +1,14 @@
#ifndef SLEEP_UTILS_H_
#define SLEEP_UTILS_H_
#include <Arduino.h>
namespace SLEEP_Utils {
void setup();
void checkWakeUpFlag();
void startSleeping();
}
#endif
+4 -2
View File
@@ -18,14 +18,16 @@ struct LastHeardStation {
namespace STATION_Utils { namespace STATION_Utils {
void loadBlackList(); void loadBlacklistAndManagers();
bool checkBlackList(const String& callsign); bool isBlacklisted(const String& callsign);
bool isManager(const String& callsign);
bool checkObjectTime(const String& packet); bool checkObjectTime(const String& packet);
void deleteNotHeard(); void deleteNotHeard();
void updateLastHeard(const String& station); void updateLastHeard(const String& station);
bool wasHeard(const String& station); bool wasHeard(const String& station);
void clean25SegBuffer(); void clean25SegBuffer();
bool check25SegBuffer(const String& station, const String& textMessage); bool check25SegBuffer(const String& station, const String& textMessage);
void processOutputPacketBufferUltraEcoMode();
void processOutputPacketBuffer(); void processOutputPacketBuffer();
void addToOutputPacketBuffer(const String& packet); void addToOutputPacketBuffer(const String& packet);
+1
View File
@@ -6,6 +6,7 @@
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
#ifdef HAS_A7670 #ifdef HAS_A7670
#define TINY_GSM_MODEM_SIM7600 //The AT instruction of A7670 is compatible with SIM7600 #define TINY_GSM_MODEM_SIM7600 //The AT instruction of A7670 is compatible with SIM7600
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb #define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
+93 -121
View File
@@ -26,14 +26,13 @@ ___________________________________________________________________*/
#include <WiFi.h> #include <WiFi.h>
#include <vector> #include <vector>
#include "configuration.h" #include "configuration.h"
#include "battery_utils.h"
#include "aprs_is_utils.h" #include "aprs_is_utils.h"
#include "station_utils.h" #include "station_utils.h"
#include "battery_utils.h" #include "battery_utils.h"
#include "board_pinout.h" #include "board_pinout.h"
#include "syslog_utils.h" #include "syslog_utils.h"
#include "query_utils.h"
#include "power_utils.h" #include "power_utils.h"
#include "sleep_utils.h"
#include "lora_utils.h" #include "lora_utils.h"
#include "wifi_utils.h" #include "wifi_utils.h"
#include "digi_utils.h" #include "digi_utils.h"
@@ -48,7 +47,8 @@ ___________________________________________________________________*/
#include "A7670_utils.h" #include "A7670_utils.h"
#endif #endif
String versionDate = "2025.03.03";
String versionDate = "2025-04-24";
Configuration Config; Configuration Config;
WiFiClient espClient; WiFiClient espClient;
#ifdef HAS_GPS #ifdef HAS_GPS
@@ -78,6 +78,7 @@ std::vector<ReceivedPacket> receivedPackets;
String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine; String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine;
//#define STARTUP_DELAY 5 //min //#define STARTUP_DELAY 5 //min
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
POWER_Utils::setup(); POWER_Utils::setup();
@@ -85,54 +86,14 @@ void setup() {
LoRa_Utils::setup(); LoRa_Utils::setup();
Utils::validateFreqs(); Utils::validateFreqs();
GPS_Utils::setup(); GPS_Utils::setup();
STATION_Utils::loadBlackList(); STATION_Utils::loadBlacklistAndManagers();
#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 SLEEP_Utils::setup();
if (Config.lowPowerMode) {
gpio_wakeup_enable(GPIO_NUM_3, GPIO_INTR_HIGH_LEVEL);
esp_deep_sleep_enable_gpio_wakeup(GPIO_NUM_3, ESP_GPIO_WAKEUP_GPIO_HIGH);
long lastBeacon = 0;
LoRa_Utils::startReceive();
while (true) {
auto wakeup_reason = esp_sleep_get_wakeup_cause();
if (wakeup_reason == 7) { // packet received
Serial.println("Received packet");
String packet = LoRa_Utils::receivePacket();
Serial.println(packet);
if (Config.digi.mode == 2) DIGI_Utils::processLoRaPacket(packet);
if (packet.indexOf(Config.callsign + ":?APRSELP{") != -1) { // Send `?APRSELP` to exit low power
Serial.println("Got ?APRSELP message, exiting from low power mode");
break;
};
}
long time = esp_timer_get_time() / 1000000;
if (lastBeacon == 0 || time - lastBeacon >= Config.beacon.interval * 60) {
Serial.println("Sending beacon");
String comment = Config.beacon.comment;
if (Config.battery.sendInternalVoltage) comment += " Batt=" + String(BATTERY_Utils::checkInternalVoltage(),2) + "V";
if (Config.battery.sendExternalVoltage) comment += " Ext=" + String(BATTERY_Utils::checkExternalVoltage(),2) + "V";
LoRa_Utils::sendNewPacket(GPS_Utils::getiGateLoRaBeaconPacket() + comment);
lastBeacon = time;
}
LoRa_Utils::startReceive();
Serial.println("Sleeping");
long sleep = (Config.beacon.interval * 60) - (time - lastBeacon);
Serial.flush();
esp_sleep_enable_timer_wakeup(sleep * 1000000);
esp_light_sleep_start();
Serial.println("Waked up");
}
Config.loramodule.rxActive = false;
}
#endif
DIGI_Utils::checkEcoMode();
WIFI_Utils::setup(); WIFI_Utils::setup();
NTP_Utils::setup(); NTP_Utils::setup();
SYSLOG_Utils::setup(); SYSLOG_Utils::setup();
@@ -147,95 +108,106 @@ void setup() {
} }
void loop() { void loop() {
WIFI_Utils::checkAutoAPTimeout(); if (Config.digi.ecoMode == 1) {
SLEEP_Utils::checkWakeUpFlag();
Utils::checkBeaconInterval();
STATION_Utils::processOutputPacketBufferUltraEcoMode();
Utils::checkSleepByLowBatteryVoltage(1);
SLEEP_Utils::startSleeping();
} else {
WIFI_Utils::checkAutoAPTimeout();
if (isUpdatingOTA) { if (isUpdatingOTA) {
ElegantOTA.loop(); ElegantOTA.loop();
return; // Don't process IGate and Digi during OTA update return; // Don't process IGate and Digi during OTA update
} }
if (Config.lowVoltageCutOff > 0) { #ifdef HAS_GPS
BATTERY_Utils::checkIfShouldSleep(); if (Config.beacon.gpsActive) {
} if (millis() - gpsSatelliteTime > 5000) {
gpsInfoToggle = !gpsInfoToggle;
#ifdef HAS_GPS gpsSatelliteTime = millis();
if (Config.beacon.gpsActive) { }
if (millis() - gpsSatelliteTime > 5000) { if (gpsInfoToggle) {
gpsInfoToggle = !gpsInfoToggle; thirdLine = "Satellite(s): ";
gpsSatelliteTime = millis(); String gpsData = String(gps.satellites.value());
} if (gpsData.length() < 2) gpsData = "0" + gpsData; // Ensure two-digit formatting
if (gpsInfoToggle) { thirdLine += gpsData;
thirdLine = "Satellite(s): "; } else {
String gpsData = String(gps.satellites.value()); thirdLine = Utils::getLocalIP();
if (gpsData.length() < 2) gpsData = "0" + gpsData; // Ensure two-digit formatting }
thirdLine += gpsData;
} else { } else {
thirdLine = Utils::getLocalIP(); thirdLine = Utils::getLocalIP();
} }
} else { #else
thirdLine = Utils::getLocalIP(); thirdLine = Utils::getLocalIP();
} #endif
#else
thirdLine = Utils::getLocalIP();
#endif
#ifdef HAS_A7670 #ifdef HAS_A7670
if (Config.aprs_is.active && !modemLoggedToAPRSIS) A7670_Utils::APRS_IS_connect(); if (Config.aprs_is.active && !modemLoggedToAPRSIS) A7670_Utils::APRS_IS_connect();
#else #else
WIFI_Utils::checkWiFi(); WIFI_Utils::checkWiFi();
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(); NTP_Utils::update();
TNC_Utils::loop(); TNC_Utils::loop();
Utils::checkDisplayInterval(); Utils::checkDisplayInterval();
Utils::checkBeaconInterval(); Utils::checkBeaconInterval();
APRS_IS_Utils::checkStatus(); // Need that to update display, maybe split this and send APRSIS status to display func? APRS_IS_Utils::checkStatus(); // Need that to update display, maybe split this and send APRSIS status to display func?
String packet = ""; String packet = "";
if (Config.loramodule.rxActive) { if (Config.loramodule.rxActive) {
packet = LoRa_Utils::receivePacket(); // We need to fetch LoRa packet above APRSIS and Digi packet = LoRa_Utils::receivePacket(); // We need to fetch LoRa packet above APRSIS and Digi
}
if (packet != "") {
if (Config.aprs_is.active) { // If APRSIS enabled
APRS_IS_Utils::processLoRaPacket(packet); // Send received packet to APRSIS
} }
if (Config.loramodule.txActive && (Config.digi.mode == 2 || Config.digi.mode == 3 || backUpDigiMode)) { // If Digi enabled if (packet != "") {
STATION_Utils::clean25SegBuffer(); if (Config.aprs_is.active) { // If APRSIS enabled
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi APRS_IS_Utils::processLoRaPacket(packet); // Send received packet to APRSIS
} }
if (Config.tnc.enableServer) { // If TNC server enabled if (Config.loramodule.txActive && (Config.digi.mode == 2 || Config.digi.mode == 3 || backUpDigiMode)) { // If Digi enabled
TNC_Utils::sendToClients(packet); // Send received packet to TNC KISS STATION_Utils::clean25SegBuffer();
} DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
if (Config.tnc.enableSerial) { // If Serial KISS enabled }
TNC_Utils::sendToSerial(packet); // Send received packet to Serial KISS
}
}
if (Config.aprs_is.active) { if (Config.tnc.enableServer) { // If TNC server enabled
APRS_IS_Utils::listenAPRSIS(); // listen received packet from APRSIS TNC_Utils::sendToClients(packet); // Send received packet to TNC KISS
} }
if (Config.tnc.enableSerial) { // If Serial KISS enabled
STATION_Utils::processOutputPacketBuffer(); TNC_Utils::sendToSerial(packet); // Send received packet to Serial KISS
#ifdef HAS_EPAPER // Only consider updating every 10 seconds (when data to show is different from before)
if(lastEpaperTime == 0 || millis() - lastEpaperTime > 10000) {
String posibleEpaperText = firstLine + secondLine + thirdLine + fourthLine + fifthLine + sixthLine + seventhLine;
if (lastEpaperText != posibleEpaperText) {
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
lastEpaperText = posibleEpaperText;
lastEpaperTime = millis();
} }
} }
#else
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
#endif
Utils::checkRebootTime(); if (Config.aprs_is.active) {
Utils::checkSleepByLowBatteryVoltage(1); APRS_IS_Utils::listenAPRSIS(); // listen received packet from APRSIS
} }
STATION_Utils::processOutputPacketBuffer();
#ifdef HAS_EPAPER // Only consider updating every 10 seconds (when data to show is different from before)
if(lastEpaperTime == 0 || millis() - lastEpaperTime > 10000) {
String posibleEpaperText = firstLine + secondLine + thirdLine + fourthLine + fifthLine + sixthLine + seventhLine;
if (lastEpaperText != posibleEpaperText) {
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
lastEpaperText = posibleEpaperText;
lastEpaperTime = millis();
}
}
#else
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
#endif
Utils::checkRebootTime();
Utils::checkSleepByLowBatteryVoltage(1);
}
}
// HWT not sleeping!
// ESP32C3 :
// - HT-CT62 ??
// - and others?
+16 -2
View File
@@ -2,6 +2,7 @@
#include "configuration.h" #include "configuration.h"
#include "aprs_is_utils.h" #include "aprs_is_utils.h"
#include "station_utils.h" #include "station_utils.h"
#include "board_pinout.h"
#include "syslog_utils.h" #include "syslog_utils.h"
#include "query_utils.h" #include "query_utils.h"
#include "A7670_utils.h" #include "A7670_utils.h"
@@ -9,6 +10,7 @@
#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 uint32_t lastScreenOn; extern uint32_t lastScreenOn;
@@ -58,7 +60,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 2.0 filter "; aprsAuth += " vers CA2RXU_iGate 2.3 filter ";
aprsAuth += Config.aprs_is.filter; aprsAuth += Config.aprs_is.filter;
upload(aprsAuth); upload(aprsAuth);
} }
@@ -69,7 +71,7 @@ namespace APRS_IS_Utils {
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
wifiState = "OK"; wifiState = "OK";
} else { } else {
if (backUpDigiMode || Config.digi.ecoMode) { if (backUpDigiMode || Config.digi.ecoMode == 1 || Config.digi.ecoMode == 2) {
wifiState = "--"; wifiState = "--";
} else { } else {
wifiState = "AP"; wifiState = "AP";
@@ -297,6 +299,7 @@ namespace APRS_IS_Utils {
} }
if (receivedMessage.indexOf("?") == 0) { if (receivedMessage.indexOf("?") == 0) {
Utils::println("Rx Query (APRS-IS) : " + packet); Utils::println("Rx Query (APRS-IS) : " + packet);
Sender.trim();
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) {
@@ -368,6 +371,17 @@ namespace APRS_IS_Utils {
listenAPRSIS(); listenAPRSIS();
} }
} }
if (Config.digi.ecoMode == 1) {
displayToggle(false);
#ifdef VEXT_CTRL
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3)
digitalWrite(VEXT_CTRL, LOW);
#endif
#if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2)
digitalWrite(VEXT_CTRL, HIGH);
#endif
#endif
}
} }
} }
+1 -9
View File
@@ -5,6 +5,7 @@
#include "power_utils.h" #include "power_utils.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; extern Configuration Config;
extern uint32_t lastBatteryCheck; extern uint32_t lastBatteryCheck;
@@ -197,15 +198,6 @@ namespace BATTERY_Utils {
// return mapVoltage(voltage, 5.05, 6.32, 4.5, 5.5); // mapped voltage // return mapVoltage(voltage, 5.05, 6.32, 4.5, 5.5); // mapped voltage
} }
void checkIfShouldSleep() {
if (lastBatteryCheck == 0 || millis() - lastBatteryCheck >= 15 * 60 * 1000) {
lastBatteryCheck = millis();
if (checkInternalVoltage() < Config.lowVoltageCutOff) {
ESP.deepSleep(1800000000); // 30 min sleep (60s = 60e6)
}
}
}
void startupBatteryHealth() { void startupBatteryHealth() {
#ifdef BATTERY_PIN #ifdef BATTERY_PIN
if (Config.battery.monitorInternalVoltage && checkInternalVoltage() < Config.battery.internalSleepVoltage + 0.1) { if (Config.battery.monitorInternalVoltage && checkInternalVoltage() < Config.battery.internalSleepVoltage + 0.1) {
+20 -15
View File
@@ -4,8 +4,11 @@
#include "display.h" #include "display.h"
bool shouldSleepStop = true;
void Configuration::writeFile() { void Configuration::writeFile() {
Serial.println("Saving config.."); Serial.println("Saving config...");
StaticJsonDocument<2560> data; StaticJsonDocument<2560> data;
File configFile = SPIFFS.open("/igate_conf.json", "w"); File configFile = SPIFFS.open("/igate_conf.json", "w");
@@ -94,12 +97,9 @@ void Configuration::writeFile() {
data["other"]["backupDigiMode"] = backupDigiMode; data["other"]["backupDigiMode"] = backupDigiMode;
data["other"]["lowPowerMode"] = lowPowerMode;
data["other"]["lowVoltageCutOff"] = lowVoltageCutOff;
data["personalNote"] = personalNote; data["personalNote"] = personalNote;
data["blackList"] = blackList; data["blacklist"] = blacklist;
data["webadmin"]["active"] = webadmin.active; data["webadmin"]["active"] = webadmin.active;
data["webadmin"]["username"] = webadmin.username; data["webadmin"]["username"] = webadmin.username;
@@ -107,11 +107,15 @@ void Configuration::writeFile() {
data["ntp"]["gmtCorrection"] = ntp.gmtCorrection; data["ntp"]["gmtCorrection"] = ntp.gmtCorrection;
data["remoteManagement"]["managers"] = remoteManagement.managers;
data["remoteManagement"]["rfOnly"] = remoteManagement.rfOnly;
serializeJson(data, configFile); serializeJson(data, configFile);
configFile.close(); configFile.close();
Serial.println("Config saved"); Serial.println("Config saved");
delay(200);
} }
bool Configuration::readFile() { bool Configuration::readFile() {
@@ -164,7 +168,8 @@ bool Configuration::readFile() {
aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false; aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false;
digi.mode = data["digi"]["mode"] | 0; digi.mode = data["digi"]["mode"] | 0;
digi.ecoMode = data["digi"]["ecoMode"] | false; digi.ecoMode = data["digi"]["ecoMode"] | 0;
if (digi.ecoMode == 1) shouldSleepStop = false;
loramodule.txFreq = data["lora"]["txFreq"] | 433775000; loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000; loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000;
@@ -213,9 +218,6 @@ bool Configuration::readFile() {
ntp.gmtCorrection = data["ntp"]["gmtCorrection"] | 0.0; ntp.gmtCorrection = data["ntp"]["gmtCorrection"] | 0.0;
lowPowerMode = data["other"]["lowPowerMode"] | false;
lowVoltageCutOff = data["other"]["lowVoltageCutOff"] | 0;
backupDigiMode = data["other"]["backupDigiMode"] | false; backupDigiMode = data["other"]["backupDigiMode"] | false;
rebootMode = data["other"]["rebootMode"] | false; rebootMode = data["other"]["rebootMode"] | false;
@@ -223,7 +225,10 @@ bool Configuration::readFile() {
personalNote = data["personalNote"] | "personal note here"; personalNote = data["personalNote"] | "personal note here";
blackList = data["blackList"] | "station callsign"; blacklist = data["blacklist"] | "station callsign";
remoteManagement.managers = data["remoteManagement"]["managers"] | "";
remoteManagement.rfOnly = data["remoteManagement"]["rfOnly"] | true;
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;
@@ -268,7 +273,7 @@ void Configuration::init() {
beacon.gpsAmbiguity = false; beacon.gpsAmbiguity = false;
digi.mode = 0; digi.mode = 0;
digi.ecoMode = false; digi.ecoMode = 0;
tnc.enableServer = false; tnc.enableServer = false;
tnc.enableSerial = false; tnc.enableSerial = false;
@@ -321,9 +326,6 @@ void Configuration::init() {
battery.sendVoltageAsTelemetry = false; battery.sendVoltageAsTelemetry = false;
lowPowerMode = false;
lowVoltageCutOff = 0;
backupDigiMode = false; backupDigiMode = false;
rebootMode = false; rebootMode = false;
@@ -331,7 +333,7 @@ void Configuration::init() {
personalNote = ""; personalNote = "";
blackList = ""; blacklist = "";
webadmin.active = false; webadmin.active = false;
webadmin.username = "admin"; webadmin.username = "admin";
@@ -339,6 +341,9 @@ void Configuration::init() {
ntp.gmtCorrection = 0.0; ntp.gmtCorrection = 0.0;
remoteManagement.managers = "";
remoteManagement.rfOnly = true;
Serial.println("All is Written!"); Serial.println("All is Written!");
} }
+4 -16
View File
@@ -2,7 +2,6 @@
#include "configuration.h" #include "configuration.h"
#include "station_utils.h" #include "station_utils.h"
#include "aprs_is_utils.h" #include "aprs_is_utils.h"
#include "query_utils.h"
#include "digi_utils.h" #include "digi_utils.h"
#include "wifi_utils.h" #include "wifi_utils.h"
#include "lora_utils.h" #include "lora_utils.h"
@@ -10,6 +9,7 @@
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; extern Configuration Config;
extern uint32_t lastScreenOn; extern uint32_t lastScreenOn;
extern String iGateBeaconPacket; extern String iGateBeaconPacket;
@@ -133,7 +133,7 @@ namespace DIGI_Utils {
if (!thirdPartyPacket && !Utils::checkValidCallsign(Sender)) { if (!thirdPartyPacket && !Utils::checkValidCallsign(Sender)) {
return; return;
} }
if (STATION_Utils::check25SegBuffer(Sender, temp.substring(temp.indexOf(":") + 2)) || Config.lowPowerMode) { if (STATION_Utils::check25SegBuffer(Sender, temp.substring(temp.indexOf(":") + 2))) {
STATION_Utils::updateLastHeard(Sender); STATION_Utils::updateLastHeard(Sender);
Utils::typeOfPacket(temp, 2); // Digi Utils::typeOfPacket(temp, 2); // Digi
bool queryMessage = false; bool queryMessage = false;
@@ -148,12 +148,8 @@ namespace DIGI_Utils {
if (!queryMessage) { if (!queryMessage) {
String loraPacket = generateDigipeatedPacket(packet.substring(3), thirdPartyPacket); String loraPacket = generateDigipeatedPacket(packet.substring(3), thirdPartyPacket);
if (loraPacket != "") { if (loraPacket != "") {
if (Config.lowPowerMode) { STATION_Utils::addToOutputPacketBuffer(loraPacket);
LoRa_Utils::sendNewPacket(loraPacket); if (Config.digi.ecoMode != 1) displayToggle(true);
} else {
STATION_Utils::addToOutputPacketBuffer(loraPacket);
}
displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
} }
} }
@@ -162,12 +158,4 @@ namespace DIGI_Utils {
} }
} }
void checkEcoMode() {
if (Config.digi.ecoMode) {
Config.display.alwaysOn = false;
Config.display.timeout = 0;
setCpuFrequencyMhz(10);
}
}
} }
+71 -56
View File
@@ -110,22 +110,30 @@ namespace GPS_Utils {
} }
String decodeEncodedGPS(const String& packet) { String decodeEncodedGPS(const String& packet) {
const String& GPSPacket = packet.substring(packet.indexOf(":!")+3); int indexOfExclamation = packet.indexOf(":!");
const String& encodedLatitude = GPSPacket.substring(0,4); int indexOfEqual = packet.indexOf(":=");
const String& encodedLongtitude = GPSPacket.substring(4,8);
const String& comment = GPSPacket.substring(12);
int Y1 = int(encodedLatitude[0]); const uint8_t OFFSET = 3; // Offset for encoded data in the packet
int Y2 = int(encodedLatitude[1]); String GPSPacket;
int Y3 = int(encodedLatitude[2]); if (indexOfExclamation > 10) {
int Y4 = int(encodedLatitude[3]); GPSPacket = packet.substring(indexOfExclamation + OFFSET);
float decodedLatitude = 90.0 - ((((Y1-33) * pow(91,3)) + ((Y2-33) * pow(91,2)) + ((Y3-33) * 91) + Y4-33) / 380926.0); } else if (indexOfEqual > 10) {
GPSPacket = packet.substring(indexOfEqual + OFFSET);
int X1 = int(encodedLongtitude[0]); }
int X2 = int(encodedLongtitude[1]);
int X3 = int(encodedLongtitude[2]); String encodedLatitude = GPSPacket.substring(0,4);
int X4 = int(encodedLongtitude[3]); int Y1 = encodedLatitude[0] - 33;
float decodedLongitude = -180.0 + ((((X1-33) * pow(91,3)) + ((X2-33) * pow(91,2)) + ((X3-33) * 91) + X4-33) / 190463.0); int Y2 = encodedLatitude[1] - 33;
int Y3 = encodedLatitude[2] - 33;
int Y4 = encodedLatitude[3] - 33;
float decodedLatitude = 90.0 - (((Y1 * pow(91,3)) + (Y2 * pow(91,2)) + (Y3 * 91) + Y4) / 380926.0);
String encodedLongitude = GPSPacket.substring(4,8);
int X1 = encodedLongitude[0] - 33;
int X2 = encodedLongitude[1] - 33;
int X3 = encodedLongitude[2] - 33;
int X4 = encodedLongitude[3] - 33;
float decodedLongitude = -180.0 + (((X1 * pow(91,3)) + (X2 * pow(91,2)) + (X3 * 91) + X4) / 190463.0);
distance = String(calculateDistanceTo(decodedLatitude, decodedLongitude),1); distance = String(calculateDistanceTo(decodedLatitude, decodedLongitude),1);
@@ -136,6 +144,7 @@ namespace GPS_Utils {
decodedGPS += distance; decodedGPS += distance;
decodedGPS += "km"; decodedGPS += "km";
String comment = GPSPacket.substring(12);
if (comment != "") { if (comment != "") {
decodedGPS += " / "; decodedGPS += " / ";
decodedGPS += comment; decodedGPS += comment;
@@ -144,33 +153,30 @@ namespace GPS_Utils {
} }
String getReceivedGPS(const String& packet) { String getReceivedGPS(const String& packet) {
String infoGPS; int indexOfExclamation = packet.indexOf(":!");
if (packet.indexOf(":!") > 10) { int indexOfEqual = packet.indexOf(":=");
infoGPS = packet.substring(packet.indexOf(":!") + 2); int indexOfAt = packet.indexOf(":@");
} else if (packet.indexOf(":=") > 10) {
infoGPS = packet.substring(packet.indexOf(":=") + 2);
}
const String& Latitude = infoGPS.substring(0,8);
const String& Longitude = infoGPS.substring(9,18);
const String& comment = infoGPS.substring(19);
float convertedLatitude, convertedLongitude;
const String& firstLatPart = Latitude.substring(0,2);
const String& secondLatPart = Latitude.substring(2,4);
const String& thirdLatPart = Latitude.substring(Latitude.indexOf(".") + 1, Latitude.indexOf(".") + 3);
convertedLatitude = firstLatPart.toFloat() + (secondLatPart.toFloat()/60) + (thirdLatPart.toFloat()/(60*100));
const String& firstLngPart = Longitude.substring(0,3); String infoGPS;
const String& secondLngPart = Longitude.substring(3,5); if (indexOfExclamation > 10) {
const String& thirdLngPart = Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3); infoGPS = packet.substring(indexOfExclamation + 2);
convertedLongitude = firstLngPart.toFloat() + (secondLngPart.toFloat()/60) + (thirdLngPart.toFloat()/(60*100)); } else if (indexOfEqual > 10) {
infoGPS = packet.substring(indexOfEqual + 2);
if (String(Latitude[7]) == "S") { } else if (indexOfAt > 10) {
convertedLatitude = -convertedLatitude; infoGPS = packet.substring(indexOfAt + 9); // 9 = 2+7 (when 7 is timestamp characters)
}
if (String(Longitude[8]) == "W") {
convertedLongitude = -convertedLongitude;
} }
String Latitude = infoGPS.substring(0,8); // First 8 characters are Latitude
float convertedLatitude = Latitude.substring(0,2).toFloat(); // First 2 digits (Degrees)
convertedLatitude += Latitude.substring(2,4).toFloat() / 60; // Next 2 digits (Minutes)
convertedLatitude += Latitude.substring(Latitude.indexOf(".") + 1, Latitude.indexOf(".") + 3).toFloat() / (60*100);
if (Latitude.endsWith("S")) convertedLatitude = -convertedLatitude; // Handle Southern Hemisphere
String Longitude = infoGPS.substring(9,18); // Next 9 characters are Longitude
float convertedLongitude = Longitude.substring(0,3).toFloat(); // First 3 digits (Degrees)
convertedLongitude += Longitude.substring(3,5).toFloat() / 60; // Next 2 digits (Minutes)
convertedLongitude += Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3).toFloat() / (60*100);
if (Longitude.endsWith("W")) convertedLongitude = -convertedLongitude; // Handle Western Hemisphere
distance = String(calculateDistanceTo(convertedLatitude, convertedLongitude),1); distance = String(calculateDistanceTo(convertedLatitude, convertedLongitude),1);
@@ -181,6 +187,7 @@ namespace GPS_Utils {
decodedGPS += distance; decodedGPS += distance;
decodedGPS += "km"; decodedGPS += "km";
String comment = infoGPS.substring(19);
if (comment != "") { if (comment != "") {
decodedGPS += " / "; decodedGPS += " / ";
decodedGPS += comment; decodedGPS += comment;
@@ -189,28 +196,36 @@ namespace GPS_Utils {
} }
String getDistanceAndComment(const String& packet) { String getDistanceAndComment(const String& packet) {
uint8_t encodedBytePosition = 0; int indexOfAt = packet.indexOf(":@");
if (packet.indexOf(":!") > 10) { if (indexOfAt > 10) {
encodedBytePosition = packet.indexOf(":!") + 14; return getReceivedGPS(packet);
}
if (packet.indexOf(":=") > 10) {
encodedBytePosition = packet.indexOf(":=") + 14;
}
if (encodedBytePosition != 0) {
char currentChar = packet[encodedBytePosition];
if (currentChar == 'G' || currentChar == 'Q' || currentChar == '[' || currentChar == 'H' || currentChar == 'X') {
return decodeEncodedGPS(packet);
} else {
return getReceivedGPS(packet);
}
} else { } else {
return " _ / _ / _ "; const uint8_t ENCODED_BYTE_OFFSET = 14; // Offset for encoded data in the packet
int indexOfExclamation = packet.indexOf(":!");
int indexOfEqual = packet.indexOf(":=");
uint8_t encodedBytePosition = 0;
if (indexOfExclamation > 10) { // Determine the position where encoded data starts
encodedBytePosition = indexOfExclamation + ENCODED_BYTE_OFFSET;
} else if (indexOfEqual > 10) {
encodedBytePosition = indexOfEqual + ENCODED_BYTE_OFFSET;
}
if (encodedBytePosition != 0) {
char currentChar = packet[encodedBytePosition];
if (currentChar == 'G' || currentChar == 'Q' || currentChar == '[' || currentChar == 'H' || currentChar == 'X') {
return decodeEncodedGPS(packet); // If valid encoded data position is found, decode it
} else {
return getReceivedGPS(packet);
}
} else {
return " _ / _ / _ ";
}
} }
} }
void setup() { void setup() {
#ifdef HAS_GPS #ifdef HAS_GPS
if (Config.beacon.gpsActive) { if (Config.beacon.gpsActive && Config.digi.ecoMode != 1) {
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_TX, GPS_RX); gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_TX, GPS_RX);
} }
#endif #endif
+1
View File
@@ -1,6 +1,7 @@
#include <Arduino.h> #include <Arduino.h>
#include "kiss_protocol.h" #include "kiss_protocol.h"
bool validateTNC2Frame(const String& tnc2FormattedFrame) { bool validateTNC2Frame(const String& tnc2FormattedFrame) {
return (tnc2FormattedFrame.indexOf(':') != -1) && (tnc2FormattedFrame.indexOf('>') != -1); return (tnc2FormattedFrame.indexOf(':') != -1) && (tnc2FormattedFrame.indexOf('>') != -1);
} }
+23 -25
View File
@@ -9,6 +9,7 @@
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; extern Configuration Config;
extern uint32_t lastRxTime; extern uint32_t lastRxTime;
@@ -68,11 +69,11 @@ namespace LoRa_Utils {
while (true); while (true);
} }
#if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68) #if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
if (!Config.lowPowerMode) { //if (!Config.lowPowerMode) {
radio.setDio1Action(setFlag); radio.setDio1Action(setFlag);
} else { /*} else {
radio.setDIOMapping(1, RADIOLIB_SX126X_IRQ_RX_DONE); radio.setDIOMapping(1, RADIOLIB_SX126X_IRQ_RX_DONE);
} }*/
#endif #endif
#if defined(HAS_SX1278) || defined(HAS_SX1276) #if defined(HAS_SX1278) || defined(HAS_SX1276)
radio.setDio0Action(setFlag, RISING); radio.setDio0Action(setFlag, RISING);
@@ -132,7 +133,7 @@ namespace LoRa_Utils {
} }
#ifdef INTERNAL_LED_PIN #ifdef INTERNAL_LED_PIN
if (!Config.digi.ecoMode) digitalWrite(INTERNAL_LED_PIN, HIGH); if (Config.digi.ecoMode != 1) digitalWrite(INTERNAL_LED_PIN, HIGH); // disabled in Ultra Eco Mode
#endif #endif
int state = radio.transmit("\x3c\xff\x01" + newPacket); int state = radio.transmit("\x3c\xff\x01" + newPacket);
transmitFlag = true; transmitFlag = true;
@@ -147,36 +148,29 @@ namespace LoRa_Utils {
Utils::println(String(state)); Utils::println(String(state));
} }
#ifdef INTERNAL_LED_PIN #ifdef INTERNAL_LED_PIN
if (!Config.digi.ecoMode) digitalWrite(INTERNAL_LED_PIN, LOW); if (Config.digi.ecoMode != 1) digitalWrite(INTERNAL_LED_PIN, LOW); // disabled in Ultra Eco Mode
#endif #endif
if (Config.loramodule.txFreq != Config.loramodule.rxFreq) { if (Config.loramodule.txFreq != Config.loramodule.rxFreq) {
changeFreqRx(); changeFreqRx();
} }
} }
/*String packetSanitization(const String& packet) { String receivePacketFromSleep() {
String sanitizedPacket = packet; String packet = "";
if (packet.indexOf("\0") > 0) { int state = radio.readData(packet);
sanitizedPacket.replace("\0", ""); if (state == RADIOLIB_ERR_NONE) {
Utils::println("<--- LoRa Packet Rx : " + packet.substring(3));
} else {
packet = "";
} }
if (packet.indexOf("\r") > 0) { return packet;
sanitizedPacket.replace("\r", "");
}
if (packet.indexOf("\n") > 0) {
sanitizedPacket.replace("\n", "");
}
return sanitizedPacket;
}*/
void startReceive() {
radio.startReceive();
} }
String receivePacket() { String receivePacket() {
String packet = ""; String packet = "";
if (operationDone || Config.lowPowerMode) { if (operationDone) {
operationDone = false; operationDone = false;
if (transmitFlag && !Config.lowPowerMode) { if (transmitFlag) {
radio.startReceive(); radio.startReceive();
transmitFlag = false; transmitFlag = false;
} else { } else {
@@ -185,14 +179,14 @@ namespace LoRa_Utils {
if (packet != "") { if (packet != "") {
String sender = packet.substring(3, packet.indexOf(">")); String sender = packet.substring(3, packet.indexOf(">"));
if (packet.substring(0,3) == "\x3c\xff\x01" && !STATION_Utils::checkBlackList(sender)){ // avoid processing BlackListed stations if (packet.substring(0,3) == "\x3c\xff\x01" && !STATION_Utils::isBlacklisted(sender)){ // avoid processing BlackListed stations
rssi = radio.getRSSI(); rssi = radio.getRSSI();
snr = radio.getSNR(); snr = radio.getSNR();
freqError = radio.getFrequencyError(); freqError = radio.getFrequencyError();
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 && !Config.digi.ecoMode) { if (Config.digi.ecoMode == 0) {
if (receivedPackets.size() >= 10) { if (receivedPackets.size() >= 10) {
receivedPackets.erase(receivedPackets.begin()); receivedPackets.erase(receivedPackets.begin());
} }
@@ -232,6 +226,10 @@ namespace LoRa_Utils {
return packet; return packet;
} }
void wakeRadio() {
radio.startReceive();
}
void sleepRadio() { void sleepRadio() {
radio.sleep(); radio.sleep();
} }
+3 -3
View File
@@ -15,7 +15,7 @@ NTPClient timeClient(ntpUDP, "pool.ntp.org", 0, 15 * 60 * 1000); // Update in
namespace NTP_Utils { namespace NTP_Utils {
void setup() { void setup() {
if (WiFi.status() == WL_CONNECTED && !Config.digi.ecoMode && Config.callsign != "NOCALL-10") { if (WiFi.status() == WL_CONNECTED && Config.digi.ecoMode == 0 && Config.callsign != "NOCALL-10") {
int gmt = Config.ntp.gmtCorrection * 3600; int gmt = Config.ntp.gmtCorrection * 3600;
timeClient.setTimeOffset(gmt); timeClient.setTimeOffset(gmt);
timeClient.begin(); timeClient.begin();
@@ -23,11 +23,11 @@ namespace NTP_Utils {
} }
void update() { void update() {
if (WiFi.status() == WL_CONNECTED && !Config.digi.ecoMode && Config.callsign != "NOCALL-10") timeClient.update(); if (WiFi.status() == WL_CONNECTED && Config.digi.ecoMode == 0 && Config.callsign != "NOCALL-10") timeClient.update();
} }
String getFormatedTime() { String getFormatedTime() {
if (!Config.digi.ecoMode) return timeClient.getFormattedTime(); if (Config.digi.ecoMode == 0) return timeClient.getFormattedTime();
return "DigiEcoMode Active"; return "DigiEcoMode Active";
} }
+1
View File
@@ -5,6 +5,7 @@
#include "ota_utils.h" #include "ota_utils.h"
#include "display.h" #include "display.h"
extern Configuration Config; extern Configuration Config;
extern uint32_t lastScreenOn; extern uint32_t lastScreenOn;
extern bool isUpdatingOTA; extern bool isUpdatingOTA;
+5 -4
View File
@@ -224,7 +224,7 @@ namespace POWER_Utils {
#ifdef VEXT_CTRL #ifdef VEXT_CTRL
pinMode(VEXT_CTRL,OUTPUT); // GPS + TFT on HELTEC Wireless_Tracker and only for Oled in HELTEC V3 pinMode(VEXT_CTRL,OUTPUT); // GPS + TFT on HELTEC Wireless_Tracker and only for Oled in HELTEC V3
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) #if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3)
digitalWrite(VEXT_CTRL, HIGH); digitalWrite(VEXT_CTRL, HIGH);
#endif #endif
#if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2) #if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2)
@@ -233,7 +233,7 @@ namespace POWER_Utils {
#endif #endif
#ifdef HAS_GPS #ifdef HAS_GPS
if (Config.beacon.gpsActive) activateGPS(); if (Config.beacon.gpsActive && Config.digi.ecoMode != 1) activateGPS();
#endif #endif
#ifdef ADC_CTRL #ifdef ADC_CTRL
@@ -250,7 +250,7 @@ namespace POWER_Utils {
#if defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WP) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) #if defined(HELTEC_V3) || defined(HELTEC_V3_2) || 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(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS) #if defined(TTGO_T_DECK_GPS) || defined(TTGO_T_DECK_PLUS)
pinMode(BOARD_POWERON, OUTPUT); pinMode(BOARD_POWERON, OUTPUT);
@@ -266,11 +266,12 @@ namespace POWER_Utils {
delay(500); delay(500);
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL); Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
#endif #endif
delay(1000); delay(1000);
BATTERY_Utils::setup(); BATTERY_Utils::setup();
BATTERY_Utils::startupBatteryHealth(); BATTERY_Utils::startupBatteryHealth();
setCpuFrequencyMhz(80);
} }
} }
+69 -18
View File
@@ -22,9 +22,9 @@ namespace QUERY_Utils {
String queryQuestion = query; String queryQuestion = query;
queryQuestion.toUpperCase(); queryQuestion.toUpperCase();
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 ?APRSSSR ?EM=? ?TX=? "); // ?APRSH ?WHERE callsign
} else if (queryQuestion == "?APRSV") { } else if (queryQuestion == "?APRSV") {
answer.concat("CA2RXU_LoRa_iGate 2.0 v"); answer.concat("CA2RXU_LoRa_iGate 2.3 v");
answer.concat(versionDate); answer.concat(versionDate);
} else if (queryQuestion == "?APRSP") { } else if (queryQuestion == "?APRSP") {
answer.concat("iGate QTH: "); answer.concat("iGate QTH: ");
@@ -46,29 +46,75 @@ namespace QUERY_Utils {
char signalData[35]; char signalData[35];
snprintf(signalData, sizeof(signalData), " %ddBm / %.2fdB / %dHz", rssi, snr, freqError); snprintf(signalData, sizeof(signalData), " %ddBm / %.2fdB / %dHz", rssi, snr, freqError);
answer.concat(signalData); answer.concat(signalData);
} else if (queryQuestion.indexOf("?APRSH") == 0) { } /*else if (queryQuestion.indexOf("?APRSH") == 0) {
// sacar callsign despues de ?APRSH // sacar callsign despues de ?APRSH
Serial.println("escuchaste a X estacion? en las ultimas 24 o 8 horas?"); Serial.println("escuchaste a X estacion? en las ultimas 24 o 8 horas?");
answer.concat("?APRSH on development 73!"); answer.concat("?APRSH on development 73!");
} else if (queryQuestion.indexOf("?WHERE") == 0) { } *//*else if (queryQuestion.indexOf("?WHERE") == 0) {
// 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 && Config.digi.ecoMode == true) { // Exit Digipeater EcoMode } */
answer = "DigiEcoMode:Stop"; else if (STATION_Utils::isManager(station) && (!queryFromAPRSIS || !Config.remoteManagement.rfOnly)) {
Config.digi.ecoMode = false; if (queryQuestion.indexOf("?EM=OFF") == 0) {
Config.display.alwaysOn = true; if ((Config.digi.mode == 2 || Config.digi.mode == 3) && Config.loramodule.txActive && Config.loramodule.rxActive && !Config.aprs_is.active) {
Config.display.timeout = 10; if (Config.digi.ecoMode == 1) { // Exit Digipeater EcoMode
shouldSleepLowVoltage = true; // to make sure all packets in outputPacketBuffer are sended before restart. answer = "DigiEcoMode:OFF";
saveNewDigiEcoModeConfig = true; Config.digi.ecoMode = 0;
} else if (queryQuestion.indexOf("?APRSSEM") == 0 && Config.digi.ecoMode == false) { // Start Digipeater EcoMode Config.display.alwaysOn = true;
answer = "DigiEcoMode:Start"; Config.display.timeout = 10;
Config.digi.ecoMode = true; shouldSleepLowVoltage = true; // to make sure all packets in outputPacketBuffer are sended before restart.
shouldSleepLowVoltage = true; // to make sure all packets in outputPacketBuffer are sended before restart. saveNewDigiEcoModeConfig = true;
saveNewDigiEcoModeConfig = true; } else {
} else if (queryQuestion.indexOf("?APRSEMS") == 0) { // Digipeater EcoMode Status answer = "DigiEcoMode was OFF";
answer = (Config.digi.ecoMode) ? "DigiEcoMode:ON" : "DigiEcoMode:OFF"; }
} else {
answer = "DigiEcoMode control not possible";
}
} else if (queryQuestion.indexOf("?EM=ON") == 0) {
if ((Config.digi.mode == 2 || Config.digi.mode == 3) && Config.loramodule.txActive && Config.loramodule.rxActive && !Config.aprs_is.active) {
if (Config.digi.ecoMode == 0) { // Start Digipeater EcoMode
answer = "DigiEcoMode:ON";
Config.digi.ecoMode = 1;
shouldSleepLowVoltage = true; // to make sure all packets in outputPacketBuffer are sended before restart.
saveNewDigiEcoModeConfig = true;
} else {
answer = "DigiEcoMode was ON";
}
} else {
answer = "DigiEcoMode control not possible";
}
} else if (queryQuestion.indexOf("?EM=?") == 0) { // Digipeater EcoMode Status
if (Config.digi.ecoMode == 0) {
answer = "DigiEcoMode:OFF";
} else if (Config.digi.ecoMode == 1) {
answer = "DigiEcoMode:ON";
} else {
answer = "DigiEcoMode:OFF/Only Serial Output";
}
} else if (queryQuestion.indexOf("?TX=ON") == 0) {
if (Config.loramodule.txActive) {
answer = "TX was ON";
} else {
Config.loramodule.txActive = true;
answer = "TX=ON";
}
} else if (queryQuestion.indexOf("?TX=OFF") == 0) {
if (!Config.loramodule.txActive) {
answer = "TX was OFF";
} else {
Config.loramodule.txActive = false;
answer = "TX=OFF";
}
} else if (queryQuestion.indexOf("?TX=?") == 0) {
answer = (Config.loramodule.txActive) ? "TX=ON" : "TX=OFF";
} else if (queryQuestion.indexOf("?COMMIT") == 0) { // saving for next reboot
answer = "New Config Saved";
Config.writeFile();
}
} }
if (answer == "") return "";
String queryAnswer = Config.callsign; String queryAnswer = Config.callsign;
queryAnswer += ">APLRG1"; queryAnswer += ">APLRG1";
@@ -90,6 +136,11 @@ namespace QUERY_Utils {
queryAnswer += processedStation; queryAnswer += processedStation;
queryAnswer += ":"; queryAnswer += ":";
queryAnswer += answer; queryAnswer += answer;
queryAnswer += " *";
queryAnswer += char(random(97, 123));
queryAnswer += char(random(97, 123));
queryAnswer += "*";
return queryAnswer; return queryAnswer;
} }
+63
View File
@@ -0,0 +1,63 @@
#include "configuration.h"
#include "board_pinout.h"
#include "sleep_utils.h"
#include "digi_utils.h"
#include "lora_utils.h"
extern Configuration Config;
extern bool shouldSleepStop;
extern uint32_t lastBeaconTx;
bool wakeUpFlag = false;
namespace SLEEP_Utils {
void wakeUpLoRaPacketReceived() {
wakeUpFlag = true;
}
void checkWakeUpFlag() {
if (wakeUpFlag) {
String packet = LoRa_Utils::receivePacketFromSleep();
if (packet != "") {
DIGI_Utils::processLoRaPacket(packet);
}
wakeUpFlag = false;
}
}
void setup() {
if (Config.digi.ecoMode == 1) {
pinMode(RADIO_WAKEUP_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(RADIO_WAKEUP_PIN), wakeUpLoRaPacketReceived, RISING);
LoRa_Utils::wakeRadio();
#if defined(TTGO_LORA32_V2_1) || defined(TTGO_LORA32_V2_1_915) || defined(TTGO_LORA32_T3S3_V1_2) || 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) || defined(TTGO_T_BEAM_V1_2_915) || defined(TTGO_T_BEAM_V1_2_SX1262) || defined(TTGO_T_DECK_PLUS) || defined(TTGO_T_DECK_GPS) || defined(TTGO_T_Beam_S3_SUPREME_V3) || defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V2) || defined(XIAO_ESP32S3_LORA) || defined(LIGHTGATEWAY_1_0) || defined(TROY_LoRa_APRS) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_LoRa_915) || defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_LLCC68) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2) || defined(WEMOS_S2_MINI_DIY_LoRa) || defined(WEMOS_D1_R32_RA02) || defined(WEMOS_LOLIN32_OLED_DIY_LoRa)
esp_sleep_enable_ext1_wakeup(GPIO_WAKEUP_PIN, ESP_EXT1_WAKEUP_ANY_HIGH);
#endif
#if defined(HELTEC_HTCT62) || defined(ESP32C3_DIY_1W_LoRa) || defined(ESP32C3_DIY_1W_LoRa_915) || defined(ESP32_C3_OctopusLab_LoRa)
esp_deep_sleep_enable_gpio_wakeup(1ULL << GPIO_WAKEUP_PIN, ESP_GPIO_WAKEUP_GPIO_HIGH);
#endif
}
}
uint32_t getSecondsToSleep() {
uint32_t elapsedTime = (millis() - lastBeaconTx) / 1000; // in secs
uint32_t intervalTime = Config.beacon.interval * 60; // in secs
return (elapsedTime < intervalTime) ? (intervalTime - elapsedTime) : 0;
}
void startSleeping() {
if (!shouldSleepStop) {
uint32_t timeToSleep = getSecondsToSleep();
esp_sleep_enable_timer_wakeup(timeToSleep * 1000000); // 1 min = 60sec
Serial.print("(Sleeping : "); Serial.print(timeToSleep); Serial.println("seconds)");
delay(100);
LoRa_Utils::wakeRadio();
esp_light_sleep_start();
}
}
}
+55 -18
View File
@@ -7,6 +7,7 @@
#include "utils.h" #include "utils.h"
#include <vector> #include <vector>
extern Configuration Config; extern Configuration Config;
extern uint32_t lastRxTime; extern uint32_t lastRxTime;
extern String fourthLine; extern String fourthLine;
@@ -16,7 +17,8 @@ uint32_t lastTxTime = millis();
std::vector<LastHeardStation> lastHeardStations; std::vector<LastHeardStation> lastHeardStations;
std::vector<String> outputPacketBuffer; std::vector<String> outputPacketBuffer;
std::vector<Packet25SegBuffer> packet25SegBuffer; std::vector<Packet25SegBuffer> packet25SegBuffer;
std::vector<String> blackList; std::vector<String> blacklist;
std::vector<String> managers;
std::vector<LastHeardStation> lastHeardObjects; std::vector<LastHeardStation> lastHeardObjects;
bool saveNewDigiEcoModeConfig = false; bool saveNewDigiEcoModeConfig = false;
@@ -24,31 +26,49 @@ bool saveNewDigiEcoModeConfig = false;
namespace STATION_Utils { namespace STATION_Utils {
void loadBlackList() { std::vector<String> loadCallSignList(const String& list) {
if (Config.blackList != "") { std::vector<String> loadedList;
String callsigns = Config.blackList;
int spaceIndex = callsigns.indexOf(" ");
while (spaceIndex >= 0) { String callsigns = list;
blackList.push_back(callsigns.substring(0, spaceIndex)); callsigns.trim();
callsigns = callsigns.substring(spaceIndex + 1);
spaceIndex = callsigns.indexOf(" "); while (callsigns.length() > 0) { // != ""
int spaceIndex = callsigns.indexOf(" ");
if (spaceIndex == -1) { // No more spaces, add the last part
loadedList.push_back(callsigns);
break;
} }
callsigns.trim(); loadedList.push_back(callsigns.substring(0, spaceIndex));
if (callsigns.length() > 0) blackList.push_back(callsigns); // Add the last word if available callsigns = callsigns.substring(spaceIndex + 1);
callsigns.trim(); // Trim in case of multiple spaces
} }
return loadedList;
} }
bool checkBlackList(const String& callsign) { void loadBlacklistAndManagers() {
for (int i = 0; i < blackList.size(); i++) { blacklist = loadCallSignList(Config.blacklist);
if (blackList[i].indexOf("*") >= 0) { // use wild card managers = loadCallSignList(Config.remoteManagement.managers);
String wildCard = blackList[i].substring(0, blackList[i].indexOf("*")); }
if (callsign.startsWith(wildCard))return true;
bool checkCallsignList(const std::vector<String>& list, const String& callsign) {
for (int i = 0; i < list.size(); i++) {
int wildcardIndex = list[i].indexOf("*");
if (wildcardIndex >= 0) {
String wildcard = list[i].substring(0, wildcardIndex);
if (callsign.startsWith(wildcard)) return true;
} else { } else {
if (blackList[i] == callsign) return true; if (list[i] == callsign) return true;
} }
} }
return false; return false;
}
bool isBlacklisted(const String& callsign) {
return checkCallsignList(blacklist, callsign);
}
bool isManager(const String& callsign) {
return checkCallsignList(managers, callsign);
} }
void cleanObjectsHeard() { void cleanObjectsHeard() {
@@ -129,6 +149,24 @@ namespace STATION_Utils {
return true; return true;
} }
void processOutputPacketBufferUltraEcoMode() {
size_t currentIndex = 0;
while (currentIndex < outputPacketBuffer.size()) { // this sends all packets from output buffer
delay(3000); // and cleans buffer to avoid sending packets with time offset
LoRa_Utils::sendNewPacket(outputPacketBuffer[currentIndex]); // next time it wakes up
currentIndex++;
}
outputPacketBuffer.clear();
//
if (saveNewDigiEcoModeConfig) {
Config.writeFile();
delay(1000);
displayToggle(false);
ESP.restart();
}
//
}
void processOutputPacketBuffer() { void processOutputPacketBuffer() {
int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ??? int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ???
uint32_t lastRx = millis() - lastRxTime; uint32_t lastRx = millis() - lastRxTime;
@@ -146,7 +184,6 @@ namespace STATION_Utils {
} }
} }
if (saveNewDigiEcoModeConfig) { if (saveNewDigiEcoModeConfig) {
setCpuFrequencyMhz(80);
Config.writeFile(); Config.writeFile();
delay(1000); delay(1000);
displayToggle(false); displayToggle(false);
+6 -4
View File
@@ -4,6 +4,7 @@
#include "syslog_utils.h" #include "syslog_utils.h"
#include "gps_utils.h" #include "gps_utils.h"
extern Configuration Config; extern Configuration Config;
WiFiUDP udpClient; WiFiUDP udpClient;
@@ -37,15 +38,16 @@ namespace SYSLOG_Utils {
syslogPacket.concat(sender); syslogPacket.concat(sender);
syslogPacket.concat(" ---> "); syslogPacket.concat(" ---> ");
syslogPacket.concat(packet.substring(colonIndex + 2)); syslogPacket.concat(packet.substring(colonIndex + 2));
} else if (nextChar == '!' || nextChar == '=') { } else if (nextChar == '!' || nextChar == '=' || nextChar == '@') {
syslogPacket.concat("GPS / "); syslogPacket.concat("GPS / ");
syslogPacket.concat(sender); syslogPacket.concat(sender);
syslogPacket.concat(" / "); syslogPacket.concat(" / ");
int greaterThanIndex = packet.indexOf(">");
if (packet.indexOf("WIDE1-1") > 10) { if (packet.indexOf("WIDE1-1") > 10) {
syslogPacket.concat(packet.substring(packet.indexOf(">") + 1, packet.indexOf(","))); syslogPacket.concat(packet.substring(greaterThanIndex + 1, packet.indexOf(",")));
syslogPacket.concat(" / WIDE1-1"); syslogPacket.concat(" / WIDE1-1");
} else { } else {
syslogPacket.concat(packet.substring(packet.indexOf(">") + 1, colonIndex)); syslogPacket.concat(packet.substring(greaterThanIndex + 1, colonIndex));
syslogPacket.concat(" / -"); syslogPacket.concat(" / -");
} }
} else if (nextChar == '>') { } else if (nextChar == '>') {
@@ -72,7 +74,7 @@ namespace SYSLOG_Utils {
syslogPacket.concat(packet); syslogPacket.concat(packet);
} }
syslogPacket.concat(signalData); syslogPacket.concat(signalData);
if (nextChar == '!' || nextChar == '=') { if (nextChar == '!' || nextChar == '=' || nextChar == '@') {
syslogPacket.concat(" / "); syslogPacket.concat(" / ");
syslogPacket.concat(GPS_Utils::getDistanceAndComment(packet)); syslogPacket.concat(GPS_Utils::getDistanceAndComment(packet));
} }
+3 -2
View File
@@ -5,6 +5,7 @@
#include "station_utils.h" #include "station_utils.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; extern Configuration Config;
#define MAX_CLIENTS 4 #define MAX_CLIENTS 4
@@ -23,7 +24,7 @@ String inputSerialBuffer = "";
namespace TNC_Utils { namespace TNC_Utils {
void setup() { void setup() {
if (Config.tnc.enableServer && !Config.digi.ecoMode) { if (Config.tnc.enableServer && Config.digi.ecoMode == 0) {
tncServer.stop(); tncServer.stop();
tncServer.begin(); tncServer.begin();
} }
@@ -127,7 +128,7 @@ namespace TNC_Utils {
} }
void loop() { void loop() {
if (!Config.digi.ecoMode) { if (Config.digi.ecoMode == 0) {
if (Config.tnc.enableServer) { if (Config.tnc.enableServer) {
checkNewClients(); checkNewClients();
readFromClients(); readFromClients();
+10 -4
View File
@@ -76,7 +76,7 @@ namespace Utils {
} }
String getLocalIP() { String getLocalIP() {
if (Config.digi.ecoMode) { if (Config.digi.ecoMode == 1 || Config.digi.ecoMode == 2) {
return "** WiFi AP Killed **"; return "** WiFi AP Killed **";
} else if (!WiFiConnected) { } else if (!WiFiConnected) {
return "IP : 192.168.4.1"; return "IP : 192.168.4.1";
@@ -93,7 +93,14 @@ namespace Utils {
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);
Serial.println((Config.digi.ecoMode) ? "(DigiEcoMode: ON)" : "(DigiEcoMode: OFF)"); Serial.print("(DigiEcoMode: ");
if (Config.digi.ecoMode == 0) {
Serial.println("OFF)");
} else if (Config.digi.ecoMode == 1) {
Serial.println("ON)");
} else {
Serial.println("ON / Only Serial Output)");
}
displayShow(" LoRa APRS", "", "", " ( iGATE & DIGI )", "", "" , " 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);
@@ -200,7 +207,6 @@ namespace Utils {
!Config.wxsensor.active && !Config.wxsensor.active &&
(Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage) && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage) &&
(lastBeaconTx > 0)) { (lastBeaconTx > 0)) {
//(!Config.digi.ecoMode || lastBeaconTx > 0)) {
sendInitialTelemetryPackets(); sendInitialTelemetryPackets();
} }
@@ -211,7 +217,7 @@ namespace Utils {
beaconPacket = iGateBeaconPacket; beaconPacket = iGateBeaconPacket;
secondaryBeaconPacket = iGateLoRaBeaconPacket; secondaryBeaconPacket = iGateLoRaBeaconPacket;
#ifdef HAS_GPS #ifdef HAS_GPS
if (Config.beacon.gpsActive && !Config.digi.ecoMode) { if (Config.beacon.gpsActive && Config.digi.ecoMode == 0) {
GPS_Utils::getData(); GPS_Utils::getData();
if (gps.location.isUpdated() && gps.location.lat() != 0.0 && gps.location.lng() != 0.0) { if (gps.location.isUpdated() && gps.location.lat() != 0.0 && gps.location.lng() != 0.0) {
GPS_Utils::generateBeaconFirstPart(); GPS_Utils::generateBeaconFirstPart();
+8 -5
View File
@@ -5,6 +5,7 @@
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; extern Configuration Config;
extern uint32_t lastBeaconTx; extern uint32_t lastBeaconTx;
extern std::vector<ReceivedPacket> receivedPackets; extern std::vector<ReceivedPacket> receivedPackets;
@@ -140,7 +141,7 @@ namespace WEB_Utils {
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->getParam("digi.ecoMode", true)->value().toInt();;
Config.loramodule.txFreq = request->getParam("lora.txFreq", true)->value().toInt(); Config.loramodule.txFreq = request->getParam("lora.txFreq", true)->value().toInt();
@@ -201,12 +202,10 @@ namespace WEB_Utils {
Config.rememberStationTime = request->getParam("other.rememberStationTime", true)->value().toInt(); Config.rememberStationTime = request->getParam("other.rememberStationTime", true)->value().toInt();
Config.backupDigiMode = request->hasParam("other.backupDigiMode", true); Config.backupDigiMode = request->hasParam("other.backupDigiMode", true);
Config.lowPowerMode = request->hasParam("other.lowPowerMode", true);
Config.lowVoltageCutOff = request->getParam("other.lowVoltageCutOff", true)->value().toDouble();
Config.personalNote = request->getParam("personalNote", true)->value(); Config.personalNote = request->getParam("personalNote", true)->value();
Config.blackList = request->getParam("blackList", true)->value(); Config.blacklist = request->getParam("blacklist", true)->value();
Config.webadmin.active = request->hasParam("webadmin.active", true); Config.webadmin.active = request->hasParam("webadmin.active", true);
if (Config.webadmin.active) { if (Config.webadmin.active) {
@@ -216,12 +215,16 @@ namespace WEB_Utils {
Config.ntp.gmtCorrection = request->getParam("ntp.gmtCorrection", true)->value().toFloat(); Config.ntp.gmtCorrection = request->getParam("ntp.gmtCorrection", true)->value().toFloat();
Config.remoteManagement.managers = request->getParam("remoteManagement.managers", true)->value();
Config.remoteManagement.rfOnly = request->getParam("remoteManagement.rfOnly", true);
Config.writeFile(); Config.writeFile();
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);
displayToggle(false); displayToggle(false);
delay(200);
ESP.restart(); ESP.restart();
} }
@@ -267,7 +270,7 @@ namespace WEB_Utils {
} }
void setup() { void setup() {
if (!Config.digi.ecoMode) { if (Config.digi.ecoMode == 0) {
server.on("/", HTTP_GET, handleHome); server.on("/", HTTP_GET, handleHome);
server.on("/status", HTTP_GET, handleStatus); server.on("/status", HTTP_GET, handleStatus);
server.on("/received-packets.json", HTTP_GET, handleReceivedPackets); server.on("/received-packets.json", HTTP_GET, handleReceivedPackets);
+3 -2
View File
@@ -5,6 +5,7 @@
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; extern Configuration Config;
extern uint8_t myWiFiAPIndex; extern uint8_t myWiFiAPIndex;
@@ -23,7 +24,7 @@ uint32_t lastBackupDigiTime = millis();
namespace WIFI_Utils { namespace WIFI_Utils {
void checkWiFi() { void checkWiFi() {
if (!Config.digi.ecoMode) { if (Config.digi.ecoMode == 0) {
if (backUpDigiMode) { if (backUpDigiMode) {
uint32_t WiFiCheck = millis() - lastBackupDigiTime; uint32_t WiFiCheck = millis() - lastBackupDigiTime;
if (WiFi.status() != WL_CONNECTED && WiFiCheck >= 15 * 60 * 1000) { if (WiFi.status() != WL_CONNECTED && WiFiCheck >= 15 * 60 * 1000) {
@@ -153,7 +154,7 @@ namespace WIFI_Utils {
} }
void setup() { void setup() {
if (!Config.digi.ecoMode) startWiFi(); if (Config.digi.ecoMode == 0) startWiFi();
btStop(); btStop();
} }
-1
View File
@@ -31,7 +31,6 @@ Adafruit_Si7021 sensor = Adafruit_Si7021();
#endif #endif
namespace WX_Utils { namespace WX_Utils {
void getWxModuleAddres() { void getWxModuleAddres() {
@@ -11,6 +11,8 @@
#define RADIO_DIO1_PIN 3 #define RADIO_DIO1_PIN 3
#define RADIO_RST_PIN -1 #define RADIO_RST_PIN -1
#define RADIO_BUSY_PIN 8 #define RADIO_BUSY_PIN 8
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -13,6 +13,8 @@
#define RADIO_BUSY_PIN 14 #define RADIO_BUSY_PIN 14
#define RADIO_RXEN 32 #define RADIO_RXEN 32
#define RADIO_TXEN 25 #define RADIO_TXEN 25
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_12
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -13,6 +13,8 @@
#define RADIO_BUSY_PIN 14 #define RADIO_BUSY_PIN 14
#define RADIO_RXEN 32 #define RADIO_RXEN 32
#define RADIO_TXEN 25 #define RADIO_TXEN 25
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_12
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -13,6 +13,8 @@
#define RADIO_BUSY_PIN 14 #define RADIO_BUSY_PIN 14
#define RADIO_RXEN 32 #define RADIO_RXEN 32
#define RADIO_TXEN 25 #define RADIO_TXEN 25
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_12
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -13,6 +13,8 @@
#define RADIO_BUSY_PIN 32 #define RADIO_BUSY_PIN 32
#define RADIO_RXEN 14 #define RADIO_RXEN 14
#define RADIO_TXEN 13 #define RADIO_TXEN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_33
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
+2
View File
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
+2
View File
@@ -13,6 +13,8 @@
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_RXEN 14 #define RADIO_RXEN 14
#define RADIO_TXEN 13 #define RADIO_TXEN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_33
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -13,6 +13,8 @@
#define RADIO_BUSY_PIN 6 #define RADIO_BUSY_PIN 6
#define RADIO_RXEN 42 #define RADIO_RXEN 42
#define RADIO_TXEN 14 #define RADIO_TXEN 14
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_5
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
+2
View File
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 23 #define RADIO_RST_PIN 23
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 13 #define RADIO_RST_PIN 13
#define RADIO_DIO1_PIN 14 #define RADIO_DIO1_PIN 14
#define RADIO_BUSY_PIN 12 #define RADIO_BUSY_PIN 12
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_12
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 14 #define RADIO_CS_PIN 14
#define RADIO_RST_PIN 2 #define RADIO_RST_PIN 2
#define RADIO_BUSY_PIN 25 #define RADIO_BUSY_PIN 25
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_25
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 34 #define RADIO_CS_PIN 34
#define RADIO_RST_PIN 33 #define RADIO_RST_PIN 33
#define RADIO_BUSY_PIN 38 #define RADIO_BUSY_PIN 38
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_38
// Aditional Config // Aditional Config
#define INTERNAL_LED_PIN 15 #define INTERNAL_LED_PIN 15
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 42 #define RADIO_RST_PIN 42
#define RADIO_DIO1_PIN 39 #define RADIO_DIO1_PIN 39
#define RADIO_BUSY_PIN 40 #define RADIO_BUSY_PIN 40
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_39
#define RADIO_HAS_RF_SWITCH // DIO02 #define RADIO_HAS_RF_SWITCH // DIO02
#define RADIO_RF_SWITCH 38 #define RADIO_RF_SWITCH 38
@@ -13,5 +13,7 @@
#define RADIO_BUSY_PIN 3 #define RADIO_BUSY_PIN 3
#define RADIO_RXEN 6 #define RADIO_RXEN 6
#define RADIO_TXEN 7 #define RADIO_TXEN 7
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
#endif #endif
@@ -13,5 +13,7 @@
#define RADIO_BUSY_PIN 3 #define RADIO_BUSY_PIN 3
#define RADIO_RXEN 6 #define RADIO_RXEN 6
#define RADIO_TXEN 7 #define RADIO_TXEN 7
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
#endif #endif
+2
View File
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
+2
View File
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 5 #define RADIO_RST_PIN 5
#define RADIO_DIO1_PIN 3 #define RADIO_DIO1_PIN 3
#define RADIO_BUSY_PIN 4 #define RADIO_BUSY_PIN 4
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
// Aditional Config // Aditional Config
#define BATTERY_PIN 1 #define BATTERY_PIN 1
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 12 #define RADIO_RST_PIN 12
#define RADIO_DIO1_PIN 14 #define RADIO_DIO1_PIN 14
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_14
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 12 #define RADIO_RST_PIN 12
#define RADIO_DIO1_PIN 14 #define RADIO_DIO1_PIN 14
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_14
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 12 #define RADIO_RST_PIN 12
#define RADIO_DIO1_PIN 14 #define RADIO_DIO1_PIN 14
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_14
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 12 #define RADIO_RST_PIN 12
#define RADIO_DIO1_PIN 14 #define RADIO_DIO1_PIN 14
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_14
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 12 #define RADIO_RST_PIN 12
#define RADIO_DIO1_PIN 14 #define RADIO_DIO1_PIN 14
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_14
// Aditional Config // Aditional Config
#define INTERNAL_LED_PIN 35 #define INTERNAL_LED_PIN 35
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 12 #define RADIO_RST_PIN 12
#define RADIO_DIO1_PIN 14 #define RADIO_DIO1_PIN 14
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_14
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 12 // SX1262 RST #define RADIO_RST_PIN 12 // SX1262 RST
#define RADIO_DIO1_PIN 14 // SX1262 DIO1 #define RADIO_DIO1_PIN 14 // SX1262 DIO1
#define RADIO_BUSY_PIN 13 // SX1262 BUSY #define RADIO_BUSY_PIN 13 // SX1262 BUSY
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_14
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
+2
View File
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
+2
View File
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
+2
View File
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -11,6 +11,8 @@
#define RADIO_RST_PIN 23 #define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33 #define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32 #define RADIO_BUSY_PIN 32
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_33
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -9,6 +9,8 @@
#define RADIO_CS_PIN 18 #define RADIO_CS_PIN 18
#define RADIO_RST_PIN 14 #define RADIO_RST_PIN 14
#define RADIO_BUSY_PIN 26 #define RADIO_BUSY_PIN 26
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_26
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -11,6 +11,8 @@
#define RADIO_RST_PIN 23 #define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33 #define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32 #define RADIO_BUSY_PIN 32
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_33
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -10,6 +10,8 @@
#define RADIO_RST_PIN 8 #define RADIO_RST_PIN 8
#define RADIO_DIO1_PIN 33 #define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 34 #define RADIO_BUSY_PIN 34
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_33
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -3,14 +3,16 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define RADIO_SCLK_PIN 12 #define RADIO_SCLK_PIN 12
#define RADIO_MISO_PIN 13 #define RADIO_MISO_PIN 13
#define RADIO_MOSI_PIN 11 #define RADIO_MOSI_PIN 11
#define RADIO_CS_PIN 10 #define RADIO_CS_PIN 10
#define RADIO_DIO0_PIN -1 #define RADIO_DIO0_PIN -1
#define RADIO_RST_PIN 5 #define RADIO_RST_PIN 5
#define RADIO_DIO1_PIN 1 #define RADIO_DIO1_PIN 1
#define RADIO_BUSY_PIN 4 #define RADIO_BUSY_PIN 4
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_1
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -19,9 +21,9 @@
#undef OLED_SCL #undef OLED_SCL
#undef OLED_RST #undef OLED_RST
#define OLED_SDA 17 #define OLED_SDA 17
#define OLED_SCL 18 #define OLED_SCL 18
#define OLED_RST 16 #define OLED_RST 16
#define OLED_DISPLAY_HAS_RST_PIN #define OLED_DISPLAY_HAS_RST_PIN
// Aditional Config // Aditional Config
@@ -29,8 +31,8 @@
// GPS // GPS
#define HAS_GPS #define HAS_GPS
#define GPS_RX 8 #define GPS_RX 8
#define GPS_TX 9 #define GPS_TX 9
#define BOARD_HAS_PSRAM #define BOARD_HAS_PSRAM
+17 -15
View File
@@ -3,13 +3,15 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define RADIO_SCLK_PIN 40 #define RADIO_SCLK_PIN 40
#define RADIO_MISO_PIN 38 #define RADIO_MISO_PIN 38
#define RADIO_MOSI_PIN 41 #define RADIO_MOSI_PIN 41
#define RADIO_CS_PIN 9 #define RADIO_CS_PIN 9
#define RADIO_RST_PIN 17 #define RADIO_RST_PIN 17
#define RADIO_DIO1_PIN 45 #define RADIO_DIO1_PIN 45
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_45
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -20,17 +22,17 @@
#undef OLED_RST #undef OLED_RST
// GPS // GPS
#define GPS_RX 43 #define GPS_RX 43
#define GPS_TX 44 #define GPS_TX 44
// Aditional Config // Aditional Config
#define BATTERY_PIN 4 #define BATTERY_PIN 4
#define BOARD_POWERON 10 #define BOARD_POWERON 10
#define BOARD_SDCARD_CS 39 #define BOARD_SDCARD_CS 39
#define BOARD_BL_PIN 42 #define BOARD_BL_PIN 42
#define BOARD_I2C_SDA 18 #define BOARD_I2C_SDA 18
#define BOARD_I2C_SCL 8 #define BOARD_I2C_SCL 8
#endif #endif
+1 -1
View File
@@ -18,7 +18,7 @@ debug_tool = esp-prog
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D TTGO_T_DECK_PLUS -D TTGO_T_DECK_GPS
-D BOARD_HAS_PSRAM -D BOARD_HAS_PSRAM
-D USER_SETUP_LOADED -D USER_SETUP_LOADED
-D ST7789_DRIVER -D ST7789_DRIVER
+18 -16
View File
@@ -3,13 +3,15 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define RADIO_SCLK_PIN 40 #define RADIO_SCLK_PIN 40
#define RADIO_MISO_PIN 38 #define RADIO_MISO_PIN 38
#define RADIO_MOSI_PIN 41 #define RADIO_MOSI_PIN 41
#define RADIO_CS_PIN 9 #define RADIO_CS_PIN 9
#define RADIO_RST_PIN 17 #define RADIO_RST_PIN 17
#define RADIO_DIO1_PIN 45 #define RADIO_DIO1_PIN 45
#define RADIO_BUSY_PIN 13 #define RADIO_BUSY_PIN 13
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
#define GPIO_WAKEUP_PIN GPIO_SEL_45
// Display // Display
#define HAS_DISPLAY #define HAS_DISPLAY
@@ -20,18 +22,18 @@
#undef OLED_RST #undef OLED_RST
// GPS // GPS
#define GPS_RX 43 #define GPS_RX 43
#define GPS_TX 44 #define GPS_TX 44
#define GPS_BAUDRATE 38400 #define GPS_BAUDRATE 38400
// Aditional Config // Aditional Config
#define BATTERY_PIN 4 #define BATTERY_PIN 4
#define BOARD_POWERON 10 #define BOARD_POWERON 10
#define BOARD_SDCARD_CS 39 #define BOARD_SDCARD_CS 39
#define BOARD_BL_PIN 42 #define BOARD_BL_PIN 42
#define BOARD_I2C_SDA 18 #define BOARD_I2C_SDA 18
#define BOARD_I2C_SCL 8 #define BOARD_I2C_SCL 8
#endif #endif