mpsoc shutdown after running update procedure

This commit is contained in:
Jakob Meier
2022-04-25 11:03:02 +02:00
parent 6876952bbd
commit 311ec7b194
12 changed files with 343 additions and 86 deletions

View File

@ -266,10 +266,10 @@ static const uint32_t LOGGING_RPT_ID = LOGGING_REQUEST_COUNTERS;
static const uint32_t ADC_REPORT_SET_ID = REQUEST_ADC_REPORT;
namespace recv_timeout {
// Erase memory can require up to 60 seconds for execution
static const uint32_t ERASE_MEMORY = 60000;
static const uint32_t UPDATE_STATUS_REPORT = 60000;
}
// Erase memory can require up to 60 seconds for execution
static const uint32_t ERASE_MEMORY = 60000;
static const uint32_t UPDATE_STATUS_REPORT = 60000;
} // namespace recv_timeout
/**
* @brief This class creates a space packet containing only the header data and the CRC.
@ -1245,7 +1245,6 @@ class DisableAutoTm : public SupvTcSpacePacket {
*/
class RequestLoggingData : public SupvTcSpacePacket {
public:
enum class Sa : uint8_t {
REQUEST_COUNTERS = 1,
REQUEST_EVENT_BUFFERS = 2,
@ -1278,9 +1277,7 @@ class TmPacket : public SpacePacket {
/**
* @brief Returns the payload data length (data field length without CRC)
*/
uint16_t getPayloadDataLength() {
return this->getPacketDataLength() - 1;
}
uint16_t getPayloadDataLength() { return this->getPacketDataLength() - 1; }
ReturnValue_t checkCrc() {
uint8_t* crcPtr = this->getPacketData() + this->getPayloadDataLength();
@ -1294,6 +1291,257 @@ class TmPacket : public SpacePacket {
}
};
class VerificationReport : public TmPacket {
public:
VerificationReport() : TmPacket() {}
/**
* @brief Gets the APID of command which caused the transmission of this verification report.
*/
uint16_t getRefApid() {
uint16_t refApid = 0;
size_t size = 0;
uint8_t* refApidPtr = this->getPacketData();
ReturnValue_t result = SerializeAdapter::deSerialize(&refApid, refApidPtr, &size,
SerializeIF::Endianness::BIG);
if (result != HasReturnvaluesIF::RETURN_OK) {
sif::debug << "ExecutionReport: Failed to deserialize reference APID field" << std::endl;
return result;
}
return refApid;
}
uint16_t getStatusCode() {
uint16_t statusCode = 0;
size_t size = 0;
uint8_t* statusCodePtr = this->getPacketData() + OFFSET_STATUS_CODE;
ReturnValue_t result = SerializeAdapter::deSerialize(&statusCode, statusCodePtr, &size,
SerializeIF::Endianness::BIG);
if (result != HasReturnvaluesIF::RETURN_OK) {
sif::debug << "ExecutionReport: Failed to deserialize status code field" << std::endl;
return result;
}
return statusCode;
}
virtual ReturnValue_t checkApid() { return HasReturnvaluesIF::RETURN_FAILED; }
private:
static const uint8_t OFFSET_STATUS_CODE = 4;
};
class AcknowledgmentReport : public VerificationReport {
public:
AcknowledgmentReport() : VerificationReport() {}
ReturnValue_t checkApid() {
uint16_t apid = this->getAPID();
if (apid == APID_ACK_SUCCESS) {
return HasReturnvaluesIF::RETURN_OK;
} else if (apid == APID_ACK_FAILURE) {
printStatusInformation();
return SupvReturnValuesIF::RECEIVED_ACK_FAILURE;
} else {
sif::warning << "AcknowledgmentReport::checkApid: Invalid apid: 0x" << std::hex << apid
<< std::endl;
return SupvReturnValuesIF::INVALID_APID;
}
}
void printStatusInformation() {
StatusCode statusCode = static_cast<StatusCode>(getStatusCode());
switch (statusCode) {
case StatusCode::OK: {
sif::warning << "Supervisor acknowledgment report status: Ok" << std::endl;
break;
}
case StatusCode::BAD_PARAM: {
sif::warning << "Supervisor acknowledgment report status: Bad param" << std::endl;
break;
}
case StatusCode::TIMEOUT: {
sif::warning << "Supervisor acknowledgment report status: Timeout" << std::endl;
break;
}
case StatusCode::RX_ERROR: {
sif::warning << "Supervisor acknowledgment report status: RX error" << std::endl;
break;
}
case StatusCode::TX_ERROR: {
sif::warning << "Supervisor acknowledgment report status: TX error" << std::endl;
break;
}
case StatusCode::HEADER_EMPTY: {
sif::warning << "Supervisor acknowledgment report status: Header empty" << std::endl;
break;
}
case StatusCode::DEFAULT_NAK: {
sif::warning << "Supervisor acknowledgment report status: Default code for nak" <<
std::endl;
break;
}
case StatusCode::ROUTE_PACKET: {
sif::warning << "Supervisor acknowledgment report status: Route packet error" << std::endl;
break;
}
default:
sif::warning << "AcknowledgmentReport::printStatusInformation: Invalid status code: 0x"
<< std::hex << static_cast<uint16_t>(statusCode) << std::endl;
break;
}
}
private:
enum class StatusCode : uint16_t {
OK = 0x0,
BAD_PARAM = 0x1,
TIMEOUT = 0x2,
RX_ERROR = 0x3,
TX_ERROR = 0x4,
HEADER_EMPTY = 0x5,
DEFAULT_NAK = 0x6,
ROUTE_PACKET = 0x7
};
};
class ExecutionReport : public VerificationReport {
public:
ExecutionReport() : VerificationReport() {}
ReturnValue_t checkApid() {
uint16_t apid = this->getAPID();
if (apid == APID_EXE_SUCCESS) {
return HasReturnvaluesIF::RETURN_OK;
} else if (apid == APID_EXE_FAILURE) {
printStatusInformation();
return SupvReturnValuesIF::RECEIVED_EXE_FAILURE;
} else {
sif::warning << "ExecutionReport::checkApid: Invalid apid: 0x" << std::hex << apid
<< std::endl;
return SupvReturnValuesIF::INVALID_APID;
}
}
private:
enum class StatusCode : uint16_t {
OK = 0x0,
INIT_ERROR = 0x1,
BAD_PARAM = 0x2,
NOT_INITIALIZED = 0x3,
BAD_PERIPH_ID = 0x4,
TIMEOUT = 0x5,
RX_ERROR = 0x6,
TX_ERROR = 0x7,
BUF_EMPTY = 0x8,
BUF_FULL = 0x9,
NAK = 0xA,
ARB_LOST = 0xB,
BUSY = 0xC,
NOT_IMPLEMENTED = 0xD,
ALIGNEMENT_ERROR = 0xE,
PERIPH_ERR = 0xF,
FAILED_LATCH = 0x10,
GPIO_HIGH = 0x11,
GPIO_LOW = 0x12,
TEST_PASSED = 0x13,
TEST_FAILED = 0x14
};
void printStatusInformation() {
StatusCode statusCode = static_cast<StatusCode>(getStatusCode());
switch (statusCode) {
case StatusCode::OK: {
sif::warning << "Supervisor execution report status: Ok" << std::endl;
break;
}
case StatusCode::INIT_ERROR: {
sif::warning << "Supervisor execution report status: Init error" << std::endl;
break;
}
case StatusCode::BAD_PARAM: {
sif::warning << "Supervisor execution report status: Bad param" << std::endl;
break;
}
case StatusCode::NOT_INITIALIZED: {
sif::warning << "Supervisor execution report status: Not initialized" << std::endl;
break;
}
case StatusCode::BAD_PERIPH_ID: {
sif::warning << "Supervisor execution report status: Bad periph ID" << std::endl;
break;
}
case StatusCode::TIMEOUT: {
sif::warning << "Supervisor execution report status: Timeout" << std::endl;
break;
}
case StatusCode::RX_ERROR: {
sif::warning << "Supervisor execution report status: RX error" << std::endl;
break;
}
case StatusCode::TX_ERROR: {
sif::warning << "Supervisor execution report status: TX error" << std::endl;
break;
}
case StatusCode::BUF_EMPTY: {
sif::warning << "Supervisor execution report status: Buf empty" << std::endl;
break;
}
case StatusCode::BUF_FULL: {
sif::warning << "Supervisor execution report status: Buf full" << std::endl;
break;
}
case StatusCode::NAK: {
sif::warning << "Supervisor execution report status: Nak, default error code" << std::endl;
break;
}
case StatusCode::ARB_LOST: {
sif::warning << "Supervisor execution report status: Arb lost" << std::endl;
break;
}
case StatusCode::BUSY: {
sif::warning << "Supervisor execution report status: Busy" << std::endl;
break;
}
case StatusCode::NOT_IMPLEMENTED: {
sif::warning << "Supervisor execution report status: Not implemented" << std::endl;
break;
}
case StatusCode::ALIGNEMENT_ERROR: {
sif::warning << "Supervisor execution report status: Alignment error" << std::endl;
break;
}
case StatusCode::PERIPH_ERR: {
sif::warning << "Supervisor execution report status: Periph error" << std::endl;
break;
}
case StatusCode::FAILED_LATCH: {
sif::warning << "Supervisor execution report status: Failed latch" << std::endl;
break;
}
case StatusCode::GPIO_HIGH: {
sif::warning << "Supervisor execution report status: GPIO high" << std::endl;
break;
}
case StatusCode::GPIO_LOW: {
sif::warning << "Supervisor execution report status: GPIO low" << std::endl;
break;
}
case StatusCode::TEST_PASSED: {
sif::warning << "Supervisor execution report status: Test passed" << std::endl;
break;
}
case StatusCode::TEST_FAILED: {
sif::warning << "Supervisor execution report status: Test failed" << std::endl;
break;
}
default:
sif::warning << "ExecutionReport::printStatusInformation: Invalid status code: 0x"
<< std::hex << static_cast<uint16_t>(statusCode) << std::endl;
break;
}
}
};
/**
* @brief This dataset stores the boot status report of the supervisor.
*/
@ -1409,31 +1657,36 @@ class LoggingReport : public StaticLocalDataSet<LOGGING_RPT_SET_ENTRIES> {
lp_var_t<uint32_t>(sid.objectId, PoolIds::TM_AVAILABLE_CNT, this);
lp_var_t<uint32_t> supervisorBoots =
lp_var_t<uint32_t>(sid.objectId, PoolIds::SUPERVISOR_BOOTS, this);
lp_var_t<uint32_t> mpsocBoots =
lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_BOOTS, this);
lp_var_t<uint32_t> mpsocBoots = lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_BOOTS, this);
lp_var_t<uint32_t> mpsocBootFailedAttempts =
lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_BOOT_FAILED_ATTEMPTS, this);
lp_var_t<uint32_t> mpsocPowerup =
lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_POWER_UP, this);
lp_var_t<uint32_t> mpsocUpdates =
lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_UPDATES, this);
lp_var_t<uint32_t> lastRecvdTc =
lp_var_t<uint32_t>(sid.objectId, PoolIds::LAST_RECVD_TC, this);
lp_var_t<uint32_t> mpsocPowerup = lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_POWER_UP, this);
lp_var_t<uint32_t> mpsocUpdates = lp_var_t<uint32_t>(sid.objectId, PoolIds::MPSOC_UPDATES, this);
lp_var_t<uint32_t> lastRecvdTc = lp_var_t<uint32_t>(sid.objectId, PoolIds::LAST_RECVD_TC, this);
void printSet() {
sif::info << "LoggingReport: Latchup happened count 0: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: Latchup happened count 1: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: Latchup happened count 2: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: Latchup happened count 3: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: Latchup happened count 4: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: Latchup happened count 5: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: Latchup happened count 6: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: ADC deviation triggers count: " << this->latchupHappenCnt0 << std::endl;
sif::info << "LoggingReport: Latchup happened count 0: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: Latchup happened count 1: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: Latchup happened count 2: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: Latchup happened count 3: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: Latchup happened count 4: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: Latchup happened count 5: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: Latchup happened count 6: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: ADC deviation triggers count: " << this->latchupHappenCnt0
<< std::endl;
sif::info << "LoggingReport: TC received count: " << this->tcReceivedCnt << std::endl;
sif::info << "LoggingReport: TM available count: " << this->tmAvailableCnt << std::endl;
sif::info << "LoggingReport: Supervisor boots: " << this->supervisorBoots << std::endl;
sif::info << "LoggingReport: MPSoC boots: " << this->mpsocBoots << std::endl;
sif::info << "LoggingReport: MPSoC boot failed attempts: " << this->mpsocBootFailedAttempts << std::endl;
sif::info << "LoggingReport: MPSoC boot failed attempts: " << this->mpsocBootFailedAttempts
<< std::endl;
sif::info << "LoggingReport: MPSoC power up: " << this->mpsocPowerup << std::endl;
sif::info << "LoggingReport: MPSoC updates: " << this->mpsocUpdates << std::endl;
sif::info << "LoggingReport: Last received TC: " << this->lastRecvdTc << std::endl;