Merge remote-tracking branch 'origin/develop' into mueller/master

This commit is contained in:
2021-08-09 16:45:32 +02:00
22 changed files with 1452 additions and 596 deletions

View File

@ -1,3 +1,8 @@
#include <sstream>
#include <string>
#include <fstream>
#include <filesystem>
#include "PlocSupervisorHandler.h"
#include "OBSWConfig.h"
@ -28,6 +33,9 @@ ReturnValue_t PlocSupervisorHandler::initialize() {
sif::warning << "PlocSupervisorHandler::initialize: Invalid uart com if" << std::endl;
return INVALID_UART_COM_IF;
}
sdcMan = SdCardManager::instance();
return result;
}
@ -112,11 +120,6 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(
prepareEmptyCmd(PLOC_SPV::APID_GET_BOOT_STATUS_RPT);
result = RETURN_OK;
break;
}
case(PLOC_SPV::UPDATE_AVAILABLE): {
prepareUpdateAvailableCmd(commandData);
result = RETURN_OK;
break;
}
case(PLOC_SPV::WATCHDOGS_ENABLE): {
prepareWatchdogsEnableCmd(commandData);
@ -207,6 +210,11 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(
prepareSetDbgVerbosityCmd(commandData);
result = RETURN_OK;
break;
}
case(PLOC_SPV::CAN_LOOPBACK_TEST): {
prepareEmptyCmd(PLOC_SPV::APID_CAN_LOOPBACK_TEST);
result = RETURN_OK;
break;
}
case(PLOC_SPV::SET_GPIO): {
prepareSetGpioCmd(commandData);
@ -241,6 +249,16 @@ ReturnValue_t PlocSupervisorHandler::buildCommandFromCommand(
result = RETURN_OK;
break;
}
case(PLOC_SPV::UPDATE_AVAILABLE):
case(PLOC_SPV::UPDATE_IMAGE_DATA):
case(PLOC_SPV::UPDATE_VERIFY):
// Simply forward data from PLOC Updater to supervisor
std::memcpy(commandBuffer, commandData, commandDataLen);
rawPacket = commandBuffer;
rawPacketLen = commandDataLen;
nextReplyId = PLOC_SPV::ACK_REPORT;
result = RETURN_OK;
break;
default:
sif::debug << "PlocSupervisorHandler::buildCommandFromCommand: Command not implemented"
<< std::endl;
@ -271,6 +289,8 @@ void PlocSupervisorHandler::fillCommandAndReplyMap() {
this->insertInCommandMap(PLOC_SPV::DISABLE_PERIOIC_HK_TRANSMISSION);
this->insertInCommandMap(PLOC_SPV::GET_BOOT_STATUS_REPORT);
this->insertInCommandMap(PLOC_SPV::UPDATE_AVAILABLE);
this->insertInCommandMap(PLOC_SPV::UPDATE_VERIFY);
this->insertInCommandMap(PLOC_SPV::UPDATE_IMAGE_DATA);
this->insertInCommandMap(PLOC_SPV::WATCHDOGS_ENABLE);
this->insertInCommandMap(PLOC_SPV::WATCHDOGS_CONFIG_TIMEOUT);
this->insertInCommandMap(PLOC_SPV::ENABLE_LATCHUP_ALERT);
@ -296,6 +316,7 @@ void PlocSupervisorHandler::fillCommandAndReplyMap() {
this->insertInCommandMap(PLOC_SPV::FACTORY_RESET_CLEAR_ALL);
this->insertInCommandMap(PLOC_SPV::FACTORY_RESET_CLEAR_MIRROR);
this->insertInCommandMap(PLOC_SPV::FACTORY_RESET_CLEAR_CIRCULAR);
this->insertInCommandMap(PLOC_SPV::CAN_LOOPBACK_TEST);
this->insertInCommandAndReplyMap(PLOC_SPV::DUMP_MRAM, 3);
this->insertInReplyMap(PLOC_SPV::ACK_REPORT, 3, nullptr, PLOC_SPV::SIZE_ACK_REPORT);
this->insertInReplyMap(PLOC_SPV::EXE_REPORT, 3, nullptr, PLOC_SPV::SIZE_EXE_REPORT);
@ -506,6 +527,8 @@ ReturnValue_t PlocSupervisorHandler::enableReplyInReplyMap(DeviceCommandMap::ite
case PLOC_SPV::RESET_MPSOC:
case PLOC_SPV::SET_TIME_REF:
case PLOC_SPV::UPDATE_AVAILABLE:
case PLOC_SPV::UPDATE_IMAGE_DATA:
case PLOC_SPV::UPDATE_VERIFY:
case PLOC_SPV::WATCHDOGS_ENABLE:
case PLOC_SPV::WATCHDOGS_CONFIG_TIMEOUT:
case PLOC_SPV::ENABLE_LATCHUP_ALERT:
@ -1004,26 +1027,6 @@ void PlocSupervisorHandler::prepareRestartTriesCmd(const uint8_t * commandData)
packetToOutBuffer(packet.getWholeData(), packet.getFullSize());
}
void PlocSupervisorHandler::prepareUpdateAvailableCmd(const uint8_t * commandData) {
uint8_t offset = 0;
uint8_t imageSelect = *(commandData + offset);
offset += 1;
uint8_t imagePartition = *(commandData + offset);
offset += 1;
uint32_t imageSize = *(commandData + offset) << 24 | *(commandData + offset + 1) << 16
| *(commandData + offset + 2) << 8 | *(commandData + offset + 3);
offset += 4;
uint32_t imageCrc = *(commandData + offset) << 24 | *(commandData + offset + 1) << 16
| *(commandData + offset + 2) << 8 | *(commandData + offset + 3);
offset += 4;
uint32_t numberOfPackets = *(commandData + offset) << 24 | *(commandData + offset + 1) << 16
| *(commandData + offset + 2) << 8 | *(commandData + offset + 3);
PLOC_SPV::UpdateAvailable packet(imageSelect, imagePartition, imageSize, imageCrc,
numberOfPackets);
packetToOutBuffer(packet.getWholeData(), packet.getFullSize());
}
void PlocSupervisorHandler::prepareWatchdogsEnableCmd(const uint8_t * commandData) {
uint8_t offset = 0;
uint8_t watchdogPs = *(commandData + offset);
@ -1315,7 +1318,7 @@ ReturnValue_t PlocSupervisorHandler::parseMramPackets(const uint8_t *packet, siz
bufferTop += 1;
*foundLen += 1;
if (bufferTop >= PLOC_SPV::SPACE_PACKET_HEADER_LENGTH) {
packetLen = spacePacketBuffer[4] << 8 | spacePacketBuffer[5];
packetLen = readSpacePacketLength(spacePacketBuffer);
}
if (bufferTop == PLOC_SPV::SPACE_PACKET_HEADER_LENGTH + packetLen + 1) {
@ -1341,15 +1344,17 @@ ReturnValue_t PlocSupervisorHandler::handleMramDumpPacket() {
// Prepare packet for downlink
if (packetInBuffer) {
uint16_t packetLen = spacePacketBuffer[4] << 8 | spacePacketBuffer[5];
uint16_t packetLen = readSpacePacketLength(spacePacketBuffer);
result = verifyPacket(spacePacketBuffer, PLOC_SPV::SPACE_PACKET_HEADER_LENGTH + packetLen + 1);
if (result != RETURN_OK) {
sif::warning << "PlocSupervisorHandler::handleMramDumpPacket: CRC failure" << std::endl;
return result;
}
//TODO: Write MRAM dump to SD card handler
handleDeviceTM(spacePacketBuffer + PLOC_SPV::SPACE_PACKET_HEADER_LENGTH, packetLen - 1,
PLOC_SPV::DUMP_MRAM);
handleMramDumpFile();
if (downlinkMramDump == true) {
handleDeviceTM(spacePacketBuffer + PLOC_SPV::SPACE_PACKET_HEADER_LENGTH, packetLen - 1,
PLOC_SPV::DUMP_MRAM);
}
packetInBuffer = false;
receivedMramDumpPackets++;
if (expectedMramDumpPackets == receivedMramDumpPackets) {
@ -1416,3 +1421,73 @@ ReturnValue_t PlocSupervisorHandler::checkMramPacketApid() {
}
return APERIODIC_REPLY;
}
ReturnValue_t PlocSupervisorHandler::handleMramDumpFile() {
ReturnValue_t result = RETURN_OK;
uint16_t packetLen = readSpacePacketLength(spacePacketBuffer);
uint8_t sequenceFlags = readSequenceFlags(spacePacketBuffer);
if (sequenceFlags == static_cast<uint8_t>(PLOC_SPV::SequenceFlags::FIRST_PKT)) {
result = createMramDumpFile();
if (result != RETURN_OK) {
return result;
}
}
if (not std::filesystem::exists(activeMramFile)) {
sif::warning << "PlocSupervisorHandler::handleMramDumpFile: MRAM file does not exist"
<< std::endl;
return MRAM_FILE_NOT_EXISTS;
}
std::ofstream file(activeMramFile, std::ios_base::app | std::ios_base::out);
file.write(
reinterpret_cast<const char*>(spacePacketBuffer + PLOC_SPV::SPACE_PACKET_HEADER_LENGTH),
packetLen - 1);
file.close();
return RETURN_OK;
}
uint16_t PlocSupervisorHandler::readSpacePacketLength(uint8_t* spacePacket) {
return spacePacket[4] << 8 | spacePacket[5];
}
uint8_t PlocSupervisorHandler::readSequenceFlags(uint8_t* spacePacket) {
return spacePacketBuffer[2] >> 6;
}
ReturnValue_t PlocSupervisorHandler::createMramDumpFile() {
ReturnValue_t result = RETURN_OK;
std::string timeStamp;
result = getTimeStampString(timeStamp);
if (result != RETURN_OK) {
return result;
}
std::string filename = "mram-dump--" + timeStamp + ".bin";
std::string currentMountPrefix = sdcMan->getCurrentMountPrefix();
// Check if path to PLOC directory exists
if (not std::filesystem::exists(std::string(currentMountPrefix + "/" + plocFilePath))) {
sif::warning << "PlocSupervisorHandler::createMramDumpFile: Ploc path does not exist"
<< std::endl;
return PATH_DOES_NOT_EXIST;
}
activeMramFile = currentMountPrefix + "/" + plocFilePath + "/" + filename;
// Create new file
std::ofstream file(activeMramFile, std::ios_base::out);
file.close();
return RETURN_OK;
}
ReturnValue_t PlocSupervisorHandler::getTimeStampString(std::string& timeStamp) {
Clock::TimeOfDay_t time;
ReturnValue_t result = Clock::getDateAndTime(&time);
if (result != RETURN_OK) {
sif::warning << "PlocSupervisorHandler::createMramDumpFile: Failed to get current time"
<< std::endl;
return GET_TIME_FAILURE;
}
timeStamp = std::to_string(time.year) + "-" + std::to_string(time.month) + "-"
+ std::to_string(time.day) + "--" + std::to_string(time.hour) + "-"
+ std::to_string(time.minute) + "-" + std::to_string(time.second);
return RETURN_OK;
}