mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-07-15 14:21:30 +02:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 775e08a10a | |||
| f9291821d2 | |||
| 12d0bb760e | |||
| f020eb7491 | |||
| 63f4660ef6 | |||
| efabe9b1f7 |
+1
-1
@@ -45,7 +45,7 @@ namespace Utils {
|
|||||||
void checkRebootMode();
|
void checkRebootMode();
|
||||||
void checkRebootTime();
|
void checkRebootTime();
|
||||||
void checkSleepByLowBatteryVoltage(uint8_t mode);
|
void checkSleepByLowBatteryVoltage(uint8_t mode);
|
||||||
bool checkValidCallsign(const String& callsign);
|
bool callsignIsValid(const String& callsign);
|
||||||
void startupDelay();
|
void startupDelay();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ ___________________________________________________________________*/
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
String versionDate = "2026-01-21";
|
String versionDate = "2026-02-16";
|
||||||
String versionNumber = "3.2";
|
String versionNumber = "3.2";
|
||||||
Configuration Config;
|
Configuration Config;
|
||||||
WiFiClient aprsIsClient;
|
WiFiClient aprsIsClient;
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ namespace APRS_IS_Utils {
|
|||||||
int firstColonIndex = packet.indexOf(":");
|
int firstColonIndex = packet.indexOf(":");
|
||||||
if (firstColonIndex > 5 && firstColonIndex < (packet.length() - 1) && packet[firstColonIndex + 1] != '}' && packet.indexOf("TCPIP") == -1) {
|
if (firstColonIndex > 5 && firstColonIndex < (packet.length() - 1) && packet[firstColonIndex + 1] != '}' && packet.indexOf("TCPIP") == -1) {
|
||||||
const String& Sender = packet.substring(3, packet.indexOf(">"));
|
const String& Sender = packet.substring(3, packet.indexOf(">"));
|
||||||
if (Sender != Config.callsign && Utils::checkValidCallsign(Sender)) {
|
if (Sender != Config.callsign && Utils::callsignIsValid(Sender)) {
|
||||||
STATION_Utils::updateLastHeard(Sender);
|
STATION_Utils::updateLastHeard(Sender);
|
||||||
Utils::typeOfPacket(packet.substring(3), 0); // LoRa-APRS
|
Utils::typeOfPacket(packet.substring(3), 0); // LoRa-APRS
|
||||||
const String& AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2);
|
const String& AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2);
|
||||||
|
|||||||
+37
-37
@@ -99,8 +99,8 @@ namespace DIGI_Utils {
|
|||||||
} else {
|
} else {
|
||||||
temp = packet.substring(packet.indexOf(">") + 1, packet.indexOf(":"));
|
temp = packet.substring(packet.indexOf(">") + 1, packet.indexOf(":"));
|
||||||
}
|
}
|
||||||
if (temp.indexOf(",") > 2) { // checks for path
|
if (temp.indexOf(",") > 2) { // checks for path in temp
|
||||||
const String& path = temp.substring(temp.indexOf(",") + 1); // after tocall
|
const String& path = temp.substring(temp.indexOf(",") + 1); // extract path after tocall
|
||||||
if (Config.digi.mode == 2 || backupDigiMode) {
|
if (Config.digi.mode == 2 || backupDigiMode) {
|
||||||
if (path.indexOf("WIDE1-1") != - 1) {
|
if (path.indexOf("WIDE1-1") != - 1) {
|
||||||
return buildPacket(path, packet, thirdParty, false);
|
return buildPacket(path, packet, thirdParty, false);
|
||||||
@@ -135,45 +135,45 @@ namespace DIGI_Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void processLoRaPacket(const String& packet) {
|
void processLoRaPacket(const String& packet) {
|
||||||
if (packet.indexOf("NOGATE") == -1) {
|
if (packet.indexOf("NOGATE") >= 0) return;
|
||||||
bool thirdPartyPacket = false;
|
|
||||||
String temp, Sender;
|
bool thirdPartyPacket = false;
|
||||||
int firstColonIndex = packet.indexOf(":");
|
String temp, Sender;
|
||||||
if (firstColonIndex > 5 && firstColonIndex < (packet.length() - 1) && packet[firstColonIndex + 1] == '}' && packet.indexOf("TCPIP") > 0) { // 3rd Party
|
int firstColonIndex = packet.indexOf(":");
|
||||||
thirdPartyPacket = true;
|
if (firstColonIndex > 5 && firstColonIndex < (packet.length() - 1) && packet[firstColonIndex + 1] == '}' && packet.indexOf("TCPIP") > 0) { // 3rd Party
|
||||||
temp = packet.substring(packet.indexOf(":}") + 2);
|
thirdPartyPacket = true;
|
||||||
Sender = temp.substring(0, temp.indexOf(">"));
|
temp = packet.substring(packet.indexOf(":}") + 2);
|
||||||
} else {
|
Sender = temp.substring(0, temp.indexOf(">"));
|
||||||
temp = packet.substring(3);
|
} else {
|
||||||
Sender = packet.substring(3, packet.indexOf(">"));
|
temp = packet.substring(3);
|
||||||
}
|
Sender = packet.substring(3, packet.indexOf(">"));
|
||||||
if (Sender != (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign)) { // Avoid listening to own packets
|
}
|
||||||
if (!thirdPartyPacket && Config.tacticalCallsign == "" && !Utils::checkValidCallsign(Sender)) {
|
|
||||||
return;
|
if (Sender == (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign)) return; // Avoid listening to self packets
|
||||||
|
if (!thirdPartyPacket && Config.tacticalCallsign == "" && !Utils::callsignIsValid(Sender)) return; // No thirdParty + no tactical y no valid callsign
|
||||||
|
|
||||||
|
if (STATION_Utils::check25SegBuffer(Sender, temp.substring(temp.indexOf(":") + 2))) {
|
||||||
|
STATION_Utils::updateLastHeard(Sender);
|
||||||
|
Utils::typeOfPacket(temp, 2); // Digi
|
||||||
|
bool queryMessage = false;
|
||||||
|
if (temp.indexOf("::") > 10) { // it's a message
|
||||||
|
String AddresseeAndMessage = temp.substring(temp.indexOf("::") + 2);
|
||||||
|
String Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
||||||
|
Addressee.trim();
|
||||||
|
if (Addressee == (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign)) { // it's a message for me!
|
||||||
|
queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage, thirdPartyPacket);
|
||||||
}
|
}
|
||||||
if (STATION_Utils::check25SegBuffer(Sender, temp.substring(temp.indexOf(":") + 2))) {
|
}
|
||||||
STATION_Utils::updateLastHeard(Sender);
|
if (!queryMessage) {
|
||||||
Utils::typeOfPacket(temp, 2); // Digi
|
String loraPacket = generateDigipeatedPacket(packet.substring(3), thirdPartyPacket);
|
||||||
bool queryMessage = false;
|
if (loraPacket != "") {
|
||||||
if (temp.indexOf("::") > 10) { // it's a message
|
STATION_Utils::addToOutputPacketBuffer(loraPacket);
|
||||||
String AddresseeAndMessage = temp.substring(temp.indexOf("::") + 2);
|
if (Config.digi.ecoMode != 1) displayToggle(true);
|
||||||
String Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":"));
|
lastScreenOn = millis();
|
||||||
Addressee.trim();
|
|
||||||
if (Addressee == (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign)) { // it's a message for me!
|
|
||||||
queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage, thirdPartyPacket);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!queryMessage) {
|
|
||||||
String loraPacket = generateDigipeatedPacket(packet.substring(3), thirdPartyPacket);
|
|
||||||
if (loraPacket != "") {
|
|
||||||
STATION_Utils::addToOutputPacketBuffer(loraPacket);
|
|
||||||
if (Config.digi.ecoMode != 1) displayToggle(true);
|
|
||||||
lastScreenOn = millis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+3
-3
@@ -34,7 +34,7 @@
|
|||||||
extern Configuration Config;
|
extern Configuration Config;
|
||||||
extern HardwareSerial gpsSerial;
|
extern HardwareSerial gpsSerial;
|
||||||
extern TinyGPSPlus gps;
|
extern TinyGPSPlus gps;
|
||||||
extern bool callsignIsValid;
|
extern bool stationCallsignIsValid;
|
||||||
String distance, iGateBeaconPacket, iGateLoRaBeaconPacket;
|
String distance, iGateBeaconPacket, iGateLoRaBeaconPacket;
|
||||||
|
|
||||||
|
|
||||||
@@ -49,7 +49,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);
|
||||||
|
|
||||||
if (Config.callsign.indexOf("NOCALL-10") != 0) {
|
if (Config.callsign.indexOf("NOCALL-10") != 0) {
|
||||||
if (!callsignIsValid) {
|
if (!stationCallsignIsValid) {
|
||||||
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
|
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
|
||||||
Config.loramodule.txActive = false;
|
Config.loramodule.txActive = false;
|
||||||
Config.aprs_is.messagesToRF = false;
|
Config.aprs_is.messagesToRF = false;
|
||||||
@@ -57,7 +57,7 @@ namespace GPS_Utils {
|
|||||||
Config.beacon.sendViaRF = false;
|
Config.beacon.sendViaRF = false;
|
||||||
Config.digi.mode = 0;
|
Config.digi.mode = 0;
|
||||||
Config.digi.backupDigiMode = false;
|
Config.digi.backupDigiMode = false;
|
||||||
} else if (callsignIsValid && Config.tacticalCallsign != "") {
|
} else if (stationCallsignIsValid && Config.tacticalCallsign != "") {
|
||||||
beaconPacket = APRSPacketLib::generateBasePacket(Config.tacticalCallsign, "APLRG1", Config.beacon.path);
|
beaconPacket = APRSPacketLib::generateBasePacket(Config.tacticalCallsign, "APLRG1", Config.beacon.path);
|
||||||
Config.aprs_is.active = false;
|
Config.aprs_is.active = false;
|
||||||
Config.beacon.sendViaAPRSIS = false;
|
Config.beacon.sendViaAPRSIS = false;
|
||||||
|
|||||||
+14
-18
@@ -44,27 +44,25 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern Configuration Config;
|
extern Configuration Config;
|
||||||
extern bool callsignIsValid;
|
extern bool stationCallsignIsValid;
|
||||||
|
|
||||||
|
|
||||||
namespace POWER_Utils {
|
namespace POWER_Utils {
|
||||||
|
|
||||||
#ifdef VEXT_CTRL
|
#ifdef VEXT_CTRL
|
||||||
void vext_ctrl_ON() {
|
void vext_ctrl_ON() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) || defined(HELTEC_VM_E290)
|
#if VEXT_CTRL_INVERTED == 1
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
|
||||||
#endif
|
|
||||||
#if defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3)
|
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
||||||
|
#else
|
||||||
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void vext_ctrl_OFF() {
|
void vext_ctrl_OFF() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3) || defined(HELTEC_VM_E290)
|
#if VEXT_CTRL_INVERTED == 1
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
|
||||||
#endif
|
|
||||||
#if defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3)
|
|
||||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
||||||
|
#else
|
||||||
|
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -72,20 +70,18 @@ namespace POWER_Utils {
|
|||||||
|
|
||||||
#ifdef ADC_CTRL
|
#ifdef ADC_CTRL
|
||||||
void adc_ctrl_ON() {
|
void adc_ctrl_ON() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) || defined(HELTEC_VM_E290)
|
#if ADC_CTRL_INVERTED == 1
|
||||||
digitalWrite(ADC_CTRL, HIGH);
|
|
||||||
#endif
|
|
||||||
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2)
|
|
||||||
digitalWrite(ADC_CTRL, LOW);
|
digitalWrite(ADC_CTRL, LOW);
|
||||||
|
#else
|
||||||
|
digitalWrite(ADC_CTRL, HIGH);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_ctrl_OFF() {
|
void adc_ctrl_OFF() {
|
||||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2) || defined(HELTEC_VM_E290)
|
#if ADC_CTRL_INVERTED == 1
|
||||||
digitalWrite(ADC_CTRL, LOW);
|
|
||||||
#endif
|
|
||||||
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP_V1) || defined(HELTEC_WP_V1_2)
|
|
||||||
digitalWrite(ADC_CTRL, HIGH);
|
digitalWrite(ADC_CTRL, HIGH);
|
||||||
|
#else
|
||||||
|
digitalWrite(ADC_CTRL, LOW);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -328,7 +324,7 @@ namespace POWER_Utils {
|
|||||||
delay(1000);
|
delay(1000);
|
||||||
BATTERY_Utils::setup();
|
BATTERY_Utils::setup();
|
||||||
BATTERY_Utils::startupBatteryHealth();
|
BATTERY_Utils::startupBatteryHealth();
|
||||||
callsignIsValid = Utils::checkValidCallsign(Config.callsign);
|
stationCallsignIsValid = Utils::callsignIsValid(Config.callsign);
|
||||||
setCpuFrequencyMhz(80);
|
setCpuFrequencyMhz(80);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -49,9 +49,9 @@ namespace QUERY_Utils {
|
|||||||
answer.concat(versionDate);
|
answer.concat(versionDate);
|
||||||
} else if (queryQuestion == "?APRSP") {
|
} else if (queryQuestion == "?APRSP") {
|
||||||
answer.concat("iGate QTH: ");
|
answer.concat("iGate QTH: ");
|
||||||
answer.concat(String(Config.beacon.latitude,3));
|
answer.concat(String(Config.beacon.latitude,2));
|
||||||
answer.concat(" ");
|
answer.concat(" ");
|
||||||
answer.concat(String(Config.beacon.longitude,3));
|
answer.concat(String(Config.beacon.longitude,2));
|
||||||
} else if (queryQuestion == "?APRSL") {
|
} else if (queryQuestion == "?APRSL") {
|
||||||
if (lastHeardStations.size() == 0) {
|
if (lastHeardStations.size() == 0) {
|
||||||
char answerArray[50];
|
char answerArray[50];
|
||||||
|
|||||||
+4
-3
@@ -51,12 +51,13 @@ namespace SLEEP_Utils {
|
|||||||
if (Config.digi.ecoMode == 1) {
|
if (Config.digi.ecoMode == 1) {
|
||||||
pinMode(RADIO_WAKEUP_PIN, INPUT);
|
pinMode(RADIO_WAKEUP_PIN, INPUT);
|
||||||
attachInterrupt(digitalPinToInterrupt(RADIO_WAKEUP_PIN), wakeUpLoRaPacketReceived, RISING);
|
attachInterrupt(digitalPinToInterrupt(RADIO_WAKEUP_PIN), wakeUpLoRaPacketReceived, RISING);
|
||||||
#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_V1) || 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(LIGHTGATEWAY_PLUS_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)
|
|
||||||
|
#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
|
||||||
esp_sleep_enable_ext1_wakeup(GPIO_WAKEUP_PIN, ESP_EXT1_WAKEUP_ANY_HIGH);
|
esp_sleep_enable_ext1_wakeup(GPIO_WAKEUP_PIN, ESP_EXT1_WAKEUP_ANY_HIGH);
|
||||||
#endif
|
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||||
#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);
|
esp_deep_sleep_enable_gpio_wakeup(1ULL << GPIO_WAKEUP_PIN, ESP_GPIO_WAKEUP_GPIO_HIGH);
|
||||||
#endif
|
#endif
|
||||||
|
//#if defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_NRF52)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,10 +141,6 @@ namespace SYSLOG_Utils {
|
|||||||
void setup() {
|
void setup() {
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
if (WiFi.status() == WL_CONNECTED) {
|
||||||
udpClient.begin(0);
|
udpClient.begin(0);
|
||||||
udpClient.beginPacket("syslog.trackiot.cc", 15243);
|
|
||||||
String hiddenLogPacket = Config.callsign + "," + versionDate;
|
|
||||||
udpClient.write((const uint8_t*)hiddenLogPacket.c_str(), hiddenLogPacket.length());
|
|
||||||
udpClient.endPacket();
|
|
||||||
if (Config.syslog.active) Serial.println("init : Syslog Server ... done! (at " + Config.syslog.server + ")");
|
if (Config.syslog.active) Serial.println("init : Syslog Server ... done! (at " + Config.syslog.server + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-9
@@ -61,13 +61,13 @@ extern bool passcodeValid;
|
|||||||
|
|
||||||
extern std::vector<LastHeardStation> lastHeardStations;
|
extern std::vector<LastHeardStation> lastHeardStations;
|
||||||
|
|
||||||
bool statusAfterBoot = true;
|
bool statusAfterBoot = true;
|
||||||
bool sendStartTelemetry = true;
|
bool sendStartTelemetry = true;
|
||||||
bool beaconUpdate = false;
|
bool beaconUpdate = false;
|
||||||
uint32_t lastBeaconTx = 0;
|
uint32_t lastBeaconTx = 0;
|
||||||
uint32_t lastScreenOn = millis();
|
uint32_t lastScreenOn = millis();
|
||||||
uint32_t lastStatusTx = 0;
|
uint32_t lastStatusTx = 0;
|
||||||
bool callsignIsValid = false;
|
bool stationCallsignIsValid = false;
|
||||||
String beaconPacket;
|
String beaconPacket;
|
||||||
String secondaryBeaconPacket;
|
String secondaryBeaconPacket;
|
||||||
|
|
||||||
@@ -198,7 +198,7 @@ namespace Utils {
|
|||||||
}
|
}
|
||||||
beaconPacket += Config.beacon.comment;
|
beaconPacket += Config.beacon.comment;
|
||||||
secondaryBeaconPacket += Config.beacon.comment;
|
secondaryBeaconPacket += Config.beacon.comment;
|
||||||
if (callsignIsValid && Config.tacticalCallsign != "") {
|
if (stationCallsignIsValid && Config.tacticalCallsign != "") {
|
||||||
beaconPacket += " de ";
|
beaconPacket += " de ";
|
||||||
beaconPacket += Config.callsign;
|
beaconPacket += Config.callsign;
|
||||||
secondaryBeaconPacket += " de ";
|
secondaryBeaconPacket += " de ";
|
||||||
@@ -415,7 +415,7 @@ namespace Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool checkValidCallsign(const String& callsign) {
|
bool callsignIsValid(const String& callsign) {
|
||||||
if (callsign == "WLNK-1") return true;
|
if (callsign == "WLNK-1") return true;
|
||||||
|
|
||||||
String cleanCallsign;
|
String cleanCallsign;
|
||||||
|
|||||||
@@ -49,5 +49,6 @@
|
|||||||
#define INTERNAL_LED_PIN 25
|
#define INTERNAL_LED_PIN 25
|
||||||
#define BATTERY_PIN 37
|
#define BATTERY_PIN 37
|
||||||
#define ADC_CTRL 21
|
#define ADC_CTRL 21
|
||||||
|
#define ADC_CTRL_INVERTED 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/* 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_SX1276
|
||||||
|
#define RADIO_SCLK_PIN 5
|
||||||
|
#define RADIO_MISO_PIN 19
|
||||||
|
#define RADIO_MOSI_PIN 27
|
||||||
|
#define RADIO_CS_PIN 18
|
||||||
|
#define RADIO_RST_PIN 14
|
||||||
|
#define RADIO_BUSY_PIN 26
|
||||||
|
#define RADIO_WAKEUP_PIN RADIO_BUSY_PIN
|
||||||
|
#define GPIO_WAKEUP_PIN GPIO_SEL_26
|
||||||
|
|
||||||
|
// I2C
|
||||||
|
#define USE_WIRE_WITH_OLED_PINS
|
||||||
|
|
||||||
|
// Display
|
||||||
|
#define HAS_DISPLAY
|
||||||
|
|
||||||
|
#undef OLED_SDA
|
||||||
|
#undef OLED_SCL
|
||||||
|
#undef OLED_RST
|
||||||
|
|
||||||
|
#define OLED_SDA 4
|
||||||
|
#define OLED_SCL 15
|
||||||
|
#define OLED_RST 16
|
||||||
|
#define OLED_DISPLAY_HAS_RST_PIN
|
||||||
|
|
||||||
|
// Aditional Config
|
||||||
|
#define INTERNAL_LED_PIN 25
|
||||||
|
#define BATTERY_PIN 37
|
||||||
|
#define ADC_CTRL 21
|
||||||
|
#define ADC_CTRL_INVERTED 1
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[env:heltec-lora32-v2_915]
|
||||||
|
board = ttgo-lora32-v21
|
||||||
|
build_flags =
|
||||||
|
${common.build_flags}
|
||||||
|
-D RADIOLIB_EXCLUDE_LR11X0=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX126X=1
|
||||||
|
-D RADIOLIB_EXCLUDE_SX128X=1
|
||||||
|
-D HELTEC_V2_915
|
||||||
|
lib_deps =
|
||||||
|
${common.lib_deps}
|
||||||
|
${common.display_libs}
|
||||||
@@ -51,6 +51,8 @@
|
|||||||
#define INTERNAL_LED_PIN 45
|
#define INTERNAL_LED_PIN 45
|
||||||
#define BATTERY_PIN 7
|
#define BATTERY_PIN 7
|
||||||
#define ADC_CTRL 46
|
#define ADC_CTRL 46
|
||||||
|
#define ADC_CTRL_INVERTED 0
|
||||||
#define VEXT_CTRL 18
|
#define VEXT_CTRL 18
|
||||||
|
#define VEXT_CTRL_INVERTED 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -54,6 +54,8 @@
|
|||||||
#define INTERNAL_LED_PIN 35
|
#define INTERNAL_LED_PIN 35
|
||||||
#define BATTERY_PIN 1
|
#define BATTERY_PIN 1
|
||||||
#define VEXT_CTRL 36
|
#define VEXT_CTRL 36
|
||||||
|
#define VEXT_CTRL_INVERTED 0
|
||||||
#define ADC_CTRL 37
|
#define ADC_CTRL 37
|
||||||
|
#define ADC_CTRL_INVERTED 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -54,6 +54,8 @@
|
|||||||
#define INTERNAL_LED_PIN 35
|
#define INTERNAL_LED_PIN 35
|
||||||
#define BATTERY_PIN 1
|
#define BATTERY_PIN 1
|
||||||
#define VEXT_CTRL 36
|
#define VEXT_CTRL 36
|
||||||
|
#define VEXT_CTRL_INVERTED 1
|
||||||
#define ADC_CTRL 37
|
#define ADC_CTRL 37
|
||||||
|
#define ADC_CTRL_INVERTED 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -54,7 +54,9 @@
|
|||||||
#define INTERNAL_LED_PIN 35
|
#define INTERNAL_LED_PIN 35
|
||||||
#define BATTERY_PIN 1
|
#define BATTERY_PIN 1
|
||||||
#define VEXT_CTRL 36
|
#define VEXT_CTRL 36
|
||||||
|
#define VEXT_CTRL_INVERTED 1
|
||||||
#define ADC_CTRL 37
|
#define ADC_CTRL 37
|
||||||
|
#define ADC_CTRL_INVERTED 0
|
||||||
|
|
||||||
// GPS ??
|
// GPS ??
|
||||||
#define VGNS_CTRL 34 // cambiar nombre para prender GPS ?
|
#define VGNS_CTRL 34 // cambiar nombre para prender GPS ?
|
||||||
|
|||||||
@@ -51,6 +51,8 @@
|
|||||||
#define INTERNAL_LED_PIN 18
|
#define INTERNAL_LED_PIN 18
|
||||||
#define BATTERY_PIN 20
|
#define BATTERY_PIN 20
|
||||||
#define ADC_CTRL 19
|
#define ADC_CTRL 19
|
||||||
|
#define ADC_CTRL_INVERTED 1
|
||||||
#define VEXT_CTRL 45
|
#define VEXT_CTRL 45
|
||||||
|
#define VEXT_CTRL_INVERTED 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -51,6 +51,8 @@
|
|||||||
#define INTERNAL_LED_PIN 18
|
#define INTERNAL_LED_PIN 18
|
||||||
#define BATTERY_PIN 20
|
#define BATTERY_PIN 20
|
||||||
#define ADC_CTRL 19
|
#define ADC_CTRL 19
|
||||||
|
#define ADC_CTRL_INVERTED 1
|
||||||
#define VEXT_CTRL 45
|
#define VEXT_CTRL 45
|
||||||
|
#define VEXT_CTRL_INVERTED 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -50,8 +50,10 @@
|
|||||||
// Aditional Config
|
// Aditional Config
|
||||||
#define INTERNAL_LED_PIN 35
|
#define INTERNAL_LED_PIN 35
|
||||||
#define BATTERY_PIN 1
|
#define BATTERY_PIN 1
|
||||||
#define VEXT_CTRL 36
|
|
||||||
#define ADC_CTRL 37
|
#define ADC_CTRL 37
|
||||||
|
#define VEXT_CTRL 36
|
||||||
|
#define VEXT_CTRL_INVERTED 1
|
||||||
|
|
||||||
#define BOARD_I2C_SDA 41
|
#define BOARD_I2C_SDA 41
|
||||||
#define BOARD_I2C_SCL 42
|
#define BOARD_I2C_SCL 42
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,9 @@
|
|||||||
// Aditional Config
|
// Aditional Config
|
||||||
#define INTERNAL_LED_PIN 35
|
#define INTERNAL_LED_PIN 35
|
||||||
#define BATTERY_PIN 1
|
#define BATTERY_PIN 1
|
||||||
#define VEXT_CTRL 36
|
|
||||||
#define ADC_CTRL 37
|
#define ADC_CTRL 37
|
||||||
|
#define ADC_CTRL_INVERTED 1
|
||||||
|
#define VEXT_CTRL 36
|
||||||
|
#define VEXT_CTRL_INVERTED 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -44,7 +44,9 @@
|
|||||||
// Aditional Config
|
// Aditional Config
|
||||||
#define INTERNAL_LED_PIN 35
|
#define INTERNAL_LED_PIN 35
|
||||||
#define BATTERY_PIN 1
|
#define BATTERY_PIN 1
|
||||||
#define VEXT_CTRL 36
|
|
||||||
#define ADC_CTRL 37
|
#define ADC_CTRL 37
|
||||||
|
#define ADC_CTRL_INVERTED 1
|
||||||
|
#define VEXT_CTRL 36
|
||||||
|
#define VEXT_CTRL_INVERTED 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -44,8 +44,10 @@
|
|||||||
// Aditional Config
|
// Aditional Config
|
||||||
#define INTERNAL_LED_PIN 18
|
#define INTERNAL_LED_PIN 18
|
||||||
#define BATTERY_PIN 1
|
#define BATTERY_PIN 1
|
||||||
#define ADC_CTRL 2 // HELTEC Wireless Tracker ADC_CTRL = HIGH powers the voltage divider to read BatteryPin. Only on V05 = V1.1
|
|
||||||
#define VEXT_CTRL 3 // To turn on GPS and TFT
|
#define VEXT_CTRL 3 // To turn on GPS and TFT
|
||||||
|
#define VEXT_CTRL_INVERTED 0
|
||||||
|
#define ADC_CTRL 2 // HELTEC Wireless Tracker ADC_CTRL = HIGH powers the voltage divider to read BatteryPin. Only on V05 = V1.1
|
||||||
|
#define ADC_CTRL_INVERTED 0
|
||||||
|
|
||||||
// GPS
|
// GPS
|
||||||
#define HAS_GPS
|
#define HAS_GPS
|
||||||
|
|||||||
Reference in New Issue
Block a user