outputBufferTest1

This commit is contained in:
richonguzman 2024-05-06 21:04:15 -04:00
parent ba42204f03
commit 9f691f126e
4 changed files with 61 additions and 89 deletions

View File

@ -117,15 +117,16 @@ bool miceActive = false;
bool smartBeaconValue = true; bool smartBeaconValue = true;
int ackRequestNumber; // numero generado para los request que se pediran
uint32_t lastMsgRxTime = millis(); // tiempo que se actualiza de cada mensaje recibido
bool ackRequestState = false; // activa proceso escucha/espera de ack enviado.
String ackCallsignRequest = ""; // de quien espero ack String ackCallsignRequest = ""; // de quien espero ack
String ackNumberRequest = ""; // cual ack espero String ackNumberRequest = ""; // cual ack espero
int ackRequestNumber; // si //
bool ackRequestState = false;
String ackDataExpected = ""; String ackDataExpected = "";
uint32_t lastRetryTime = millis(); uint32_t lastRetryTime = millis();
uint32_t lastMsgRxTime = millis(); //
uint8_t winlinkStatus = 0; uint8_t winlinkStatus = 0;
String winlinkMailNumber = "_?"; String winlinkMailNumber = "_?";
@ -225,8 +226,6 @@ void loop() {
} }
STATION_Utils::checkSmartBeaconValue(); STATION_Utils::checkSmartBeaconValue();
//if (ackNumberSend >= 999) ackNumberSend = 1; // mover ??
POWER_Utils::batteryManager(); POWER_Utils::batteryManager();
if (!Config.simplifiedTrackerMode) { if (!Config.simplifiedTrackerMode) {

View File

@ -461,16 +461,13 @@ namespace KEYBOARD_Utils {
} else if (menuDisplay == 5062) { } else if (menuDisplay == 5062) {
menuDisplay = 50620; menuDisplay = 50620;
} else if (menuDisplay == 5063) { } else if (menuDisplay == 5063) {
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "AL"); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "AL");
} else if (menuDisplay == 5070) { } else if (menuDisplay == 5070) {
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "B"); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "B");
menuDisplay = 5; menuDisplay = 5;
} else if (menuDisplay == 5080) { } else if (menuDisplay == 5080) {
menuDisplay = 5081; menuDisplay = 5081;
} else if (menuDisplay == 5084) { } else if (menuDisplay == 5084) {
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "/EX"); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "/EX");
winlinkAddressee = ""; winlinkAddressee = "";
winlinkSubject = ""; winlinkSubject = "";
@ -602,12 +599,10 @@ namespace KEYBOARD_Utils {
} else if ((menuDisplay == 5021 || menuDisplay == 5031 || menuDisplay == 5041 || menuDisplay == 5051) && key == 8) { } else if ((menuDisplay == 5021 || menuDisplay == 5031 || menuDisplay == 5041 || menuDisplay == 5051) && key == 8) {
winlinkMailNumber = "_?"; winlinkMailNumber = "_?";
} else if (menuDisplay == 5021 && key == 13 && winlinkMailNumber != "_?") { } else if (menuDisplay == 5021 && key == 13 && winlinkMailNumber != "_?") {
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "R" + winlinkMailNumber); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "R" + winlinkMailNumber);
winlinkMailNumber = "_?"; winlinkMailNumber = "_?";
menuDisplay = 5020; menuDisplay = 5020;
} else if (menuDisplay == 5031 && key == 13 && winlinkMailNumber != "_?") { } else if (menuDisplay == 5031 && key == 13 && winlinkMailNumber != "_?") {
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "Y" + winlinkMailNumber); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "Y" + winlinkMailNumber);
winlinkMailNumber = "_?"; winlinkMailNumber = "_?";
menuDisplay = 5083; menuDisplay = 5083;
@ -621,7 +616,6 @@ namespace KEYBOARD_Utils {
winlinkAddressee += key; winlinkAddressee += key;
} else if (key == 13 && winlinkAddressee.length() > 0) { } else if (key == 13 && winlinkAddressee.length() > 0) {
winlinkAddressee.trim(); winlinkAddressee.trim();
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "F" + winlinkMailNumber + " " + winlinkAddressee); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "F" + winlinkMailNumber + " " + winlinkAddressee);
winlinkMailNumber = "_?"; winlinkMailNumber = "_?";
winlinkAddressee = ""; winlinkAddressee = "";
@ -633,7 +627,6 @@ namespace KEYBOARD_Utils {
winlinkAddressee = ""; winlinkAddressee = "";
} }
} else if (menuDisplay == 5051 && key == 13 && winlinkMailNumber !="_?") { } else if (menuDisplay == 5051 && key == 13 && winlinkMailNumber !="_?") {
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "K" + winlinkMailNumber); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "K" + winlinkMailNumber);
winlinkMailNumber = "_?"; winlinkMailNumber = "_?";
menuDisplay = 5050; menuDisplay = 5050;
@ -660,7 +653,6 @@ namespace KEYBOARD_Utils {
winlinkAliasComplete += key; winlinkAliasComplete += key;
} else if (key == 13 && winlinkAliasComplete.length()>= 1) { } else if (key == 13 && winlinkAliasComplete.length()>= 1) {
winlinkAliasComplete.trim(); winlinkAliasComplete.trim();
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "A " + winlinkAlias + "=" + winlinkAliasComplete); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "A " + winlinkAlias + "=" + winlinkAliasComplete);
winlinkAlias = ""; winlinkAlias = "";
winlinkAliasComplete = ""; winlinkAliasComplete = "";
@ -679,7 +671,6 @@ namespace KEYBOARD_Utils {
winlinkAlias += key; winlinkAlias += key;
} else if (key == 13 && winlinkAlias.length()>= 1) { } else if (key == 13 && winlinkAlias.length()>= 1) {
winlinkAlias.trim(); winlinkAlias.trim();
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "A " + winlinkAlias + "="); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "A " + winlinkAlias + "=");
winlinkAlias = ""; winlinkAlias = "";
menuDisplay = 5062; menuDisplay = 5062;
@ -712,7 +703,6 @@ namespace KEYBOARD_Utils {
winlinkSubject += key; winlinkSubject += key;
} else if (key == 13 && winlinkSubject.length() > 0) { } else if (key == 13 && winlinkSubject.length() > 0) {
winlinkSubject.trim(); winlinkSubject.trim();
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", "SP " + winlinkAddressee + " " + winlinkSubject); MSG_Utils::addToOutputBuffer(1, "WLNK-1", "SP " + winlinkAddressee + " " + winlinkSubject);
menuDisplay = 5083; menuDisplay = 5083;
} else if (key == 8) { } else if (key == 8) {
@ -729,7 +719,6 @@ namespace KEYBOARD_Utils {
winlinkBody += key; winlinkBody += key;
} else if (key == 13 && winlinkBody.length() <= 67) { } else if (key == 13 && winlinkBody.length() <= 67) {
winlinkBody.trim(); winlinkBody.trim();
// reemplazar con buffer
MSG_Utils::addToOutputBuffer(1, "WLNK-1", winlinkBody); MSG_Utils::addToOutputBuffer(1, "WLNK-1", winlinkBody);
menuDisplay = 5084; menuDisplay = 5084;
} else if (key == 8) { } else if (key == 8) {

View File

@ -31,11 +31,13 @@ extern bool digirepeaterActive;
extern String ackCallsignRequest; extern String ackCallsignRequest;
extern String ackNumberRequest; extern String ackNumberRequest;
extern int ackRequestNumber; //si
//extern int ackNumberSend;
extern String ackDataExpected;
extern bool ackRequestState; extern bool ackRequestState;
extern int ackRequestNumber;
//
extern uint32_t lastTxTime;
extern String ackDataExpected;
extern uint8_t winlinkStatus; extern uint8_t winlinkStatus;
extern APRSPacket lastReceivedPacket; extern APRSPacket lastReceivedPacket;
@ -226,15 +228,13 @@ namespace MSG_Utils {
} }
} }
void sendMessage(uint8_t typeOfMessage, String station, String textMessage) { void sendMessage(String station, String textMessage) {
String newPacket = APRSPacketLib::generateMessagePacket(currentBeacon->callsign, "APLRT1", Config.path, station, textMessage); String newPacket = APRSPacketLib::generateMessagePacket(currentBeacon->callsign, "APLRT1", Config.path, station, textMessage);
#if HAS_TFT #if HAS_TFT
cleanTFT(); cleanTFT();
#endif #endif
/*if (textMessage.indexOf("ack") == 0) { if (textMessage.indexOf("ack") == 0 && station != "WLNK-1") { // don't show Winlink ACK
if (station != "WLNK-1") { // don't show Winlink ACK
show_display("<<ACK Tx>>", 500); show_display("<<ACK Tx>>", 500);
}
} else if (station.indexOf("CA2RXU-15") == 0 && textMessage.indexOf("wrl") == 0) { } else if (station.indexOf("CA2RXU-15") == 0 && textMessage.indexOf("wrl") == 0) {
show_display("<WEATHER>","", "--- Sending Query ---", 1000); show_display("<WEATHER>","", "--- Sending Query ---", 1000);
} else { } else {
@ -244,12 +244,6 @@ namespace MSG_Utils {
show_display("MSG Tx >>", "", newPacket, 1000); show_display("MSG Tx >>", "", newPacket, 1000);
} }
} }
if (typeOfMessage == 1) { //forced to send MSG with ack confirmation
ackNumberSend++;
newPacket += "{" + String(ackNumberSend);
}*/
// MSG_Utils::addToOutputBuffer
LoRa_Utils::sendNewPacket(newPacket); LoRa_Utils::sendNewPacket(newPacket);
} }
@ -269,53 +263,49 @@ namespace MSG_Utils {
} }
} }
void processOutputBuffer() { // todos los mensajes de salida deben llegar a este buffer !!! void processOutputBuffer() {
if (!outputMessagesBuffer.empty() && (millis() - lastMsgRxTime) >= 4500 && (millis() - lastTxTime) > 3000) {
/* no olvidar revisar que los mensajes no se envien muy pronto despues de gps
ni los de gps despues de mensajes
lastOutputBufferTx ????
lastMsgRxTime??
*/
uint32_t lastOutputBufferTx = millis() - lastMsgRxTime;
if (!outputMessagesBuffer.empty() && lastOutputBufferTx >= 4500) {
String addressee = outputMessagesBuffer[0].substring(0, outputMessagesBuffer[0].indexOf(",")); String addressee = outputMessagesBuffer[0].substring(0, outputMessagesBuffer[0].indexOf(","));
String payload = outputMessagesBuffer[0].substring(outputMessagesBuffer[0].indexOf(",") + 1); String message = outputMessagesBuffer[0].substring(outputMessagesBuffer[0].indexOf(",") + 1);
if (payload.indexOf("{") > 0) { // message Has ack Request if (message.indexOf("{") > 0) { // message with ack Request
outputAckRequestBuffer.push_back("5," + addressee + "," + payload); // 5 is for ack packets retries outputAckRequestBuffer.push_back("6," + addressee + "," + message); // 5 is for ack packets retries
outputMessagesBuffer.erase(outputMessagesBuffer.begin()); outputMessagesBuffer.erase(outputMessagesBuffer.begin());
lastMsgRxTime = millis(); // ?? } else { // message without ack Request
} else { // Normal message without ack Request sendMessage(addressee, message);
/*unit32-t lastPacketTx = millis() - lastTxTime;
if (lastPacketTx > 7 * 1000) { // no enviar un mensaje antes de 7 segundos del ultimo gps.
}*/
sendMessage(0, addressee, payload); //????? cero??
outputMessagesBuffer.erase(outputMessagesBuffer.begin()); outputMessagesBuffer.erase(outputMessagesBuffer.begin());
lastMsgRxTime = millis(); // ? lastTxTime = millis();
} }
} }
if (outputAckRequestBuffer.empty()) { if (outputAckRequestBuffer.empty()) {
ackRequestState = false; /// validar que donde se escuchan packets se revise si recibio X ack para sacarlo de los retrys ackRequestState = false;
} else if (!outputAckRequestBuffer.empty() && lastOutputBufferTx >= 4500) { } else if (!outputAckRequestBuffer.empty() && (millis() - lastMsgRxTime) >= 4500 && (millis() - lastTxTime) > 3000) {
/* asegurarse que la creacion del mensaje desde su origen agregue el ackNumber y no en el sendMessage!!! */
bool sendRetry = false; bool sendRetry = false;
String triesLeftString = outputAckRequestBuffer[0].substring(0 , outputAckRequestBuffer[0].indexOf(",")); String triesLeft = outputAckRequestBuffer[0].substring(0 , outputAckRequestBuffer[0].indexOf(","));
int triesLeft = triesLeftString.toInt(); switch (triesLeft.toInt()) {
switch (triesLeft) { case 6:
case 5:
sendRetry = true; sendRetry = true;
ackRequestState = true;
break;
case 5:
if (millis() - lastRetryTime > 30 * 1000) sendRetry = true;
break; break;
case 4: case 4:
if (millis() - lastRetryTime > 30 * 1000) sendRetry = true; if (millis() - lastRetryTime > 60 * 1000) sendRetry = true;
break; break;
case 3: case 3:
if (millis() - lastRetryTime > 30 * 1000) sendRetry = true; if (millis() - lastRetryTime > 120 * 1000) sendRetry = true;
break; break;
case 2: case 2:
if (millis() - lastRetryTime > 90 * 1000) sendRetry = true; if (millis() - lastRetryTime > 120 * 1000) sendRetry = true;
break; break;
case 1: case 1:
if (millis() - lastRetryTime > 180 * 1000) sendRetry = true; if (millis() - lastRetryTime > 120 * 1000) sendRetry = true;
break;
case 0:
if (millis() - lastRetryTime > 30 * 1000) {
ackRequestNumber = false;
outputAckRequestBuffer.erase(outputAckRequestBuffer.begin());
}
break; break;
} }
if (sendRetry) { if (sendRetry) {
@ -323,21 +313,23 @@ namespace MSG_Utils {
ackCallsignRequest = rest.substring(0, rest.indexOf(",")); ackCallsignRequest = rest.substring(0, rest.indexOf(","));
String payload = rest.substring(rest.indexOf(",") + 1); String payload = rest.substring(rest.indexOf(",") + 1);
ackNumberRequest = payload.substring(payload.indexOf("{") + 1); ackNumberRequest = payload.substring(payload.indexOf("{") + 1);
ackRequestState = true; sendMessage(ackCallsignRequest, payload);
sendMessage(1, ackCallsignRequest, payload); // cambiar "1" !!! //????? cero?? lastTxTime = millis();
lastRetryTime = millis(); lastRetryTime = millis();
if (triesLeft == 1) { outputAckRequestBuffer[0] = String(triesLeft.toInt() - 1) + "," + ackCallsignRequest + "," + payload;
outputAckRequestBuffer.erase(outputAckRequestBuffer.begin());
} else {
outputAckRequestBuffer[0] = String(triesLeft - 1) + "," + ackCallsignRequest + "," + payload;
} }
} }
}
} }
void checkReceivedMessage(ReceivedLoRaPacket packet) { void checkReceivedMessage(ReceivedLoRaPacket packet) {
/*
agregar revisor de no escuchar o pescar el mismo packet que recien escucho hace X segundos... buffer de 5 o 10?
*/
if(packet.text.isEmpty()) { if(packet.text.isEmpty()) {
return; return;
} }
@ -372,7 +364,8 @@ namespace MSG_Utils {
if (ackRequestState && lastReceivedPacket.message.indexOf("ack") == 0) { if (ackRequestState && lastReceivedPacket.message.indexOf("ack") == 0) {
ackAnswer = lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("ack") + 3); ackAnswer = lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("ack") + 3);
if (ackCallsignRequest == lastReceivedPacket.sender && ackNumberRequest == ackAnswer) { if (ackCallsignRequest == lastReceivedPacket.sender && ackNumberRequest == ackAnswer) {
// lo saco del buffer de ackrequest outputAckRequestBuffer.erase(outputAckRequestBuffer.begin());
ackRequestState = false;
} }
} }
// //
@ -380,7 +373,7 @@ namespace MSG_Utils {
if (lastReceivedPacket.message.indexOf("{") >= 0) { if (lastReceivedPacket.message.indexOf("{") >= 0) {
String ackMessage = "ack" + lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("{") + 1); String ackMessage = "ack" + lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("{") + 1);
ackMessage.trim(); ackMessage.trim();
addToOutputBuffer(0, lastReceivedPacket.sender, ackMessage); MSG_Utils::addToOutputBuffer(0, lastReceivedPacket.sender, ackMessage);
lastMsgRxTime = millis(); lastMsgRxTime = millis();
lastReceivedPacket.message = lastReceivedPacket.message.substring(0, lastReceivedPacket.message.indexOf("{")); lastReceivedPacket.message = lastReceivedPacket.message.substring(0, lastReceivedPacket.message.indexOf("{"));
} }
@ -389,7 +382,7 @@ namespace MSG_Utils {
} }
if (lastReceivedPacket.message.indexOf("ping") == 0 || lastReceivedPacket.message.indexOf("Ping") == 0 || lastReceivedPacket.message.indexOf("PING") == 0) { if (lastReceivedPacket.message.indexOf("ping") == 0 || lastReceivedPacket.message.indexOf("Ping") == 0 || lastReceivedPacket.message.indexOf("PING") == 0) {
lastMsgRxTime = millis(); lastMsgRxTime = millis();
addToOutputBuffer(0, lastReceivedPacket.sender, "pong, 73!"); MSG_Utils::addToOutputBuffer(0, lastReceivedPacket.sender, "pong, 73!");
} }
if (lastReceivedPacket.sender == "CA2RXU-15" && lastReceivedPacket.message.indexOf("WX") == 0) { // WX = WeatherReport if (lastReceivedPacket.sender == "CA2RXU-15" && lastReceivedPacket.message.indexOf("WX") == 0) { // WX = WeatherReport
Serial.println("Weather Report Received"); Serial.println("Weather Report Received");
@ -427,19 +420,10 @@ namespace MSG_Utils {
} else if (lastReceivedPacket.message.indexOf("Login [") == 0) { } else if (lastReceivedPacket.message.indexOf("Login [") == 0) {
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Winlink","---> Challenge received"); logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Winlink","---> Challenge received");
WINLINK_Utils::processWinlinkChallenge(lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("[")+1,lastReceivedPacket.message.indexOf("]"))); WINLINK_Utils::processWinlinkChallenge(lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("[")+1,lastReceivedPacket.message.indexOf("]")));
// controlar en proceso anterior tirar al outputMessagesBuffer tambien!
lastMsgRxTime = millis(); lastMsgRxTime = millis();
winlinkStatus = 3; winlinkStatus = 3;
menuDisplay = 501; menuDisplay = 501;
} /* } else if (winlinkStatus == 3 && ackNumberRequest == ackAnswer) {
que pasa si es que se reinicio pero esta logeado en las 2 horas?
else if (winlinkStatus == 2 && lastReceivedPacket.message.indexOf("Login [") == -1) {
Serial.println("We were already logged to WINLINK!!!!");
show_display("_WINLINK_>", "", " LOGGED !!!!", 2000);
winlinkStatus = 5;
menuDisplay = 5000;
} */else if (winlinkStatus == 3 && ackNumberRequest == ackAnswer) {
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Winlink","---> Challenge Answer Send"); // edit show_display : Challenge Answer Send!!!! logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Winlink","---> Challenge Answer Send"); // edit show_display : Challenge Answer Send!!!!
lastMsgRxTime = millis(); lastMsgRxTime = millis();
winlinkStatus = 4; winlinkStatus = 4;

View File

@ -16,7 +16,7 @@ namespace MSG_Utils {
void ledNotification(); void ledNotification();
void deleteFile(String typeOfFile); void deleteFile(String typeOfFile);
void saveNewMessage(String typeMessage, String station, String newMessage); void saveNewMessage(String typeMessage, String station, String newMessage);
void sendMessage(uint8_t typeOfMessage, String station, String textMessage); void sendMessage(String station, String textMessage);
String ackRequestNumberGenerator(); String ackRequestNumberGenerator();
void addToOutputBuffer(uint8_t typeOfMessage, String station, String textMessage); void addToOutputBuffer(uint8_t typeOfMessage, String station, String textMessage);
void processOutputBuffer(); void processOutputBuffer();