supervisor event buffer request

This commit is contained in:
Jakob Meier
2022-04-14 07:52:21 +02:00
parent f679461164
commit 10343a0dab
15 changed files with 166 additions and 105 deletions

View File

@ -71,7 +71,7 @@ static const uint16_t SIZE_EXE_REPORT = 14;
static const uint16_t SIZE_HK_REPORT = 52;
static const uint16_t SIZE_BOOT_STATUS_REPORT = 24;
static const uint16_t SIZE_LATCHUP_STATUS_REPORT = 31;
static const uint16_t SIZE_LOGGING_REPORT = 44;
static const uint16_t SIZE_LOGGING_REPORT = 45;
/**
* SpacePacket apids of telemetry packets
@ -1260,7 +1260,7 @@ class TmPacket : public SpacePacket {
* @brief Returns the payload data length (data field length without CRC)
*/
uint16_t getPayloadDataLength() {
this->getPacketDataLength() - 1;
return this->getPacketDataLength() - 1;
}
ReturnValue_t checkCrc() {

View File

@ -117,11 +117,18 @@ ReturnValue_t PlocSupervisorHandler::executeAction(ActionId_t actionId,
plocSupvHelperExecuting = true;
return EXECUTION_FINISHED;
}
case LOGGING_REQUEST_EVENT_BUFFERS:
case LOGGING_REQUEST_EVENT_BUFFERS: {
if (size > config::MAX_PATH_SIZE) {
return SupvReturnValuesIF::FILENAME_TOO_LONG;
}
supvHelper->startEventbBufferRequest(std::string(reinterpret_cast<const char*>(data), size));
result = supvHelper->startEventbBufferRequest(
std::string(reinterpret_cast<const char*>(data), size));
if (result != RETURN_OK) {
return result;
}
plocSupvHelperExecuting = true;
return EXECUTION_FINISHED;
}
default:
break;
}
@ -335,7 +342,8 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(DeviceCommandId_t d
break;
}
case LOGGING_SET_TOPIC: {
RequestLoggingData packet(RequestLoggingData::Sa::SET_LOGGING_TOPIC);
uint8_t tpc = *(commandData);
RequestLoggingData packet(RequestLoggingData::Sa::SET_LOGGING_TOPIC, tpc);
packetToOutBuffer(packet.getWholeData(), packet.getFullSize());
result = RETURN_OK;
break;
@ -394,6 +402,8 @@ void PlocSupervisorHandler::fillCommandAndReplyMap() {
this->insertInCommandMap(ENABLE_ADC_MONITOR_TASK);
this->insertInCommandMap(DISABLE_ADC_MONITOR_TASK);
this->insertInCommandMap(LOGGING_REQUEST_COUNTERS);
this->insertInCommandMap(LOGGING_CLEAR_COUNTERS);
this->insertInCommandMap(LOGGING_SET_TOPIC);
this->insertInCommandAndReplyMap(FIRST_MRAM_DUMP, 3);
this->insertInCommandAndReplyMap(CONSECUTIVE_MRAM_DUMP, 3);
this->insertInReplyMap(ACK_REPORT, 3, nullptr, SIZE_ACK_REPORT);
@ -504,6 +514,8 @@ ReturnValue_t PlocSupervisorHandler::enableReplyInReplyMap(DeviceCommandMap::ite
case supv::DISABLE_AUTO_TM:
case supv::ENABLE_ADC_MONITOR_TASK:
case supv::DISABLE_ADC_MONITOR_TASK:
case supv::LOGGING_CLEAR_COUNTERS:
case supv::LOGGING_SET_TOPIC:
enabledReplies = 2;
break;
default:
@ -534,11 +546,12 @@ ReturnValue_t PlocSupervisorHandler::enableReplyInReplyMap(DeviceCommandMap::ite
ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t remainingSize,
DeviceCommandId_t* foundId, size_t* foundLen) {
if (nextReplyId == supv::FIRST_MRAM_DUMP) {
*foundId = supv::FIRST_MRAM_DUMP;
using namespace supv;
if (nextReplyId == FIRST_MRAM_DUMP) {
*foundId = FIRST_MRAM_DUMP;
return parseMramPackets(start, remainingSize, foundLen);
} else if (nextReplyId == supv::CONSECUTIVE_MRAM_DUMP) {
*foundId = supv::CONSECUTIVE_MRAM_DUMP;
} else if (nextReplyId == CONSECUTIVE_MRAM_DUMP) {
*foundId = CONSECUTIVE_MRAM_DUMP;
return parseMramPackets(start, remainingSize, foundLen);
}
@ -547,37 +560,37 @@ ReturnValue_t PlocSupervisorHandler::scanForReply(const uint8_t* start, size_t r
uint16_t apid = (*(start) << 8 | *(start + 1)) & APID_MASK;
switch (apid) {
case (supv::APID_ACK_SUCCESS):
*foundLen = supv::SIZE_ACK_REPORT;
*foundId = supv::ACK_REPORT;
case (APID_ACK_SUCCESS):
*foundLen = SIZE_ACK_REPORT;
*foundId = ACK_REPORT;
break;
case (supv::APID_ACK_FAILURE):
*foundLen = supv::SIZE_ACK_REPORT;
*foundId = supv::ACK_REPORT;
case (APID_ACK_FAILURE):
*foundLen = SIZE_ACK_REPORT;
*foundId = ACK_REPORT;
break;
case (supv::APID_HK_REPORT):
*foundLen = supv::SIZE_HK_REPORT;
*foundId = supv::HK_REPORT;
case (APID_HK_REPORT):
*foundLen = SIZE_HK_REPORT;
*foundId = HK_REPORT;
break;
case (supv::APID_BOOT_STATUS_REPORT):
*foundLen = supv::SIZE_BOOT_STATUS_REPORT;
*foundId = supv::BOOT_STATUS_REPORT;
case (APID_BOOT_STATUS_REPORT):
*foundLen = SIZE_BOOT_STATUS_REPORT;
*foundId = BOOT_STATUS_REPORT;
break;
case (supv::APID_LATCHUP_STATUS_REPORT):
*foundLen = supv::SIZE_LATCHUP_STATUS_REPORT;
*foundId = supv::LATCHUP_REPORT;
case (APID_LATCHUP_STATUS_REPORT):
*foundLen = SIZE_LATCHUP_STATUS_REPORT;
*foundId = LATCHUP_REPORT;
break;
case (supv::APID_DATA_LOGGER_DATA):
*foundLen = supv::SIZE_LOGGING_REPORT;
*foundId = supv::LOGGING_REPORT;
case (APID_DATA_LOGGER_DATA):
*foundLen = SIZE_LOGGING_REPORT;
*foundId = LOGGING_REPORT;
break;
case (supv::APID_EXE_SUCCESS):
*foundLen = supv::SIZE_EXE_REPORT;
*foundId = supv::EXE_REPORT;
case (APID_EXE_SUCCESS):
*foundLen = SIZE_EXE_REPORT;
*foundId = EXE_REPORT;
break;
case (supv::APID_EXE_FAILURE):
*foundLen = supv::SIZE_EXE_REPORT;
*foundId = supv::EXE_REPORT;
case (APID_EXE_FAILURE):
*foundLen = SIZE_EXE_REPORT;
*foundId = EXE_REPORT;
break;
default: {
sif::debug << "PlocSupervisorHandler::scanForReply: Reply has invalid apid" << std::endl;
@ -687,6 +700,16 @@ ReturnValue_t PlocSupervisorHandler::initializeLocalDataPool(localpool::DataPool
localDataPoolMap.emplace(supv::LATCHUP_RPT_TIME_YEAR, new PoolEntry<uint8_t>({0}));
localDataPoolMap.emplace(supv::LATCHUP_RPT_IS_SET, new PoolEntry<uint8_t>({0}));
localDataPoolMap.emplace(supv::SUPERVISOR_REBOOTS, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::LATCHUP_EVENTS, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::ADC_TRIGGERS, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::PS_HEARTBEATS_LOST, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::PL_HEARTBEATS_LOST, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::TC_RECEIVED, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::TM_RECEIVED, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::SOC_BOOTS, new PoolEntry<uint32_t>({0}));
localDataPoolMap.emplace(supv::SOC_BOOT_FAILS, new PoolEntry<uint32_t>({0}));
return HasReturnvaluesIF::RETURN_OK;
}
@ -1037,7 +1060,7 @@ ReturnValue_t PlocSupervisorHandler::handleLoggingReport(const uint8_t* data) {
return result;
}
const uint8_t* dataField = data + supv::DATA_FIELD_OFFSET + sizeof(sa);
const uint8_t* dataField = data + supv::DATA_FIELD_OFFSET + sizeof(supv::RequestLoggingData::Sa);
result = loggingReport.read();
if (result != RETURN_OK) {
return result;
@ -1078,6 +1101,9 @@ void PlocSupervisorHandler::setNextReplyId() {
case supv::CONSECUTIVE_MRAM_DUMP:
nextReplyId = supv::CONSECUTIVE_MRAM_DUMP;
break;
case supv::LOGGING_REQUEST_COUNTERS:
nextReplyId = supv::LOGGING_REPORT;
break;
default:
/* If no telemetry is expected the next reply is always the execution report */
nextReplyId = supv::EXE_REPORT;
@ -1331,9 +1357,10 @@ void PlocSupervisorHandler::prepareSetShutdownTimeoutCmd(const uint8_t* commandD
ReturnValue_t PlocSupervisorHandler::prepareLoggingRequest(const uint8_t* commandData,
size_t commandDataLen) {
uint8_t sa = *commandData;
using namespace supv;
RequestLoggingData::Sa sa = static_cast<RequestLoggingData::Sa>(*commandData);
uint8_t tpc = *(commandData + 1);
supv::RequestLoggingData packet(sa, tpc);
RequestLoggingData packet(sa, tpc);
packetToOutBuffer(packet.getWholeData(), packet.getFullSize());
return RETURN_OK;
}

View File

@ -11,6 +11,7 @@
#include "bsp_q7s/memory/FilesystemHelper.h"
#include "fsfw/globalfunctions/CRC.h"
#include "mission/utility/Timestamp.h"
#include "mission/utility/Filenaming.h"
PlocSupvHelper::PlocSupvHelper(object_id_t objectId) : SystemObject(objectId) {}
@ -195,7 +196,7 @@ ReturnValue_t PlocSupvHelper::performUpdate() {
ReturnValue_t PlocSupvHelper::performEventBufferRequest() {
using namespace supv;
ReturnValuet_t result = RETURN_OK;
ReturnValue_t result = RETURN_OK;
RequestLoggingData packet(RequestLoggingData::Sa::REQUEST_EVENT_BUFFERS);
result = sendCommand(packet);
if (result != RETURN_OK) {
@ -213,6 +214,7 @@ ReturnValue_t PlocSupvHelper::performEventBufferRequest() {
if (result != RETURN_OK) {
return result;
}
return result;
}
ReturnValue_t PlocSupvHelper::prepareUpdate() {
@ -337,8 +339,8 @@ ReturnValue_t PlocSupvHelper::handleTmReception(supv::TmPacket* tmPacket, size_t
}
}
if (remainingBytes != 0) {
sif::warning << "PlocSupvHelper::handleTmReception: Failed to receive reply" << std::endl;
triggerEvent(SUPV_MISSING_EXE, remainingBytes, static_cast<uint32_t>(internalState));
sif::warning << "PlocSupvHelper::handleTmReception: Failed to read " << remainingBytes
<< " bytes" << std::endl;
return RETURN_FAILED;
}
result = tmPacket->checkCrc();
@ -437,31 +439,40 @@ uint32_t PlocSupvHelper::getFileSize(std::string filename) {
}
ReturnValue_t PlocSupvHelper::handleEventBufferReception() {
std::sring filename = Filenaming::generateAbsoluteFilename(eventBufferReq.pat,
ReturnValue_t result = RETURN_OK;
std::string filename = Filenaming::generateAbsoluteFilename(eventBufferReq.path,
eventBufferReq.filename, timestamping);
std::ofstream file(filename, std::ios_base::app | std::ios_base::out);
uint32_t packetsRead = 0;
size_t requestLen = 0;
supv::TmPacket tmPacket;
for (packetsRead = 0; packetsRead < NUM_EVENT_BUFFER_PACKETS - 1; packetsRead++) {
for (packetsRead = 0; packetsRead < NUM_EVENT_BUFFER_PACKETS; packetsRead++) {
if (terminate) {
triggerEvent(SUPV_EVENT_BUFFER_REQUEST_TERMINATED, packetsRead - 1);
file.close();
return PROCESS_TERMINATED;
}
result = handleTmReception(&tmPacket, SIZE_EVENT_BUFFER_FULL_PACKET);
if (packetsRead == NUM_EVENT_BUFFER_PACKETS - 1) {
requestLen = SIZE_EVENT_BUFFER_LAST_PACKET;
} else {
requestLen = SIZE_EVENT_BUFFER_FULL_PACKET;
}
result = handleTmReception(&tmPacket, requestLen);
if (result != RETURN_OK) {
sif::debug << "PlocSupvHelper::handleEventBufferReception: Failed while trying to read packet"
<< " " << packetsRead + 1 << std::endl;
file.close();
return result;
}
uint16_t apid = tmPacket.getAPID();
if (apid != supv::APID_MRAM_DUMP_TM) {
sif::warning << "PlocSupvHelper::handleEventBufferReception: Did not expect space packet "
<< "with APID " << std::hex << std::endl;
return EVENT_BUFFER_REQUEST_INVALID_APID;
<< "with APID 0x" << std::hex << apid << std::endl;
file.close();
return EVENT_BUFFER_REPLY_INVALID_APID;
}
file.write(reinterpret_cast<const char*>(spacePacketBuffer + supv::SPACE_PACKET_HEADER_LENGTH),
packetLen - 1);
file.write(reinterpret_cast<const char*>(tmPacket.getPacketData()),
tmPacket.getPayloadDataLength());
}
file.write(reinterpret_cast<const char*>(spacePacketBuffer + supv::SPACE_PACKET_HEADER_LENGTH),
packetLen - 1);
return result;
}

View File

@ -112,7 +112,7 @@ class PlocSupvHelper : public SystemObject, public ExecutableObjectIF, public Ha
//! [EXPORT] : [COMMENT] Received command with invalid pathname
static const ReturnValue_t PATH_NOT_EXISTS = MAKE_RETURN_CODE(0xA2);
//! [EXPORT] : [COMMENT] Expected event buffer TM but received space packet with other APID
static const ReturnValue_t EVENT_BUFFER_REQUEST_INVALID_APID = MAKE_RETURN_CODE(0xA3);
static const ReturnValue_t EVENT_BUFFER_REPLY_INVALID_APID = MAKE_RETURN_CODE(0xA3);
// Maximum number of times the communication interface retries polling data from the reply
// buffer
@ -140,7 +140,7 @@ class PlocSupvHelper : public SystemObject, public ExecutableObjectIF, public Ha
std::string path = "";
// Default name of file where event buffer data will be written to. Timestamp will be added to
// name when new file is created
std::string filename = "event-buffer";
std::string filename = "event-buffer.bin";
};
EventBufferRequest eventBufferReq;

View File

@ -1,7 +1,7 @@
/**
* @brief Auto-generated event translation file. Contains 177 translations.
* @brief Auto-generated event translation file. Contains 180 translations.
* @details
* Generated on: 2022-04-10 13:17:48
* Generated on: 2022-04-13 17:02:22
*/
#include "translateEvents.h"
@ -148,6 +148,9 @@ const char *STR_HELPER_REQUESTING_MSG_FAILED_STRING = "STR_HELPER_REQUESTING_MSG
const char *SUPV_UPDATE_FAILED_STRING = "SUPV_UPDATE_FAILED";
const char *SUPV_UPDATE_SUCCESSFUL_STRING = "SUPV_UPDATE_SUCCESSFUL";
const char *TERMINATED_UPDATE_PROCEDURE_STRING = "TERMINATED_UPDATE_PROCEDURE";
const char *SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL_STRING = "SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL";
const char *SUPV_EVENT_BUFFER_REQUEST_FAILED_STRING = "SUPV_EVENT_BUFFER_REQUEST_FAILED";
const char *SUPV_EVENT_BUFFER_REQUEST_TERMINATED_STRING = "SUPV_EVENT_BUFFER_REQUEST_TERMINATED";
const char *SUPV_SENDING_COMMAND_FAILED_STRING = "SUPV_SENDING_COMMAND_FAILED";
const char *SUPV_HELPER_REQUESTING_REPLY_FAILED_STRING = "SUPV_HELPER_REQUESTING_REPLY_FAILED";
const char *SUPV_HELPER_READING_REPLY_FAILED_STRING = "SUPV_HELPER_READING_REPLY_FAILED";
@ -468,22 +471,28 @@ const char *translateEvents(Event event) {
case (12102):
return TERMINATED_UPDATE_PROCEDURE_STRING;
case (12103):
return SUPV_SENDING_COMMAND_FAILED_STRING;
return SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL_STRING;
case (12104):
return SUPV_HELPER_REQUESTING_REPLY_FAILED_STRING;
return SUPV_EVENT_BUFFER_REQUEST_FAILED_STRING;
case (12105):
return SUPV_HELPER_READING_REPLY_FAILED_STRING;
return SUPV_EVENT_BUFFER_REQUEST_TERMINATED_STRING;
case (12106):
return SUPV_MISSING_ACK_STRING;
return SUPV_SENDING_COMMAND_FAILED_STRING;
case (12107):
return SUPV_MISSING_EXE_STRING;
return SUPV_HELPER_REQUESTING_REPLY_FAILED_STRING;
case (12108):
return SUPV_ACK_FAILURE_REPORT_STRING;
return SUPV_HELPER_READING_REPLY_FAILED_STRING;
case (12109):
return SUPV_EXE_FAILURE_REPORT_STRING;
return SUPV_MISSING_ACK_STRING;
case (12110):
return SUPV_ACK_INVALID_APID_STRING;
return SUPV_MISSING_EXE_STRING;
case (12111):
return SUPV_ACK_FAILURE_REPORT_STRING;
case (12112):
return SUPV_EXE_FAILURE_REPORT_STRING;
case (12113):
return SUPV_ACK_INVALID_APID_STRING;
case (12114):
return SUPV_EXE_INVALID_APID_STRING;
case (12200):
return TRANSITION_BACK_TO_OFF_STRING;

View File

@ -2,7 +2,7 @@
* @brief Auto-generated object translation file.
* @details
* Contains 117 translations.
* Generated on: 2022-04-10 13:17:55
* Generated on: 2022-04-13 17:02:27
*/
#include "translateObjects.h"