From 13e89e13422b1208b54c18ad533a94486d89ec06 Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Tue, 30 Aug 2022 16:34:24 +0200 Subject: [PATCH 01/14] bump deps --- fsfw | 2 +- tmtc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fsfw b/fsfw index 9a590a3f..141dcb1f 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 9a590a3fcd81ed4dd48de503522b6d71f64205d2 +Subproject commit 141dcb1f149b824b5bd6e5d3339ecb712835751e diff --git a/tmtc b/tmtc index 05dd1738..b1eafd92 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 05dd17386070b9f333977f1f2b9f5651f9053b65 +Subproject commit b1eafd92c202385731a990d3bdba36c48267d63a From b156d7827459912e73080878673a5ef29a68e809 Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Tue, 30 Aug 2022 16:51:30 +0200 Subject: [PATCH 02/14] huh --- CMakeLists.txt | 11 +- bsp_linux_board/InitMission.cpp | 2 +- linux/devices/Max31865RtdLowlevelHandler.cpp | 2 +- linux/devices/ScexUartReader.cpp | 6 +- linux/devices/ploc/PlocSupervisorHandler.cpp | 2 +- mission/devices/ScexDeviceHandler.cpp | 153 +++++++++++-------- 6 files changed, 101 insertions(+), 75 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03b2b512..6dab4525 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -382,10 +382,8 @@ add_subdirectory(${TEST_PATH}) add_subdirectory(${UNITTEST_PATH}) # This should have already been downloaded by the FSFW Still include it to be -# safe -# find_package(etl ${FSFW_ETL_LIB_MAJOR_VERSION} CONFIG QUIET) -# Not installed, so use FetchContent to download and provide etl -# if(NOT etl_FOUND) +# safe find_package(etl ${FSFW_ETL_LIB_MAJOR_VERSION} CONFIG QUIET) Not +# installed, so use FetchContent to download and provide etl if(NOT etl_FOUND) message( STATUS "No ETL installation was found with find_package. Installing and providing " @@ -454,8 +452,9 @@ if(TGT_BSP MATCHES "arm/q7s") target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_GPS} ${LIB_ARCSEC}) endif() -target_link_libraries(${UNITTEST_NAME} PRIVATE Catch2 ${LIB_EIVE_MISSION} - rapidcsv ${LIB_DUMMIES} ${LIB_GOMSPACE_CLIENTS}) +target_link_libraries( + ${UNITTEST_NAME} PRIVATE Catch2 ${LIB_EIVE_MISSION} rapidcsv ${LIB_DUMMIES} + ${LIB_GOMSPACE_CLIENTS}) if(TGT_BSP MATCHES "arm/egse") target_link_libraries(${OBSW_NAME} PRIVATE ${LIB_ARCSEC}) diff --git a/bsp_linux_board/InitMission.cpp b/bsp_linux_board/InitMission.cpp index ec77f668..d009030b 100644 --- a/bsp_linux_board/InitMission.cpp +++ b/bsp_linux_board/InitMission.cpp @@ -231,7 +231,7 @@ void initmission::createPstTasks(TaskFactory& factory, result = pst::pstSpi(spiPst); if (result != HasReturnvaluesIF::RETURN_OK) { if (result != FixedTimeslotTaskIF::SLOT_LIST_EMPTY) { - sif::error << "InitMission::initTasks: Creating PST failed!" << std::endl; + sif::error << "InitMission::createPstTasks: Creating PST failed!" << std::endl; } } else { taskVec.push_back(spiPst); diff --git a/linux/devices/Max31865RtdLowlevelHandler.cpp b/linux/devices/Max31865RtdLowlevelHandler.cpp index f2815f5f..1be2b1c2 100644 --- a/linux/devices/Max31865RtdLowlevelHandler.cpp +++ b/linux/devices/Max31865RtdLowlevelHandler.cpp @@ -311,7 +311,7 @@ ReturnValue_t Max31865RtdReader::readReceivedMessage(CookieIF* cookie, uint8_t** return returnvalue::FAILED; } auto* rtdCookie = dynamic_cast(cookie); - if(rtdCookie == nullptr) { + if (rtdCookie == nullptr) { return returnvalue::FAILED; } uint8_t* exchangePtr = rtdCookie->exchangeBuf.data(); diff --git a/linux/devices/ScexUartReader.cpp b/linux/devices/ScexUartReader.cpp index 38286a7a..84a7d7cc 100644 --- a/linux/devices/ScexUartReader.cpp +++ b/linux/devices/ScexUartReader.cpp @@ -34,7 +34,7 @@ ReturnValue_t ScexUartReader::performOperation(uint8_t operationCode) { lock->unlockMutex(); while (true) { semaphore->acquire(); - sif::info << "task was started" << std::endl; + sif::info << "ScexUartReader::performOperation:task was started" << std::endl; int bytesRead = 0; while (true) { bytesRead = read(serialPort, reinterpret_cast(recBuf.data()), @@ -42,7 +42,7 @@ ReturnValue_t ScexUartReader::performOperation(uint8_t operationCode) { if (bytesRead == 0) { MutexGuard mg(lock); if (state == States::FINISH) { - sif::debug << "finish detected" << std::endl; + sif::debug << "ScexUartReader::performOperation:finish detected" << std::endl; state = States::IDLE; break; } @@ -67,7 +67,7 @@ ReturnValue_t ScexUartReader::performOperation(uint8_t operationCode) { } }; // task block comes here - sif::info << "task was stopped" << std::endl; + sif::info << "ScexUartReader::performOperation: task was stopped" << std::endl; } return OK; } diff --git a/linux/devices/ploc/PlocSupervisorHandler.cpp b/linux/devices/ploc/PlocSupervisorHandler.cpp index 1cff8884..3846e4a4 100644 --- a/linux/devices/ploc/PlocSupervisorHandler.cpp +++ b/linux/devices/ploc/PlocSupervisorHandler.cpp @@ -417,7 +417,7 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(DeviceCommandId_t d break; } case LOGGING_SET_TOPIC: { - if(commandData == nullptr or commandDataLen == 0) { + if (commandData == nullptr or commandDataLen == 0) { return HasActionsIF::INVALID_PARAMETERS; } uint8_t tpc = *(commandData); diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index 15dd05cb..b5f55a69 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -26,13 +26,9 @@ void ScexDeviceHandler::doStartUp() { void ScexDeviceHandler::doShutDown() { setMode(_MODE_POWER_DOWN); } -ReturnValue_t ScexDeviceHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { - return OK; -} +ReturnValue_t ScexDeviceHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { return OK; } -ReturnValue_t ScexDeviceHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { - return OK; -} +ReturnValue_t ScexDeviceHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { return OK; } ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData, @@ -88,6 +84,13 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic finishCountdown.setTimeout(LONG_CD); // countdown starten finishCountdown.resetTimer(); + if (debugMode) { + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + + sif::info << "ScexDeviceHandler::buildCommandFromCommand: RemainingMillis: " + << remainingMillis << std::endl; + } + prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); break; @@ -123,12 +126,13 @@ void ScexDeviceHandler::fillCommandAndReplyMap() { insertInCommandAndReplyMap(scex::Cmds::TEMP_CMD, 3); insertInCommandAndReplyMap(scex::Cmds::EXP_STATUS_CMD, 3); + // TODO: Prüfen: richtige Variablen? insertInCommandAndReplyMap(scex::Cmds::ALL_CELLS_CMD, 0, nullptr, 0, false, false, - scex::Cmds::ALL_CELLS_CMD, &finishCountdown); + scex::Cmds::ALL_CELLS_CMD, &finishCountdown); insertInCommandAndReplyMap(scex::Cmds::ONE_CELL, 0, nullptr, 0, false, false, - scex::Cmds::ONE_CELL, &finishCountdown); - insertInCommandAndReplyMap(scex::Cmds::FRAM, 0, nullptr, 0, false, false, - scex::Cmds::FRAM, &finishCountdown); + scex::Cmds::ONE_CELL, &finishCountdown); + insertInCommandAndReplyMap(scex::Cmds::FRAM, 0, nullptr, 0, false, false, scex::Cmds::FRAM, + &finishCountdown); insertInReplyMap(scex::Cmds::ERROR_REPLY, 3); } @@ -137,15 +141,78 @@ ReturnValue_t ScexDeviceHandler::scanForReply(const uint8_t* start, size_t remai DeviceCommandId_t* foundId, size_t* foundLen) { size_t len = remainingSize; ReturnValue_t result = helper.deSerialize(&start, &len); + bool commandFound = false; if (result == ScexHelper::INVALID_CRC) { sif::warning << "ScexDeviceHandler::scanForReply: CRC invalid" << std::endl; - return result; + } else { + *foundId = helper.getCmd(); + commandFound = true; + *foundLen = remainingSize; } - *foundId = helper.getCmd(); - *foundLen = remainingSize; - return OK; + if (commandFound) { + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + if (commandActive and finishCountdown.hasTimedOut()) { + triggerEvent(scex::EXPERIMENT_TIMEDOUT, currCmd, 0); + reader.finish(); + sif::warning << "ScexDeviceHandler::performOperationHook: Reader timeout; RemMillis: " + << remainingMillis << std::endl; + fileNameSet = false; + commandActive = false; + } + } + + auto multiFileHandler = [&](std::string cmdName) { + if ((helper.getPacketCounter() == 1) or (not fileNameSet)) { + fileId = random_string(6); + std::ostringstream oss("/tmp/scex-", std::ostringstream::ate); + oss << cmdName << fileId << ".bin"; + fileName = oss.str(); + fileNameSet = true; + ofstream out(fileName, ofstream::binary); + if (debugMode) { + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + sif::info << "ScexDeviceHandler::interpretDeviceReply:MultifileHandler: RemMillis: " + << remainingMillis << std::endl; + } + if (out.bad()) { + sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName + << std::endl; + return FAILED; + } + } else { + ofstream out(fileName, + ofstream::binary | ofstream::app); // append + if (debugMode) { + out << helper; + } + } + + return OK; + }; + ReturnValue_t status = OK; + switch (helper.getCmd()) { + case (FRAM): { + if (debugMode) { + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + + sif::info << "ScexDeviceHandler::interpretDeviceReply: RemMillis: " << remainingMillis + << std::endl; + } + status = multiFileHandler("fram_"); + break; + } + case (ONE_CELL): { + status = multiFileHandler("one_cell_"); + break; + } + case (ALL_CELLS_CMD): { + status = multiFileHandler("all_cell_"); + break; + } + } + return result; } ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { @@ -170,30 +237,7 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons } return OK; }; - auto multiFileHandler = [&](std::string cmdName) { - if ((helper.getPacketCounter() == 1) or (not fileNameSet)) { - fileId = random_string(6); - std::ostringstream oss("/tmp/scex-", std::ostringstream::ate); - oss << cmdName << fileId << ".bin"; - fileName = oss.str(); - fileNameSet = true; - ofstream out(fileName, ofstream::binary); - if (out.bad()) { - sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName - << std::endl; - return FAILED; - } - } else { - ofstream out(fileName, - ofstream::binary | ofstream::app); // append - if (debugMode) { - out << helper; - } - } - - return OK; - }; switch (id) { case (PING): { status = oneFileHandler("ping_"); @@ -211,18 +255,7 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons status = oneFileHandler("exp_status_"); break; } - case (FRAM): { - status = multiFileHandler("fram_"); - break; - } - case (ONE_CELL): { - status = multiFileHandler("one_cell_"); - break; - } - case (ALL_CELLS_CMD): { - status = multiFileHandler("all_cell_"); - break; - } + default: // Unknown DeviceCommand return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; @@ -231,27 +264,21 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons reader.finish(); commandActive = false; if (id != PING) { - sif::info << "Reader is finished" << std::endl; + sif::info << "ScexDeviceHandler::interpretDeviceReply:Reader is finished" << std::endl; fileNameSet = false; } } - + if (debugMode) { + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + sif::info << __FILE__ << __func__ << "(" << __LINE__ << ") RemMillis: " << remainingMillis + << std::endl; + } return status; } -void ScexDeviceHandler::performOperationHook() { - if (commandActive and finishCountdown.hasTimedOut()) { - triggerEvent(scex::EXPERIMENT_TIMEDOUT, currCmd, 0); - reader.finish(); - sif::warning << "ScexDeviceHandler::performOperationHook: Reader timeout" << std::endl; - fileNameSet = false; - commandActive = false; - } -} +void ScexDeviceHandler::performOperationHook() {} -uint32_t ScexDeviceHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { - return OK; -} +uint32_t ScexDeviceHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return OK; } ReturnValue_t ScexDeviceHandler::getSwitches(const uint8_t** switches, uint8_t* numberOfSwitches) { return OK; From a6582313f74e352b90a2702f901903f61dcd1643 Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Tue, 30 Aug 2022 18:36:00 +0200 Subject: [PATCH 03/14] writing file works now --- bsp_linux_board/InitMission.cpp | 16 +++--- bsp_linux_board/ObjectFactory.cpp | 7 +-- linux/devices/ScexUartReader.cpp | 1 - mission/devices/ScexDeviceHandler.cpp | 72 +++++++++++++++------------ mission/devices/ScexDeviceHandler.h | 3 +- tmtc | 2 +- 6 files changed, 52 insertions(+), 49 deletions(-) diff --git a/bsp_linux_board/InitMission.cpp b/bsp_linux_board/InitMission.cpp index d009030b..c79af477 100644 --- a/bsp_linux_board/InitMission.cpp +++ b/bsp_linux_board/InitMission.cpp @@ -82,28 +82,28 @@ void initmission::initTasks() { PeriodicTaskIF* scexDevHandler = factory->createPeriodicTask( "SCEX_DEV", 35, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.5, missedDeadlineFunc); result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::PERFORM_OPERATION); - if (result != HasReturnvaluesIF::RETURN_OK) { + if (result != returnvalue::OK) { initmission::printAddObjectError("SCEX_DEV", objects::SCEX); } result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::SEND_WRITE); - if (result != HasReturnvaluesIF::RETURN_OK) { + if (result != returnvalue::OK) { initmission::printAddObjectError("SCEX_DEV", objects::SCEX); } result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::GET_WRITE); - if (result != HasReturnvaluesIF::RETURN_OK) { + if (result != returnvalue::OK) { initmission::printAddObjectError("SCEX_DEV", objects::SCEX); } result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::SEND_READ); - if (result != HasReturnvaluesIF::RETURN_OK) { + if (result != returnvalue::OK) { initmission::printAddObjectError("SCEX_DEV", objects::SCEX); } result = scexDevHandler->addComponent(objects::SCEX, DeviceHandlerIF::GET_READ); - result = HasReturnvaluesIF::RETURN_OK; + result = returnvalue::OK; PeriodicTaskIF* scexReaderTask = factory->createPeriodicTask( "SCEX_UART_READER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc); result = scexReaderTask->addComponent(objects::SCEX_UART_READER); - if (result != HasReturnvaluesIF::RETURN_OK) { + if (result != returnvalue::OK) { initmission::printAddObjectError("SCEX_UART_READER", objects::SCEX_UART_READER); } #endif @@ -229,7 +229,7 @@ void initmission::createPstTasks(TaskFactory& factory, FixedTimeslotTaskIF* spiPst = factory.createFixedTimeslotTask( "SPI_PST", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 1.0, missedDeadlineFunc); result = pst::pstSpi(spiPst); - if (result != HasReturnvaluesIF::RETURN_OK) { + if (result != returnvalue::OK) { if (result != FixedTimeslotTaskIF::SLOT_LIST_EMPTY) { sif::error << "InitMission::createPstTasks: Creating PST failed!" << std::endl; } @@ -269,7 +269,7 @@ void initmission::createTestTasks(TaskFactory& factory, PeriodicTaskIF* scexReaderTask = factory.createPeriodicTask( "SCEX_UART_READER", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 2.0, missedDeadlineFunc); result = scexReaderTask->addComponent(objects::SCEX_UART_READER); - if (result != HasReturnvaluesIF::RETURN_OK) { + if (result != returnvalue::OK) { initmission::printAddObjectError("SCEX_UART_READER", objects::SCEX_UART_READER); } taskVec.push_back(scexReaderTask); diff --git a/bsp_linux_board/ObjectFactory.cpp b/bsp_linux_board/ObjectFactory.cpp index 19a00647..2804591b 100644 --- a/bsp_linux_board/ObjectFactory.cpp +++ b/bsp_linux_board/ObjectFactory.cpp @@ -47,8 +47,8 @@ #include "fsfw_hal/linux/spi/SpiCookie.h" void Factory::setStaticFrameworkObjectIds() { - PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR; - PusServiceBase::packetDestination = objects::TM_FUNNEL; + PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_PACKET_DISTRIBUTOR; + PusServiceBase::PACKET_DESTINATION = objects::TM_FUNNEL; CommandingServiceBase::defaultPacketSource = objects::PUS_PACKET_DISTRIBUTOR; CommandingServiceBase::defaultPacketDestination = objects::TM_FUNNEL; @@ -56,9 +56,6 @@ void Factory::setStaticFrameworkObjectIds() { TmFunnel::downlinkDestination = objects::TMTC_BRIDGE; // No storage object for now. TmFunnel::storageDestination = objects::NO_OBJECT; - - VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION; - TmPacketBase::timeStamperId = objects::TIME_STAMPER; } void ObjectFactory::produce(void* args) { diff --git a/linux/devices/ScexUartReader.cpp b/linux/devices/ScexUartReader.cpp index 84a7d7cc..f1d0d037 100644 --- a/linux/devices/ScexUartReader.cpp +++ b/linux/devices/ScexUartReader.cpp @@ -135,7 +135,6 @@ ReturnValue_t ScexUartReader::sendMessage(CookieIF *cookie, const uint8_t *sendD sif::warning << "ScexUartReader::sendMessage: Encoding failed" << std::endl; return FAILED; } - arrayprinter::print(cmdbuf.data(), encodedLen); size_t bytesWritten = write(serialPort, cmdbuf.data(), encodedLen); if (bytesWritten != encodedLen) { sif::warning << "ScexUartReader::sendMessage: Sending ping command to solar experiment failed" diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index b5f55a69..6432bcea 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -126,7 +126,6 @@ void ScexDeviceHandler::fillCommandAndReplyMap() { insertInCommandAndReplyMap(scex::Cmds::TEMP_CMD, 3); insertInCommandAndReplyMap(scex::Cmds::EXP_STATUS_CMD, 3); - // TODO: Prüfen: richtige Variablen? insertInCommandAndReplyMap(scex::Cmds::ALL_CELLS_CMD, 0, nullptr, 0, false, false, scex::Cmds::ALL_CELLS_CMD, &finishCountdown); insertInCommandAndReplyMap(scex::Cmds::ONE_CELL, 0, nullptr, 0, false, false, @@ -141,28 +140,29 @@ ReturnValue_t ScexDeviceHandler::scanForReply(const uint8_t* start, size_t remai DeviceCommandId_t* foundId, size_t* foundLen) { size_t len = remainingSize; ReturnValue_t result = helper.deSerialize(&start, &len); - bool commandFound = false; if (result == ScexHelper::INVALID_CRC) { sif::warning << "ScexDeviceHandler::scanForReply: CRC invalid" << std::endl; - } else { - *foundId = helper.getCmd(); - commandFound = true; *foundLen = remainingSize; + } else { + result = handleValidReply(remainingSize, foundId, foundLen); } - - if (commandFound) { - uint32_t remainingMillis = finishCountdown.getRemainingMillis(); - if (commandActive and finishCountdown.hasTimedOut()) { - triggerEvent(scex::EXPERIMENT_TIMEDOUT, currCmd, 0); - reader.finish(); - sif::warning << "ScexDeviceHandler::performOperationHook: Reader timeout; RemMillis: " - << remainingMillis << std::endl; - fileNameSet = false; - commandActive = false; - } + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + if (commandActive and finishCountdown.hasTimedOut()) { + triggerEvent(scex::EXPERIMENT_TIMEDOUT, currCmd, 0); + reader.finish(); + sif::warning << "ScexDeviceHandler::performOperationHook: Reader timeout; RemMillis: " + << remainingMillis << std::endl; + fileNameSet = false; + commandActive = false; } + return result; +} +ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandId_t* foundId, + size_t* foundLen) { + using namespace scex; + ReturnValue_t result = OK; auto multiFileHandler = [&](std::string cmdName) { if ((helper.getPacketCounter() == 1) or (not fileNameSet)) { fileId = random_string(6); @@ -171,27 +171,28 @@ ReturnValue_t ScexDeviceHandler::scanForReply(const uint8_t* start, size_t remai fileName = oss.str(); fileNameSet = true; ofstream out(fileName, ofstream::binary); - if (debugMode) { - uint32_t remainingMillis = finishCountdown.getRemainingMillis(); - sif::info << "ScexDeviceHandler::interpretDeviceReply:MultifileHandler: RemMillis: " - << remainingMillis << std::endl; - } if (out.bad()) { sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName << std::endl; return FAILED; } + out << helper; } else { ofstream out(fileName, ofstream::binary | ofstream::app); // append - if (debugMode) { - out << helper; + if (out.bad()) { + sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName + << std::endl; + return FAILED; } + out << helper; } - - return OK; + if (helper.getPacketCounter() == helper.getTotalPacketCounter()) { + *foundId = helper.getCmd(); + return OK; + } + return IGNORE_FULL_PACKET; }; - ReturnValue_t status = OK; switch (helper.getCmd()) { case (FRAM): { if (debugMode) { @@ -200,18 +201,23 @@ ReturnValue_t ScexDeviceHandler::scanForReply(const uint8_t* start, size_t remai sif::info << "ScexDeviceHandler::interpretDeviceReply: RemMillis: " << remainingMillis << std::endl; } - status = multiFileHandler("fram_"); + result = multiFileHandler("fram_"); break; } case (ONE_CELL): { - status = multiFileHandler("one_cell_"); + result = multiFileHandler("one_cell_"); break; } case (ALL_CELLS_CMD): { - status = multiFileHandler("all_cell_"); + result = multiFileHandler("all_cell_"); + break; + } + default: { + *foundId = helper.getCmd(); break; } } + *foundLen = remSize; return result; } @@ -225,16 +231,13 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons std::ostringstream oss("/tmp/scex-", std::ostringstream::ate); oss << cmdName << fileId << ".bin"; fileName = oss.str(); - std::cout << fileName << std::endl; ofstream out(fileName, ofstream::binary); if (out.bad()) { sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName << std::endl; return FAILED; } - if (debugMode) { - out << helper; - } + out << helper; return OK; }; @@ -258,6 +261,9 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons default: // Unknown DeviceCommand + if(id == FRAM or id == ONE_CELL or id == ALL_CELLS_CMD) { + break; + } return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } if (helper.getPacketCounter() == helper.getTotalPacketCounter()) { diff --git a/mission/devices/ScexDeviceHandler.h b/mission/devices/ScexDeviceHandler.h index eeaac755..69436e0b 100644 --- a/mission/devices/ScexDeviceHandler.h +++ b/mission/devices/ScexDeviceHandler.h @@ -22,7 +22,7 @@ class ScexDeviceHandler : public DeviceHandlerBase { std::string fileName = ""; bool fileNameSet = false; bool commandActive = false; - bool debugMode = true; + bool debugMode = false; scex::Cmds currCmd = scex::Cmds::PING; SdCardMountedIF *sdcMan = nullptr; @@ -45,6 +45,7 @@ class ScexDeviceHandler : public DeviceHandlerBase { ReturnValue_t scanForReply(const uint8_t *start, size_t remainingSize, DeviceCommandId_t *foundId, size_t *foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override; + ReturnValue_t handleValidReply(size_t remSize, DeviceCommandId_t *foundId, size_t *foundLen); uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t getSwitches(const uint8_t **switches, uint8_t *numberOfSwitches) override; diff --git a/tmtc b/tmtc index b1eafd92..b4d4a511 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit b1eafd92c202385731a990d3bdba36c48267d63a +Subproject commit b4d4a51164af69a22eedd645775061dbb51702b1 From 0f91800cf8951aa57aab3b1815833180069a8d05 Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Tue, 30 Aug 2022 18:52:50 +0200 Subject: [PATCH 04/14] works but reply handling is annoying --- mission/devices/ScexDeviceHandler.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index 6432bcea..0c3049c8 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -93,6 +93,9 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); + // auto iter = deviceReplyMap.find(FRAM); + // auto& info = iter->second.command->second; + // actionHelper.finish(true,info.sendReplyTo, iter->first, OK); break; } case (ONE_CELL): { @@ -160,7 +163,7 @@ ReturnValue_t ScexDeviceHandler::scanForReply(const uint8_t* start, size_t remai } ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandId_t* foundId, - size_t* foundLen) { + size_t* foundLen) { using namespace scex; ReturnValue_t result = OK; auto multiFileHandler = [&](std::string cmdName) { @@ -261,9 +264,9 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons default: // Unknown DeviceCommand - if(id == FRAM or id == ONE_CELL or id == ALL_CELLS_CMD) { - break; - } + if (id == FRAM or id == ONE_CELL or id == ALL_CELLS_CMD) { + break; + } return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } if (helper.getPacketCounter() == helper.getTotalPacketCounter()) { From 8c0e261f449a80ef2a2da023d0be0ac915bcd4af Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Wed, 31 Aug 2022 10:58:21 +0200 Subject: [PATCH 05/14] ScexDeviceHandler: fileId includes date and time --- mission/devices/ScexDeviceHandler.cpp | 42 +++++++++++++++++---------- mission/devices/ScexDeviceHandler.h | 2 +- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index 0c3049c8..bd9211a6 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -168,7 +169,7 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI ReturnValue_t result = OK; auto multiFileHandler = [&](std::string cmdName) { if ((helper.getPacketCounter() == 1) or (not fileNameSet)) { - fileId = random_string(6); + fileId = date_time_string(); std::ostringstream oss("/tmp/scex-", std::ostringstream::ate); oss << cmdName << fileId << ".bin"; fileName = oss.str(); @@ -230,7 +231,7 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons ReturnValue_t status = OK; auto oneFileHandler = [&](std::string cmdName) { - fileId = random_string(6); + fileId = date_time_string(); std::ostringstream oss("/tmp/scex-", std::ostringstream::ate); oss << cmdName << fileId << ".bin"; fileName = oss.str(); @@ -298,23 +299,32 @@ ReturnValue_t ScexDeviceHandler::initializeLocalDataPool(localpool::DataPool& lo return OK; } -std::string ScexDeviceHandler::random_string(std::string::size_type length) { - static auto& chrs = - "0123456789" - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +std::string ScexDeviceHandler::date_time_string() { + using namespace std; + string date_time; + time_t now = time(0); + tm* ltm = localtime(&now); + ostringstream oss(std::ostringstream::ate); - thread_local static std::mt19937 rg{std::random_device{}()}; - thread_local static std::uniform_int_distribution pick(0, - sizeof(chrs) - 2); + if (ltm->tm_hour < 10) { + oss << 1900 + ltm->tm_year << 1 + ltm->tm_mon << ltm->tm_mday << "_0" << ltm->tm_hour; + } else { + oss << 1900 + ltm->tm_year << 1 + ltm->tm_mon << ltm->tm_mday << "_" << ltm->tm_hour; + } + if (ltm->tm_min < 10) { + oss << 0 << ltm->tm_min; + } else { + oss << ltm->tm_min; + } + if (ltm->tm_sec < 10) { + oss << 0 << ltm->tm_sec; + } else { + oss << ltm->tm_sec; + } - std::string s; + date_time = oss.str(); - s.reserve(length); - - while (length--) s += chrs[pick(rg)]; - - return s; + return date_time; } void ScexDeviceHandler::modeChanged() {} diff --git a/mission/devices/ScexDeviceHandler.h b/mission/devices/ScexDeviceHandler.h index 69436e0b..39d333f5 100644 --- a/mission/devices/ScexDeviceHandler.h +++ b/mission/devices/ScexDeviceHandler.h @@ -28,7 +28,7 @@ class ScexDeviceHandler : public DeviceHandlerBase { SdCardMountedIF *sdcMan = nullptr; Countdown finishCountdown = Countdown(LONG_CD); - std::string random_string(std::string::size_type length); + std::string date_time_string(); // DeviceHandlerBase private function implementation void doStartUp() override; From 74d47413807ab8f3267bfa3d0510c19b9bfed47d Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Wed, 31 Aug 2022 11:06:37 +0200 Subject: [PATCH 06/14] ScexDeviceHandler: adjusted comments --- mission/devices/ScexDeviceHandler.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index bd9211a6..2d614765 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -155,7 +155,7 @@ ReturnValue_t ScexDeviceHandler::scanForReply(const uint8_t* start, size_t remai if (commandActive and finishCountdown.hasTimedOut()) { triggerEvent(scex::EXPERIMENT_TIMEDOUT, currCmd, 0); reader.finish(); - sif::warning << "ScexDeviceHandler::performOperationHook: Reader timeout; RemMillis: " + sif::warning << "ScexDeviceHandler::scanForReply: Reader timeout; RemMillis: " << remainingMillis << std::endl; fileNameSet = false; commandActive = false; @@ -176,7 +176,7 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI fileNameSet = true; ofstream out(fileName, ofstream::binary); if (out.bad()) { - sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName + sif::error << "ScexDeviceHandler::handleValidReply: Could not open file " << fileName << std::endl; return FAILED; } @@ -185,7 +185,7 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI ofstream out(fileName, ofstream::binary | ofstream::app); // append if (out.bad()) { - sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName + sif::error << "ScexDeviceHandler::handleValidReply: Could not open file " << fileName << std::endl; return FAILED; } @@ -202,7 +202,7 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI if (debugMode) { uint32_t remainingMillis = finishCountdown.getRemainingMillis(); - sif::info << "ScexDeviceHandler::interpretDeviceReply: RemMillis: " << remainingMillis + sif::info << "ScexDeviceHandler::handleValidReply: RemMillis: " << remainingMillis << std::endl; } result = multiFileHandler("fram_"); @@ -226,7 +226,6 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI } ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { - // cmd auswertung (in file reinschreiben) using namespace scex; ReturnValue_t status = OK; From 839851914acf851c5f8ca5220010f86e9b77ca04 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 31 Aug 2022 16:07:38 +0200 Subject: [PATCH 07/14] update SCEX code --- generators/bsp_q7s_events.csv | 4 +- generators/bsp_q7s_returnvalues.csv | 9 +- generators/events/translateEvents.cpp | 10 +- generators/objects/translateObjects.cpp | 2 +- linux/devices/ScexUartReader.cpp | 3 - linux/fsfwconfig/events/translateEvents.cpp | 10 +- linux/fsfwconfig/objects/translateObjects.cpp | 2 +- mission/devices/ScexDeviceHandler.cpp | 133 ++++++++++-------- mission/devices/ScexDeviceHandler.h | 1 + .../devicedefinitions/ScexDefinitions.h | 5 +- tmtc | 2 +- 11 files changed, 103 insertions(+), 78 deletions(-) diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index c7001a82..a38aa4e9 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -215,4 +215,6 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 13701;0x3585;REBOOT_SW;MEDIUM; Software reboot occurred. Can also be a systemd reboot. P1: Current Chip, P2: Current Copy;bsp_q7s/core/CoreController.h 13702;0x3586;REBOOT_MECHANISM_TRIGGERED;MEDIUM;The reboot mechanism was triggered. P1: First 16 bits: Last Chip, Last 16 bits: Last Copy, P2: Each byte is the respective reboot count for the slots;bsp_q7s/core/CoreController.h 13703;0x3587;REBOOT_HW;MEDIUM;;bsp_q7s/core/CoreController.h -13800;0x35e8;EXPERIMENT_TIMEDOUT;LOW;;mission/devices/devicedefinitions/ScexDefinitions.h +13800;0x35e8;MISSING_PACKET;LOW;;mission/devices/devicedefinitions/ScexDefinitions.h +13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;;mission/devices/devicedefinitions/ScexDefinitions.h +13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;;mission/devices/devicedefinitions/ScexDefinitions.h diff --git a/generators/bsp_q7s_returnvalues.csv b/generators/bsp_q7s_returnvalues.csv index ab196298..7a1e52f8 100644 --- a/generators/bsp_q7s_returnvalues.csv +++ b/generators/bsp_q7s_returnvalues.csv @@ -1,6 +1,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path -0x0000;OK;System-wide code for ok.;0;HasReturnvaluesIF;fsfw/returnvalues/HasReturnvaluesIF.h -0x0001;Failed;Unspecified system-wide code for failed.;1;HasReturnvaluesIF;fsfw/returnvalues/HasReturnvaluesIF.h +0x0000;OK;System-wide code for ok.;0;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.h +0x0001;Failed;Unspecified system-wide code for failed.;1;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.h 0x63a0;NVMB_KeyNotExists;Specified key does not exist in json file;160;NVM_PARAM_BASE;mission/memory/NVMParameterBase.h 0x58a0;SUSS_ErrorUnlockMutex;;160;SUS_HANDLER;mission/devices/SusHandler.h 0x58a1;SUSS_ErrorLockMutex;;161;SUS_HANDLER;mission/devices/SusHandler.h @@ -361,8 +361,9 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x2cd2;CCS_TooShortBlockedPacket;;210;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h 0x2cd3;CCS_TooShortMapExtraction;;211;CCSDS_HANDLER_IF;fsfw/src/fsfw/datalinklayer/CCSDSReturnValuesIF.h 0x4201;PUS11_InvalidTypeTimeWindow;;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h -0x4202;PUS11_TimeshiftingNotPossible;;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h -0x4203;PUS11_InvalidRelativeTime;;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h +0x4202;PUS11_InvalidTimeWindow;;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h +0x4203;PUS11_TimeshiftingNotPossible;;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h +0x4204;PUS11_InvalidRelativeTime;;4;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x3401;DC_NoReplyReceived;;1;DEVICE_COMMUNICATION_IF;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h 0x3402;DC_ProtocolError;;2;DEVICE_COMMUNICATION_IF;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h 0x3403;DC_Nullpointer;;3;DEVICE_COMMUNICATION_IF;fsfw/src/fsfw/devicehandlers/DeviceCommunicationIF.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index dda8b717..4448112c 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 217 translations. + * @brief Auto-generated event translation file. Contains 219 translations. * @details - * Generated on: 2022-08-24 16:53:50 + * Generated on: 2022-08-31 16:07:07 */ #include "translateEvents.h" @@ -217,7 +217,9 @@ const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE"; const char *REBOOT_SW_STRING = "REBOOT_SW"; const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED"; const char *REBOOT_HW_STRING = "REBOOT_HW"; +const char *MISSING_PACKET_STRING = "MISSING_PACKET"; const char *EXPERIMENT_TIMEDOUT_STRING = "EXPERIMENT_TIMEDOUT"; +const char *MULTI_PACKET_COMMAND_DONE_STRING = "MULTI_PACKET_COMMAND_DONE"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -646,7 +648,11 @@ const char *translateEvents(Event event) { case (13703): return REBOOT_HW_STRING; case (13800): + return MISSING_PACKET_STRING; + case (13801): return EXPERIMENT_TIMEDOUT_STRING; + case (13802): + return MULTI_PACKET_COMMAND_DONE_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 215d47d8..8f5c084f 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 135 translations. - * Generated on: 2022-08-24 16:53:50 + * Generated on: 2022-08-31 16:07:07 */ #include "translateObjects.h" diff --git a/linux/devices/ScexUartReader.cpp b/linux/devices/ScexUartReader.cpp index f1d0d037..57239ed5 100644 --- a/linux/devices/ScexUartReader.cpp +++ b/linux/devices/ScexUartReader.cpp @@ -34,7 +34,6 @@ ReturnValue_t ScexUartReader::performOperation(uint8_t operationCode) { lock->unlockMutex(); while (true) { semaphore->acquire(); - sif::info << "ScexUartReader::performOperation:task was started" << std::endl; int bytesRead = 0; while (true) { bytesRead = read(serialPort, reinterpret_cast(recBuf.data()), @@ -66,8 +65,6 @@ ReturnValue_t ScexUartReader::performOperation(uint8_t operationCode) { } } }; - // task block comes here - sif::info << "ScexUartReader::performOperation: task was stopped" << std::endl; } return OK; } diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index dda8b717..4448112c 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 217 translations. + * @brief Auto-generated event translation file. Contains 219 translations. * @details - * Generated on: 2022-08-24 16:53:50 + * Generated on: 2022-08-31 16:07:07 */ #include "translateEvents.h" @@ -217,7 +217,9 @@ const char *ALLOC_FAILURE_STRING = "ALLOC_FAILURE"; const char *REBOOT_SW_STRING = "REBOOT_SW"; const char *REBOOT_MECHANISM_TRIGGERED_STRING = "REBOOT_MECHANISM_TRIGGERED"; const char *REBOOT_HW_STRING = "REBOOT_HW"; +const char *MISSING_PACKET_STRING = "MISSING_PACKET"; const char *EXPERIMENT_TIMEDOUT_STRING = "EXPERIMENT_TIMEDOUT"; +const char *MULTI_PACKET_COMMAND_DONE_STRING = "MULTI_PACKET_COMMAND_DONE"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -646,7 +648,11 @@ const char *translateEvents(Event event) { case (13703): return REBOOT_HW_STRING; case (13800): + return MISSING_PACKET_STRING; + case (13801): return EXPERIMENT_TIMEDOUT_STRING; + case (13802): + return MULTI_PACKET_COMMAND_DONE_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 215d47d8..8f5c084f 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 135 translations. - * Generated on: 2022-08-24 16:53:50 + * Generated on: 2022-08-31 16:07:07 */ #include "translateObjects.h" diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index 2d614765..71bb4302 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -94,9 +94,7 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); - // auto iter = deviceReplyMap.find(FRAM); - // auto& info = iter->second.command->second; - // actionHelper.finish(true,info.sendReplyTo, iter->first, OK); + updatePeriodicReply(true, deviceCommand); break; } case (ONE_CELL): { @@ -105,6 +103,7 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic finishCountdown.resetTimer(); prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); + updatePeriodicReply(true, deviceCommand); break; } case (ALL_CELLS_CMD): { @@ -113,6 +112,7 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic finishCountdown.resetTimer(); prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); + updatePeriodicReply(true, deviceCommand); break; } default: { @@ -130,11 +130,11 @@ void ScexDeviceHandler::fillCommandAndReplyMap() { insertInCommandAndReplyMap(scex::Cmds::TEMP_CMD, 3); insertInCommandAndReplyMap(scex::Cmds::EXP_STATUS_CMD, 3); - insertInCommandAndReplyMap(scex::Cmds::ALL_CELLS_CMD, 0, nullptr, 0, false, false, + insertInCommandAndReplyMap(scex::Cmds::ALL_CELLS_CMD, 0, nullptr, 0, true, false, scex::Cmds::ALL_CELLS_CMD, &finishCountdown); - insertInCommandAndReplyMap(scex::Cmds::ONE_CELL, 0, nullptr, 0, false, false, + insertInCommandAndReplyMap(scex::Cmds::ONE_CELL, 0, nullptr, 0, true, false, scex::Cmds::ONE_CELL, &finishCountdown); - insertInCommandAndReplyMap(scex::Cmds::FRAM, 0, nullptr, 0, false, false, scex::Cmds::FRAM, + insertInCommandAndReplyMap(scex::Cmds::FRAM, 0, nullptr, 0, true, false, scex::Cmds::FRAM, &finishCountdown); insertInReplyMap(scex::Cmds::ERROR_REPLY, 3); @@ -167,6 +167,56 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI size_t* foundLen) { using namespace scex; ReturnValue_t result = OK; + + switch (helper.getCmd()) { + case (FRAM): { + if (debugMode) { + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + + sif::info << "ScexDeviceHandler::handleValidReply: RemMillis: " << remainingMillis + << std::endl; + } + actionHelper.finish(true, getCommanderQueueId(FRAM), FRAM, result); + result = APERIODIC_REPLY; + break; + } + case (ONE_CELL): { + actionHelper.finish(true, getCommanderQueueId(ONE_CELL), ONE_CELL, result); + result = APERIODIC_REPLY; + break; + } + case (ALL_CELLS_CMD): { + actionHelper.finish(true, getCommanderQueueId(ALL_CELLS_CMD), ALL_CELLS_CMD, result); + result = APERIODIC_REPLY; + break; + } + default: { + break; + } + } + *foundId = helper.getCmd(); + *foundLen = remSize; + return result; +} + +ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { + using namespace scex; + + ReturnValue_t status = OK; + auto oneFileHandler = [&](std::string cmdName) { + fileId = date_time_string(); + std::ostringstream oss("/tmp/scex-", std::ostringstream::ate); + oss << cmdName << fileId << ".bin"; + fileName = oss.str(); + ofstream out(fileName, ofstream::binary); + if (out.bad()) { + sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName + << std::endl; + return FAILED; + } + out << helper; + return OK; + }; auto multiFileHandler = [&](std::string cmdName) { if ((helper.getPacketCounter() == 1) or (not fileNameSet)) { fileId = date_time_string(); @@ -191,59 +241,8 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI } out << helper; } - if (helper.getPacketCounter() == helper.getTotalPacketCounter()) { - *foundId = helper.getCmd(); - return OK; - } - return IGNORE_FULL_PACKET; - }; - switch (helper.getCmd()) { - case (FRAM): { - if (debugMode) { - uint32_t remainingMillis = finishCountdown.getRemainingMillis(); - - sif::info << "ScexDeviceHandler::handleValidReply: RemMillis: " << remainingMillis - << std::endl; - } - result = multiFileHandler("fram_"); - break; - } - case (ONE_CELL): { - result = multiFileHandler("one_cell_"); - break; - } - case (ALL_CELLS_CMD): { - result = multiFileHandler("all_cell_"); - break; - } - default: { - *foundId = helper.getCmd(); - break; - } - } - *foundLen = remSize; - return result; -} - -ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { - using namespace scex; - - ReturnValue_t status = OK; - auto oneFileHandler = [&](std::string cmdName) { - fileId = date_time_string(); - std::ostringstream oss("/tmp/scex-", std::ostringstream::ate); - oss << cmdName << fileId << ".bin"; - fileName = oss.str(); - ofstream out(fileName, ofstream::binary); - if (out.bad()) { - sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName - << std::endl; - return FAILED; - } - out << helper; return OK; }; - switch (id) { case (PING): { status = oneFileHandler("ping_"); @@ -261,12 +260,20 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons status = oneFileHandler("exp_status_"); break; } - + case(FRAM): { + status = multiFileHandler("fram_"); + break; + } + case(ONE_CELL): { + status = multiFileHandler("one_cell_"); + break; + } + case(ALL_CELLS_CMD): { + status = multiFileHandler("multi_cell_"); + break; + } default: // Unknown DeviceCommand - if (id == FRAM or id == ONE_CELL or id == ALL_CELLS_CMD) { - break; - } return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } if (helper.getPacketCounter() == helper.getTotalPacketCounter()) { @@ -276,6 +283,10 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons sif::info << "ScexDeviceHandler::interpretDeviceReply:Reader is finished" << std::endl; fileNameSet = false; } + if(id == FRAM or id == ALL_CELLS_CMD or id == ONE_CELL) { + triggerEvent(MULTI_PACKET_COMMAND_DONE, id); + updatePeriodicReply(false, id); + } } if (debugMode) { uint32_t remainingMillis = finishCountdown.getRemainingMillis(); diff --git a/mission/devices/ScexDeviceHandler.h b/mission/devices/ScexDeviceHandler.h index 39d333f5..62973e41 100644 --- a/mission/devices/ScexDeviceHandler.h +++ b/mission/devices/ScexDeviceHandler.h @@ -4,6 +4,7 @@ #include #include #include +#include "commonSubsystemIds.h" class SdCardMountedIF; diff --git a/mission/devices/devicedefinitions/ScexDefinitions.h b/mission/devices/devicedefinitions/ScexDefinitions.h index 685f0cc0..dfa20f3d 100644 --- a/mission/devices/devicedefinitions/ScexDefinitions.h +++ b/mission/devices/devicedefinitions/ScexDefinitions.h @@ -14,8 +14,9 @@ namespace scex { static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SCEX_HANDLER; static constexpr Event MISSING_PACKET = event::makeEvent(SUBSYSTEM_ID, 0, severity::LOW); - -static constexpr Event EXPERIMENT_TIMEDOUT = event::makeEvent(SUBSYSTEM_ID, 0, severity::LOW); +static constexpr Event EXPERIMENT_TIMEDOUT = event::makeEvent(SUBSYSTEM_ID, 1, severity::LOW); +//! FRAM, One Cell or All cells command finished. P1: Command ID +static constexpr Event MULTI_PACKET_COMMAND_DONE = event::makeEvent(SUBSYSTEM_ID, 2, severity::INFO); enum Cmds : DeviceCommandId_t { PING = 0b00111, diff --git a/tmtc b/tmtc index b4d4a511..e1d84c5b 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit b4d4a51164af69a22eedd645775061dbb51702b1 +Subproject commit e1d84c5b99e99ea9a9687dcd298d815dc4d8d2b6 From 7c15ecbad2b67117069ab6412dd772391586b86d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 31 Aug 2022 16:12:32 +0200 Subject: [PATCH 08/14] apply afmt --- linux/devices/ScexUartReader.cpp | 1 - mission/devices/ScexDeviceHandler.cpp | 13 ++++++------- mission/devices/ScexDeviceHandler.h | 1 + mission/devices/devicedefinitions/ScexDefinitions.h | 3 ++- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/linux/devices/ScexUartReader.cpp b/linux/devices/ScexUartReader.cpp index 57239ed5..ca7013c4 100644 --- a/linux/devices/ScexUartReader.cpp +++ b/linux/devices/ScexUartReader.cpp @@ -41,7 +41,6 @@ ReturnValue_t ScexUartReader::performOperation(uint8_t operationCode) { if (bytesRead == 0) { MutexGuard mg(lock); if (state == States::FINISH) { - sif::debug << "ScexUartReader::performOperation:finish detected" << std::endl; state = States::IDLE; break; } diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index 71bb4302..675d6093 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -132,8 +132,8 @@ void ScexDeviceHandler::fillCommandAndReplyMap() { insertInCommandAndReplyMap(scex::Cmds::ALL_CELLS_CMD, 0, nullptr, 0, true, false, scex::Cmds::ALL_CELLS_CMD, &finishCountdown); - insertInCommandAndReplyMap(scex::Cmds::ONE_CELL, 0, nullptr, 0, true, false, - scex::Cmds::ONE_CELL, &finishCountdown); + insertInCommandAndReplyMap(scex::Cmds::ONE_CELL, 0, nullptr, 0, true, false, scex::Cmds::ONE_CELL, + &finishCountdown); insertInCommandAndReplyMap(scex::Cmds::FRAM, 0, nullptr, 0, true, false, scex::Cmds::FRAM, &finishCountdown); @@ -260,15 +260,15 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons status = oneFileHandler("exp_status_"); break; } - case(FRAM): { + case (FRAM): { status = multiFileHandler("fram_"); break; } - case(ONE_CELL): { + case (ONE_CELL): { status = multiFileHandler("one_cell_"); break; } - case(ALL_CELLS_CMD): { + case (ALL_CELLS_CMD): { status = multiFileHandler("multi_cell_"); break; } @@ -280,10 +280,9 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons reader.finish(); commandActive = false; if (id != PING) { - sif::info << "ScexDeviceHandler::interpretDeviceReply:Reader is finished" << std::endl; fileNameSet = false; } - if(id == FRAM or id == ALL_CELLS_CMD or id == ONE_CELL) { + if (id == FRAM or id == ALL_CELLS_CMD or id == ONE_CELL) { triggerEvent(MULTI_PACKET_COMMAND_DONE, id); updatePeriodicReply(false, id); } diff --git a/mission/devices/ScexDeviceHandler.h b/mission/devices/ScexDeviceHandler.h index 62973e41..7fc47858 100644 --- a/mission/devices/ScexDeviceHandler.h +++ b/mission/devices/ScexDeviceHandler.h @@ -4,6 +4,7 @@ #include #include #include + #include "commonSubsystemIds.h" class SdCardMountedIF; diff --git a/mission/devices/devicedefinitions/ScexDefinitions.h b/mission/devices/devicedefinitions/ScexDefinitions.h index dfa20f3d..4abe1249 100644 --- a/mission/devices/devicedefinitions/ScexDefinitions.h +++ b/mission/devices/devicedefinitions/ScexDefinitions.h @@ -16,7 +16,8 @@ static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SCEX_HANDLER; static constexpr Event MISSING_PACKET = event::makeEvent(SUBSYSTEM_ID, 0, severity::LOW); static constexpr Event EXPERIMENT_TIMEDOUT = event::makeEvent(SUBSYSTEM_ID, 1, severity::LOW); //! FRAM, One Cell or All cells command finished. P1: Command ID -static constexpr Event MULTI_PACKET_COMMAND_DONE = event::makeEvent(SUBSYSTEM_ID, 2, severity::INFO); +static constexpr Event MULTI_PACKET_COMMAND_DONE = + event::makeEvent(SUBSYSTEM_ID, 2, severity::INFO); enum Cmds : DeviceCommandId_t { PING = 0b00111, From da7cedc910ad4412eb165f2ce1618a6a2492a3ac Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 31 Aug 2022 16:37:15 +0200 Subject: [PATCH 09/14] perform finish in command builder --- fsfw | 2 +- mission/devices/ScexDeviceHandler.cpp | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/fsfw b/fsfw index 2fa76d36..cfca2754 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 2fa76d366325372e92a2188f71f143a485e652fc +Subproject commit cfca27542a3cabf58f9b7cab238c89ab9ad9beea diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index 675d6093..9a5ebf11 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -95,6 +95,7 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); updatePeriodicReply(true, deviceCommand); + actionHelper.finish(true, getCommanderQueueId(deviceCommand), deviceCommand, OK); break; } case (ONE_CELL): { @@ -104,6 +105,7 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); updatePeriodicReply(true, deviceCommand); + actionHelper.finish(true, getCommanderQueueId(deviceCommand), deviceCommand, OK); break; } case (ALL_CELLS_CMD): { @@ -112,6 +114,7 @@ ReturnValue_t ScexDeviceHandler::buildCommandFromCommand(DeviceCommandId_t devic finishCountdown.resetTimer(); prepareScexCmd(cmdTyped, {cmdBuf.data(), cmdBuf.size()}, rawPacketLen, {commandData + 1, commandDataLen - 1}, tempCheck); + actionHelper.finish(true, getCommanderQueueId(deviceCommand), deviceCommand, OK); updatePeriodicReply(true, deviceCommand); break; } @@ -151,15 +154,6 @@ ReturnValue_t ScexDeviceHandler::scanForReply(const uint8_t* start, size_t remai } else { result = handleValidReply(remainingSize, foundId, foundLen); } - uint32_t remainingMillis = finishCountdown.getRemainingMillis(); - if (commandActive and finishCountdown.hasTimedOut()) { - triggerEvent(scex::EXPERIMENT_TIMEDOUT, currCmd, 0); - reader.finish(); - sif::warning << "ScexDeviceHandler::scanForReply: Reader timeout; RemMillis: " - << remainingMillis << std::endl; - fileNameSet = false; - commandActive = false; - } return result; } @@ -176,17 +170,14 @@ ReturnValue_t ScexDeviceHandler::handleValidReply(size_t remSize, DeviceCommandI sif::info << "ScexDeviceHandler::handleValidReply: RemMillis: " << remainingMillis << std::endl; } - actionHelper.finish(true, getCommanderQueueId(FRAM), FRAM, result); result = APERIODIC_REPLY; break; } case (ONE_CELL): { - actionHelper.finish(true, getCommanderQueueId(ONE_CELL), ONE_CELL, result); result = APERIODIC_REPLY; break; } case (ALL_CELLS_CMD): { - actionHelper.finish(true, getCommanderQueueId(ALL_CELLS_CMD), ALL_CELLS_CMD, result); result = APERIODIC_REPLY; break; } @@ -295,7 +286,17 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons return status; } -void ScexDeviceHandler::performOperationHook() {} +void ScexDeviceHandler::performOperationHook() { + uint32_t remainingMillis = finishCountdown.getRemainingMillis(); + if (commandActive and finishCountdown.hasTimedOut()) { + triggerEvent(scex::EXPERIMENT_TIMEDOUT, currCmd, 0); + reader.finish(); + sif::warning << "ScexDeviceHandler::scanForReply: Reader timeout; RemMillis: " + << remainingMillis << std::endl; + fileNameSet = false; + commandActive = false; + } +} uint32_t ScexDeviceHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return OK; } From 31b3de784bf6ccac6ce25107abe4c10614d53bfd Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 12 Sep 2022 17:00:49 +0200 Subject: [PATCH 10/14] stuff --- bsp_q7s/core/CoreController.cpp | 1 + bsp_q7s/memory/SdCardManager.cpp | 18 +++++++++++------- bsp_q7s/memory/SdCardManager.h | 2 +- fsfw | 2 +- mission/memory/SdCardMountedIF.h | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index de36b01a..02d7330d 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -384,6 +384,7 @@ ReturnValue_t CoreController::sdStateMachine() { if (nonBlockingOpChecking(SdStates::DETERMINE_OTHER, 5, "Mounting SD card")) { sdInfo.prefState = sd::SdState::MOUNTED; currentStateSetter(sdInfo.pref, sd::SdState::MOUNTED); + sdcMan->setActiveSdCard(sdInfo.pref); } } } diff --git a/bsp_q7s/memory/SdCardManager.cpp b/bsp_q7s/memory/SdCardManager.cpp index e2702771..ac0df040 100644 --- a/bsp_q7s/memory/SdCardManager.cpp +++ b/bsp_q7s/memory/SdCardManager.cpp @@ -412,13 +412,9 @@ ReturnValue_t SdCardManager::updateSdCardStateFile() { return result; } -std::string SdCardManager::getCurrentMountPrefix() const { +const std::string& SdCardManager::getCurrentMountPrefix() const { MutexGuard mg(mutex); - if (sdInfo.active == sd::SdCard::SLOT_0) { - return SD_0_MOUNT_POINT; - } else { - return SD_1_MOUNT_POINT; - } + return currentPrefix; } SdCardManager::OpStatus SdCardManager::checkCurrentOp(Operations& currentOp) { @@ -552,6 +548,14 @@ ReturnValue_t SdCardManager::performFsck(sd::SdCard sdcard, bool printOutput, in return result; } -void SdCardManager::setActiveSdCard(sd::SdCard sdCard) { sdInfo.active = sdCard; } +void SdCardManager::setActiveSdCard(sd::SdCard sdCard) { + sdInfo.active = sdCard; + MutexGuard mg(mutex); + if (sdInfo.active == sd::SdCard::SLOT_0) { + currentPrefix = SD_0_MOUNT_POINT; + } else { + currentPrefix = SD_1_MOUNT_POINT; + } +} sd::SdCard SdCardManager::getActiveSdCard() const { return sdInfo.active; } diff --git a/bsp_q7s/memory/SdCardManager.h b/bsp_q7s/memory/SdCardManager.h index 87ed91d7..14101b0e 100644 --- a/bsp_q7s/memory/SdCardManager.h +++ b/bsp_q7s/memory/SdCardManager.h @@ -188,7 +188,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { * @param prefSdCardPtr * @return */ - std::string getCurrentMountPrefix() const override; + const std::string& getCurrentMountPrefix() const override; OpStatus checkCurrentOp(Operations& currentOp); diff --git a/fsfw b/fsfw index cfca2754..cf8fe7ea 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit cfca27542a3cabf58f9b7cab238c89ab9ad9beea +Subproject commit cf8fe7ea728bea077b9936bcf0db96845bc6419e diff --git a/mission/memory/SdCardMountedIF.h b/mission/memory/SdCardMountedIF.h index 853c7e8d..ff0bf190 100644 --- a/mission/memory/SdCardMountedIF.h +++ b/mission/memory/SdCardMountedIF.h @@ -8,7 +8,7 @@ class SdCardMountedIF { public: virtual ~SdCardMountedIF(){}; - virtual std::string getCurrentMountPrefix() const = 0; + virtual const std::string& getCurrentMountPrefix() const = 0; virtual bool isSdCardMounted(sd::SdCard sdCard) = 0; virtual sd::SdCard getPreferredSdCard() const = 0; virtual void setActiveSdCard(sd::SdCard sdCard) = 0; From 7bc866a105ab6575bdc759e19dae8c32c6de9338 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 12 Sep 2022 17:09:27 +0200 Subject: [PATCH 11/14] add RPI SD card manager --- bsp_linux_board/RPiSdCardManager.cpp | 15 +++++++++++++++ bsp_linux_board/RPiSdCardManager.h | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 bsp_linux_board/RPiSdCardManager.cpp create mode 100644 bsp_linux_board/RPiSdCardManager.h diff --git a/bsp_linux_board/RPiSdCardManager.cpp b/bsp_linux_board/RPiSdCardManager.cpp new file mode 100644 index 00000000..7913f33a --- /dev/null +++ b/bsp_linux_board/RPiSdCardManager.cpp @@ -0,0 +1,15 @@ +#include "RPiSdCardManager.h" + +RPiSdCardManager::RPiSdCardManager() {} + +RPiSdCardManager::RPiSdCardManager(std::string prefix) {} + +const std::string& RPiSdCardManager::getCurrentMountPrefix() const {} + +bool RPiSdCardManager::isSdCardMounted(sd::SdCard sdCard) {} + +sd::SdCard RPiSdCardManager::getPreferredSdCard() const {} + +void RPiSdCardManager::setActiveSdCard(sd::SdCard sdCard) {} + +sd::SdCard RPiSdCardManager::getActiveSdCard() const {} diff --git a/bsp_linux_board/RPiSdCardManager.h b/bsp_linux_board/RPiSdCardManager.h new file mode 100644 index 00000000..68e20c78 --- /dev/null +++ b/bsp_linux_board/RPiSdCardManager.h @@ -0,0 +1,17 @@ +#ifndef BSP_LINUX_BOARD_RPISDCARDMANAGER_H_ +#define BSP_LINUX_BOARD_RPISDCARDMANAGER_H_ +#include + +class RPiSdCardManager: public SdCardMountedIF { +public: + RPiSdCardManager(std::string prefix); + const std::string& getCurrentMountPrefix() const override; + bool isSdCardMounted(sd::SdCard sdCard) override; + sd::SdCard getPreferredSdCard() const override; + void setActiveSdCard(sd::SdCard sdCard) override; + sd::SdCard getActiveSdCard() const override; +}; + + + +#endif /* BSP_LINUX_BOARD_RPISDCARDMANAGER_H_ */ From 002f776bef7a5afb284aefd1a072c3a4628bc7bb Mon Sep 17 00:00:00 2001 From: Irini Kosmidou Date: Mon, 12 Sep 2022 17:15:02 +0200 Subject: [PATCH 12/14] start RPiSdCardManager --- bsp_linux_board/RPiSdCardManager.cpp | 16 +++++++++++----- bsp_linux_board/RPiSdCardManager.h | 4 +++- fsfw | 2 +- mission/devices/ScexDeviceHandler.cpp | 6 +++++- tmtc | 2 +- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/bsp_linux_board/RPiSdCardManager.cpp b/bsp_linux_board/RPiSdCardManager.cpp index 7913f33a..73111a83 100644 --- a/bsp_linux_board/RPiSdCardManager.cpp +++ b/bsp_linux_board/RPiSdCardManager.cpp @@ -1,14 +1,20 @@ #include "RPiSdCardManager.h" -RPiSdCardManager::RPiSdCardManager() {} +RPiSdCardManager::RPiSdCardManager(const std::string& prefix):prefix(prefix) { -RPiSdCardManager::RPiSdCardManager(std::string prefix) {} +} -const std::string& RPiSdCardManager::getCurrentMountPrefix() const {} +const std::string& RPiSdCardManager::getCurrentMountPrefix() const { + return prefix; +} -bool RPiSdCardManager::isSdCardMounted(sd::SdCard sdCard) {} +bool RPiSdCardManager::isSdCardMounted(sd::SdCard sdCard) { + return true; +} -sd::SdCard RPiSdCardManager::getPreferredSdCard() const {} +sd::SdCard RPiSdCardManager::getPreferredSdCard() const { + +} void RPiSdCardManager::setActiveSdCard(sd::SdCard sdCard) {} diff --git a/bsp_linux_board/RPiSdCardManager.h b/bsp_linux_board/RPiSdCardManager.h index 68e20c78..144cfe0e 100644 --- a/bsp_linux_board/RPiSdCardManager.h +++ b/bsp_linux_board/RPiSdCardManager.h @@ -4,12 +4,14 @@ class RPiSdCardManager: public SdCardMountedIF { public: - RPiSdCardManager(std::string prefix); + RPiSdCardManager(const std::string& prefix); const std::string& getCurrentMountPrefix() const override; bool isSdCardMounted(sd::SdCard sdCard) override; sd::SdCard getPreferredSdCard() const override; void setActiveSdCard(sd::SdCard sdCard) override; sd::SdCard getActiveSdCard() const override; +private: + std::string prefix; }; diff --git a/fsfw b/fsfw index cf8fe7ea..141dcb1f 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit cf8fe7ea728bea077b9936bcf0db96845bc6419e +Subproject commit 141dcb1f149b824b5bd6e5d3339ecb712835751e diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/devices/ScexDeviceHandler.cpp index 9a5ebf11..5f3f9aa0 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/devices/ScexDeviceHandler.cpp @@ -312,17 +312,21 @@ ReturnValue_t ScexDeviceHandler::initializeLocalDataPool(localpool::DataPool& lo std::string ScexDeviceHandler::date_time_string() { using namespace std; string date_time; + Clock::TimeOfDay_t tod; + Clock::getDateAndTime(&tod); time_t now = time(0); tm* ltm = localtime(&now); ostringstream oss(std::ostringstream::ate); + //TODO mit tod ersetzen if (ltm->tm_hour < 10) { - oss << 1900 + ltm->tm_year << 1 + ltm->tm_mon << ltm->tm_mday << "_0" << ltm->tm_hour; + oss << tod.year << tod.month << ltm->tm_mday << "_0" << ltm->tm_hour; } else { oss << 1900 + ltm->tm_year << 1 + ltm->tm_mon << ltm->tm_mday << "_" << ltm->tm_hour; } if (ltm->tm_min < 10) { oss << 0 << ltm->tm_min; + } else { oss << ltm->tm_min; } diff --git a/tmtc b/tmtc index e1d84c5b..b4d4a511 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit e1d84c5b99e99ea9a9687dcd298d815dc4d8d2b6 +Subproject commit b4d4a51164af69a22eedd645775061dbb51702b1 From 4649a75d40e8d1c8be364dbf079cdc85c02260d7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 12 Sep 2022 17:23:43 +0200 Subject: [PATCH 13/14] update to new API --- bsp_linux_board/RPiSdCardManager.cpp | 8 +++++--- bsp_linux_board/RPiSdCardManager.h | 4 ++-- bsp_q7s/core/CoreController.cpp | 12 ++++++++++-- bsp_q7s/memory/FileSystemHandler.cpp | 12 ++++++++---- bsp_q7s/memory/SdCardManager.cpp | 12 +++++------- bsp_q7s/memory/SdCardManager.h | 4 ++-- fsfw | 2 +- mission/devices/PayloadPcduHandler.cpp | 4 ++-- mission/memory/SdCardMountedIF.h | 6 +++--- tmtc | 2 +- 10 files changed, 39 insertions(+), 27 deletions(-) diff --git a/bsp_linux_board/RPiSdCardManager.cpp b/bsp_linux_board/RPiSdCardManager.cpp index 73111a83..264d3cfa 100644 --- a/bsp_linux_board/RPiSdCardManager.cpp +++ b/bsp_linux_board/RPiSdCardManager.cpp @@ -12,10 +12,12 @@ bool RPiSdCardManager::isSdCardMounted(sd::SdCard sdCard) { return true; } -sd::SdCard RPiSdCardManager::getPreferredSdCard() const { - +std::optional RPiSdCardManager::getPreferredSdCard() const { + return std::nullopt; } void RPiSdCardManager::setActiveSdCard(sd::SdCard sdCard) {} -sd::SdCard RPiSdCardManager::getActiveSdCard() const {} +std::optional RPiSdCardManager::getActiveSdCard() const { + return std::nullopt; +} diff --git a/bsp_linux_board/RPiSdCardManager.h b/bsp_linux_board/RPiSdCardManager.h index 144cfe0e..b1c1d2cc 100644 --- a/bsp_linux_board/RPiSdCardManager.h +++ b/bsp_linux_board/RPiSdCardManager.h @@ -7,9 +7,9 @@ public: RPiSdCardManager(const std::string& prefix); const std::string& getCurrentMountPrefix() const override; bool isSdCardMounted(sd::SdCard sdCard) override; - sd::SdCard getPreferredSdCard() const override; + std::optional getPreferredSdCard() const override; void setActiveSdCard(sd::SdCard sdCard) override; - sd::SdCard getActiveSdCard() const override; + std::optional getActiveSdCard() const override; private: std::string prefix; }; diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 02d7330d..6f774b6d 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -139,7 +139,11 @@ ReturnValue_t CoreController::initialize() { ReturnValue_t CoreController::initializeAfterTaskCreation() { ReturnValue_t result = returnvalue::OK; - sdInfo.pref = sdcMan->getPreferredSdCard(); + auto sdCard = sdcMan->getPreferredSdCard(); + if(not sdCard) { + return returnvalue::FAILED; + } + sdInfo.pref = sdCard.value(); sdcMan->setActiveSdCard(sdInfo.pref); currMntPrefix = sdcMan->getCurrentMountPrefix(); if (BLOCKING_SD_INIT) { @@ -337,7 +341,11 @@ ReturnValue_t CoreController::sdStateMachine() { if (sdInfo.state == SdStates::SET_STATE_SELF) { if (not sdInfo.commandExecuted) { result = sdcMan->getSdCardsStatus(sdInfo.currentState); - sdInfo.pref = sdcMan->getPreferredSdCard(); + auto sdCard = sdcMan->getPreferredSdCard(); + if(not sdCard) { + return returnvalue::FAILED; + } + sdInfo.pref = sdCard.value(); updateSdInfoOther(); if (sdInfo.pref != sd::SdCard::SLOT_0 and sdInfo.pref != sd::SdCard::SLOT_1) { sif::warning << "Preferred SD card invalid. Setting to card 0.." << std::endl; diff --git a/bsp_q7s/memory/FileSystemHandler.cpp b/bsp_q7s/memory/FileSystemHandler.cpp index cb122383..2c5fb729 100644 --- a/bsp_q7s/memory/FileSystemHandler.cpp +++ b/bsp_q7s/memory/FileSystemHandler.cpp @@ -71,8 +71,8 @@ void FileSystemHandler::fileSystemHandlerLoop() { void FileSystemHandler::fileSystemCheckup() { SdCardManager::SdStatePair statusPair; sdcMan->getSdCardsStatus(statusPair); - sd::SdCard preferredSdCard = sdcMan->getPreferredSdCard(); - if ((preferredSdCard == sd::SdCard::SLOT_0) and (statusPair.first == sd::SdState::MOUNTED)) { + auto preferredSdCard = sdcMan->getPreferredSdCard(); + if (preferredSdCard and (preferredSdCard == sd::SdCard::SLOT_0) and (statusPair.first == sd::SdState::MOUNTED)) { currentMountPrefix = SdCardManager::SD_0_MOUNT_POINT; } else if ((preferredSdCard == sd::SdCard::SLOT_1) and (statusPair.second == sd::SdState::MOUNTED)) { @@ -90,7 +90,7 @@ void FileSystemHandler::fileSystemCheckup() { sif::warning << "Preferred SD card is " << sdString << " but does not appear to be mounted. Attempting fix.." << std::endl; // This function will appear to fix the inconsistent state - ReturnValue_t result = sdcMan->sanitizeState(&statusPair, preferredSdCard); + ReturnValue_t result = sdcMan->sanitizeState(&statusPair, preferredSdCard.value()); if (result != returnvalue::OK) { // Oh no. triggerEvent(SdCardManager::SANITIZATION_FAILED, 0, 0); @@ -108,7 +108,11 @@ ReturnValue_t FileSystemHandler::initialize() { << std::endl; } sdcMan = SdCardManager::instance(); - sd::SdCard preferredSdCard = sdcMan->getPreferredSdCard(); + auto sdCard = sdcMan->getPreferredSdCard(); + if(not sdCard) { + return returnvalue::FAILED; + } + sd::SdCard preferredSdCard = sdCard.value(); if (preferredSdCard == sd::SdCard::SLOT_0) { currentMountPrefix = SdCardManager::SD_0_MOUNT_POINT; } else if (preferredSdCard == sd::SdCard::SLOT_1) { diff --git a/bsp_q7s/memory/SdCardManager.cpp b/bsp_q7s/memory/SdCardManager.cpp index ac0df040..c1b2b8de 100644 --- a/bsp_q7s/memory/SdCardManager.cpp +++ b/bsp_q7s/memory/SdCardManager.cpp @@ -300,11 +300,6 @@ ReturnValue_t SdCardManager::sanitizeState(SdStatePair* statusPair, sd::SdCard p blocking = true; resetNonBlockingState = true; } - if (prefSdCard == sd::SdCard::NONE) { - result = getPreferredSdCard(); - if (result != returnvalue::OK) { - } - } if (statusPair == nullptr) { sdStatusPtr = std::make_unique(); statusPair = sdStatusPtr.get(); @@ -379,7 +374,7 @@ void SdCardManager::processSdStatusLine(std::pair& act idx++; } -sd::SdCard SdCardManager::getPreferredSdCard() const { +std::optional SdCardManager::getPreferredSdCard() const { MutexGuard mg(mutex); auto res = mg.getLockResult(); if (res != returnvalue::OK) { @@ -558,4 +553,7 @@ void SdCardManager::setActiveSdCard(sd::SdCard sdCard) { } } -sd::SdCard SdCardManager::getActiveSdCard() const { return sdInfo.active; } +std::optional SdCardManager::getActiveSdCard() const { + MutexGuard mg(mutex); + return sdInfo.active; +} diff --git a/bsp_q7s/memory/SdCardManager.h b/bsp_q7s/memory/SdCardManager.h index 14101b0e..d8bafe25 100644 --- a/bsp_q7s/memory/SdCardManager.h +++ b/bsp_q7s/memory/SdCardManager.h @@ -92,7 +92,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { * @param sdCard * @return */ - sd::SdCard getPreferredSdCard() const override; + std::optional getPreferredSdCard() const override; /** * Switch on the specified SD card. @@ -159,7 +159,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { * mounted * @return */ - sd::SdCard getActiveSdCard() const override; + std::optional getActiveSdCard() const override; /** * Unmount the specified SD card. This is recommended before switching it off. The SD card diff --git a/fsfw b/fsfw index 141dcb1f..cf8fe7ea 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 141dcb1f149b824b5bd6e5d3339ecb712835751e +Subproject commit cf8fe7ea728bea077b9936bcf0db96845bc6419e diff --git a/mission/devices/PayloadPcduHandler.cpp b/mission/devices/PayloadPcduHandler.cpp index e643a945..c811f5d3 100644 --- a/mission/devices/PayloadPcduHandler.cpp +++ b/mission/devices/PayloadPcduHandler.cpp @@ -491,8 +491,8 @@ void PayloadPcduHandler::checkAdcValues() { void PayloadPcduHandler::checkJsonFileInit() { if (not jsonFileInitComplete) { - sd::SdCard activeSd = sdcMan->getActiveSdCard(); - if (sdcMan->isSdCardMounted(activeSd)) { + auto activeSd = sdcMan->getActiveSdCard(); + if (activeSd and sdcMan->isSdCardMounted(activeSd.value())) { params.initialize(sdcMan->getCurrentMountPrefix()); jsonFileInitComplete = true; } diff --git a/mission/memory/SdCardMountedIF.h b/mission/memory/SdCardMountedIF.h index ff0bf190..3dd529d4 100644 --- a/mission/memory/SdCardMountedIF.h +++ b/mission/memory/SdCardMountedIF.h @@ -2,7 +2,7 @@ #define MISSION_MEMORY_SDCARDMOUNTERIF_H_ #include - +#include #include "definitions.h" class SdCardMountedIF { @@ -10,9 +10,9 @@ class SdCardMountedIF { virtual ~SdCardMountedIF(){}; virtual const std::string& getCurrentMountPrefix() const = 0; virtual bool isSdCardMounted(sd::SdCard sdCard) = 0; - virtual sd::SdCard getPreferredSdCard() const = 0; + virtual std::optional getPreferredSdCard() const = 0; virtual void setActiveSdCard(sd::SdCard sdCard) = 0; - virtual sd::SdCard getActiveSdCard() const = 0; + virtual std::optional getActiveSdCard() const = 0; private: }; diff --git a/tmtc b/tmtc index b4d4a511..e1d84c5b 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit b4d4a51164af69a22eedd645775061dbb51702b1 +Subproject commit e1d84c5b99e99ea9a9687dcd298d815dc4d8d2b6 From fb3214fef9bfd03e22477ef6ffab23573c551776 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 12 Sep 2022 17:25:20 +0200 Subject: [PATCH 14/14] swap order --- bsp_q7s/memory/SdCardManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp_q7s/memory/SdCardManager.cpp b/bsp_q7s/memory/SdCardManager.cpp index c1b2b8de..d4b22e59 100644 --- a/bsp_q7s/memory/SdCardManager.cpp +++ b/bsp_q7s/memory/SdCardManager.cpp @@ -544,8 +544,8 @@ ReturnValue_t SdCardManager::performFsck(sd::SdCard sdcard, bool printOutput, in } void SdCardManager::setActiveSdCard(sd::SdCard sdCard) { - sdInfo.active = sdCard; MutexGuard mg(mutex); + sdInfo.active = sdCard; if (sdInfo.active == sd::SdCard::SLOT_0) { currentPrefix = SD_0_MOUNT_POINT; } else {