From f8f0032d1e50b41b43c8e1bae70f96e42e6d4def Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 3 Aug 2021 11:18:24 +0200 Subject: [PATCH 1/3] reboot feature finished --- bsp_q7s/core/CoreController.cpp | 30 ++++++++++++++++++++++++++++-- bsp_q7s/core/CoreController.h | 3 ++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 72171c65..69c234f5 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -159,8 +159,7 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_ return actionListDirectoryIntoFile(actionId, commandedBy, data, size); } case(REBOOT_OBC): { - return HasReturnvaluesIF::RETURN_OK; - break; + return actionPerformReboot(data, size); } default: { return HasActionsIF::INVALID_ACTION_ID; @@ -457,6 +456,33 @@ void CoreController::initPrint() { #endif } +ReturnValue_t CoreController::actionPerformReboot(const uint8_t *data, size_t size) { + if(size < 1) { + return HasActionsIF::INVALID_PARAMETERS; + } + bool rebootSameBootCopy = data[0]; + if(rebootSameBootCopy) { + int result = std::system("xsc_boot_copy -r"); + if(result != 0) { + utility::handleSystemError(result, "CoreController::executeAction"); + return HasReturnvaluesIF::RETURN_FAILED; + } + return HasActionsIF::EXECUTION_FINISHED; + } + if(size < 3) { + return HasActionsIF::INVALID_PARAMETERS; + } + // The second byte in data is the target chip, the third byte is the target copy + std::string cmdString = "xsc_boot_copy " + std::to_string(data[1]) + + std::to_string(data[2]); + int result = std::system(cmdString.c_str()); + if(result != 0) { + utility::handleSystemError(result, "CoreController::executeAction"); + return HasReturnvaluesIF::RETURN_FAILED; + } + return HasActionsIF::EXECUTION_FINISHED; +} + void CoreController::performWatchdogControlOperation() { // Only perform each fifth iteration if(watchdogFifoFd != 0 and opDivider.checkAndIncrement()) { diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index 92b22dd4..4a71e6e7 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -24,7 +24,7 @@ public: }; static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0; - static constexpr ActionId_t REBOOT_OBC = 1; + static constexpr ActionId_t REBOOT_OBC = 32; static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE; @@ -68,6 +68,7 @@ private: ReturnValue_t actionListDirectoryIntoFile(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t *data, size_t size); + ReturnValue_t actionPerformReboot(const uint8_t *data, size_t size); void initPrint(); From 59c4ed74e030dfead7d639700230600939fa8cbc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 3 Aug 2021 11:21:28 +0200 Subject: [PATCH 2/3] minor bugfix --- bsp_q7s/core/CoreController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 69c234f5..847f6a52 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -473,7 +473,7 @@ ReturnValue_t CoreController::actionPerformReboot(const uint8_t *data, size_t si return HasActionsIF::INVALID_PARAMETERS; } // The second byte in data is the target chip, the third byte is the target copy - std::string cmdString = "xsc_boot_copy " + std::to_string(data[1]) + + std::string cmdString = "xsc_boot_copy " + std::to_string(data[1]) + " " + std::to_string(data[2]); int result = std::system(cmdString.c_str()); if(result != 0) { From 3cc37865056d3527f876e9c808e9e2d836f24670 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 3 Aug 2021 15:29:45 +0200 Subject: [PATCH 3/3] TCP default now, bugfixes in CoreController --- bsp_q7s/boardtest/FileSystemTest.cpp | 5 +++++ bsp_q7s/boardtest/FileSystemTest.h | 5 ----- bsp_q7s/boardtest/Q7STestTask.cpp | 4 ++-- bsp_q7s/core/CoreController.cpp | 18 ++++++++++++++---- bsp_q7s/memory/FileSystemHandler.cpp | 4 ++-- common/config/commonConfig.h.in | 2 +- fsfw | 2 +- tmtc | 2 +- 8 files changed, 26 insertions(+), 16 deletions(-) diff --git a/bsp_q7s/boardtest/FileSystemTest.cpp b/bsp_q7s/boardtest/FileSystemTest.cpp index 1de5bb7a..92c4cf3d 100644 --- a/bsp_q7s/boardtest/FileSystemTest.cpp +++ b/bsp_q7s/boardtest/FileSystemTest.cpp @@ -4,6 +4,11 @@ #include #include +enum SdCard { + SDC0, + SDC1 +}; + FileSystemTest::FileSystemTest() { using namespace std; SdCard sdCard = SdCard::SDC0; diff --git a/bsp_q7s/boardtest/FileSystemTest.h b/bsp_q7s/boardtest/FileSystemTest.h index 907c86ca..256a0b36 100644 --- a/bsp_q7s/boardtest/FileSystemTest.h +++ b/bsp_q7s/boardtest/FileSystemTest.h @@ -1,11 +1,6 @@ #ifndef BSP_Q7S_BOARDTEST_FILESYSTEMTEST_H_ #define BSP_Q7S_BOARDTEST_FILESYSTEMTEST_H_ -enum SdCard { - SDC0, - SDC1 -}; - class FileSystemTest { public: FileSystemTest(); diff --git a/bsp_q7s/boardtest/Q7STestTask.cpp b/bsp_q7s/boardtest/Q7STestTask.cpp index 4e763641..f9439fc1 100644 --- a/bsp_q7s/boardtest/Q7STestTask.cpp +++ b/bsp_q7s/boardtest/Q7STestTask.cpp @@ -24,8 +24,8 @@ ReturnValue_t Q7STestTask::performOneShotAction() { //testScratchApi(); //testJsonLibDirect(); //testDummyParams(); - FsOpCodes opCode = FsOpCodes::ATTEMPT_DIR_REMOVAL_NON_EMPTY; - testFileSystemHandlerDirect(opCode); + //FsOpCodes opCode = FsOpCodes::ATTEMPT_DIR_REMOVAL_NON_EMPTY; + //testFileSystemHandlerDirect(opCode); return TestTask::performOneShotAction(); } diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 847f6a52..b1ca47d9 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -23,8 +23,8 @@ CoreController::Chip CoreController::currentChip = Chip::NO_CHIP; CoreController::Copy CoreController::currentCopy = Copy::NO_COPY; CoreController::CoreController(object_id_t objectId): - ExtendedControllerBase(objectId, objects::NO_OBJECT, 5), - opDivider(5) { + ExtendedControllerBase(objectId, objects::NO_OBJECT, 5), + opDivider(5) { ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; try { result = initWatchdogFifo(); @@ -49,7 +49,7 @@ CoreController::CoreController(object_id_t objectId): } ReturnValue_t CoreController::handleCommandMessage(CommandMessage *message) { - return HasReturnvaluesIF::RETURN_OK; + return ExtendedControllerBase::handleCommandMessage(message); } void CoreController::performControlOperation() { @@ -74,7 +74,7 @@ ReturnValue_t CoreController::initialize() { "count failed" << std::endl; } - return HasReturnvaluesIF::RETURN_OK; + return ExtendedControllerBase::initialize(); } ReturnValue_t CoreController::checkModeCommand(Mode_t mode, Submode_t submode, @@ -462,6 +462,12 @@ ReturnValue_t CoreController::actionPerformReboot(const uint8_t *data, size_t si } bool rebootSameBootCopy = data[0]; if(rebootSameBootCopy) { +#if OBSW_VERBOSE_LEVEL >= 1 + sif::info << "CoreController::actionPerformReboot: Rebooting on current image" << std::endl; +#endif + // Attempt graceful shutdown by unmounting and switching off SD cards + SdCardManager::instance()->switchOffSdCard(sd::SdCard::SLOT_0); + SdCardManager::instance()->switchOffSdCard(sd::SdCard::SLOT_1); int result = std::system("xsc_boot_copy -r"); if(result != 0) { utility::handleSystemError(result, "CoreController::executeAction"); @@ -472,6 +478,10 @@ ReturnValue_t CoreController::actionPerformReboot(const uint8_t *data, size_t si if(size < 3) { return HasActionsIF::INVALID_PARAMETERS; } +#if OBSW_VERBOSE_LEVEL >= 1 + sif::info << "CoreController::actionPerformReboot: Rebooting on " << + static_cast(data[1]) << " " << static_cast(data[2]) << std::endl; +#endif // The second byte in data is the target chip, the third byte is the target copy std::string cmdString = "xsc_boot_copy " + std::to_string(data[1]) + " " + std::to_string(data[2]); diff --git a/bsp_q7s/memory/FileSystemHandler.cpp b/bsp_q7s/memory/FileSystemHandler.cpp index 159512a0..5a7895da 100644 --- a/bsp_q7s/memory/FileSystemHandler.cpp +++ b/bsp_q7s/memory/FileSystemHandler.cpp @@ -226,7 +226,7 @@ ReturnValue_t FileSystemHandler::removeDirectory(const char *repositoryPath, else { // Check error code. Most probably denied permissions because folder is not empty sif::warning << "FileSystemHandler::removeDirectory: Deleting directory failed with " - "code" << err.value() << ": " << strerror(err.value()) << std::endl; + "code " << err.value() << ": " << strerror(err.value()) << std::endl; if(err.value() == ENOTEMPTY) { return DIRECTORY_NOT_EMPTY; } @@ -242,7 +242,7 @@ ReturnValue_t FileSystemHandler::removeDirectory(const char *repositoryPath, } else { sif::warning << "FileSystemHandler::removeDirectory: Deleting directory failed with " - "code" << err.value() << ": " << strerror(err.value()) << std::endl; + "code " << err.value() << ": " << strerror(err.value()) << std::endl; // Check error code if(err.value() == ENOTEMPTY) { return DIRECTORY_NOT_EMPTY; diff --git a/common/config/commonConfig.h.in b/common/config/commonConfig.h.in index 2b0590c8..52b5dd45 100644 --- a/common/config/commonConfig.h.in +++ b/common/config/commonConfig.h.in @@ -5,6 +5,6 @@ // Use TCP instead of UDP for the TMTC bridge. This allows using the TMTC client locally // because UDP packets are not allowed in the VPN -#define OBSW_USE_TMTC_TCP_BRIDGE 0 +#define OBSW_USE_TMTC_TCP_BRIDGE 1 #endif /* COMMON_CONFIG_COMMONCONFIG_H_ */ diff --git a/fsfw b/fsfw index 0ff81294..296c587e 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 0ff81294e7e209bb4a26171b10d80fe522e65bcf +Subproject commit 296c587e3de10c579847e04af3176b3acaa2d701 diff --git a/tmtc b/tmtc index 477743f6..bc32472d 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 477743f6264689327528beb5344c39247af6c49e +Subproject commit bc32472d88a0d7a1566f53c05a1bc49f3c377985