mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-07-13 05:11:36 +02:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 026d6b2eeb | |||
| fe705519cb | |||
| 1fa74b8697 | |||
| a3794085b4 | |||
| 0a898a40e6 | |||
| ff8c7581fa | |||
| 449a8557d2 |
+3
-3
@@ -31,12 +31,12 @@ lib_deps =
|
|||||||
adafruit/Adafruit INA219 @ 1.2.3
|
adafruit/Adafruit INA219 @ 1.2.3
|
||||||
adafruit/Adafruit Si7021 Library @ 1.5.3
|
adafruit/Adafruit Si7021 Library @ 1.5.3
|
||||||
arduino-libraries/NTPClient @ 3.2.1
|
arduino-libraries/NTPClient @ 3.2.1
|
||||||
ayushsharma82/ElegantOTA @ 3.1.5
|
ayushsharma82/ElegantOTA @ 3.1.7
|
||||||
bblanchon/ArduinoJson @ 6.21.3
|
bblanchon/ArduinoJson @ 6.21.3
|
||||||
jgromes/RadioLib @ 7.1.0
|
jgromes/RadioLib @ 7.1.0
|
||||||
knolleary/PubSubClient @ 2.8
|
knolleary/PubSubClient @ 2.8
|
||||||
mathieucarbou/AsyncTCP @ 3.2.5
|
ESP32Async/AsyncTCP @ 3.4.9
|
||||||
mathieucarbou/ESPAsyncWebServer @ 3.2.3
|
ESP32Async/ESPAsyncWebServer @ 3.9.3
|
||||||
mikalhart/TinyGPSPlus @ 1.0.3
|
mikalhart/TinyGPSPlus @ 1.0.3
|
||||||
richonguzman/APRSPacketLib @ 1.0.4
|
richonguzman/APRSPacketLib @ 1.0.4
|
||||||
display_libs =
|
display_libs =
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ ___________________________________________________________________*/
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
String versionDate = "2025-12-22";
|
String versionDate = "2025-12-29";
|
||||||
String versionNumber = "3.1.6.2";
|
String versionNumber = "3.1.7";
|
||||||
Configuration Config;
|
Configuration Config;
|
||||||
WiFiClient aprsIsClient;
|
WiFiClient aprsIsClient;
|
||||||
WiFiClient mqttClient;
|
WiFiClient mqttClient;
|
||||||
|
|||||||
+30
-23
@@ -57,7 +57,7 @@ namespace GPS_Utils {
|
|||||||
String encodedGPS = APRSPacketLib::encodeGPSIntoBase91(Config.beacon.latitude, Config.beacon.longitude, 0, 0, Config.beacon.symbol, false, 0, true, Config.beacon.ambiguityLevel);
|
String encodedGPS = APRSPacketLib::encodeGPSIntoBase91(Config.beacon.latitude, Config.beacon.longitude, 0, 0, Config.beacon.symbol, false, 0, true, Config.beacon.ambiguityLevel);
|
||||||
|
|
||||||
iGateBeaconPacket = beaconPacket;
|
iGateBeaconPacket = beaconPacket;
|
||||||
iGateBeaconPacket += ",qAC:!";
|
iGateBeaconPacket += ",qAC:=";
|
||||||
iGateBeaconPacket += Config.beacon.overlay;
|
iGateBeaconPacket += Config.beacon.overlay;
|
||||||
iGateBeaconPacket += encodedGPS;
|
iGateBeaconPacket += encodedGPS;
|
||||||
|
|
||||||
@@ -138,30 +138,37 @@ namespace GPS_Utils {
|
|||||||
|
|
||||||
String getDistanceAndComment(const String& packet) {
|
String getDistanceAndComment(const String& packet) {
|
||||||
int indexOfAt = packet.indexOf(":@");
|
int indexOfAt = packet.indexOf(":@");
|
||||||
if (indexOfAt > 10) {
|
if (indexOfAt > 10) return getReceivedGPS(packet);
|
||||||
return getReceivedGPS(packet);
|
|
||||||
} else {
|
|
||||||
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) {
|
const uint8_t nonEncondedLatitudeOffset = 9; // "N" / "S"
|
||||||
char currentChar = packet[encodedBytePosition];
|
const uint8_t nonEncondedLongitudeOffset = 19; // "E" / "W"
|
||||||
if (currentChar == 'G' || currentChar == 'Q' || currentChar == '[' || currentChar == 'H' || currentChar == 'X' || currentChar == '3') {
|
const uint8_t encodedByteOffset = 14;
|
||||||
return decodeEncodedGPS(packet); // If valid encoded data position is found, decode it
|
|
||||||
} else {
|
int indexOfExclamation = packet.indexOf(":!");
|
||||||
return getReceivedGPS(packet);
|
int indexOfEqual = packet.indexOf(":=");
|
||||||
}
|
int baseIndex = - 1;
|
||||||
} else {
|
if (indexOfExclamation > 10) {
|
||||||
return " _ / _ / _ ";
|
baseIndex = indexOfExclamation;
|
||||||
}
|
} else if (indexOfEqual > 10) {
|
||||||
|
baseIndex = indexOfEqual;
|
||||||
}
|
}
|
||||||
|
if (baseIndex == -1) return " _ / _ / _ ";
|
||||||
|
|
||||||
|
int latitudeIndex = baseIndex + nonEncondedLatitudeOffset;
|
||||||
|
int longitudeIndex = baseIndex + nonEncondedLongitudeOffset;
|
||||||
|
int encodedByteIndex = baseIndex + encodedByteOffset;
|
||||||
|
int packetLength = packet.length();
|
||||||
|
|
||||||
|
if (latitudeIndex < packetLength && longitudeIndex < packetLength) {
|
||||||
|
char latChar = packet[latitudeIndex];
|
||||||
|
char lngChar = packet[longitudeIndex];
|
||||||
|
if ((latChar == 'N' || latChar == 'S') && (lngChar == 'E' || lngChar == 'W')) return getReceivedGPS(packet);
|
||||||
|
}
|
||||||
|
if (encodedByteIndex < packetLength) {
|
||||||
|
char byteChar = packet[encodedByteIndex];
|
||||||
|
if (byteChar == 'G' || byteChar == 'Q' || byteChar == '[' || byteChar == 'H' || byteChar == 'X' || byteChar == '3') return decodeEncodedGPS(packet);
|
||||||
|
}
|
||||||
|
return " _ / _ / _ ";
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
|||||||
+1
-1
@@ -98,7 +98,7 @@ namespace WIFI_Utils {
|
|||||||
delay(500);
|
delay(500);
|
||||||
unsigned long start = millis();
|
unsigned long start = millis();
|
||||||
displayShow("", "Connecting to WiFi:", "", currentWiFi->ssid + " ...", 0);
|
displayShow("", "Connecting to WiFi:", "", currentWiFi->ssid + " ...", 0);
|
||||||
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ...");
|
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.print("' ");
|
||||||
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
|
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
|
||||||
while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) {
|
while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) {
|
||||||
delay(500);
|
delay(500);
|
||||||
|
|||||||
@@ -7,10 +7,7 @@ build_flags =
|
|||||||
-D RADIOLIB_EXCLUDE_SX127X=1
|
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||||
-D RADIOLIB_EXCLUDE_SX128X=1
|
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||||
-D HELTEC_VM_E290
|
-D HELTEC_VM_E290
|
||||||
-D Vision_Master_E290 ; Todd Herbert eink display driver constructor
|
-D Vision_Master_E290
|
||||||
-D USE_EINK_DYNAMICDISPLAY ; Enable Dynamic EInk
|
|
||||||
-D EINK_LIMIT_FASTREFRESH=10 ; How many consecutive fast-refreshes are permitted
|
|
||||||
-D EINK_HASQUIRK_GHOSTING ; Display model is identified as "prone to ghosting"
|
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${common.lib_deps}
|
${common.lib_deps}
|
||||||
https://github.com/todd-herbert/heltec-eink-modules.git
|
https://github.com/todd-herbert/heltec-eink-modules.git
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/* Copyright (C) 2025 Ricardo Guzman - CA2RXU
|
||||||
|
*
|
||||||
|
* This file is part of LoRa APRS iGate.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* LoRa APRS iGate is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOARD_PINOUT_H_
|
||||||
|
#define BOARD_PINOUT_H_
|
||||||
|
|
||||||
|
// LoRa Radio
|
||||||
|
#define HAS_SX1262
|
||||||
|
#define HAS_TCXO
|
||||||
|
#define RADIO_SCLK_PIN 9
|
||||||
|
#define RADIO_MISO_PIN 11
|
||||||
|
#define RADIO_MOSI_PIN 10
|
||||||
|
#define RADIO_CS_PIN 8
|
||||||
|
#define RADIO_RST_PIN 12
|
||||||
|
#define RADIO_DIO1_PIN 14
|
||||||
|
#define RADIO_BUSY_PIN 13
|
||||||
|
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||||
|
#define GPIO_WAKEUP_PIN GPIO_SEL_14
|
||||||
|
|
||||||
|
// I2C
|
||||||
|
#define USE_WIRE_WITH_OLED_PINS
|
||||||
|
#define USE_WIRE1_WITH_BOARD_I2C_PINS
|
||||||
|
#define BOARD_I2C_SDA 41
|
||||||
|
#define BOARD_I2C_SCL 42
|
||||||
|
|
||||||
|
// Display
|
||||||
|
#define HAS_DISPLAY
|
||||||
|
|
||||||
|
#undef OLED_SDA
|
||||||
|
#undef OLED_SCL
|
||||||
|
#undef OLED_RST
|
||||||
|
|
||||||
|
#define OLED_SDA 17
|
||||||
|
#define OLED_SCL 18
|
||||||
|
#define OLED_RST 21
|
||||||
|
#define OLED_DISPLAY_HAS_RST_PIN
|
||||||
|
|
||||||
|
// Aditional Config
|
||||||
|
#define INTERNAL_LED_PIN 35
|
||||||
|
#define BATTERY_PIN 1
|
||||||
|
#define VEXT_CTRL 36
|
||||||
|
#define ADC_CTRL 37
|
||||||
|
|
||||||
|
// GPS ??
|
||||||
|
#define VGNS_CTRL 34 // cambiar nombre para prender GPS ?
|
||||||
|
// wakeup 40
|
||||||
|
// TX 39
|
||||||
|
// RX 38
|
||||||
|
// RST 42
|
||||||
|
// PPS 41
|
||||||
|
//#define GPS_L76K
|
||||||
|
|
||||||
|
// // active low, powers the oled display and the lora antenna boost
|
||||||
|
|
||||||
|
//#define LORA_PA_POWER 7 // power en
|
||||||
|
//#define LORA_PA_EN 2
|
||||||
|
//#define LORA_PA_TX_EN 46 // enable tx
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[env:heltec_wifi_lora_32_V4]
|
||||||
|
board = heltec_wifi_lora_32_V3
|
||||||
|
board_build.mcu = esp32s3
|
||||||
|
build_flags =
|
||||||
|
${common.build_flags}
|
||||||
|
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX127X=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||||
|
-D HELTEC_V4
|
||||||
|
lib_deps =
|
||||||
|
${common.lib_deps}
|
||||||
|
${common.display_libs}
|
||||||
Reference in New Issue
Block a user