From 67351d5adab86b55e05e43a54a8eb5b5e8dab477 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 16 Apr 2023 11:25:10 +0200 Subject: [PATCH 01/18] set time for star tracker --- mission/acs/str/StarTrackerHandler.cpp | 38 ++++++++++++++++++++++++-- mission/acs/str/StarTrackerHandler.h | 6 ++-- mission/acs/str/strHelpers.h | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index d40e5fab..69ceab3a 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -331,6 +331,11 @@ ReturnValue_t StarTrackerHandler::buildTransitionDeviceCommand(DeviceCommandId_t *id = startracker::REQ_VERSION; return buildCommandFromCommand(*id, nullptr, 0); } + case(FwBootState::SET_TIME): { + bootState = FwBootState::WAIT_FOR_EXECUTION; + *id = startracker::SET_TIME; + return buildCommandFromCommand(*id, nullptr, 0); + } case (FwBootState::LOGLEVEL): { bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::LOGLEVEL; @@ -441,6 +446,16 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi preparePingRequest(); return returnvalue::OK; } + case(startracker::SET_TIME): { + SetTimeActionRequest setTimeRequest; + time_t epoch; + timeval tv; + Clock::getClock(&tv); + epoch = tv.tv_sec; + setTimeRequest.unixTime = epoch; + arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen); + return returnvalue::OK; + } case (startracker::REQ_TIME): { prepareTimeRequest(); return returnvalue::OK; @@ -637,6 +652,8 @@ void StarTrackerHandler::fillCommandAndReplyMap() { startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::LOGLEVEL, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); + this->insertInCommandAndReplyMap(startracker::SET_TIME, 3, nullptr, + startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::LOGSUBSCRIPTION, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::DEBUG_CAMERA, 3, nullptr, @@ -1349,6 +1366,10 @@ ReturnValue_t StarTrackerHandler::scanForActionReply(uint8_t replyId, DeviceComm *foundId = startracker::UPLOAD_IMAGE; break; } + case(ARC_ACTION_REQ_SETTIME_ID): { + *foundId = startracker::SET_TIME; + break; + } case (startracker::ID::CHECKSUM): { *foundId = startracker::CHECKSUM; break; @@ -1851,7 +1872,7 @@ ReturnValue_t StarTrackerHandler::handleSetParamReply(const uint8_t* rawFrame) { return SET_PARAM_FAILED; } if (internalState != InternalState::IDLE) { - handleStartup(*(rawFrame + PARAMETER_ID_OFFSET)); + handleStartup(*rawFrame, *(rawFrame + PARAMETER_ID_OFFSET)); } return returnvalue::OK; } @@ -2038,7 +2059,18 @@ ReturnValue_t StarTrackerHandler::handleActionReplySet(const uint8_t* rawFrame, return result; } -void StarTrackerHandler::handleStartup(uint8_t parameterId) { +void StarTrackerHandler::handleStartup(uint8_t tmType, uint8_t parameterId) { + switch(tmType) { + case(TMTC_ACTIONREPLY): { + case(ARC_ACTION_REQ_SETTIME_ID): { + bootState = FwBootState::LOGLEVEL; + return; + } + default: { + break; + } + } + } switch (parameterId) { case (startracker::ID::LOG_LEVEL): { bootState = FwBootState::LIMITS; @@ -2048,7 +2080,7 @@ void StarTrackerHandler::handleStartup(uint8_t parameterId) { bootState = FwBootState::TRACKING; break; } - case (startracker::ID::TRACKING): { + case (ARC_PARAM_TRACKING_ID): { bootState = FwBootState::MOUNTING; break; } diff --git a/mission/acs/str/StarTrackerHandler.h b/mission/acs/str/StarTrackerHandler.h index a74bff44..13855161 100644 --- a/mission/acs/str/StarTrackerHandler.h +++ b/mission/acs/str/StarTrackerHandler.h @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -16,7 +17,7 @@ #include "fsfw/timemanager/Countdown.h" extern "C" { -#include +#include } /** @@ -267,6 +268,7 @@ class StarTrackerHandler : public DeviceHandlerBase { BOOT_DELAY, REQ_VERSION, VERIFY_BOOT, + SET_TIME, LOGLEVEL, LIMITS, TRACKING, @@ -471,7 +473,7 @@ class StarTrackerHandler : public DeviceHandlerBase { /** * @brief Handles the startup state machine */ - void handleStartup(uint8_t parameterId); + void handleStartup(uint8_t tmType, uint8_t parameterId); /** * @brief Handles telemtry replies and fills the appropriate dataset diff --git a/mission/acs/str/strHelpers.h b/mission/acs/str/strHelpers.h index 69729df5..21038a91 100644 --- a/mission/acs/str/strHelpers.h +++ b/mission/acs/str/strHelpers.h @@ -326,6 +326,7 @@ static const DeviceCommandId_t DEBUG_CAMERA = 83; static const DeviceCommandId_t FIRMWARE_UPDATE = 84; static const DeviceCommandId_t DISABLE_TIMESTAMP_GENERATION = 85; static const DeviceCommandId_t ENABLE_TIMESTAMP_GENERATION = 86; +static constexpr DeviceCommandId_t SET_TIME = 87; static const DeviceCommandId_t NONE = 0xFFFFFFFF; static const uint32_t VERSION_SET_ID = REQ_VERSION; @@ -396,7 +397,6 @@ static const uint8_t ALGO = 16; static const uint8_t REBOOT = 7; static const uint8_t UPLOAD_IMAGE = 10; static const uint8_t POWER = 11; -static const uint8_t SET_TIME = 14; static const uint8_t SUBSCRIPTION = 18; static const uint8_t SOLUTION = 24; static const uint8_t TEMPERATURE = 27; -- 2.43.0 From 3aad452357560603fd1ff60e97e666c85d3ec536 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 16 Apr 2023 11:35:30 +0200 Subject: [PATCH 02/18] fix this some other time --- mission/acs/str/StarTrackerHandler.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 69ceab3a..53a75e5b 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -331,7 +331,7 @@ ReturnValue_t StarTrackerHandler::buildTransitionDeviceCommand(DeviceCommandId_t *id = startracker::REQ_VERSION; return buildCommandFromCommand(*id, nullptr, 0); } - case(FwBootState::SET_TIME): { + case (FwBootState::SET_TIME): { bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::SET_TIME; return buildCommandFromCommand(*id, nullptr, 0); @@ -446,7 +446,7 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi preparePingRequest(); return returnvalue::OK; } - case(startracker::SET_TIME): { + case (startracker::SET_TIME): { SetTimeActionRequest setTimeRequest; time_t epoch; timeval tv; @@ -1366,7 +1366,7 @@ ReturnValue_t StarTrackerHandler::scanForActionReply(uint8_t replyId, DeviceComm *foundId = startracker::UPLOAD_IMAGE; break; } - case(ARC_ACTION_REQ_SETTIME_ID): { + case (ARC_ACTION_REQ_SETTIME_ID): { *foundId = startracker::SET_TIME; break; } @@ -1982,7 +1982,7 @@ ReturnValue_t StarTrackerHandler::checkProgram() { startupState = StartupState::BOOT_BOOTLOADER; } if (bootState == FwBootState::VERIFY_BOOT) { - bootState = FwBootState::LOGLEVEL; + bootState = FwBootState::SET_TIME; } else if (internalState == InternalState::BOOTLOADER_CHECK) { triggerEvent(BOOTING_BOOTLOADER_FAILED_EVENT); internalState = InternalState::FAILED_BOOTLOADER_BOOT; @@ -2060,16 +2060,16 @@ ReturnValue_t StarTrackerHandler::handleActionReplySet(const uint8_t* rawFrame, } void StarTrackerHandler::handleStartup(uint8_t tmType, uint8_t parameterId) { - switch(tmType) { - case(TMTC_ACTIONREPLY): { - case(ARC_ACTION_REQ_SETTIME_ID): { - bootState = FwBootState::LOGLEVEL; - return; + switch (tmType) { + case (TMTC_ACTIONREPLY): { + case (ARC_ACTION_REQ_SETTIME_ID): { + bootState = FwBootState::LOGLEVEL; + return; + } + default: { + break; + } } - default: { - break; - } - } } switch (parameterId) { case (startracker::ID::LOG_LEVEL): { -- 2.43.0 From e9d48687d703dced61e6788ae17518f1322f05ee Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 12 Jul 2023 17:59:07 +0200 Subject: [PATCH 03/18] i hate this stupid class --- mission/acs/str/StarTrackerHandler.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 7776bf17..9171d182 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -466,12 +467,14 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi } case (startracker::SET_TIME): { SetTimeActionRequest setTimeRequest; - time_t epoch; timeval tv; Clock::getClock(&tv); - epoch = tv.tv_sec; - setTimeRequest.unixTime = epoch; arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen); + size_t serLen = 0; + // Time in milliseconds. Manual serialization because arcsec API ignores endianness. + SerializeAdapter::serialize(&setTimeRequest.unixTime, commandBuffer + 2, &serLen, + sizeof(commandBuffer), SerializeIF::Endianness::NETWORK); + rawPacket = commandBuffer; return returnvalue::OK; } case (startracker::REQ_TIME): { @@ -886,6 +889,7 @@ ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t* start, size_t rema switch (startracker::getReplyFrameType(start)) { case TMTC_ACTIONREPLY: { *foundLen = remainingSize; + arrayprinter::print(start, remainingSize); return scanForActionReply(startracker::getId(start), foundId); break; } @@ -918,6 +922,10 @@ ReturnValue_t StarTrackerHandler::interpretDeviceReply(DeviceCommandId_t id, ReturnValue_t result = returnvalue::OK; switch (id) { + case (startracker::SET_TIME): { + result = handleActionReply(packet); + break; + } case (startracker::REQ_TIME): { result = handleTm(packet, timeSet, startracker::TimeSet::SIZE, "REQ_TIME"); break; @@ -1882,7 +1890,7 @@ ReturnValue_t StarTrackerHandler::handleSetParamReply(const uint8_t* rawFrame) { uint8_t status = startracker::getStatusField(rawFrame); if (status != startracker::STATUS_OK) { sif::warning << "StarTrackerHandler::handleSetParamReply: Failed to execute parameter set " - " command with parameter ID" + "command with parameter ID " << static_cast(*(rawFrame + PARAMETER_ID_OFFSET)) << std::endl; if (internalState != InternalState::IDLE) { internalState = InternalState::IDLE; @@ -1897,14 +1905,18 @@ ReturnValue_t StarTrackerHandler::handleSetParamReply(const uint8_t* rawFrame) { ReturnValue_t StarTrackerHandler::handleActionReply(const uint8_t* rawFrame) { uint8_t status = startracker::getStatusField(rawFrame); + ReturnValue_t result = returnvalue::OK; if (status != startracker::STATUS_OK) { sif::warning << "StarTrackerHandler::handleActionReply: Failed to execute action " << "command with action ID " << static_cast(*(rawFrame + ACTION_ID_OFFSET)) << " and status " << static_cast(status) << std::endl; - return ACTION_FAILED; + result = ACTION_FAILED; } - return returnvalue::OK; + if (internalState != InternalState::IDLE) { + handleStartup(*rawFrame, *(rawFrame + PARAMETER_ID_OFFSET)); + } + return result; } ReturnValue_t StarTrackerHandler::handleChecksumReply(const uint8_t* rawFrame) { -- 2.43.0 From ff432a419410e096a81211e845660ef4af4308b7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 12 Jul 2023 18:17:00 +0200 Subject: [PATCH 04/18] what the hell is wrong here.. --- mission/acs/str/StarTrackerHandler.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 9171d182..9cde4e70 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -466,14 +466,15 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi return returnvalue::OK; } case (startracker::SET_TIME): { - SetTimeActionRequest setTimeRequest; + SetTimeActionRequest setTimeRequest{}; timeval tv; Clock::getClock(&tv); + setTimeRequest.unixTime = (tv.tv_sec * 1000) + (tv.tv_usec / 1000); arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen); size_t serLen = 0; // Time in milliseconds. Manual serialization because arcsec API ignores endianness. SerializeAdapter::serialize(&setTimeRequest.unixTime, commandBuffer + 2, &serLen, - sizeof(commandBuffer), SerializeIF::Endianness::NETWORK); + sizeof(commandBuffer) - 2, SerializeIF::Endianness::NETWORK); rawPacket = commandBuffer; return returnvalue::OK; } -- 2.43.0 From 608eecb091ec4348a648650fbdb516e24a6df805 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 12 Jul 2023 18:33:02 +0200 Subject: [PATCH 05/18] this is realy buggy somewhere.. --- linux/acs/StrComHandler.cpp | 2 +- mission/acs/str/StarTrackerHandler.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/linux/acs/StrComHandler.cpp b/linux/acs/StrComHandler.cpp index 5ae00c94..6fed7317 100644 --- a/linux/acs/StrComHandler.cpp +++ b/linux/acs/StrComHandler.cpp @@ -51,7 +51,7 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { switch (state) { case InternalState::POLL_ONE_REPLY: { // Stopwatch watch; - replyTimeout.setTimeout(200); + replyTimeout.setTimeout(400); replyResult = readOneReply(static_cast(state)); { MutexGuard mg(lock); diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 9cde4e70..dbcaf940 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -471,10 +471,10 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi Clock::getClock(&tv); setTimeRequest.unixTime = (tv.tv_sec * 1000) + (tv.tv_usec / 1000); arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen); - size_t serLen = 0; + //size_t serLen = 0; // Time in milliseconds. Manual serialization because arcsec API ignores endianness. - SerializeAdapter::serialize(&setTimeRequest.unixTime, commandBuffer + 2, &serLen, - sizeof(commandBuffer) - 2, SerializeIF::Endianness::NETWORK); + //SerializeAdapter::serialize(&setTimeRequest.unixTime, commandBuffer + 2, &serLen, + // sizeof(commandBuffer) - 2, SerializeIF::Endianness::NETWORK); rawPacket = commandBuffer; return returnvalue::OK; } @@ -890,7 +890,7 @@ ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t* start, size_t rema switch (startracker::getReplyFrameType(start)) { case TMTC_ACTIONREPLY: { *foundLen = remainingSize; - arrayprinter::print(start, remainingSize); + // arrayprinter::print(start, remainingSize); return scanForActionReply(startracker::getId(start), foundId); break; } -- 2.43.0 From 0fb85883a54dd08f447161cee2cac37744de1456 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 10:16:52 +0200 Subject: [PATCH 06/18] always add STR, rename set field --- CMakeLists.txt | 2 +- mission/acs/str/StarTrackerHandler.cpp | 2 +- mission/acs/str/strHelpers.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 54b43f47..c67fb75a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,7 +93,7 @@ set(OBSW_ADD_BPX_BATTERY_HANDLER 1 CACHE STRING "Add BPX battery module") set(OBSW_ADD_STAR_TRACKER - ${INIT_VAL} + 1 CACHE STRING "Add Startracker module") set(OBSW_ADD_SUN_SENSORS ${INIT_VAL} diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 9cde4e70..004d5f34 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -2013,7 +2013,7 @@ ReturnValue_t StarTrackerHandler::checkProgram() { startupState = StartupState::BOOT_BOOTLOADER; } if (bootState == FwBootState::VERIFY_BOOT) { - bootState = FwBootState::SET_TIME; + bootState = FwBootState::LOGLEVEL; } else if (internalState == InternalState::BOOTLOADER_CHECK) { triggerEvent(BOOTING_BOOTLOADER_FAILED_EVENT); internalState = InternalState::FAILED_BOOTLOADER_BOOT; diff --git a/mission/acs/str/strHelpers.h b/mission/acs/str/strHelpers.h index 21038a91..241f2783 100644 --- a/mission/acs/str/strHelpers.h +++ b/mission/acs/str/strHelpers.h @@ -650,7 +650,7 @@ class SolutionSet : public StaticLocalDataSet { // Ticks timestamp lp_var_t ticks = lp_var_t(sid.objectId, PoolIds::TICKS_SOLUTION_SET, this); /// Unix time stamp - lp_var_t time = lp_var_t(sid.objectId, PoolIds::TIME_SOLUTION_SET, this); + lp_var_t timeUs = lp_var_t(sid.objectId, PoolIds::TIME_SOLUTION_SET, this); // Calibrated quaternion (takes into account the mounting quaternion), typically same as // track q values lp_var_t caliQw = lp_var_t(sid.objectId, PoolIds::CALI_QW, this); @@ -695,7 +695,7 @@ class SolutionSet : public StaticLocalDataSet { void printSet() { PoolReadGuard rg(this); sif::info << "SolutionSet::printSet: Ticks: " << this->ticks << std::endl; - sif::info << "SolutionSet::printSet: Time: " << this->time << std::endl; + sif::info << "SolutionSet::printSet: Time: " << this->timeUs << std::endl; sif::info << "SolutionSet::printSet: Calibrated quaternion Qw: " << this->caliQw << std::endl; sif::info << "SolutionSet::printSet: Calibrated quaternion Qx: " << this->caliQx << std::endl; sif::info << "SolutionSet::printSet: Calibrated quaternion Qy: " << this->caliQy << std::endl; -- 2.43.0 From 863c0af2a1488045714b3ac1414889414c06d87a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 10:53:58 +0200 Subject: [PATCH 07/18] what the hell is wrong with the thing? --- linux/acs/StrComHandler.cpp | 19 ++++++++++++++++--- mission/acs/str/StarTrackerHandler.cpp | 13 +++++++------ mission/acs/str/strHelpers.h | 2 +- tmtc | 2 +- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/linux/acs/StrComHandler.cpp b/linux/acs/StrComHandler.cpp index 5ae00c94..f070efd4 100644 --- a/linux/acs/StrComHandler.cpp +++ b/linux/acs/StrComHandler.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -23,6 +24,8 @@ extern "C" { using namespace returnvalue; +static constexpr bool PACKET_WIRETAPPING = false; + StrComHandler::StrComHandler(object_id_t objectId) : SystemObject(objectId) { lock = MutexFactory::instance()->createMutex(); semaphore.acquire(); @@ -51,7 +54,7 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { switch (state) { case InternalState::POLL_ONE_REPLY: { // Stopwatch watch; - replyTimeout.setTimeout(200); + replyTimeout.setTimeout(400); replyResult = readOneReply(static_cast(state)); { MutexGuard mg(lock); @@ -680,6 +683,10 @@ ReturnValue_t StrComHandler::sendMessage(CookieIF* cookie, const uint8_t* sendDa const uint8_t* txFrame; size_t frameLen; datalinkLayer.encodeFrame(sendData, sendLen, &txFrame, frameLen); + if(PACKET_WIRETAPPING) { + sif::debug << "Sendign STR frame" << std::endl; + arrayprinter::print(txFrame, frameLen); + } ssize_t bytesWritten = write(serialPort, txFrame, frameLen); if (bytesWritten != static_cast(frameLen)) { sif::warning << "StrComHandler: Sending packet failed" << std::endl; @@ -782,8 +789,10 @@ ReturnValue_t StrComHandler::handleSerialReception() { << std::endl; return FAILED; } else if (bytesRead > 0) { - // sif::info << "Received " << bytesRead << " bytes from the STR" << std::endl; - // arrayprinter::print(recBuf.data(), bytesRead); + if(PACKET_WIRETAPPING) { + sif::info << "Received " << bytesRead << " bytes from the STR" << std::endl; + arrayprinter::print(recBuf.data(), bytesRead); + } datalinkLayer.feedData(recBuf.data(), bytesRead); } return OK; @@ -797,6 +806,10 @@ ReturnValue_t StrComHandler::readOneReply(uint32_t failParameter) { handleSerialReception(); result = datalinkLayer.checkRingBufForFrame(&replyPtr, replyLen); if (result == returnvalue::OK) { + if(PACKET_WIRETAPPING) { + sif::debug << "Received STR reply frame" << std::endl; + arrayprinter::print(replyPtr, replyLen); + } return returnvalue::OK; } else if (result != ArcsecDatalinkLayer::DEC_IN_PROGRESS) { triggerEvent(STR_HELPER_DEC_ERROR, result, failParameter); diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 004d5f34..3dee6a78 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -352,7 +352,7 @@ ReturnValue_t StarTrackerHandler::buildTransitionDeviceCommand(DeviceCommandId_t } case (FwBootState::SET_TIME): { bootState = FwBootState::WAIT_FOR_EXECUTION; - *id = startracker::SET_TIME; + *id = startracker::SET_TIME_FROM_SYS_TIME; return buildCommandFromCommand(*id, nullptr, 0); } case (FwBootState::LOGLEVEL): { @@ -465,7 +465,8 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi preparePingRequest(); return returnvalue::OK; } - case (startracker::SET_TIME): { + case (startracker::SET_TIME_FROM_SYS_TIME): { + // Might be buggy, need more answers from arcsec... SetTimeActionRequest setTimeRequest{}; timeval tv; Clock::getClock(&tv); @@ -674,7 +675,7 @@ void StarTrackerHandler::fillCommandAndReplyMap() { startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::LOGLEVEL, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); - this->insertInCommandAndReplyMap(startracker::SET_TIME, 3, nullptr, + this->insertInCommandAndReplyMap(startracker::SET_TIME_FROM_SYS_TIME, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::LOGSUBSCRIPTION, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); @@ -890,7 +891,7 @@ ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t* start, size_t rema switch (startracker::getReplyFrameType(start)) { case TMTC_ACTIONREPLY: { *foundLen = remainingSize; - arrayprinter::print(start, remainingSize); + // arrayprinter::print(start, remainingSize); return scanForActionReply(startracker::getId(start), foundId); break; } @@ -923,7 +924,7 @@ ReturnValue_t StarTrackerHandler::interpretDeviceReply(DeviceCommandId_t id, ReturnValue_t result = returnvalue::OK; switch (id) { - case (startracker::SET_TIME): { + case (startracker::SET_TIME_FROM_SYS_TIME): { result = handleActionReply(packet); break; } @@ -1394,7 +1395,7 @@ ReturnValue_t StarTrackerHandler::scanForActionReply(uint8_t replyId, DeviceComm break; } case (ARC_ACTION_REQ_SETTIME_ID): { - *foundId = startracker::SET_TIME; + *foundId = startracker::SET_TIME_FROM_SYS_TIME; break; } case (startracker::ID::CHECKSUM): { diff --git a/mission/acs/str/strHelpers.h b/mission/acs/str/strHelpers.h index 241f2783..894ceac5 100644 --- a/mission/acs/str/strHelpers.h +++ b/mission/acs/str/strHelpers.h @@ -326,7 +326,7 @@ static const DeviceCommandId_t DEBUG_CAMERA = 83; static const DeviceCommandId_t FIRMWARE_UPDATE = 84; static const DeviceCommandId_t DISABLE_TIMESTAMP_GENERATION = 85; static const DeviceCommandId_t ENABLE_TIMESTAMP_GENERATION = 86; -static constexpr DeviceCommandId_t SET_TIME = 87; +static constexpr DeviceCommandId_t SET_TIME_FROM_SYS_TIME = 87; static const DeviceCommandId_t NONE = 0xFFFFFFFF; static const uint32_t VERSION_SET_ID = REQ_VERSION; diff --git a/tmtc b/tmtc index 9be81f17..1f2f2aac 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 9be81f1725004b55e937718fbaddc4f4e4e74081 +Subproject commit 1f2f2aac13b0b32c22f0a75e557743ad32f7dc70 -- 2.43.0 From 0e3980dc379a051368d6d7cc9aff2244017313fb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 14:52:07 +0200 Subject: [PATCH 08/18] this works --- mission/acs/str/StarTrackerHandler.cpp | 3 +-- tmtc | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 1adf05b2..f380a60c 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -466,11 +466,10 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi return returnvalue::OK; } case (startracker::SET_TIME_FROM_SYS_TIME): { - // Might be buggy, need more answers from arcsec... SetTimeActionRequest setTimeRequest{}; timeval tv; Clock::getClock(&tv); - setTimeRequest.unixTime = (tv.tv_sec * 1000000) + (tv.tv_usec); + setTimeRequest.unixTime = (static_cast(tv.tv_sec) * 1000 * 1000) + (static_cast(tv.tv_usec)); arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen); size_t serLen = 0; // Time in milliseconds. Manual serialization because arcsec API ignores endianness. diff --git a/tmtc b/tmtc index 1f2f2aac..62bd5356 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 1f2f2aac13b0b32c22f0a75e557743ad32f7dc70 +Subproject commit 62bd5356220bab1ce9f3ddaa7aaf75963b8bd596 -- 2.43.0 From 16f26d77584ae8c0afb93d4519b0bdad79f84572 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 14:52:32 +0200 Subject: [PATCH 09/18] afmt --- linux/acs/StrComHandler.cpp | 6 +++--- mission/acs/str/StarTrackerHandler.cpp | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/linux/acs/StrComHandler.cpp b/linux/acs/StrComHandler.cpp index f070efd4..243cb771 100644 --- a/linux/acs/StrComHandler.cpp +++ b/linux/acs/StrComHandler.cpp @@ -683,7 +683,7 @@ ReturnValue_t StrComHandler::sendMessage(CookieIF* cookie, const uint8_t* sendDa const uint8_t* txFrame; size_t frameLen; datalinkLayer.encodeFrame(sendData, sendLen, &txFrame, frameLen); - if(PACKET_WIRETAPPING) { + if (PACKET_WIRETAPPING) { sif::debug << "Sendign STR frame" << std::endl; arrayprinter::print(txFrame, frameLen); } @@ -789,7 +789,7 @@ ReturnValue_t StrComHandler::handleSerialReception() { << std::endl; return FAILED; } else if (bytesRead > 0) { - if(PACKET_WIRETAPPING) { + if (PACKET_WIRETAPPING) { sif::info << "Received " << bytesRead << " bytes from the STR" << std::endl; arrayprinter::print(recBuf.data(), bytesRead); } @@ -806,7 +806,7 @@ ReturnValue_t StrComHandler::readOneReply(uint32_t failParameter) { handleSerialReception(); result = datalinkLayer.checkRingBufForFrame(&replyPtr, replyLen); if (result == returnvalue::OK) { - if(PACKET_WIRETAPPING) { + if (PACKET_WIRETAPPING) { sif::debug << "Received STR reply frame" << std::endl; arrayprinter::print(replyPtr, replyLen); } diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index f380a60c..0532a992 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -469,7 +469,8 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi SetTimeActionRequest setTimeRequest{}; timeval tv; Clock::getClock(&tv); - setTimeRequest.unixTime = (static_cast(tv.tv_sec) * 1000 * 1000) + (static_cast(tv.tv_usec)); + setTimeRequest.unixTime = + (static_cast(tv.tv_sec) * 1000 * 1000) + (static_cast(tv.tv_usec)); arc_pack_settime_action_req(&setTimeRequest, commandBuffer, &rawPacketLen); size_t serLen = 0; // Time in milliseconds. Manual serialization because arcsec API ignores endianness. -- 2.43.0 From 6398532462ae95e6ba342ea51eb744fadeaf3402 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 14:57:24 +0200 Subject: [PATCH 10/18] only enable STR set for normal mode --- mission/acs/str/StarTrackerHandler.cpp | 3 ++- tmtc | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index cc5b19b7..d0d29345 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -88,7 +88,6 @@ void StarTrackerHandler::doStartUp() { default: return; } - solutionSet.setReportingEnabled(true); startupState = StartupState::DONE; internalState = InternalState::IDLE; setMode(_MODE_TO_ON); @@ -787,11 +786,13 @@ void StarTrackerHandler::doOnTransition(Submode_t subModeFrom) { void StarTrackerHandler::doNormalTransition(Mode_t modeFrom, Submode_t subModeFrom) { using namespace startracker; if (subModeFrom == SUBMODE_FIRMWARE) { + solutionSet.setReportingEnabled(true); setMode(MODE_NORMAL); } else if (subModeFrom == SUBMODE_BOOTLOADER) { bootFirmware(MODE_NORMAL); } else if (modeFrom == MODE_NORMAL && subModeFrom == SUBMODE_NONE) { // Device handler already in mode normal + solutionSet.setReportingEnabled(true); setMode(MODE_NORMAL); } } diff --git a/tmtc b/tmtc index eea76835..62bd5356 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit eea768358101a16912c0c49ad5e66a8c90826121 +Subproject commit 62bd5356220bab1ce9f3ddaa7aaf75963b8bd596 -- 2.43.0 From 0cefef8a3553d4c13c5321363c2dc2e6f6099247 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 16:38:20 +0200 Subject: [PATCH 11/18] rough but possible fix.. --- fsfw | 2 +- linux/acs/StrComHandler.cpp | 12 +++++------- mission/acs/str/StarTrackerHandler.cpp | 18 ++---------------- mission/acs/str/StarTrackerHandler.h | 1 + mission/pollingSeqTables.cpp | 2 ++ mission/system/acs/StrFdir.cpp | 4 +++- tmtc | 2 +- 7 files changed, 15 insertions(+), 26 deletions(-) diff --git a/fsfw b/fsfw index 88e86652..42e74d22 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 88e8665280a0381c41b724ab035a8c3eff1a23c1 +Subproject commit 42e74d22cc1b5d4060ce9923f674bdede0babaac diff --git a/linux/acs/StrComHandler.cpp b/linux/acs/StrComHandler.cpp index 243cb771..2db73f35 100644 --- a/linux/acs/StrComHandler.cpp +++ b/linux/acs/StrComHandler.cpp @@ -54,8 +54,8 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { switch (state) { case InternalState::POLL_ONE_REPLY: { // Stopwatch watch; - replyTimeout.setTimeout(400); - replyResult = readOneReply(static_cast(state)); + replyTimeout.setTimeout(200); + readOneReply(static_cast(state)); { MutexGuard mg(lock); replyWasReceived = true; @@ -684,7 +684,7 @@ ReturnValue_t StrComHandler::sendMessage(CookieIF* cookie, const uint8_t* sendDa size_t frameLen; datalinkLayer.encodeFrame(sendData, sendLen, &txFrame, frameLen); if (PACKET_WIRETAPPING) { - sif::debug << "Sendign STR frame" << std::endl; + sif::debug << "Sending STR frame" << std::endl; arrayprinter::print(txFrame, frameLen); } ssize_t bytesWritten = write(serialPort, txFrame, frameLen); @@ -716,13 +716,11 @@ ReturnValue_t StrComHandler::requestReceiveMessage(CookieIF* cookie, size_t requ } ReturnValue_t StrComHandler::readReceivedMessage(CookieIF* cookie, uint8_t** buffer, size_t* size) { - // Consider it a configuration error if the task is not done with a command -> reply cycle - // in time. bool replyWasReceived = false; { MutexGuard mg(lock); if (state != InternalState::SLEEPING) { - return BUSY; + return returnvalue::OK; } replyWasReceived = this->replyWasReceived; } @@ -735,7 +733,7 @@ ReturnValue_t StrComHandler::readReceivedMessage(CookieIF* cookie, uint8_t** buf *size = replyLen; } replyLen = 0; - return replyResult; + return returnvalue::OK; } ReturnValue_t StrComHandler::unlockAndEraseRegions(uint32_t from, uint32_t to) { diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index b9de5996..151410b2 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -325,7 +325,7 @@ ReturnValue_t StarTrackerHandler::buildNormalDeviceCommand(DeviceCommandId_t* id ReturnValue_t StarTrackerHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { switch (internalState) { case InternalState::BOOT_FIRMWARE: { - if (bootState == FwBootState::WAIT_FOR_EXECUTION or bootState == FwBootState::VERIFY_BOOT) { + if (bootState == FwBootState::VERIFY_BOOT or isAwaitingReply()) { return NOTHING_TO_SEND; } if (bootState == FwBootState::NONE) { @@ -350,75 +350,61 @@ ReturnValue_t StarTrackerHandler::buildTransitionDeviceCommand(DeviceCommandId_t return buildCommandFromCommand(*id, nullptr, 0); } case (FwBootState::SET_TIME): { - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::SET_TIME_FROM_SYS_TIME; return buildCommandFromCommand(*id, nullptr, 0); } case (FwBootState::LOGLEVEL): { - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::LOGLEVEL; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); } case (FwBootState::LIMITS): { - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::LIMITS; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); } case (FwBootState::TRACKING): { - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::TRACKING; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); } case FwBootState::MOUNTING: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::MOUNTING; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::IMAGE_PROCESSOR: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::IMAGE_PROCESSOR; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::CAMERA: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::CAMERA; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::CENTROIDING: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::CENTROIDING; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::LISA: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::LISA; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::MATCHING: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::MATCHING; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::VALIDATION: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::VALIDATION; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::ALGO: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::ALGO; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::LOG_SUBSCRIPTION: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::LOGSUBSCRIPTION; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); case FwBootState::DEBUG_CAMERA: - bootState = FwBootState::WAIT_FOR_EXECUTION; *id = startracker::DEBUG_CAMERA; return buildCommandFromCommand( *id, reinterpret_cast(paramJsonFile.c_str()), paramJsonFile.size()); @@ -688,7 +674,7 @@ void StarTrackerHandler::fillCommandAndReplyMap() { startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::CAMERA, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); - this->insertInCommandAndReplyMap(startracker::CENTROIDING, 3, nullptr, + this->insertInCommandAndReplyMap(startracker::CENTROIDING, 2, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::LISA, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); diff --git a/mission/acs/str/StarTrackerHandler.h b/mission/acs/str/StarTrackerHandler.h index 10397148..34a10746 100644 --- a/mission/acs/str/StarTrackerHandler.h +++ b/mission/acs/str/StarTrackerHandler.h @@ -281,6 +281,7 @@ class StarTrackerHandler : public DeviceHandlerBase { LOG_SUBSCRIPTION, DEBUG_CAMERA, WAIT_FOR_EXECUTION, + RETRY_CFG_CMD }; FwBootState bootState = FwBootState::NONE; diff --git a/mission/pollingSeqTables.cpp b/mission/pollingSeqTables.cpp index e18046d5..758361e3 100644 --- a/mission/pollingSeqTables.cpp +++ b/mission/pollingSeqTables.cpp @@ -341,6 +341,8 @@ ReturnValue_t pst::pstTcsAndAcs(FixedTimeslotTaskIF *thisSequence, AcsPstCfg cfg DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, + DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, diff --git a/mission/system/acs/StrFdir.cpp b/mission/system/acs/StrFdir.cpp index 97a4162a..74284d55 100644 --- a/mission/system/acs/StrFdir.cpp +++ b/mission/system/acs/StrFdir.cpp @@ -3,7 +3,9 @@ #include "mission/acs/defs.h" StrFdir::StrFdir(object_id_t strObject) - : DeviceHandlerFailureIsolation(strObject, objects::NO_OBJECT) {} + : DeviceHandlerFailureIsolation(strObject, objects::NO_OBJECT) { + missedReplyCount.setFailureThreshold(30); +} ReturnValue_t StrFdir::eventReceived(EventMessage* event) { if (event->getEvent() == acs::MEKF_INVALID_MODE_VIOLATION) { diff --git a/tmtc b/tmtc index 62bd5356..26cf1121 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 62bd5356220bab1ce9f3ddaa7aaf75963b8bd596 +Subproject commit 26cf112121782e730057cda0766d435ee2077b6d -- 2.43.0 From 39022ce2f67a9b1433223fa0883b1f2dc4384b9d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 16:52:33 +0200 Subject: [PATCH 12/18] different max missed reply thresholds for STR FDIR --- bsp_q7s/em/emObjectFactory.cpp | 4 +++- bsp_q7s/fmObjectFactory.cpp | 2 +- bsp_q7s/objectFactory.cpp | 5 +++-- bsp_q7s/objectFactory.h | 2 +- mission/acs/str/StarTrackerHandler.cpp | 2 +- mission/system/acs/StrFdir.cpp | 4 ++-- mission/system/acs/StrFdir.h | 2 +- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index e5d6abc2..0bafa52f 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -138,7 +138,9 @@ void ObjectFactory::produce(void* args) { #endif #if OBSW_ADD_STAR_TRACKER == 1 - createStrComponents(pwrSwitcher); + // Missed reply threshold is higher on EM than default value because the ground STR received + // from the Swedes is going weird things. + createStrComponents(pwrSwitcher, 30); #endif /* OBSW_ADD_STAR_TRACKER == 1 */ createPayloadComponents(gpioComIF, *pwrSwitcher); diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp index e43e3551..6eca9a9d 100644 --- a/bsp_q7s/fmObjectFactory.cpp +++ b/bsp_q7s/fmObjectFactory.cpp @@ -102,7 +102,7 @@ void ObjectFactory::produce(void* args) { #endif #if OBSW_ADD_STAR_TRACKER == 1 - createStrComponents(pwrSwitcher); + createStrComponents(pwrSwitcher, 5); #endif /* OBSW_ADD_STAR_TRACKER == 1 */ #if OBSW_ADD_CCSDS_IP_CORES == 1 diff --git a/bsp_q7s/objectFactory.cpp b/bsp_q7s/objectFactory.cpp index 326ba8ef..a27fa94e 100644 --- a/bsp_q7s/objectFactory.cpp +++ b/bsp_q7s/objectFactory.cpp @@ -928,7 +928,8 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { #endif } -void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) { +void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher, + uint32_t missedReplyCountThreshold) { auto* strAssy = new StrAssembly(objects::STR_ASSY); strAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM); auto* starTrackerCookie = @@ -941,7 +942,7 @@ void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) { if (paramJsonFile == nullptr) { sif::error << "No valid Star Tracker parameter JSON file" << std::endl; } - auto strFdir = new StrFdir(objects::STAR_TRACKER); + auto strFdir = new StrFdir(objects::STAR_TRACKER, missedReplyCountThreshold); auto starTracker = new StarTrackerHandler(objects::STAR_TRACKER, objects::STR_COM_IF, starTrackerCookie, paramJsonFile, strComIF, power::PDU1_CH2_STAR_TRACKER_5V); diff --git a/bsp_q7s/objectFactory.h b/bsp_q7s/objectFactory.h index 491720ac..1e6e5461 100644 --- a/bsp_q7s/objectFactory.h +++ b/bsp_q7s/objectFactory.h @@ -69,7 +69,7 @@ void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTa HeaterHandler*& heaterHandler); void createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets, const char* i2cDev); void createBpxBatteryComponent(bool enableHkSets, const char* i2cDev); -void createStrComponents(PowerSwitchIF* pwrSwitcher); +void createStrComponents(PowerSwitchIF* pwrSwitcher, uint32_t missedReplyCountThreshold); void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF); void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher); void createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher); diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 151410b2..a6e601a7 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -2001,7 +2001,7 @@ ReturnValue_t StarTrackerHandler::checkProgram() { startupState = StartupState::BOOT_BOOTLOADER; } if (bootState == FwBootState::VERIFY_BOOT) { - bootState = FwBootState::LOGLEVEL; + bootState = FwBootState::SET_TIME; } else if (internalState == InternalState::BOOTLOADER_CHECK) { triggerEvent(BOOTING_BOOTLOADER_FAILED_EVENT); internalState = InternalState::FAILED_BOOTLOADER_BOOT; diff --git a/mission/system/acs/StrFdir.cpp b/mission/system/acs/StrFdir.cpp index 74284d55..5d53586b 100644 --- a/mission/system/acs/StrFdir.cpp +++ b/mission/system/acs/StrFdir.cpp @@ -2,9 +2,9 @@ #include "mission/acs/defs.h" -StrFdir::StrFdir(object_id_t strObject) +StrFdir::StrFdir(object_id_t strObject, uint32_t missedReplyThreshold) : DeviceHandlerFailureIsolation(strObject, objects::NO_OBJECT) { - missedReplyCount.setFailureThreshold(30); + missedReplyCount.setFailureThreshold(missedReplyThreshold); } ReturnValue_t StrFdir::eventReceived(EventMessage* event) { diff --git a/mission/system/acs/StrFdir.h b/mission/system/acs/StrFdir.h index 20476e1a..2a33afc3 100644 --- a/mission/system/acs/StrFdir.h +++ b/mission/system/acs/StrFdir.h @@ -5,7 +5,7 @@ class StrFdir : public DeviceHandlerFailureIsolation { public: - StrFdir(object_id_t strObject); + StrFdir(object_id_t strObject, uint32_t missedReplyThreshold); ReturnValue_t eventReceived(EventMessage* event) override; }; -- 2.43.0 From e9d4104f88a0335235f6000ae869a9a2bb712b2f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 17:03:56 +0200 Subject: [PATCH 13/18] some further investigation --- CHANGELOG.md | 9 +++++++++ mission/acs/str/StarTrackerHandler.cpp | 3 +-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd1adb9a..4ba6a2a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,15 @@ will consitute of a breaking change warranting a new major release: # [unreleased] +## Changed + +- STR missed reply handling is now moved to DHB rather than the COM interface. The COM IF will + still trigger an event if a reply is taking too long. +- The FM and EM STR FDIR now have different maximum reply tresholds. This is because the + EM STR behaved odd and sometimes takes 3-4 seconds to respond to a reply, which must be + investigated further. + + # [v6.1.0] 2023-07-13 - `eive-tmtc`: v5.2.0 diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index a6e601a7..29fccf53 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -794,13 +794,11 @@ void StarTrackerHandler::doOnTransition(Submode_t subModeFrom) { void StarTrackerHandler::doNormalTransition(Mode_t modeFrom, Submode_t subModeFrom) { using namespace startracker; if (subModeFrom == SUBMODE_FIRMWARE) { - solutionSet.setReportingEnabled(true); setMode(MODE_NORMAL); } else if (subModeFrom == SUBMODE_BOOTLOADER) { bootFirmware(MODE_NORMAL); } else if (modeFrom == MODE_NORMAL && subModeFrom == SUBMODE_NONE) { // Device handler already in mode normal - solutionSet.setReportingEnabled(true); setMode(MODE_NORMAL); } } @@ -823,6 +821,7 @@ void StarTrackerHandler::bootFirmware(Mode_t toMode) { setMode(toMode, startracker::SUBMODE_FIRMWARE); } sif::info << "STR: Firmware boot success" << std::endl; + solutionSet.setReportingEnabled(true); internalState = InternalState::IDLE; startupState = StartupState::IDLE; break; -- 2.43.0 From 462da5228a0974fa9836453586425b5cdcd730af Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 17:23:46 +0200 Subject: [PATCH 14/18] back to default FDIR --- bsp_q7s/em/emObjectFactory.cpp | 4 +--- bsp_q7s/fmObjectFactory.cpp | 2 +- bsp_q7s/objectFactory.cpp | 5 ++--- bsp_q7s/objectFactory.h | 2 +- mission/system/acs/StrFdir.cpp | 6 ++---- mission/system/acs/StrFdir.h | 2 +- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index 0bafa52f..e5d6abc2 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -138,9 +138,7 @@ void ObjectFactory::produce(void* args) { #endif #if OBSW_ADD_STAR_TRACKER == 1 - // Missed reply threshold is higher on EM than default value because the ground STR received - // from the Swedes is going weird things. - createStrComponents(pwrSwitcher, 30); + createStrComponents(pwrSwitcher); #endif /* OBSW_ADD_STAR_TRACKER == 1 */ createPayloadComponents(gpioComIF, *pwrSwitcher); diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp index 6eca9a9d..e43e3551 100644 --- a/bsp_q7s/fmObjectFactory.cpp +++ b/bsp_q7s/fmObjectFactory.cpp @@ -102,7 +102,7 @@ void ObjectFactory::produce(void* args) { #endif #if OBSW_ADD_STAR_TRACKER == 1 - createStrComponents(pwrSwitcher, 5); + createStrComponents(pwrSwitcher); #endif /* OBSW_ADD_STAR_TRACKER == 1 */ #if OBSW_ADD_CCSDS_IP_CORES == 1 diff --git a/bsp_q7s/objectFactory.cpp b/bsp_q7s/objectFactory.cpp index a27fa94e..326ba8ef 100644 --- a/bsp_q7s/objectFactory.cpp +++ b/bsp_q7s/objectFactory.cpp @@ -928,8 +928,7 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { #endif } -void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher, - uint32_t missedReplyCountThreshold) { +void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) { auto* strAssy = new StrAssembly(objects::STR_ASSY); strAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM); auto* starTrackerCookie = @@ -942,7 +941,7 @@ void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher, if (paramJsonFile == nullptr) { sif::error << "No valid Star Tracker parameter JSON file" << std::endl; } - auto strFdir = new StrFdir(objects::STAR_TRACKER, missedReplyCountThreshold); + auto strFdir = new StrFdir(objects::STAR_TRACKER); auto starTracker = new StarTrackerHandler(objects::STAR_TRACKER, objects::STR_COM_IF, starTrackerCookie, paramJsonFile, strComIF, power::PDU1_CH2_STAR_TRACKER_5V); diff --git a/bsp_q7s/objectFactory.h b/bsp_q7s/objectFactory.h index 1e6e5461..491720ac 100644 --- a/bsp_q7s/objectFactory.h +++ b/bsp_q7s/objectFactory.h @@ -69,7 +69,7 @@ void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTa HeaterHandler*& heaterHandler); void createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets, const char* i2cDev); void createBpxBatteryComponent(bool enableHkSets, const char* i2cDev); -void createStrComponents(PowerSwitchIF* pwrSwitcher, uint32_t missedReplyCountThreshold); +void createStrComponents(PowerSwitchIF* pwrSwitcher); void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF); void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher); void createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher); diff --git a/mission/system/acs/StrFdir.cpp b/mission/system/acs/StrFdir.cpp index 5d53586b..97a4162a 100644 --- a/mission/system/acs/StrFdir.cpp +++ b/mission/system/acs/StrFdir.cpp @@ -2,10 +2,8 @@ #include "mission/acs/defs.h" -StrFdir::StrFdir(object_id_t strObject, uint32_t missedReplyThreshold) - : DeviceHandlerFailureIsolation(strObject, objects::NO_OBJECT) { - missedReplyCount.setFailureThreshold(missedReplyThreshold); -} +StrFdir::StrFdir(object_id_t strObject) + : DeviceHandlerFailureIsolation(strObject, objects::NO_OBJECT) {} ReturnValue_t StrFdir::eventReceived(EventMessage* event) { if (event->getEvent() == acs::MEKF_INVALID_MODE_VIOLATION) { diff --git a/mission/system/acs/StrFdir.h b/mission/system/acs/StrFdir.h index 2a33afc3..20476e1a 100644 --- a/mission/system/acs/StrFdir.h +++ b/mission/system/acs/StrFdir.h @@ -5,7 +5,7 @@ class StrFdir : public DeviceHandlerFailureIsolation { public: - StrFdir(object_id_t strObject, uint32_t missedReplyThreshold); + StrFdir(object_id_t strObject); ReturnValue_t eventReceived(EventMessage* event) override; }; -- 2.43.0 From fec85ffa6c7cc5a43197f9a69335be2baada7e31 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 17:30:43 +0200 Subject: [PATCH 15/18] correct fix --- mission/acs/str/StarTrackerHandler.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index d0d29345..498b5b87 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -786,13 +786,11 @@ void StarTrackerHandler::doOnTransition(Submode_t subModeFrom) { void StarTrackerHandler::doNormalTransition(Mode_t modeFrom, Submode_t subModeFrom) { using namespace startracker; if (subModeFrom == SUBMODE_FIRMWARE) { - solutionSet.setReportingEnabled(true); setMode(MODE_NORMAL); } else if (subModeFrom == SUBMODE_BOOTLOADER) { bootFirmware(MODE_NORMAL); } else if (modeFrom == MODE_NORMAL && subModeFrom == SUBMODE_NONE) { // Device handler already in mode normal - solutionSet.setReportingEnabled(true); setMode(MODE_NORMAL); } } @@ -814,6 +812,7 @@ void StarTrackerHandler::bootFirmware(Mode_t toMode) { } else { setMode(toMode, startracker::SUBMODE_FIRMWARE); } + solutionSet.setReportingEnabled(true); sif::info << "STR: Firmware boot success" << std::endl; internalState = InternalState::IDLE; startupState = StartupState::IDLE; -- 2.43.0 From 6d220692d5f3b378e50c10cd42b30a9fcbbedaeb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 17:33:04 +0200 Subject: [PATCH 16/18] changelog --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ba6a2a8..3db916c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,11 +19,12 @@ will consitute of a breaking change warranting a new major release: ## Changed - STR missed reply handling is now moved to DHB rather than the COM interface. The COM IF will - still trigger an event if a reply is taking too long. -- The FM and EM STR FDIR now have different maximum reply tresholds. This is because the - EM STR behaved odd and sometimes takes 3-4 seconds to respond to a reply, which must be - investigated further. + still trigger an event if a reply is taking too long, and FDIR should still work via reply + timeouts. +## Added + +- Set STR time in configuration sequence to firmware mode. # [v6.1.0] 2023-07-13 -- 2.43.0 From c61b0f55a45bfc5ef4aadfdac1367dec9f1ced2d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 17:35:12 +0200 Subject: [PATCH 17/18] some tweaks --- mission/acs/str/StarTrackerHandler.cpp | 4 +--- mission/pollingSeqTables.cpp | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mission/acs/str/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp index 048c86af..ca11a11c 100644 --- a/mission/acs/str/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -660,7 +660,7 @@ void StarTrackerHandler::fillCommandAndReplyMap() { startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::LOGLEVEL, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); - this->insertInCommandAndReplyMap(startracker::SET_TIME_FROM_SYS_TIME, 3, nullptr, + this->insertInCommandAndReplyMap(startracker::SET_TIME_FROM_SYS_TIME, 2, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); this->insertInCommandAndReplyMap(startracker::LOGSUBSCRIPTION, 3, nullptr, startracker::MAX_FRAME_SIZE * 2 + 2); @@ -820,7 +820,6 @@ void StarTrackerHandler::bootFirmware(Mode_t toMode) { } else { setMode(toMode, startracker::SUBMODE_FIRMWARE); } - solutionSet.setReportingEnabled(true); sif::info << "STR: Firmware boot success" << std::endl; solutionSet.setReportingEnabled(true); internalState = InternalState::IDLE; @@ -878,7 +877,6 @@ ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t* start, size_t rema switch (startracker::getReplyFrameType(start)) { case TMTC_ACTIONREPLY: { *foundLen = remainingSize; - // arrayprinter::print(start, remainingSize); return scanForActionReply(startracker::getId(start), foundId); break; } diff --git a/mission/pollingSeqTables.cpp b/mission/pollingSeqTables.cpp index 758361e3..548f3773 100644 --- a/mission/pollingSeqTables.cpp +++ b/mission/pollingSeqTables.cpp @@ -341,8 +341,8 @@ ReturnValue_t pst::pstTcsAndAcs(FixedTimeslotTaskIF *thisSequence, AcsPstCfg cfg DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, DeviceHandlerIF::GET_READ); - thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, - DeviceHandlerIF::PERFORM_OPERATION); + //thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, -- 2.43.0 From 80155285c85073b32278f7a2bbe108b9277eec11 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 13 Jul 2023 17:37:13 +0200 Subject: [PATCH 18/18] remove an unnecessary tweak --- mission/pollingSeqTables.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/mission/pollingSeqTables.cpp b/mission/pollingSeqTables.cpp index 548f3773..e18046d5 100644 --- a/mission/pollingSeqTables.cpp +++ b/mission/pollingSeqTables.cpp @@ -341,8 +341,6 @@ ReturnValue_t pst::pstTcsAndAcs(FixedTimeslotTaskIF *thisSequence, AcsPstCfg cfg DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, DeviceHandlerIF::GET_READ); - //thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::STAR_TRACKER, length * config::spiSched::SCHED_BLOCK_2_PERIOD, -- 2.43.0