diff --git a/bsp_q7s/boardtest/Q7STestTask.cpp b/bsp_q7s/boardtest/Q7STestTask.cpp index 7681ef09..965a6d63 100644 --- a/bsp_q7s/boardtest/Q7STestTask.cpp +++ b/bsp_q7s/boardtest/Q7STestTask.cpp @@ -26,8 +26,8 @@ ReturnValue_t Q7STestTask::performOneShotAction() { //testJsonLibDirect(); //testDummyParams(); //testProtHandler(); - //FsOpCodes opCode = FsOpCodes::ATTEMPT_DIR_REMOVAL_NON_EMPTY; - //testFileSystemHandlerDirect(opCode); + FsOpCodes opCode = FsOpCodes::APPEND_TO_FILE; + testFileSystemHandlerDirect(opCode); return TestTask::performOneShotAction(); } @@ -252,7 +252,7 @@ void Q7STestTask::testFileSystemHandlerDirect(FsOpCodes opCode) { cfg.useMountPrefix = false; sif::info << "Creating empty file in /tmp folder" << std::endl; // Do not delete file, user can check existence in shell - fsHandler->createFile("/tmp", "test.txt", nullptr, 0, &cfg); + fsHandler->createFile("/tmp/", "test.txt", nullptr, 0, &cfg); break; } case(FsOpCodes::REMOVE_TMP_FILE): { @@ -262,7 +262,7 @@ void Q7STestTask::testFileSystemHandlerDirect(FsOpCodes opCode) { if(not std::filesystem::exists("/tmp/test.txt")) { // Creating sample file sif::info << "Creating sample file /tmp/test.txt to delete" << std::endl; - fsHandler->createFile("/tmp", "test.txt", nullptr, 0, &cfg); + fsHandler->createFile("/tmp/", "test.txt", nullptr, 0, &cfg); } result = fsHandler->removeFile("/tmp", "test.txt", &cfg); if(result == HasReturnvaluesIF::RETURN_OK) { @@ -278,7 +278,7 @@ void Q7STestTask::testFileSystemHandlerDirect(FsOpCodes opCode) { cfg.useMountPrefix = false; sif::info << "Creating empty file in /tmp folder" << std::endl; // Do not delete file, user can check existence in shell - ReturnValue_t result = fsHandler->createDirectory("/tmp", "test", false, &cfg); + ReturnValue_t result = fsHandler->createDirectory("/tmp/", "test", false, &cfg); if(result == HasReturnvaluesIF::RETURN_OK) { sif::info << "Directory created successfully" << std::endl; } @@ -297,7 +297,7 @@ void Q7STestTask::testFileSystemHandlerDirect(FsOpCodes opCode) { // Delete any leftover files to regular dir removal works std::remove("/tmp/test/*"); } - result = fsHandler->removeDirectory("/tmp", "test", false, &cfg); + result = fsHandler->removeDirectory("/tmp/", "test", false, &cfg); if(result == HasReturnvaluesIF::RETURN_OK) { sif::info << "Directory removed successfully" << std::endl; } @@ -311,7 +311,7 @@ void Q7STestTask::testFileSystemHandlerDirect(FsOpCodes opCode) { if(result != HasReturnvaluesIF::RETURN_OK) { return; } - result = fsHandler->removeDirectory("/tmp", "test", true, &cfg); + result = fsHandler->removeDirectory("/tmp/", "test", true, &cfg); if(result == HasReturnvaluesIF::RETURN_OK) { sif::info << "Directory removed recursively successfully" << std::endl; } @@ -325,13 +325,42 @@ void Q7STestTask::testFileSystemHandlerDirect(FsOpCodes opCode) { if(result != HasReturnvaluesIF::RETURN_OK) { return; } - result = fsHandler->removeDirectory("/tmp", "test", false, &cfg); + result = fsHandler->removeDirectory("/tmp/", "test", false, &cfg); if(result != HasReturnvaluesIF::RETURN_OK) { sif::info << "Directory removal attempt failed as expected" << std::endl; } else { sif::warning << "Directory removal worked when it should not have!" << std::endl; } + break; + } + case(FsOpCodes::RENAME_FILE): { + // No mount prefix, cause file is created in tmp + cfg.useMountPrefix = false; + if(std::filesystem::exists("/tmp/test.txt")) { + fsHandler->removeDirectory("/tmp/", "test", false, &cfg); + } + sif::info << "Creating empty file /tmp/test.txt and rename to /tmp/test2.txt" << std::endl; + // Do not delete file, user can check existence in shell + fsHandler->createFile("/tmp/", "test.txt", nullptr, 0, &cfg); + fsHandler->renameFile("/tmp/", "test.txt", "test2.txt", &cfg); + break; + } + case(FsOpCodes::APPEND_TO_FILE): { + // No mount prefix, cause file is created in tmp + cfg.useMountPrefix = false; + if(std::filesystem::exists("/tmp/test.txt")) { + fsHandler->removeDirectory("/tmp/", "test", false, &cfg); + } + if(std::filesystem::exists("/tmp/test.txt")) { + fsHandler->removeDirectory("/tmp/", "test", false, &cfg); + } + sif::info << "Creating empty file /tmp/test.txt and adding content" << std::endl; + std::string content = "Hello World\n"; + // Do not delete file, user can check existence in shell + fsHandler->createFile("/tmp/", "test.txt", nullptr, 0, &cfg); + fsHandler->appendToFile("/tmp/", "test.txt", reinterpret_cast( + content.data()), content.size(), 0, &cfg); } } } diff --git a/bsp_q7s/boardtest/Q7STestTask.h b/bsp_q7s/boardtest/Q7STestTask.h index b0153ce9..5e11b374 100644 --- a/bsp_q7s/boardtest/Q7STestTask.h +++ b/bsp_q7s/boardtest/Q7STestTask.h @@ -27,6 +27,8 @@ private: REMOVE_EMPTY_DIR_IN_TMP, ATTEMPT_DIR_REMOVAL_NON_EMPTY, REMOVE_FILLED_DIR_IN_TMP, + RENAME_FILE, + APPEND_TO_FILE, }; void testFileSystemHandlerDirect(FsOpCodes opCode); }; diff --git a/bsp_q7s/memory/FileSystemHandler.cpp b/bsp_q7s/memory/FileSystemHandler.cpp index 2943875a..caad94a6 100644 --- a/bsp_q7s/memory/FileSystemHandler.cpp +++ b/bsp_q7s/memory/FileSystemHandler.cpp @@ -136,13 +136,11 @@ ReturnValue_t FileSystemHandler::initialize() { ReturnValue_t FileSystemHandler::appendToFile(const char* repositoryPath, const char* filename, const uint8_t* data, size_t size, uint16_t packetNumber, FileSystemArgsIF* args) { - // A double slash between repo and filename should not be an issue, so add it in any case - std::string fullPath = currentMountPrefix + std::string(repositoryPath) + "/" + - std::string(filename); - if(not std::filesystem::exists(fullPath)) { + auto path = getInitPath(args) / repositoryPath / filename; + if(not std::filesystem::exists(path)) { return FILE_DOES_NOT_EXIST; } - std::ofstream file(fullPath, std::ios_base::app|std::ios_base::out); + std::ofstream file(path, std::ios_base::app|std::ios_base::out); file.write(reinterpret_cast(data), size); if(not file.good()) { return GENERIC_FILE_ERROR; @@ -152,19 +150,11 @@ ReturnValue_t FileSystemHandler::appendToFile(const char* repositoryPath, ReturnValue_t FileSystemHandler::createFile(const char* repositoryPath, const char* filename, const uint8_t* data, size_t size, FileSystemArgsIF* args) { - std::string fullPath; - bool useMountPrefix = true; - parseCfg(reinterpret_cast(args), useMountPrefix); - if(useMountPrefix) { - fullPath += currentMountPrefix; - } - - // A double slash between repo and filename should not be an issue, so add it in any case - fullPath += std::string(repositoryPath) + "/" + std::string(filename); - if(std::filesystem::exists(fullPath)) { + auto path = getInitPath(args) / filename; + if(std::filesystem::exists(path)) { return FILE_ALREADY_EXISTS; } - std::ofstream file(fullPath); + std::ofstream file(path); file.write(reinterpret_cast(data), size); if(not file.good()) { return GENERIC_FILE_ERROR; @@ -174,19 +164,11 @@ ReturnValue_t FileSystemHandler::createFile(const char* repositoryPath, ReturnValue_t FileSystemHandler::removeFile(const char* repositoryPath, const char* filename, FileSystemArgsIF* args) { - std::string fullPath; - bool useMountPrefix = true; - parseCfg(reinterpret_cast(args), useMountPrefix); - if(useMountPrefix) { - fullPath += currentMountPrefix; - } - - // A double slash between repo and filename should not be an issue, so add it in any case - fullPath += std::string(repositoryPath) + "/" + std::string(filename); - if(not std::filesystem::exists(fullPath)) { + auto path = getInitPath(args) / repositoryPath / filename; + if(not std::filesystem::exists(path)) { return FILE_DOES_NOT_EXIST; } - int result = std::remove(fullPath.c_str()); + int result = std::remove(path.c_str()); if(result != 0) { sif::warning << "FileSystemHandler::deleteFile: Failed with code " << result << std::endl; return GENERIC_FILE_ERROR; @@ -196,42 +178,26 @@ ReturnValue_t FileSystemHandler::removeFile(const char* repositoryPath, ReturnValue_t FileSystemHandler:: createDirectory(const char* repositoryPath, const char* dirname, bool createParentDirs, FileSystemArgsIF* args) { - std::string fullPath; - bool useMountPrefix = true; - parseCfg(reinterpret_cast(args), useMountPrefix); - if(useMountPrefix) { - fullPath += currentMountPrefix; - } - - fullPath += std::string(repositoryPath); - fullPath += "/" + std::string(dirname); - if(std::filesystem::exists(fullPath)) { + auto path = getInitPath(args) / repositoryPath / dirname; + if(std::filesystem::exists(path)) { return DIRECTORY_ALREADY_EXISTS; } - if(std::filesystem::create_directory(fullPath)) { + if(std::filesystem::create_directory(path)) { return HasReturnvaluesIF::RETURN_OK; } - sif::warning << "Creating directory " << fullPath << " failed" << std::endl; + sif::warning << "Creating directory " << path << " failed" << std::endl; return GENERIC_FILE_ERROR; } ReturnValue_t FileSystemHandler::removeDirectory(const char* repositoryPath, const char* dirname, bool deleteRecurively, FileSystemArgsIF* args) { - std::string fullPath; - bool useMountPrefix = true; - parseCfg(reinterpret_cast(args), useMountPrefix); - if(useMountPrefix) { - fullPath += currentMountPrefix; - } - - fullPath += std::string(repositoryPath); - fullPath += "/" + std::string(dirname); - if(not std::filesystem::exists(fullPath)) { + auto path = getInitPath(args) / repositoryPath / dirname; + if(not std::filesystem::exists(path)) { return DIRECTORY_DOES_NOT_EXIST; } std::error_code err; if(not deleteRecurively) { - if(std::filesystem::remove(fullPath, err)) { + if(std::filesystem::remove(path, err)) { return HasReturnvaluesIF::RETURN_OK; } else { @@ -248,7 +214,7 @@ ReturnValue_t FileSystemHandler::removeDirectory(const char* repositoryPath, con } } else { - if(std::filesystem::remove_all(fullPath, err)) { + if(std::filesystem::remove_all(path, err)) { return HasReturnvaluesIF::RETURN_OK; } else { @@ -267,14 +233,25 @@ ReturnValue_t FileSystemHandler::removeDirectory(const char* repositoryPath, con return HasReturnvaluesIF::RETURN_OK; } +ReturnValue_t FileSystemHandler::renameFile(const char *repositoryPath, const char *oldFilename, + const char *newFilename, FileSystemArgsIF *args) { + auto basepath = getInitPath(args) / repositoryPath; + std::filesystem::rename(basepath / oldFilename, basepath / newFilename); + return HasReturnvaluesIF::RETURN_OK; +} + void FileSystemHandler::parseCfg(FsCommandCfg *cfg, bool& useMountPrefix) { if(cfg != nullptr) { useMountPrefix = cfg->useMountPrefix; } } -ReturnValue_t FileSystemHandler::renameFile(const char *repositoryPath, const char *oldFilename, - const char *newFilename, FileSystemArgsIF *args) { - // TODO: Implement - return HasReturnvaluesIF::RETURN_OK; +std::filesystem::path FileSystemHandler::getInitPath(FileSystemArgsIF* args) { + bool useMountPrefix = true; + parseCfg(reinterpret_cast(args), useMountPrefix); + std::string path; + if(useMountPrefix) { + path = currentMountPrefix; + } + return std::filesystem::path(path); } diff --git a/bsp_q7s/memory/FileSystemHandler.h b/bsp_q7s/memory/FileSystemHandler.h index 8fdebd05..35a0f533 100644 --- a/bsp_q7s/memory/FileSystemHandler.h +++ b/bsp_q7s/memory/FileSystemHandler.h @@ -10,6 +10,7 @@ #include "fsfw/memory/HasFileSystemIF.h" #include +#include class CoreController; @@ -61,6 +62,7 @@ private: void fileSystemHandlerLoop(); void fileSystemCheckup(); + std::filesystem::path getInitPath(FileSystemArgsIF* args); void parseCfg(FsCommandCfg* cfg, bool& useMountPrefix); }; diff --git a/fsfw b/fsfw index d8580074..ceb87b5a 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit d8580074c2730d861353ab47e659afeb707afe71 +Subproject commit ceb87b5abb2992a18266328e0ea34d9af15db7af diff --git a/linux/obc/PdecHandler.cpp b/linux/obc/PdecHandler.cpp index 027cac80..829377d0 100644 --- a/linux/obc/PdecHandler.cpp +++ b/linux/obc/PdecHandler.cpp @@ -257,7 +257,7 @@ bool PdecHandler::checkFrameAna(uint32_t pdecFar) { switch(frameAna) { case(FrameAna_t::ABANDONED_CLTU): { triggerEvent(INVALID_TC_FRAME, ABANDONED_CLTU); - sif::debug << "PdecHandler::checkFrameAna: Abondoned CLTU" << std::endl; + sif::warning << "PdecHandler::checkFrameAna: Abondoned CLTU" << std::endl; break; } case(FrameAna_t::FRAME_DIRTY): { @@ -266,36 +266,38 @@ bool PdecHandler::checkFrameAna(uint32_t pdecFar) { break; } case(FrameAna_t::FRAME_ILLEGAL): { - sif::debug << "PdecHandler::checkFrameAna: Frame illegal for one reason" << std::endl; + sif::warning << "PdecHandler::checkFrameAna: Frame illegal for one reason" << std::endl; handleIReason(pdecFar, FRAME_ILLEGAL_ONE_REASON); break; } case(FrameAna_t::FRAME_ILLEGAL_MULTI_REASON): { - sif::debug << "PdecHandler::checkFrameAna: Frame illegal for multiple reasons" + sif::warning << "PdecHandler::checkFrameAna: Frame illegal for multiple reasons" << std::endl; handleIReason(pdecFar, FRAME_ILLEGAL_MULTIPLE_REASONS); break; } case(FrameAna_t::AD_DISCARDED_LOCKOUT): { triggerEvent(INVALID_TC_FRAME, AD_DISCARDED_LOCKOUT); - sif::debug << "PdecHandler::checkFrameAna: AD frame discarded because of lockout" + sif::warning << "PdecHandler::checkFrameAna: AD frame discarded because of lockout" << std::endl; break; } case(FrameAna_t::AD_DISCARDED_WAIT): { triggerEvent(INVALID_TC_FRAME, AD_DISCARDED_LOCKOUT); - sif::debug << "PdecHandler::checkFrameAna: AD frame discarded because of wait" + sif::warning << "PdecHandler::checkFrameAna: AD frame discarded because of wait" << std::endl; break; } case(FrameAna_t::AD_DISCARDED_NS_VR): { triggerEvent(INVALID_TC_FRAME, AD_DISCARDED_NS_VS); - sif::debug << "PdecHandler::checkFrameAna: AD frame discarded because N(S) or V(R)" + sif::warning << "PdecHandler::checkFrameAna: AD frame discarded because N(S) or V(R)" << std::endl; break; } case(FrameAna_t::FRAME_ACCEPTED): { - sif::debug << "PdecHandler::checkFrameAna: Accepted TC frame" << std::endl; +#if OBSW_DEBUG_PDEC_HANDLER == 1 + sif::info << "PdecHandler::checkFrameAna: Accepted TC frame" << std::endl; +#endif frameValid = true; break; } @@ -482,6 +484,10 @@ uint32_t PdecHandler::getClcw() { return *(registerBaseAddress + PDEC_CLCW_OFFSET); } +uint32_t PdecHandler::getPdecMon() { + return *(registerBaseAddress + PDEC_MON_OFFSET); +} + void PdecHandler::printClcw() { uint32_t clcw = getClcw(); uint8_t type = static_cast((clcw >> 31) & 0x1); @@ -523,6 +529,39 @@ void PdecHandler::printClcw() { << "0x" << static_cast(repValue) << std::endl; } +void PdecHandler::printPdecMon() { + uint32_t pdecMon = getPdecMon(); + uint32_t tc0ChannelStatus = (pdecMon & TC0_STATUS_MASK) >> TC0_STATUS_POS; + uint32_t tc1ChannelStatus = (pdecMon & TC1_STATUS_MASK) >> TC1_STATUS_POS; + uint32_t tc2ChannelStatus = (pdecMon & TC2_STATUS_MASK) >> TC2_STATUS_POS; + uint32_t tc3ChannelStatus = (pdecMon & TC3_STATUS_MASK) >> TC3_STATUS_POS; + uint32_t tc4ChannelStatus = (pdecMon & TC4_STATUS_MASK) >> TC4_STATUS_POS; + uint32_t tc5ChannelStatus = (pdecMon & TC5_STATUS_MASK) >> TC5_STATUS_POS; + uint32_t lock = (pdecMon & LOCK_MASK) >> LOCK_POS; + sif::info << std::setw(30) << std::left << "TC0 status: " << getMonStatusString(tc0ChannelStatus) << std::endl; + sif::info << std::setw(30) << std::left << "TC1 status: " << getMonStatusString(tc1ChannelStatus) << std::endl; + sif::info << std::setw(30) << std::left << "TC2 status: " << getMonStatusString(tc2ChannelStatus) << std::endl; + sif::info << std::setw(30) << std::left << "TC3 status: " << getMonStatusString(tc3ChannelStatus) << std::endl; + sif::info << std::setw(30) << std::left << "TC4 status: " << getMonStatusString(tc4ChannelStatus) << std::endl; + sif::info << std::setw(30) << std::left << "TC5 status: " << getMonStatusString(tc5ChannelStatus) << std::endl; + sif::info << std::setw(30) << std::left << "Start sequence lock: " << lock << std::endl; +} + +std::string PdecHandler::getMonStatusString(uint32_t status) { + switch(status) { + case TC_CHANNEL_INACTIVE: + return std::string("inactive"); + case TC_CHANNEL_ACTIVE: + return std::string("active"); + case TC_CHANNEL_TIMEDOUT: + return std::string("timed out"); + default: + sif::warning << "PdecHandler::getMonStatusString: Invalid status" << std::endl; + return std::string(); + break; + } +} + ReturnValue_t PdecHandler::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) { @@ -530,6 +569,9 @@ ReturnValue_t PdecHandler::executeAction(ActionId_t actionId, case PRINT_CLCW: printClcw(); return EXECUTION_FINISHED; + case PRINT_PDEC_MON: + printPdecMon(); + return EXECUTION_FINISHED; default: return COMMAND_NOT_IMPLEMENTED; } diff --git a/linux/obc/PdecHandler.h b/linux/obc/PdecHandler.h index 8819df22..8c8e8d9b 100644 --- a/linux/obc/PdecHandler.h +++ b/linux/obc/PdecHandler.h @@ -61,16 +61,6 @@ public: ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) override; - /** - * brief Returns the 32-bit wide communication link control word (CLCW) - */ - uint32_t getClcw(); - - /** - * @rief Reads and prints the CLCW. Can be useful for debugging. - */ - void printClcw(); - static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PDEC_HANDLER; //! [EXPORT] : [COMMENT] Frame acceptance report signals an invalid frame @@ -119,6 +109,8 @@ private: // Action IDs static const ActionId_t PRINT_CLCW = 0; + // Print PDEC monitor register + static const ActionId_t PRINT_PDEC_MON = 1; static const uint8_t STAT_POSITION = 31; static const uint8_t FRAME_ANA_POSITION = 28; @@ -129,6 +121,28 @@ private: static const uint32_t FRAME_ANA_MASK = 0x70000000; static const uint32_t IREASON_MASK = 0x0E000000; + static const uint32_t TC_CHANNEL_INACTIVE = 0x0; + static const uint32_t TC_CHANNEL_ACTIVE = 0x1; + static const uint32_t TC_CHANNEL_TIMEDOUT = 0x2; + + static const uint32_t TC0_STATUS_MASK = 0x3; + static const uint32_t TC1_STATUS_MASK = 0xC; + static const uint32_t TC2_STATUS_MASK = 0x300; + static const uint32_t TC3_STATUS_MASK = 0xC00; + static const uint32_t TC4_STATUS_MASK = 0x30000; + static const uint32_t TC5_STATUS_MASK = 0xc00000; + // Lock register set to 1 when start sequence has been found (CLTU is beeing processed) + static const uint32_t LOCK_MASK = 0xc00000; + + static const uint32_t TC0_STATUS_POS = 0; + static const uint32_t TC1_STATUS_POS = 2; + static const uint32_t TC2_STATUS_POS = 4; + static const uint32_t TC3_STATUS_POS = 6; + static const uint32_t TC4_STATUS_POS = 8; + static const uint32_t TC5_STATUS_POS = 10; + // Lock register set to 1 when start sequence has been found (CLTU is beeing processed) + static const uint32_t LOCK_POS = 12; + /** * UIO is 4 byte aligned. Thus offset is calculated with "true offset" / 4 * Example: PDEC_FAR = 0x2840 => Offset in virtual address space is 0xA10 @@ -138,7 +152,7 @@ private: static const uint32_t PDEC_BFREE_OFFSET = 0xA24; static const uint32_t PDEC_BPTR_OFFSET = 0xA25; static const uint32_t PDEC_SLEN_OFFSET = 0xA26; - static const uint32_t PDEC_MON = 0xA27; + static const uint32_t PDEC_MON_OFFSET = 0xA27; #if BOARD_TE0720 == 1 static const int CONFIG_MEMORY_MAP_SIZE = 0x400; @@ -330,6 +344,29 @@ private: */ uint8_t getOddParity(uint8_t number); + /** + * brief Returns the 32-bit wide communication link control word (CLCW) + */ + uint32_t getClcw(); + + /** + * @brief Returns the PDEC monitor register content + * + */ + uint32_t getPdecMon(); + + /** + * @brief Reads and prints the CLCW. Can be useful for debugging. + */ + void printClcw(); + + /** + * @brief Prints monitor register information to debug console. + */ + void printPdecMon(); + + std::string getMonStatusString(uint32_t status); + object_id_t tcDestinationId; AcceptsTelecommandsIF* tcDestination = nullptr; diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index 58485b71..14c8791a 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -101,18 +101,18 @@ void ObjectFactory::produceGenericObjects() { #if OBSW_ADD_TCPIP_BRIDGE == 1 #if OBSW_USE_TCP_BRIDGE == 0 auto tmtcBridge = new UdpTmTcBridge(objects::TMTC_BRIDGE, objects::CCSDS_PACKET_DISTRIBUTOR); - tmtcBridge->setMaxNumberOfPacketsStored(50); new UdpTcPollingTask(objects::TMTC_POLLING_TASK, objects::TMTC_BRIDGE); sif::info << "Created UDP server for TMTC commanding with listener port " << udpBridge->getUdpPort() << std::endl; #else auto tmtcBridge = new TcpTmTcBridge(objects::TMTC_BRIDGE, objects::CCSDS_PACKET_DISTRIBUTOR); - tmtcBridge->setMaxNumberOfPacketsStored(50); auto tcpServer = new TcpTmTcServer(objects::TMTC_POLLING_TASK, objects::TMTC_BRIDGE); // TCP is stream based. Use packet ID as start marker when parsing for space packets tcpServer->setSpacePacketParsingOptions({common::PUS_PACKET_ID}); sif::info << "Created TCP server for TMTC commanding with listener port " << tcpServer->getTcpPort() << std::endl; #endif /* OBSW_USE_TMTC_TCP_BRIDGE == 0 */ + tmtcBridge->setMaxNumberOfPacketsStored(70); #endif /* OBSW_ADD_TCPIP_BRIDGE == 1 */ + } diff --git a/tmtc b/tmtc index dedb2849..bcec5df6 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit dedb28497f62314498034cd87d1e2a4361b92950 +Subproject commit bcec5df6e2636e3751f7a7eb103b893dc4581c10