diff --git a/src/LoRa_APRS_Tracker.cpp b/src/LoRa_APRS_Tracker.cpp index accd837..f3749f2 100644 --- a/src/LoRa_APRS_Tracker.cpp +++ b/src/LoRa_APRS_Tracker.cpp @@ -117,15 +117,16 @@ bool miceActive = false; 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 ackNumberRequest = ""; // cual ack espero -String ackCallsignRequest = ""; // de quien espero ack -String ackNumberRequest = ""; // cual ack espero - -int ackRequestNumber; // si -bool ackRequestState = false; +// String ackDataExpected = ""; uint32_t lastRetryTime = millis(); -uint32_t lastMsgRxTime = millis(); +// uint8_t winlinkStatus = 0; String winlinkMailNumber = "_?"; @@ -224,8 +225,6 @@ void loop() { miceActive = Config.validateMicE(currentBeacon->micE); } STATION_Utils::checkSmartBeaconValue(); - - //if (ackNumberSend >= 999) ackNumberSend = 1; // mover ?? POWER_Utils::batteryManager(); diff --git a/src/keyboard_utils.cpp b/src/keyboard_utils.cpp index 226d467..e5dc927 100644 --- a/src/keyboard_utils.cpp +++ b/src/keyboard_utils.cpp @@ -461,16 +461,13 @@ namespace KEYBOARD_Utils { } else if (menuDisplay == 5062) { menuDisplay = 50620; } else if (menuDisplay == 5063) { - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "AL"); } else if (menuDisplay == 5070) { - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "B"); menuDisplay = 5; } else if (menuDisplay == 5080) { menuDisplay = 5081; } else if (menuDisplay == 5084) { - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "/EX"); winlinkAddressee = ""; winlinkSubject = ""; @@ -602,12 +599,10 @@ namespace KEYBOARD_Utils { } else if ((menuDisplay == 5021 || menuDisplay == 5031 || menuDisplay == 5041 || menuDisplay == 5051) && key == 8) { winlinkMailNumber = "_?"; } else if (menuDisplay == 5021 && key == 13 && winlinkMailNumber != "_?") { - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "R" + winlinkMailNumber); winlinkMailNumber = "_?"; menuDisplay = 5020; } else if (menuDisplay == 5031 && key == 13 && winlinkMailNumber != "_?") { - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "Y" + winlinkMailNumber); winlinkMailNumber = "_?"; menuDisplay = 5083; @@ -621,7 +616,6 @@ namespace KEYBOARD_Utils { winlinkAddressee += key; } else if (key == 13 && winlinkAddressee.length() > 0) { winlinkAddressee.trim(); - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "F" + winlinkMailNumber + " " + winlinkAddressee); winlinkMailNumber = "_?"; winlinkAddressee = ""; @@ -633,7 +627,6 @@ namespace KEYBOARD_Utils { winlinkAddressee = ""; } } else if (menuDisplay == 5051 && key == 13 && winlinkMailNumber !="_?") { - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "K" + winlinkMailNumber); winlinkMailNumber = "_?"; menuDisplay = 5050; @@ -660,7 +653,6 @@ namespace KEYBOARD_Utils { winlinkAliasComplete += key; } else if (key == 13 && winlinkAliasComplete.length()>= 1) { winlinkAliasComplete.trim(); - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "A " + winlinkAlias + "=" + winlinkAliasComplete); winlinkAlias = ""; winlinkAliasComplete = ""; @@ -679,7 +671,6 @@ namespace KEYBOARD_Utils { winlinkAlias += key; } else if (key == 13 && winlinkAlias.length()>= 1) { winlinkAlias.trim(); - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "A " + winlinkAlias + "="); winlinkAlias = ""; menuDisplay = 5062; @@ -712,7 +703,6 @@ namespace KEYBOARD_Utils { winlinkSubject += key; } else if (key == 13 && winlinkSubject.length() > 0) { winlinkSubject.trim(); - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", "SP " + winlinkAddressee + " " + winlinkSubject); menuDisplay = 5083; } else if (key == 8) { @@ -729,7 +719,6 @@ namespace KEYBOARD_Utils { winlinkBody += key; } else if (key == 13 && winlinkBody.length() <= 67) { winlinkBody.trim(); - // reemplazar con buffer MSG_Utils::addToOutputBuffer(1, "WLNK-1", winlinkBody); menuDisplay = 5084; } else if (key == 8) { diff --git a/src/msg_utils.cpp b/src/msg_utils.cpp index 2e17f02..3b2e3d5 100644 --- a/src/msg_utils.cpp +++ b/src/msg_utils.cpp @@ -31,11 +31,13 @@ extern bool digirepeaterActive; extern String ackCallsignRequest; extern String ackNumberRequest; - -extern int ackRequestNumber; //si -//extern int ackNumberSend; -extern String ackDataExpected; extern bool ackRequestState; +extern int ackRequestNumber; + +// +extern uint32_t lastTxTime; +extern String ackDataExpected; + extern uint8_t winlinkStatus; 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); #if HAS_TFT cleanTFT(); #endif - /*if (textMessage.indexOf("ack") == 0) { - if (station != "WLNK-1") { // don't show Winlink ACK - show_display("<>", 500); - } + if (textMessage.indexOf("ack") == 0 && station != "WLNK-1") { // don't show Winlink ACK + show_display("<>", 500); } else if (station.indexOf("CA2RXU-15") == 0 && textMessage.indexOf("wrl") == 0) { show_display("","", "--- Sending Query ---", 1000); } else { @@ -244,12 +244,6 @@ namespace MSG_Utils { 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); } @@ -269,75 +263,73 @@ namespace MSG_Utils { } } - void processOutputBuffer() { // todos los mensajes de salida deben llegar a este buffer !!! - - /* 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) { + void processOutputBuffer() { + if (!outputMessagesBuffer.empty() && (millis() - lastMsgRxTime) >= 4500 && (millis() - lastTxTime) > 3000) { String addressee = outputMessagesBuffer[0].substring(0, outputMessagesBuffer[0].indexOf(",")); - String payload = outputMessagesBuffer[0].substring(outputMessagesBuffer[0].indexOf(",") + 1); - if (payload.indexOf("{") > 0) { // message Has ack Request - outputAckRequestBuffer.push_back("5," + addressee + "," + payload); // 5 is for ack packets retries + String message = outputMessagesBuffer[0].substring(outputMessagesBuffer[0].indexOf(",") + 1); + if (message.indexOf("{") > 0) { // message with ack Request + outputAckRequestBuffer.push_back("6," + addressee + "," + message); // 5 is for ack packets retries outputMessagesBuffer.erase(outputMessagesBuffer.begin()); - lastMsgRxTime = millis(); // ?? - } else { // Normal message without ack Request - /*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?? + } else { // message without ack Request + sendMessage(addressee, message); outputMessagesBuffer.erase(outputMessagesBuffer.begin()); - lastMsgRxTime = millis(); // ? + lastTxTime = millis(); } } if (outputAckRequestBuffer.empty()) { - ackRequestState = false; /// validar que donde se escuchan packets se revise si recibio X ack para sacarlo de los retrys - } else if (!outputAckRequestBuffer.empty() && lastOutputBufferTx >= 4500) { - /* asegurarse que la creacion del mensaje desde su origen agregue el ackNumber y no en el sendMessage!!! */ + ackRequestState = false; + } else if (!outputAckRequestBuffer.empty() && (millis() - lastMsgRxTime) >= 4500 && (millis() - lastTxTime) > 3000) { bool sendRetry = false; - String triesLeftString = outputAckRequestBuffer[0].substring(0 , outputAckRequestBuffer[0].indexOf(",")); - int triesLeft = triesLeftString.toInt(); - switch (triesLeft) { - case 5: + String triesLeft = outputAckRequestBuffer[0].substring(0 , outputAckRequestBuffer[0].indexOf(",")); + switch (triesLeft.toInt()) { + case 6: sendRetry = true; + ackRequestState = true; + break; + case 5: + if (millis() - lastRetryTime > 30 * 1000) sendRetry = true; break; case 4: - if (millis() - lastRetryTime > 30 * 1000) sendRetry = true; + if (millis() - lastRetryTime > 60 * 1000) sendRetry = true; break; case 3: - if (millis() - lastRetryTime > 30 * 1000) sendRetry = true; + if (millis() - lastRetryTime > 120 * 1000) sendRetry = true; break; case 2: - if (millis() - lastRetryTime > 90 * 1000) sendRetry = true; + if (millis() - lastRetryTime > 120 * 1000) sendRetry = true; break; 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; } if (sendRetry) { String rest = outputAckRequestBuffer[0].substring(outputAckRequestBuffer[0].indexOf(",") + 1); ackCallsignRequest = rest.substring(0, rest.indexOf(",")); String payload = rest.substring(rest.indexOf(",") + 1); - ackNumberRequest = payload.substring(payload.indexOf("{") + 1); - ackRequestState = true; - sendMessage(1, ackCallsignRequest, payload); // cambiar "1" !!! //????? cero?? + ackNumberRequest = payload.substring(payload.indexOf("{") + 1); + sendMessage(ackCallsignRequest, payload); + lastTxTime = millis(); lastRetryTime = millis(); - if (triesLeft == 1) { - outputAckRequestBuffer.erase(outputAckRequestBuffer.begin()); - } else { - outputAckRequestBuffer[0] = String(triesLeft - 1) + "," + ackCallsignRequest + "," + payload; - } + outputAckRequestBuffer[0] = String(triesLeft.toInt() - 1) + "," + ackCallsignRequest + "," + payload; } - } - } 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()) { return; } @@ -372,7 +364,8 @@ namespace MSG_Utils { if (ackRequestState && lastReceivedPacket.message.indexOf("ack") == 0) { ackAnswer = lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("ack") + 3); 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) { String ackMessage = "ack" + lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("{") + 1); ackMessage.trim(); - addToOutputBuffer(0, lastReceivedPacket.sender, ackMessage); + MSG_Utils::addToOutputBuffer(0, lastReceivedPacket.sender, ackMessage); lastMsgRxTime = millis(); 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) { 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 Serial.println("Weather Report Received"); @@ -427,19 +420,10 @@ namespace MSG_Utils { } else if (lastReceivedPacket.message.indexOf("Login [") == 0) { logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Winlink","---> Challenge received"); WINLINK_Utils::processWinlinkChallenge(lastReceivedPacket.message.substring(lastReceivedPacket.message.indexOf("[")+1,lastReceivedPacket.message.indexOf("]"))); - // controlar en proceso anterior tirar al outputMessagesBuffer tambien! lastMsgRxTime = millis(); winlinkStatus = 3; menuDisplay = 501; - } /* - 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) { + } else if (winlinkStatus == 3 && ackNumberRequest == ackAnswer) { logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Winlink","---> Challenge Answer Send"); // edit show_display : Challenge Answer Send!!!! lastMsgRxTime = millis(); winlinkStatus = 4; diff --git a/src/msg_utils.h b/src/msg_utils.h index 69f5a4b..65001bc 100644 --- a/src/msg_utils.h +++ b/src/msg_utils.h @@ -16,7 +16,7 @@ namespace MSG_Utils { void ledNotification(); void deleteFile(String typeOfFile); 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(); void addToOutputBuffer(uint8_t typeOfMessage, String station, String textMessage); void processOutputBuffer();