LoRa_APRS_iGate/src/gps_utils.cpp

179 lines
6.9 KiB
C++
Raw Normal View History

#include <TinyGPS++.h>
2023-07-30 23:12:50 +02:00
#include <WiFi.h>
2023-06-06 18:19:56 +02:00
#include "configuration.h"
2023-06-08 06:58:10 +02:00
#include "gps_utils.h"
2023-06-06 18:19:56 +02:00
extern Configuration Config;
2023-07-30 23:12:50 +02:00
extern WiFiClient espClient;
2023-06-20 01:44:55 +02:00
String distance;
2023-06-06 18:19:56 +02:00
2024-02-25 16:00:44 +01:00
2023-06-06 18:19:56 +02:00
namespace GPS_Utils {
2024-02-24 14:09:05 +01:00
String double2string(double n, int ndec) {
String r = "";
if (n>-1 && n<0) {
r = "-";
}
int v = n;
r += v;
r += '.';
for (int i=0;i<ndec;i++) {
n -= v;
n = 10 * abs(n);
v = n;
r += v;
}
return r;
}
2023-06-06 18:19:56 +02:00
2024-02-24 14:09:05 +01:00
String processLatitudeAPRS(double lat) {
String degrees = double2string(lat,6);
String north_south, latitude, convDeg3;
float convDeg, convDeg2;
2024-01-03 02:12:10 +01:00
2024-02-24 14:09:05 +01:00
if (abs(degrees.toFloat()) < 10) {
latitude += "0";
}
if (degrees.indexOf("-") == 0) {
north_south = "S";
latitude += degrees.substring(1,degrees.indexOf("."));
} else {
north_south = "N";
latitude += degrees.substring(0,degrees.indexOf("."));
}
convDeg = abs(degrees.toFloat()) - abs(int(degrees.toFloat()));
convDeg2 = (convDeg * 60)/100;
convDeg3 = String(convDeg2,6);
latitude += convDeg3.substring(convDeg3.indexOf(".")+1,convDeg3.indexOf(".")+3) + "." + convDeg3.substring(convDeg3.indexOf(".")+3,convDeg3.indexOf(".")+5);
latitude += north_south;
return latitude;
2024-01-03 02:12:10 +01:00
}
2023-06-06 18:19:56 +02:00
2024-02-24 14:09:05 +01:00
String processLongitudeAPRS(double lon) {
String degrees = double2string(lon,6);
String east_west, longitude, convDeg3;
float convDeg, convDeg2;
if (abs(degrees.toFloat()) < 100) {
longitude += "0";
}
if (abs(degrees.toFloat()) < 10) {
longitude += "0";
}
if (degrees.indexOf("-") == 0) {
east_west = "W";
longitude += degrees.substring(1,degrees.indexOf("."));
} else {
east_west = "E";
longitude += degrees.substring(0,degrees.indexOf("."));
}
convDeg = abs(degrees.toFloat()) - abs(int(degrees.toFloat()));
convDeg2 = (convDeg * 60)/100;
convDeg3 = String(convDeg2,6);
longitude += convDeg3.substring(convDeg3.indexOf(".")+1,convDeg3.indexOf(".")+3) + "." + convDeg3.substring(convDeg3.indexOf(".")+3,convDeg3.indexOf(".")+5);
longitude += east_west;
return longitude;
2023-09-21 07:08:10 +02:00
}
2024-02-24 14:09:05 +01:00
String generateBeacon() {
2024-03-07 17:46:38 +01:00
String stationLatitude = processLatitudeAPRS(Config.beacon.latitude);
String stationLongitude = processLongitudeAPRS(Config.beacon.longitude);
String beaconPacket = Config.callsign + ">APLRG1," + Config.beacon.path;
if (Config.aprs_is.active && Config.digi.mode == 0) { // If APRSIS enabled and Digi disabled
beaconPacket += ",qAC";
} else {}
beaconPacket += ":=" + stationLatitude + Config.beacon.overlay + stationLongitude + Config.beacon.symbol;
beaconPacket += Config.beacon.comment;
2024-02-24 14:09:05 +01:00
return beaconPacket;
2023-06-09 01:31:27 +02:00
}
2024-01-03 02:12:10 +01:00
2024-02-24 14:09:05 +01:00
String generateiGateLoRaBeacon() {
2024-03-07 17:46:38 +01:00
String stationLatitude = processLatitudeAPRS(Config.beacon.latitude);
String stationLongitude = processLongitudeAPRS(Config.beacon.longitude);
String beaconPacket = Config.callsign + ">APLRG1," + Config.beacon.path + ":=" + stationLatitude + Config.beacon.overlay + stationLongitude + Config.beacon.symbol;
2024-02-24 14:09:05 +01:00
return beaconPacket;
2023-07-31 05:53:59 +02:00
}
2023-06-06 18:19:56 +02:00
2024-02-24 14:09:05 +01:00
double calculateDistanceTo(double latitude, double longitude) {
2024-03-07 17:46:38 +01:00
return TinyGPSPlus::distanceBetween(Config.beacon.latitude,Config.beacon.longitude, latitude, longitude) / 1000.0;
}
2024-02-24 14:09:05 +01:00
String decodeEncodedGPS(String packet) {
String GPSPacket = packet.substring(packet.indexOf(":!")+3);
String encodedLatitude = GPSPacket.substring(0,4);
String encodedLongtitude = GPSPacket.substring(4,8);
2024-02-24 14:09:05 +01:00
int Y1 = int(encodedLatitude[0]);
int Y2 = int(encodedLatitude[1]);
int Y3 = int(encodedLatitude[2]);
int Y4 = int(encodedLatitude[3]);
float decodedLatitude = 90.0 - ((((Y1-33) * pow(91,3)) + ((Y2-33) * pow(91,2)) + ((Y3-33) * 91) + Y4-33) / 380926.0);
int X1 = int(encodedLongtitude[0]);
int X2 = int(encodedLongtitude[1]);
int X3 = int(encodedLongtitude[2]);
int X4 = int(encodedLongtitude[3]);
float decodedLongitude = -180.0 + ((((X1-33) * pow(91,3)) + ((X2-33) * pow(91,2)) + ((X3-33) * 91) + X4-33) / 190463.0);
distance = String(calculateDistanceTo(decodedLatitude, decodedLongitude),1);
return String(decodedLatitude,5) + "N / " + String(decodedLongitude,5) + "E / " + distance + "km";
2024-01-03 02:12:10 +01:00
}
2024-02-24 14:09:05 +01:00
String getReceivedGPS(String packet) {
String infoGPS;
if (packet.indexOf(":!") > 10) {
infoGPS = packet.substring(packet.indexOf(":!")+2);
} else if (packet.indexOf(":=") > 10) {
infoGPS = packet.substring(packet.indexOf(":=")+2);
}
String Latitude = infoGPS.substring(0,8);
String Longitude = infoGPS.substring(9,18);
2024-01-03 02:12:10 +01:00
2024-02-24 14:09:05 +01:00
float convertedLatitude, convertedLongitude;
String firstLatPart = Latitude.substring(0,2);
String secondLatPart = Latitude.substring(2,4);
String thirdLatPart = Latitude.substring(Latitude.indexOf(".")+1,Latitude.indexOf(".")+3);
String firstLngPart = Longitude.substring(0,3);
String secondLngPart = Longitude.substring(3,5);
String thirdLngPart = Longitude.substring(Longitude.indexOf(".")+1,Longitude.indexOf(".")+3);
convertedLatitude = firstLatPart.toFloat() + (secondLatPart.toFloat()/60) + (thirdLatPart.toFloat()/(60*100));
convertedLongitude = firstLngPart.toFloat() + (secondLngPart.toFloat()/60) + (thirdLngPart.toFloat()/(60*100));
String LatSign = String(Latitude[7]);
String LngSign = String(Longitude[8]);
if (LatSign == "S") {
convertedLatitude = -convertedLatitude;
}
if (LngSign == "W") {
convertedLongitude = -convertedLongitude;
}
distance = String(calculateDistanceTo(convertedLatitude, convertedLongitude),1);
return String(convertedLatitude,5) + "N / " + String(convertedLongitude,5) + "E / " + distance + "km";
2024-01-03 02:12:10 +01:00
}
2024-02-24 14:09:05 +01:00
String getDistance(String packet) {
int encodedBytePosition = 0;
if (packet.indexOf(":!") > 10) {
encodedBytePosition = packet.indexOf(":!") + 14;
}
if (packet.indexOf(":=") > 10) {
encodedBytePosition = packet.indexOf(":=") + 14;
}
if (encodedBytePosition != 0) {
if (String(packet[encodedBytePosition]) == "G" || String(packet[encodedBytePosition]) == "Q" || String(packet[encodedBytePosition]) == "[" || String(packet[encodedBytePosition]) == "H") {
return decodeEncodedGPS(packet);
} else {
return getReceivedGPS(packet);
}
} else {
return " _ / _ / _ ";
}
}
2023-06-06 18:19:56 +02:00
}