casi casi

This commit is contained in:
richonguzman 2023-06-24 13:37:27 -04:00
parent 82e2772919
commit 4149c805f9
9 changed files with 157 additions and 133 deletions

View File

@ -64,7 +64,6 @@
"nonSmartBeaconRate": 15,
"rememberStationTime": 30,
"maxDistanceToTracker": 30,
"statusAfterBoot" : true,
"standingUpdateTime": 5,
"sendAltitude": true
}

View File

@ -23,39 +23,39 @@
#define VERSION "2023.06.24"
logging::Logger logger;
logging::Logger logger;
Configuration Config;
PowerManagement powerManagement;
HardwareSerial neo6m_gps(1);
TinyGPSPlus gps;
OneButton userButton = OneButton(BUTTON_PIN, true, true);
Configuration Config;
int myBeaconsIndex = 0;
int myBeaconsSize = Config.beacons.size();
Beacon *currentBeacon = &Config.beacons[myBeaconsIndex];
PowerManagement powerManagement;
OneButton userButton = OneButton(BUTTON_PIN, true, true);
HardwareSerial neo6m_gps(1);
TinyGPSPlus gps;
int myBeaconsIndex = 0;
int myBeaconsSize = Config.beacons.size();
Beacon *currentBeacon = &Config.beacons[myBeaconsIndex];
int menuDisplay = 0;
bool displayEcoMode = Config.displayEcoMode;
uint32_t displayTime = millis();
bool displayState = true;
int menuDisplay = 0;
bool send_update = true;
bool sendStandingUpdate = false;
int messagesIterator = 0;
std::vector<String> loadedAPRSMessages;
int messagesIterator = 0;
bool statusAfterBootState = true;
bool displayEcoMode = Config.displayEcoMode;
bool displayState = true;
uint32_t displayTime = millis();
std::vector<String> loadedAPRSMessages;
double currentHeading = 0;
double previousHeading = 0;
bool sendUpdate = true;
bool sendStandingUpdate = false;
bool statusState = true;
uint32_t lastTx = 0.0;
uint32_t txInterval = 60000L;
uint32_t lastTxTime = millis();
double lastTxLat = 0.0;
double lastTxLng = 0.0;
double lastTxDistance = 0.0;
uint32_t txInterval = 60000L;
uint32_t lastTxTime = millis();
uint32_t lastTx;
double currentHeading = 0;
double previousHeading = 0;
void setup() {
Serial.begin(115200);
@ -101,15 +101,16 @@ void loop() {
bool gps_time_update = gps.time.isUpdated();
bool gps_loc_update = gps.location.isUpdated();
GPS_Utils::setDateFromData();
MSG_Utils::checkReceivedMessage(LoRa_Utils::receivePacket());
STATION_Utils::checkListenedTrackersByTimeAndDelete();
int currentSpeed = (int)gps.speed.kmph();
lastTx = millis() - lastTxTime;
if (!send_update && gps_loc_update && currentBeacon->smartBeaconState) {
if (!sendUpdate && gps_loc_update && currentBeacon->smartBeaconState) {
GPS_Utils::calculateDistanceTraveled();
if (!send_update) {
if (!sendUpdate) {
GPS_Utils::calculateHeadingDelta(currentSpeed);
}
STATION_Utils::checkStandingUpdateTime();
@ -117,93 +118,8 @@ void loop() {
STATION_Utils::checkSmartBeaconState();
if (send_update && gps_loc_update) {
String beaconPacket = currentBeacon->callsign + ">APLRT1,WIDE1-1:!" + Config.overlay;
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);
for (i=0; i<4; i++) {
beaconPacket += helper_base91[i];
}
utils::ax25_base91enc(helper_base91, 4, aprs_lon);
for (i=0; i<4; i++) {
beaconPacket += helper_base91[i];
}
beaconPacket += 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;
}
if (sendStandingUpdate) {
beaconPacket += " ";
} else {
beaconPacket +=char(Alt1+33);
}
beaconPacket +=char(Alt2+33);
beaconPacket +=char(0x30+33);
} else { // ... just send Course and Speed
utils::ax25_base91enc(helper_base91, 1, (uint32_t) Tcourse/4 );
if (sendStandingUpdate) {
beaconPacket += " ";
} else {
beaconPacket += helper_base91[0];
}
utils::ax25_base91enc(helper_base91, 1, (uint32_t) (log1p(Tspeed)/0.07696));
beaconPacket += helper_base91[0];
beaconPacket += "\x47";
}
if (currentBeacon->comment != "") {
beaconPacket += currentBeacon->comment;
}
logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "Loop", "%s", beaconPacket.c_str());
show_display("<<< TX >>>", "", beaconPacket);
LoRa_Utils::sendNewPacket(beaconPacket);
if (currentBeacon->smartBeaconState) {
lastTxLat = gps.location.lat();
lastTxLng = gps.location.lng();
previousHeading = currentHeading;
lastTxDistance = 0.0;
}
lastTxTime = millis();
send_update = false;
if (statusAfterBootState) {
utils::startingStatus();
}
if (sendUpdate && gps_loc_update) {
STATION_Utils::sendBeacon();
}
if (gps_time_update) {

View File

@ -9,9 +9,9 @@ extern bool displayState;
extern uint32_t displayTime;
extern logging::Logger logger;
extern int messagesIterator;
extern bool send_update;
extern bool sendUpdate;
extern int myBeaconsIndex;
extern bool statusAfterBootState;
extern bool statusState;
extern bool displayEcoMode;
extern int myBeaconsSize;
extern Configuration Config;
@ -22,7 +22,7 @@ namespace BUTTON_Utils {
void singlePress() {
if (menuDisplay == 0) {
if (displayState) {
send_update = true;
sendUpdate = true;
} else {
display_toggle(true);
displayTime = millis();
@ -60,7 +60,7 @@ void longPress() {
} else {
myBeaconsIndex++;
}
statusAfterBootState = true;
statusState = true;
display_toggle(true);
displayTime = millis();
show_display("__INFO____", "", "CHANGING CALLSIGN ...", 1000);

View File

@ -43,7 +43,6 @@ public:
int nonSmartBeaconRate;
int rememberStationTime;
int maxDistanceToTracker;
bool statusAfterBoot;
int standingUpdateTime;
bool sendAltitude;

View File

@ -6,20 +6,20 @@
#include "configuration.h"
#include "display.h"
#include "logger.h"
#include "utils.h"
extern Configuration Config;
extern HardwareSerial neo6m_gps;
extern TinyGPSPlus gps;
extern Beacon *currentBeacon;
extern logging::Logger logger;
extern bool send_update;
extern bool sendUpdate;
extern bool sendStandingUpdate;
extern double currentHeading;
extern double previousHeading;
extern double lastTxDistance;
extern uint32_t lastTxTime;
extern uint32_t txInterval;
extern double lastTxLat;
@ -27,9 +27,6 @@ extern double lastTxLng;
extern double lastTxDistance;
extern uint32_t lastTx;
namespace GPS_Utils {
void setup() {
@ -121,7 +118,7 @@ void calculateDistanceTraveled() {
lastTxDistance = TinyGPSPlus::distanceBetween(gps.location.lat(), gps.location.lng(), lastTxLat, lastTxLng);
if (lastTx >= txInterval) {
if (lastTxDistance > currentBeacon->minTxDist) {
send_update = true;
sendUpdate = true;
sendStandingUpdate = false;
}
}
@ -137,7 +134,7 @@ void calculateHeadingDelta(int speed) {
TurnMinAngle = currentBeacon->turnMinDeg + (currentBeacon->turnSlope/speed);
}
if (headingDelta > TurnMinAngle && lastTxDistance > currentBeacon->minTxDist) {
send_update = true;
sendUpdate = true;
sendStandingUpdate = false;
}
}
@ -152,4 +149,72 @@ void checkStartUpFrames() {
}
}
String encondeGPS() {
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);
for (i=0; i<4; i++) {
encodedData += helper_base91[i];
}
utils::ax25_base91enc(helper_base91, 4, aprs_lon);
for (i=0; i<4; i++) {
encodedData += helper_base91[i];
}
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;
}
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 );
if (sendStandingUpdate) {
encodedData += " ";
} else {
encodedData += helper_base91[0];
}
utils::ax25_base91enc(helper_base91, 1, (uint32_t) (log1p(Tspeed)/0.07696));
encodedData += helper_base91[0];
encodedData += "\x47";
}
return encodedData;
}
}

View File

@ -14,6 +14,7 @@ void setDateFromData();
void calculateDistanceTraveled();
void calculateHeadingDelta(int speed);
void checkStartUpFrames();
String encondeGPS();
}

View File

@ -1,10 +1,18 @@
#include "station_utils.h"
#include <TinyGPS++.h>
#include "configuration.h"
#include "msg_utils.h"
#include <vector>
#include "gps_utils.h"
#include "utils.h"
#include "logger.h"
#include "lora_utils.h"
#include "display.h"
extern Configuration Config;
extern Beacon *currentBeacon;
extern logging::Logger logger;
extern TinyGPSPlus gps;
extern std::vector<String> lastHeardStation;
extern std::vector<String> lastHeardStation_temp;
extern String fourthLine;
@ -17,12 +25,21 @@ extern String fourthNearTracker;
extern uint32_t lastDeleteListenedTracker;
extern uint32_t lastTxTime;
extern bool send_update;
extern bool sendUpdate;
extern bool sendStandingUpdate;
extern bool statusState;
extern uint32_t txInterval;
extern uint32_t lastTx;
extern double currentHeading;
extern double previousHeading;
extern double lastTxLat;
extern double lastTxLng;
extern double lastTxDistance;
namespace STATION_Utils {
String getFirstNearTracker() {
@ -346,8 +363,8 @@ void checkSmartBeaconInterval(int speed) {
}
void checkStandingUpdateTime() {
if (!send_update && lastTx >= Config.standingUpdateTime*60*1000) {
send_update = true;
if (!sendUpdate && lastTx >= Config.standingUpdateTime*60*1000) {
sendUpdate = true;
sendStandingUpdate = true;
}
}
@ -356,9 +373,35 @@ void checkSmartBeaconState() {
if (!currentBeacon->smartBeaconState) {
uint32_t lastTxSmartBeacon = millis() - lastTxTime;
if (lastTxSmartBeacon >= Config.nonSmartBeaconRate*60*1000) {
send_update = true;
sendUpdate = true;
}
}
}
void sendBeacon() {
String packet = currentBeacon->callsign + ">APLRT1,WIDE1-1:!" + Config.overlay;
packet += GPS_Utils::encondeGPS();
if (currentBeacon->comment != "") {
packet += currentBeacon->comment;
}
logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "Loop", "%s", packet.c_str());
show_display("<<< TX >>>", "", packet);
LoRa_Utils::sendNewPacket(packet);
if (currentBeacon->smartBeaconState) {
lastTxLat = gps.location.lat();
lastTxLng = gps.location.lng();
previousHeading = currentHeading;
lastTxDistance = 0.0;
}
lastTxTime = millis();
sendUpdate = false;
if (statusState) {
utils::startingStatus();
}
}
}

View File

@ -16,6 +16,7 @@ void orderListenedTrackersByDistance(String callsign, float distance, float cour
void checkSmartBeaconInterval(int speed);
void checkStandingUpdateTime();
void checkSmartBeaconState();
void sendBeacon();
}

View File

@ -5,7 +5,7 @@
extern Beacon *currentBeacon;
extern Configuration Config;
extern bool statusAfterBootState;
extern bool statusState;
extern bool displayEcoMode;
extern uint32_t displayTime;
extern bool displayState;
@ -47,7 +47,7 @@ String createTimeString(time_t t) {
void startingStatus() {
delay(3000);
LoRa_Utils::sendNewPacket(currentBeacon->callsign + ">APLRT1,WIDE1-1:>https://github.com/richonguzman/LoRa_APRS_Tracker");
statusAfterBootState = false;
statusState = false;
}
void checkDisplayEcoMode() {