Unlock STR second firmware slot
This commit is contained in:
@ -5,7 +5,11 @@
|
||||
#include <mission/acs/str/strHelpers.h>
|
||||
#include <mission/acs/str/strJsonCommands.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "fsfw/ipc/MessageQueueIF.h"
|
||||
#include "fsfw/returnvalues/returnvalue.h"
|
||||
#include "mission/memory/SdCardMountedIF.h"
|
||||
|
||||
extern "C" {
|
||||
#include <sagitta/client/actionreq.h>
|
||||
@ -16,7 +20,6 @@ extern "C" {
|
||||
}
|
||||
|
||||
#include <atomic>
|
||||
#include <fstream>
|
||||
#include <thread>
|
||||
|
||||
#include "OBSWConfig.h"
|
||||
@ -27,7 +30,8 @@ std::atomic_bool JCFG_DONE(false);
|
||||
|
||||
StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie,
|
||||
StrComHandler* strHelper, power::Switch_t powerSwitch,
|
||||
startracker::SdCardConfigPathGetter& cfgPathGetter)
|
||||
startracker::SdCardConfigPathGetter& cfgPathGetter,
|
||||
SdCardMountedIF& sdCardIF)
|
||||
: DeviceHandlerBase(objectId, comIF, comCookie),
|
||||
temperatureSet(this),
|
||||
versionSet(this),
|
||||
@ -60,6 +64,7 @@ StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF,
|
||||
contrastSet(this),
|
||||
strHelper(strHelper),
|
||||
powerSwitch(powerSwitch),
|
||||
sdCardIF(sdCardIF),
|
||||
cfgPathGetter(cfgPathGetter) {
|
||||
if (comCookie == nullptr) {
|
||||
sif::error << "StarTrackerHandler: Invalid com cookie" << std::endl;
|
||||
@ -138,6 +143,9 @@ ReturnValue_t StarTrackerHandler::initialize() {
|
||||
// delay whole satellite boot process.
|
||||
reloadJsonCfgFile();
|
||||
|
||||
// Default firmware target is always initialized from persistent file.
|
||||
loadTargetFirmwareFromPersistentCfg();
|
||||
|
||||
EventManagerIF* manager = ObjectManager::instance()->get<EventManagerIF>(objects::EVENT_MANAGER);
|
||||
if (manager == nullptr) {
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
@ -165,6 +173,19 @@ ReturnValue_t StarTrackerHandler::initialize() {
|
||||
return returnvalue::OK;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::loadTargetFirmwareFromPersistentCfg() {
|
||||
const char* prefix = sdCardIF.getCurrentMountPrefix();
|
||||
std::filesystem::path path = std::filesystem::path(prefix) / startracker::FW_TARGET_CFG_PATH;
|
||||
std::ifstream ifile(path);
|
||||
if (ifile.is_open()) {
|
||||
std::string targetStr;
|
||||
std::getline(ifile, targetStr);
|
||||
if (targetStr == "backup\n") {
|
||||
firmwareTargetRaw = static_cast<uint8_t>(startracker::FirmwareTarget::BACKUP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool StarTrackerHandler::reloadJsonCfgFile() {
|
||||
jcfgCountdown.resetTimer();
|
||||
auto strCfgPath = cfgPathGetter.getCfgPath();
|
||||
@ -307,21 +328,11 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu
|
||||
strHelper->setFlashReadFilename(std::string(reinterpret_cast<const char*>(data), size));
|
||||
return EXECUTION_FINISHED;
|
||||
}
|
||||
case (startracker::FIRMWARE_UPDATE): {
|
||||
result = DeviceHandlerBase::acceptExternalDeviceCommands();
|
||||
if (result != returnvalue::OK) {
|
||||
return result;
|
||||
}
|
||||
if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) {
|
||||
return FILE_PATH_TOO_LONG;
|
||||
}
|
||||
result =
|
||||
strHelper->startFirmwareUpdate(std::string(reinterpret_cast<const char*>(data), size));
|
||||
if (result != returnvalue::OK) {
|
||||
return result;
|
||||
}
|
||||
strHelperHandlingSpecialRequest = true;
|
||||
return EXECUTION_FINISHED;
|
||||
case (startracker::FIRMWARE_UPDATE_MAIN): {
|
||||
return handleFirmwareUpdateCommand(data, size, startracker::FirmwareTarget::MAIN);
|
||||
}
|
||||
case (startracker::FIRMWARE_UPDATE_BACKUP): {
|
||||
return handleFirmwareUpdateCommand(data, size, startracker::FirmwareTarget::BACKUP);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
@ -330,6 +341,23 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu
|
||||
reinitNextSetParam = true;
|
||||
return DeviceHandlerBase::executeAction(actionId, commandedBy, data, size);
|
||||
}
|
||||
ReturnValue_t StarTrackerHandler::handleFirmwareUpdateCommand(const uint8_t* data, size_t size,
|
||||
startracker::FirmwareTarget target) {
|
||||
ReturnValue_t result = DeviceHandlerBase::acceptExternalDeviceCommands();
|
||||
if (result != returnvalue::OK) {
|
||||
return result;
|
||||
}
|
||||
if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) {
|
||||
return FILE_PATH_TOO_LONG;
|
||||
}
|
||||
result = strHelper->startFirmwareUpdate(std::string(reinterpret_cast<const char*>(data), size),
|
||||
target);
|
||||
if (result != returnvalue::OK) {
|
||||
return result;
|
||||
}
|
||||
strHelperHandlingSpecialRequest = true;
|
||||
return EXECUTION_FINISHED;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::performOperationHook() {
|
||||
EventMessage event;
|
||||
@ -569,7 +597,7 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi
|
||||
return returnvalue::OK;
|
||||
}
|
||||
case (startracker::BOOT): {
|
||||
prepareBootCommand();
|
||||
prepareBootCommand(static_cast<startracker::FirmwareTarget>(firmwareTargetRaw));
|
||||
return returnvalue::OK;
|
||||
}
|
||||
case (startracker::REQ_VERSION): {
|
||||
@ -1659,7 +1687,8 @@ ReturnValue_t StarTrackerHandler::checkMode(ActionId_t actionId) {
|
||||
case startracker::UPLOAD_IMAGE:
|
||||
case startracker::DOWNLOAD_IMAGE:
|
||||
case startracker::FLASH_READ:
|
||||
case startracker::FIRMWARE_UPDATE: {
|
||||
case startracker::FIRMWARE_UPDATE_BACKUP:
|
||||
case startracker::FIRMWARE_UPDATE_MAIN: {
|
||||
return DeviceHandlerBase::acceptExternalDeviceCommands();
|
||||
default:
|
||||
break;
|
||||
@ -1956,9 +1985,9 @@ ReturnValue_t StarTrackerHandler::executeFlashReadCommand(const uint8_t* command
|
||||
return result;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::prepareBootCommand() {
|
||||
void StarTrackerHandler::prepareBootCommand(startracker::FirmwareTarget target) {
|
||||
uint32_t length = 0;
|
||||
struct BootActionRequest bootRequest = {BOOT_REGION_ID};
|
||||
struct BootActionRequest bootRequest = {static_cast<uint8_t>(target)};
|
||||
arc_pack_boot_action_req(&bootRequest, commandBuffer, &length);
|
||||
rawPacket = commandBuffer;
|
||||
rawPacketLen = length;
|
||||
@ -2389,7 +2418,8 @@ ReturnValue_t StarTrackerHandler::checkProgram() {
|
||||
internalState = InternalState::DONE;
|
||||
}
|
||||
break;
|
||||
case startracker::Program::FIRMWARE:
|
||||
case startracker::Program::FIRMWARE_BACKUP:
|
||||
case startracker::Program::FIRMWARE_MAIN: {
|
||||
if (startupState == StartupState::WAIT_CHECK_PROGRAM) {
|
||||
startupState = StartupState::BOOT_BOOTLOADER;
|
||||
}
|
||||
@ -2400,9 +2430,10 @@ ReturnValue_t StarTrackerHandler::checkProgram() {
|
||||
internalState = InternalState::FAILED_BOOTLOADER_BOOT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
sif::warning << "StarTrackerHandler::checkProgram: Version set has invalid program ID"
|
||||
<< std::endl;
|
||||
sif::warning << "StarTrackerHandler::checkProgram: Version set has invalid program ID "
|
||||
<< (int)versionSet.program.value << std::endl;
|
||||
return INVALID_PROGRAM;
|
||||
}
|
||||
return returnvalue::OK;
|
||||
@ -2865,12 +2896,13 @@ ReturnValue_t StarTrackerHandler::checkCommand(ActionId_t actionId) {
|
||||
case startracker::REQ_CENTROID:
|
||||
case startracker::REQ_CENTROIDS:
|
||||
case startracker::REQ_CONTRAST: {
|
||||
if (getMode() == MODE_ON and getSubmode() != startracker::Program::FIRMWARE) {
|
||||
if (getMode() == MODE_ON and getSubmode() != startracker::Program::FIRMWARE_MAIN) {
|
||||
return STARTRACKER_NOT_RUNNING_FIRMWARE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case startracker::FIRMWARE_UPDATE:
|
||||
case startracker::FIRMWARE_UPDATE_MAIN:
|
||||
case startracker::FIRMWARE_UPDATE_BACKUP:
|
||||
case startracker::FLASH_READ:
|
||||
if (getMode() != MODE_ON or getSubmode() != startracker::Program::BOOTLOADER) {
|
||||
return STARTRACKER_NOT_RUNNING_BOOTLOADER;
|
||||
@ -2883,3 +2915,43 @@ ReturnValue_t StarTrackerHandler::checkCommand(ActionId_t actionId) {
|
||||
}
|
||||
|
||||
ReturnValue_t StarTrackerHandler::acceptExternalDeviceCommands() { return returnvalue::OK; }
|
||||
|
||||
ReturnValue_t StarTrackerHandler::getParameter(uint8_t domainId, uint8_t uniqueId,
|
||||
ParameterWrapper* parameterWrapper,
|
||||
const ParameterWrapper* newValues,
|
||||
uint16_t startAtIndex) {
|
||||
auto firmwareTargetUpdate = [&](bool persistent) {
|
||||
uint8_t value = 0;
|
||||
newValues->getElement(&value);
|
||||
if (value != static_cast<uint8_t>(startracker::FirmwareTarget::MAIN) &&
|
||||
value != static_cast<uint8_t>(startracker::FirmwareTarget::BACKUP)) {
|
||||
return HasParametersIF::INVALID_VALUE;
|
||||
}
|
||||
parameterWrapper->set(firmwareTargetRaw);
|
||||
if (persistent) {
|
||||
if (sdCardIF.isSdCardUsable(std::nullopt)) {
|
||||
const char* prefix = sdCardIF.getCurrentMountPrefix();
|
||||
std::filesystem::path path =
|
||||
std::filesystem::path(prefix) / startracker::FW_TARGET_CFG_PATH;
|
||||
std::ofstream of(path, std::ofstream::out | std::ofstream::trunc);
|
||||
if (value == static_cast<uint8_t>(startracker::FirmwareTarget::MAIN)) {
|
||||
of << "main\n";
|
||||
} else {
|
||||
of << "backup\n";
|
||||
}
|
||||
} else {
|
||||
sif::warning << "SD card not usable" << std::endl;
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
};
|
||||
return returnvalue::OK;
|
||||
};
|
||||
if (uniqueId == startracker::ParamId::FIRMWARE_TARGET) {
|
||||
return firmwareTargetUpdate(false);
|
||||
}
|
||||
if (uniqueId == startracker::ParamId::FIRMWARE_TARGET_PERSISTENT) {
|
||||
return firmwareTargetUpdate(true);
|
||||
}
|
||||
return DeviceHandlerBase::getParameter(domainId, uniqueId, parameterWrapper, newValues,
|
||||
startAtIndex);
|
||||
}
|
||||
|
Reference in New Issue
Block a user