From d6fa9fca8280c82d1dbd657432ff0363a593d4cc Mon Sep 17 00:00:00 2001 From: richonguzman Date: Sun, 5 Nov 2023 20:30:41 -0300 Subject: [PATCH] decoded update --- lib/APRSPacketLib/APRSPacketLib.cpp | 105 +++++++++++++++++++++++++--- lib/APRSPacketLib/APRSPacketLib.h | 1 + src/gps_utils.cpp | 14 ++-- src/msg_utils.cpp | 5 +- src/utils.cpp | 6 +- src/utils.h | 2 +- 6 files changed, 112 insertions(+), 21 deletions(-) diff --git a/lib/APRSPacketLib/APRSPacketLib.cpp b/lib/APRSPacketLib/APRSPacketLib.cpp index 5696a45..be819c2 100644 --- a/lib/APRSPacketLib/APRSPacketLib.cpp +++ b/lib/APRSPacketLib/APRSPacketLib.cpp @@ -3,21 +3,104 @@ namespace APRSPacketLib { String generateStatusPacket(String callsign, String tocall, String path, String status) { - String packet = callsign + ">" + tocall; - if (path != "") { - packet += "," + path; + String packet = callsign + ">" + tocall; + if (path != "") { + packet += "," + path; + } + packet += ":>" + status; + return packet; + } + + char *ax25_base91enc(char *s, uint8_t n, uint32_t v) { + for(s += n, *s = '\0'; n; n--) { + *(--s) = v % 91 + 33; + v /= 91; + } + return(s); + } + + String encondeGPS(String type) { + String encodedData; + float Tlat, Tlon; + float Tspeed=0, Tcourse=0; + Tlat = gps.location.lat(); + Tlon = gps.location.lng(); + Tcourse = gps.course.deg(); + Tspeed = gps.speed.knots(); + + uint32_t aprs_lat, aprs_lon; + aprs_lat = 900000000 - Tlat * 10000000; + aprs_lat = aprs_lat / 26 - aprs_lat / 2710 + aprs_lat / 15384615; + aprs_lon = 900000000 + Tlon * 10000000 / 2; + aprs_lon = aprs_lon / 26 - aprs_lon / 2710 + aprs_lon / 15384615; + + String Ns, Ew, helper; + if(Tlat < 0) { Ns = "S"; } else { Ns = "N"; } + if(Tlat < 0) { Tlat= -Tlat; } + + if(Tlon < 0) { Ew = "W"; } else { Ew = "E"; } + if(Tlon < 0) { Tlon= -Tlon; } + + char helper_base91[] = {"0000\0"}; + int i; + //utils::ax25_base91enc(helper_base91, 4, aprs_lat); + APRSPacketLib::ax25_base91enc(helper_base91, 4, aprs_lat); + for (i=0; i<4; i++) { + encodedData += helper_base91[i]; + } + //utils::ax25_base91enc(helper_base91, 4, aprs_lon); + APRSPacketLib::ax25_base91enc(helper_base91, 4, aprs_lon); + for (i=0; i<4; i++) { + encodedData += helper_base91[i]; + } + if (type=="Wx") { + encodedData += "_"; + } else { + encodedData += currentBeacon->symbol; + } + + if (Config.sendAltitude) { // Send Altitude or... (APRS calculates Speed also) + int Alt1, Alt2; + int Talt; + Talt = gps.altitude.feet(); + if(Talt>0) { + double ALT=log(Talt)/log(1.002); + Alt1= int(ALT/91); + Alt2=(int)ALT%91; + } else { + Alt1=0; + Alt2=0; } - packet += ":>" + status; - return packet; + if (sendStandingUpdate) { + encodedData += " "; + } else { + encodedData +=char(Alt1+33); + } + encodedData +=char(Alt2+33); + encodedData +=char(0x30+33); + } else { // ... just send Course and Speed + //utils::ax25_base91enc(helper_base91, 1, (uint32_t) Tcourse/4 ); + APRSPacketLib::ax25_base91enc(helper_base91, 1, (uint32_t) Tcourse/4 ); + if (sendStandingUpdate) { + encodedData += " "; + } else { + encodedData += helper_base91[0]; + } + //utils::ax25_base91enc(helper_base91, 1, (uint32_t) (log1p(Tspeed)/0.07696)); + APRSPacketLib::ax25_base91enc(helper_base91, 1, (uint32_t) (log1p(Tspeed)/0.07696)); + encodedData += helper_base91[0]; + encodedData += "\x47"; + } + return encodedData; } String generateGPSBeaconPacket(String callsign, String tocall, String path, String overlay, String gps) { - String packet = callsign + ">" + tocall; - if (path != "") { - packet += "," + path; - } - packet += ":!" + overlay + gps; - return packet; + String packet = callsign + ">" + tocall; + if (path != "") { + packet += "," + path; + } + packet += ":!" + overlay + gps; + return packet; } float decodeEncodedLatitude(String receivedPacket) { diff --git a/lib/APRSPacketLib/APRSPacketLib.h b/lib/APRSPacketLib/APRSPacketLib.h index f85ee05..beb6279 100644 --- a/lib/APRSPacketLib/APRSPacketLib.h +++ b/lib/APRSPacketLib/APRSPacketLib.h @@ -15,6 +15,7 @@ struct APRSPacket { namespace APRSPacketLib { String generateStatusPacket(String callsign, String tocall, String path, String status); +char *ax25_base91enc(char *s, uint8_t n, uint32_t v); String generateGPSBeaconPacket(String callsign, String tocall, String path, String overlay, String gpsData); float decodeEncodedLatitude(String receivedPacket); float decodeEncodedLongitude(String receivedPacket); diff --git a/src/gps_utils.cpp b/src/gps_utils.cpp index def6a4b..2fb92e9 100644 --- a/src/gps_utils.cpp +++ b/src/gps_utils.cpp @@ -8,6 +8,8 @@ #include "logger.h" #include "utils.h" +#include "APRSPacketLib.h" + extern Configuration Config; extern HardwareSerial neo6m_gps; extern TinyGPSPlus gps; @@ -122,11 +124,13 @@ namespace GPS_Utils { char helper_base91[] = {"0000\0"}; int i; - utils::ax25_base91enc(helper_base91, 4, aprs_lat); + //utils::ax25_base91enc(helper_base91, 4, aprs_lat); + APRSPacketLib::ax25_base91enc(helper_base91, 4, aprs_lat); for (i=0; i<4; i++) { encodedData += helper_base91[i]; } - utils::ax25_base91enc(helper_base91, 4, aprs_lon); + //utils::ax25_base91enc(helper_base91, 4, aprs_lon); + APRSPacketLib::ax25_base91enc(helper_base91, 4, aprs_lon); for (i=0; i<4; i++) { encodedData += helper_base91[i]; } @@ -156,13 +160,15 @@ namespace GPS_Utils { encodedData +=char(Alt2+33); encodedData +=char(0x30+33); } else { // ... just send Course and Speed - utils::ax25_base91enc(helper_base91, 1, (uint32_t) Tcourse/4 ); + //utils::ax25_base91enc(helper_base91, 1, (uint32_t) Tcourse/4 ); + APRSPacketLib::ax25_base91enc(helper_base91, 1, (uint32_t) Tcourse/4 ); if (sendStandingUpdate) { encodedData += " "; } else { encodedData += helper_base91[0]; } - utils::ax25_base91enc(helper_base91, 1, (uint32_t) (log1p(Tspeed)/0.07696)); + //utils::ax25_base91enc(helper_base91, 1, (uint32_t) (log1p(Tspeed)/0.07696)); + APRSPacketLib::ax25_base91enc(helper_base91, 1, (uint32_t) (log1p(Tspeed)/0.07696)); encodedData += helper_base91[0]; encodedData += "\x47"; } diff --git a/src/msg_utils.cpp b/src/msg_utils.cpp index 97b4722..20c1496 100644 --- a/src/msg_utils.cpp +++ b/src/msg_utils.cpp @@ -185,7 +185,7 @@ namespace MSG_Utils { } if (Config.notification.buzzerActive && Config.notification.messageRxBeep) { NOTIFICATION_Utils::messageBeep(); - } + } if (aprsPacket.message.indexOf("ping")==0 || aprsPacket.message.indexOf("Ping")==0 || aprsPacket.message.indexOf("PING")==0) { delay(4000); sendMessage(aprsPacket.sender, "pong, 73!"); @@ -222,6 +222,9 @@ namespace MSG_Utils { lastHeardTracker = aprsPacket.sender; if (!Config.simplifiedTrackerMode) { GPS_Utils::calculateDistanceCourse(aprsPacket.sender, aprsPacket.latitude, aprsPacket.longitude); + if (Config.notification.buzzerActive && Config.notification.stationBeep) { + NOTIFICATION_Utils::stationHeardBeep(); + } } } } diff --git a/src/utils.cpp b/src/utils.cpp index b3fc872..d5117ff 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -54,15 +54,13 @@ namespace utils { return locator; } - char *ax25_base91enc(char *s, uint8_t n, uint32_t v) { - /* Creates a Base-91 representation of the value in v in the string */ - /* pointed to by s, n-characters long. String length should be n+1. */ + /*char *ax25_base91enc(char *s, uint8_t n, uint32_t v) { for(s += n, *s = '\0'; n; n--) { *(--s) = v % 91 + 33; v /= 91; } return(s); - } + }*/ static String padding(unsigned int number, unsigned int width) { String result; diff --git a/src/utils.h b/src/utils.h index 029bded..65e25c6 100644 --- a/src/utils.h +++ b/src/utils.h @@ -7,7 +7,7 @@ namespace utils { char *getMaidenheadLocator(double lat, double lon, int size); -char *ax25_base91enc(char *s, uint8_t n, uint32_t v); +//char *ax25_base91enc(char *s, uint8_t n, uint32_t v); String createDateString(time_t t); String createTimeString(time_t t); void checkStatus();