v1.10.0 #220
@ -80,6 +80,8 @@ ReturnValue_t CoreController::initialize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sdStateMachine();
|
sdStateMachine();
|
||||||
|
|
||||||
|
triggerEvent(REBOOT_SW, CURRENT_CHIP, CURRENT_COPY);
|
||||||
return ExtendedControllerBase::initialize();
|
return ExtendedControllerBase::initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,6 +511,44 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_
|
|||||||
case (LIST_DIRECTORY_INTO_FILE): {
|
case (LIST_DIRECTORY_INTO_FILE): {
|
||||||
return actionListDirectoryIntoFile(actionId, commandedBy, data, size);
|
return actionListDirectoryIntoFile(actionId, commandedBy, data, size);
|
||||||
}
|
}
|
||||||
|
case (SWITCH_REBOOT_FILE_HANDLING): {
|
||||||
|
if (size < 1) {
|
||||||
|
return HasActionsIF::INVALID_PARAMETERS;
|
||||||
|
}
|
||||||
|
std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE;
|
||||||
|
// Disable the reboot file mechanism
|
||||||
|
parseRebootFile(path, rebootFile);
|
||||||
|
if (data[0] == 0) {
|
||||||
|
rebootFile.enabled = false;
|
||||||
|
rewriteRebootFile(rebootFile);
|
||||||
|
} else if (data[0] == 1) {
|
||||||
|
rebootFile.enabled = true;
|
||||||
|
rewriteRebootFile(rebootFile);
|
||||||
|
} else {
|
||||||
|
return HasActionsIF::INVALID_PARAMETERS;
|
||||||
|
}
|
||||||
|
return HasActionsIF::EXECUTION_FINISHED;
|
||||||
|
}
|
||||||
|
case (RESET_ALL_REBOOT_COUNTERS): {
|
||||||
|
resetRebootCount(xsc::ALL_CHIP, xsc::ALL_COPY);
|
||||||
|
return HasActionsIF::EXECUTION_FINISHED;
|
||||||
|
}
|
||||||
|
case (RESET_REBOOT_COUNTER_00): {
|
||||||
|
resetRebootCount(xsc::CHIP_0, xsc::COPY_0);
|
||||||
|
return HasActionsIF::EXECUTION_FINISHED;
|
||||||
|
}
|
||||||
|
case (RESET_REBOOT_COUNTER_01): {
|
||||||
|
resetRebootCount(xsc::CHIP_0, xsc::COPY_1);
|
||||||
|
return HasActionsIF::EXECUTION_FINISHED;
|
||||||
|
}
|
||||||
|
case (RESET_REBOOT_COUNTER_10): {
|
||||||
|
resetRebootCount(xsc::CHIP_1, xsc::COPY_0);
|
||||||
|
return HasActionsIF::EXECUTION_FINISHED;
|
||||||
|
}
|
||||||
|
case (RESET_REBOOT_COUNTER_11): {
|
||||||
|
resetRebootCount(xsc::CHIP_1, xsc::COPY_1);
|
||||||
|
return HasActionsIF::EXECUTION_FINISHED;
|
||||||
|
}
|
||||||
case (REBOOT_OBC): {
|
case (REBOOT_OBC): {
|
||||||
return actionPerformReboot(data, size);
|
return actionPerformReboot(data, size);
|
||||||
}
|
}
|
||||||
@ -1164,6 +1204,12 @@ void CoreController::performRebootFileHandling(bool recreateFile) {
|
|||||||
|
|
||||||
if (rebootFile.bootFlag) {
|
if (rebootFile.bootFlag) {
|
||||||
// Trigger event to inform ground that a reboot was triggered
|
// Trigger event to inform ground that a reboot was triggered
|
||||||
|
uint32_t p1 = rebootFile.lastChip << 16 | rebootFile.lastCopy;
|
||||||
|
uint32_t p2 = rebootFile.img00Cnt << 24 | rebootFile.img01Cnt << 16 |
|
||||||
|
rebootFile.img10Cnt << 8 | rebootFile.img11Cnt;
|
||||||
|
triggerEvent(REBOOT_MECHANISM_TRIGGERED, p1, p2);
|
||||||
|
// Clear the boot flag
|
||||||
|
rebootFile.bootFlag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (CURRENT_CHIP) {
|
switch (CURRENT_CHIP) {
|
||||||
@ -1447,6 +1493,33 @@ bool CoreController::parseRebootFile(std::string path, RebootFile &rf) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CoreController::resetRebootCount(xsc::Chip tgtChip, xsc::Copy tgtCopy) {
|
||||||
|
std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE;
|
||||||
|
// Disable the reboot file mechanism
|
||||||
|
parseRebootFile(path, rebootFile);
|
||||||
|
if (tgtChip == xsc::ALL_CHIP and tgtCopy == xsc::ALL_COPY) {
|
||||||
|
rebootFile.img00Cnt = 0;
|
||||||
|
rebootFile.img01Cnt = 0;
|
||||||
|
rebootFile.img10Cnt = 0;
|
||||||
|
rebootFile.img11Cnt = 0;
|
||||||
|
} else {
|
||||||
|
if (tgtChip == xsc::CHIP_0) {
|
||||||
|
if (tgtCopy == xsc::COPY_0) {
|
||||||
|
rebootFile.img00Cnt = 0;
|
||||||
|
} else {
|
||||||
|
rebootFile.img01Cnt = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tgtCopy == xsc::COPY_0) {
|
||||||
|
rebootFile.img10Cnt = 0;
|
||||||
|
} else {
|
||||||
|
rebootFile.img11Cnt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rewriteRebootFile(rebootFile);
|
||||||
|
}
|
||||||
|
|
||||||
void CoreController::rewriteRebootFile(RebootFile file) {
|
void CoreController::rewriteRebootFile(RebootFile file) {
|
||||||
std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE;
|
std::string path = sdcMan->getCurrentMountPrefix(sdInfo.pref) + REBOOT_FILE;
|
||||||
std::ofstream rebootFile(path);
|
std::ofstream rebootFile(path);
|
||||||
|
@ -47,12 +47,30 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
static constexpr char REBOOT_FILE[] = "/conf/reboot.txt";
|
static constexpr char REBOOT_FILE[] = "/conf/reboot.txt";
|
||||||
|
|
||||||
static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0;
|
static constexpr ActionId_t LIST_DIRECTORY_INTO_FILE = 0;
|
||||||
|
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;
|
||||||
|
|
||||||
static constexpr ActionId_t REBOOT_OBC = 32;
|
static constexpr ActionId_t REBOOT_OBC = 32;
|
||||||
static constexpr ActionId_t MOUNT_OTHER_COPY = 33;
|
static constexpr ActionId_t MOUNT_OTHER_COPY = 33;
|
||||||
|
|
||||||
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE;
|
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE;
|
||||||
|
|
||||||
static constexpr Event ALLOC_FAILURE = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM);
|
static constexpr Event ALLOC_FAILURE = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM);
|
||||||
|
//! [EXPORT] : [COMMENT] Software reboot occured. Can also be a systemd reboot.
|
||||||
|
//! P1: Current Chip, P2: Current Copy
|
||||||
|
static constexpr Event REBOOT_SW = event::makeEvent(SUBSYSTEM_ID, 1, severity::MEDIUM);
|
||||||
|
//! [EXPORT] : [COMMENT] 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
|
||||||
|
static constexpr Event REBOOT_MECHANISM_TRIGGERED =
|
||||||
|
event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM);
|
||||||
|
//! Trying to find a way how to determine that the reboot came from ProASIC3 or PCDU..
|
||||||
|
static constexpr Event REBOOT_HW = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM);
|
||||||
|
|
||||||
CoreController(object_id_t objectId);
|
CoreController(object_id_t objectId);
|
||||||
virtual ~CoreController();
|
virtual ~CoreController();
|
||||||
@ -190,6 +208,7 @@ class CoreController : public ExtendedControllerBase {
|
|||||||
bool allChips, bool allCopies, uint8_t arrIdx);
|
bool allChips, bool allCopies, uint8_t arrIdx);
|
||||||
void determineAndExecuteReboot(RebootFile& rf, bool& needsReboot, xsc::Chip& tgtChip,
|
void determineAndExecuteReboot(RebootFile& rf, bool& needsReboot, xsc::Chip& tgtChip,
|
||||||
xsc::Copy& tgtCopy);
|
xsc::Copy& tgtCopy);
|
||||||
|
void resetRebootCount(xsc::Chip tgtChip, xsc::Copy tgtCopy);
|
||||||
bool parseRebootFile(std::string path, RebootFile& file);
|
bool parseRebootFile(std::string path, RebootFile& file);
|
||||||
void rewriteRebootFile(RebootFile file);
|
void rewriteRebootFile(RebootFile file);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user