#pragma once #include "definitions.h" #include "SdCardManager.h" #include #include #include namespace xsc { enum Chip : uint8_t { CHIP_0, CHIP_1, NO_CHIP, SELF_CHIP, ALL_CHIP }; enum Copy : uint8_t { COPY_0, COPY_1, NO_COPY, SELF_COPY, ALL_COPY }; } // namespace xsc struct RebootFile { static constexpr uint8_t DEFAULT_MAX_BOOT_CNT = 10; bool enabled = false; size_t maxCount = DEFAULT_MAX_BOOT_CNT; uint32_t img00Cnt = 0; uint32_t img01Cnt = 0; uint32_t img10Cnt = 0; uint32_t img11Cnt = 0; uint32_t relevantBootCnt = 0; bool bootFlag = false; xsc::Chip lastChip = xsc::Chip::CHIP_0; xsc::Copy lastCopy = xsc::Copy::COPY_0; }; class SdCardManager; class CoreController { public: static constexpr char REBOOT_FILE[] = "/conf/reboot.txt"; static constexpr uint32_t REBOOT_MECHANISM_TRIGGERED = 1; static xsc::Chip CURRENT_CHIP; static xsc::Copy CURRENT_COPY; static constexpr ActionId_t SWITCH_REBOOT_FILE_HANDLING = 5; static constexpr ActionId_t RESET_ALL_REBOOT_COUNTERS = 6; static constexpr ActionId_t RESET_REBOOT_COUNTER_00 = 7; static constexpr ActionId_t RESET_REBOOT_COUNTER_01 = 8; static constexpr ActionId_t RESET_REBOOT_COUNTER_10 = 9; static constexpr ActionId_t RESET_REBOOT_COUNTER_11 = 10; static constexpr ActionId_t SET_MAX_REBOOT_CNT = 11; CoreController(); ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size); void performRebootFileHandling(bool recreateFile); void determineAndExecuteReboot(RebootFile& rf, bool& needsReboot, xsc::Chip& tgtChip, xsc::Copy& tgtCopy); void resetRebootCount(xsc::Chip tgtChip, xsc::Copy tgtCopy); bool parseRebootFile(std::string path, RebootFile& file); void rewriteRebootFile(RebootFile file); private: struct SdInfo { sd::SdCard pref = sd::SdCard::NONE; sd::SdState prefState = sd::SdState::OFF; sd::SdCard other = sd::SdCard::NONE; sd::SdState otherState = sd::SdState::OFF; } sdInfo; SdCardManager* sdcMan = nullptr; RebootFile rebootFile = {}; bool doPerformRebootFileHandling = true; };