From e11c84a5ed09f20a8ba75cd2663f515f48c414bb Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Wed, 27 Apr 2022 18:21:32 +0200 Subject: [PATCH] update --- linux/boardtest/UartTestClass.cpp | 63 +++++++++++++++++++------------ linux/boardtest/UartTestClass.h | 4 +- linux/devices/ScexHelper.cpp | 2 +- linux/devices/ScexUartReader.cpp | 11 +++--- linux/devices/ScexUartReader.h | 1 - 5 files changed, 47 insertions(+), 34 deletions(-) diff --git a/linux/boardtest/UartTestClass.cpp b/linux/boardtest/UartTestClass.cpp index 12404269..27e8d02e 100644 --- a/linux/boardtest/UartTestClass.cpp +++ b/linux/boardtest/UartTestClass.cpp @@ -156,7 +156,7 @@ void UartTestClass::scexInit() { std::string devname = "/dev/ul-scex"; #endif uartCookie = new UartCookie(this->getObjectId(), devname, UartBaudRate::RATE_57600, 4096); - reader->setDebugMode(true); + reader->setDebugMode(false); ReturnValue_t result = reader->initializeInterface(uartCookie); if (result != HasReturnvaluesIF::RETURN_OK) { sif::warning << "UartTestClass::gpsPeriodic: Initializing SCEX reader " @@ -186,9 +186,11 @@ void UartTestClass::scexPeriodic() { if (cmdSent and not cmdDone) { uint8_t* decodedPacket = nullptr; size_t len = 0; - ReturnValue_t result = reader->readReceivedMessage(uartCookie, &decodedPacket, &len); - - if (len > 0) { + do { + ReturnValue_t result = reader->readReceivedMessage(uartCookie, &decodedPacket, &len); + if(len == 0){ + break; + } ScexHelper helper; const uint8_t* helperPtr = decodedPacket; result = helper.deSerialize(&helperPtr, &len); @@ -197,25 +199,35 @@ void UartTestClass::scexPeriodic() { } sif::info << helper << endl; - //ping - //if ping cmd - if(helper.getCmd() == PING) { - ofstream out("/tmp/scex-ping.bin", ofstream::binary ); - if (out.bad()) { - sif::warning << "bad" < - //countdown (max 2min), wenn nicht if (helper.getPacketCounter() == helper.getTotalPacketCounter()) { nach 2min reader->finish(); - if(helper.getCmd() == FRAM) { - if(helper.getPacketCounter() == 0) { - ofstream out("/tmp/scex-fram.bin", ofstream::binary ); // neues file anlegen wie oben ping - } else { - ofstream out("/tmp/scex-fram.bin", ofstream::binary | ofstream::app );// an bestehendes file hinzufügen - out << helper; - } + // fram + // packetcounter eins höher, wenn mehr packet verloren -> merkt sich welches packet fehlt + //was wenn erstes packet fehlt; mit boolean var (firstpacketarrived=false) die immer mit finish false wird? + // countdown (max 2min), wenn nicht if (helper.getPacketCounter() == + // helper.getTotalPacketCounter()) { nach 2min reader->finish(); + if (helper.getCmd() == FRAM) { + if (helper.getPacketCounter() == 1) { + //countdown starten + finishCountdown.resetTimer(); + ofstream out("/tmp/scex-fram.bin", + ofstream::binary); // neues file anlegen wie oben ping + } else { + ofstream out("/tmp/scex-fram.bin", + ofstream::binary | ofstream::app); // an bestehendes file hinzufügen + out << helper; + } + + if(finishCountdown.hasTimedOut()){ + reader->finish(); + } } if (helper.getPacketCounter() == helper.getTotalPacketCounter()) { @@ -226,7 +238,7 @@ void UartTestClass::scexPeriodic() { cmdSent = false; } } - } + } while (len > 0); } } } @@ -313,8 +325,9 @@ void UartTestClass::scexSimplePeriodic() { << errno << ", " << strerror(errno) << "]" << std::endl; break; } else if (bytesRead >= static_cast(recBuf.size())) { - sif::debug << "UartTestClass::performPeriodicAction: recv buffer might not be large enough" - << std::endl; + sif::debug << "UartTestClass::performPeriodicAction: recv buffer might not be large " + "enough, bytes read:" + << bytesRead << std::endl; } else if (bytesRead > 0) { dleParser->passData(recBuf.data(), bytesRead); if (currCmd == ScexCmds::PING) { diff --git a/linux/boardtest/UartTestClass.h b/linux/boardtest/UartTestClass.h index 0a228782..28a8b8a7 100644 --- a/linux/boardtest/UartTestClass.h +++ b/linux/boardtest/UartTestClass.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include // Contains POSIX terminal control definitions @@ -46,6 +47,7 @@ class UartTestClass : public TestTask { static void foundDlePacketHandler(const DleParser::Context& ctx); void handleFoundDlePacket(uint8_t* packet, size_t len); + Countdown finishCountdown = Countdown(180 * 1000); bool cmdSent = false; bool cmdDone = false; scex::ScexCmds currCmd = scex::ScexCmds::PING; @@ -59,7 +61,7 @@ class UartTestClass : public TestTask { bool startFound = false; ScexUartReader* reader = nullptr; std::array cmdBuf = {}; - std::array recBuf = {}; + std::array recBuf = {}; ScexDleParser* dleParser; scex::ScexCmds cmdHelper; uint8_t recvCnt = 0; diff --git a/linux/devices/ScexHelper.cpp b/linux/devices/ScexHelper.cpp index bc7ee04f..ca29ff65 100644 --- a/linux/devices/ScexHelper.cpp +++ b/linux/devices/ScexHelper.cpp @@ -71,7 +71,7 @@ std::ostream& operator<<(std::ostream& os, const ScexHelper& h) { sif::info << "PacketCounter: " << h.packetCounter << endl; sif::info << "TotalPacketCount: " << h.totalPacketCounter << endl; sif::info << "PayloadLength: " << h.payloadLen << endl; - sif::info << "TotalPacketLength: " << h.totalPacketLen << endl; + sif::info << "TotalPacketLength: " << h.totalPacketLen; return os; } diff --git a/linux/devices/ScexUartReader.cpp b/linux/devices/ScexUartReader.cpp index cfac79e4..517ee4a1 100644 --- a/linux/devices/ScexUartReader.cpp +++ b/linux/devices/ScexUartReader.cpp @@ -45,13 +45,14 @@ ReturnValue_t ScexUartReader::performOperation(uint8_t operationCode) { state = States::IDLE; break; } - TaskFactory::delayTask(1000); + TaskFactory::delayTask(400); } else if (bytesRead < 0) { sif::warning << "ScexUartReader::performOperation: read call failed with error [" << errno << ", " << strerror(errno) << "]" << std::endl; break; } else if (bytesRead >= static_cast(recBuf.size())) { - sif::error << "ScexUartReader::performOperation: Receive buffer too small for " << bytesRead << " bytes" << std::endl; + sif::error << "ScexUartReader::performOperation: Receive buffer too small for " << bytesRead + << " bytes" << std::endl; } else if (bytesRead > 0) { ReturnValue_t result = dleParser.passData(recBuf.data(), bytesRead); if (debugMode) { @@ -76,7 +77,6 @@ ReturnValue_t ScexUartReader::initializeInterface(CookieIF *cookie) { return RETURN_FAILED; } std::string devname = uartCookie->getDeviceFile(); - sif::info << devname << std::endl; /* Get file descriptor */ serialPort = open(devname.c_str(), O_RDWR); if (serialPort < 0) { @@ -171,7 +171,7 @@ void ScexUartReader::foundDlePacketHandler(const DleParser::Context &ctx) { void ScexUartReader::handleFoundDlePacket(uint8_t *packet, size_t len) { // TODO: insert data into IPC ring buffer here - sif::info << "Detected DLE encoded packet with decoded size " << len << std::endl; + // sif::info << "Detected DLE encoded packet with decoded size " << len << std::endl; MutexGuard mg(lock); ReturnValue_t result = ipcQueue.insert(len); if (result != RETURN_OK) { @@ -181,7 +181,7 @@ void ScexUartReader::handleFoundDlePacket(uint8_t *packet, size_t len) { if (result != RETURN_OK) { sif::warning << "IPCRingBuf error" << std::endl; } - sif::info << "DLE handler done" << std::endl; + // sif::info << "DLE handler done" << std::endl; } ReturnValue_t ScexUartReader::readReceivedMessage(CookieIF *cookie, uint8_t **buffer, @@ -191,7 +191,6 @@ ReturnValue_t ScexUartReader::readReceivedMessage(CookieIF *cookie, uint8_t **bu *size = 0; return RETURN_OK; } - sif::info << "returning data" << std::endl; ipcQueue.retrieve(size); *buffer = ipcBuffer.data(); ReturnValue_t result = ipcRingBuf.readData(ipcBuffer.data(), *size, true); diff --git a/linux/devices/ScexUartReader.h b/linux/devices/ScexUartReader.h index 4cebb31e..4abbfd86 100644 --- a/linux/devices/ScexUartReader.h +++ b/linux/devices/ScexUartReader.h @@ -37,7 +37,6 @@ class ScexUartReader : public SystemObject, // strg+shift+n DleEncoder dleEncoder = DleEncoder(); SimpleRingBuffer decodeRingBuf; - Countdown finishCountdown = Countdown(180 * 1000); std::array cmdbuf = {}; std::array recBuf = {}; std::array encodedBuf = {};