From 632759bf8a186507b103145dbf67e4bafbedee57 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Mon, 3 Jan 2022 08:01:55 +0100 Subject: [PATCH 001/309] improvements in ploc mpsoc handler --- bsp_q7s/core/ObjectFactory.cpp | 14 +- bsp_q7s/devices/CMakeLists.txt | 9 +- bsp_q7s/devices/ploc/CMakeLists.txt | 5 + .../devices/{ => ploc}/PlocMemoryDumper.cpp | 0 bsp_q7s/devices/{ => ploc}/PlocMemoryDumper.h | 0 .../{ => ploc}/PlocSupervisorHandler.cpp | 10 +- .../{ => ploc}/PlocSupervisorHandler.h | 25 +- bsp_q7s/devices/{ => ploc}/PlocUpdater.cpp | 0 bsp_q7s/devices/{ => ploc}/PlocUpdater.h | 2 +- .../pollingSequenceFactory.cpp | 2 +- mission/devices/PlocMPSoCHandler.cpp | 82 +++--- mission/devices/PlocMPSoCHandler.h | 34 ++- .../devicedefinitions/PlocMPSoCDefinitions.h | 278 +++++++++--------- 13 files changed, 243 insertions(+), 218 deletions(-) create mode 100644 bsp_q7s/devices/ploc/CMakeLists.txt rename bsp_q7s/devices/{ => ploc}/PlocMemoryDumper.cpp (100%) rename bsp_q7s/devices/{ => ploc}/PlocMemoryDumper.h (100%) rename bsp_q7s/devices/{ => ploc}/PlocSupervisorHandler.cpp (99%) rename bsp_q7s/devices/{ => ploc}/PlocSupervisorHandler.h (97%) rename bsp_q7s/devices/{ => ploc}/PlocUpdater.cpp (100%) rename bsp_q7s/devices/{ => ploc}/PlocUpdater.h (98%) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index fbe1bbfb..3273293f 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -16,9 +16,9 @@ #include "bsp_q7s/core/CoreController.h" #include "bsp_q7s/boardtest/Q7STestTask.h" #include "bsp_q7s/memory/FileSystemHandler.h" -#include "bsp_q7s/devices/PlocSupervisorHandler.h" -#include "bsp_q7s/devices/PlocUpdater.h" -#include "bsp_q7s/devices/PlocMemoryDumper.h" +#include "bsp_q7s/devices/ploc/PlocSupervisorHandler.h" +#include "bsp_q7s/devices/ploc/PlocUpdater.h" +#include "bsp_q7s/devices/ploc/PlocMemoryDumper.h" #include "bsp_q7s/devices/startracker/StarTrackerHandler.h" #include "bsp_q7s/callbacks/rwSpiCallback.h" #include "bsp_q7s/callbacks/gnssCallback.h" @@ -1079,11 +1079,11 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { #endif #if BOARD_TE0720 == 1 && OBSW_ADD_PLOC_MPSOC == 1 - UartCookie* plocUartCookie = new UartCookie(std::string("/dev/ttyPS1"), 115200, - PLOC_MPSOC::MAX_REPLY_SIZE); + UartCookie* plocUartCookie = new UartCookie(objects::PLOC_MPSOC_HANDLER, "/dev/ttyUL1", + UartModes::NON_CANONICAL, uart::PLOC_MPSOC_BAUD, PLOC_MPSOC::MAX_REPLY_SIZE); /* Testing PlocMPSoCHandler on TE0720-03-1CFA */ - PlocMPSoCHandler* mpsocPlocHandler = new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, - plocUartCookie); + PlocMPSoCHandler* mpsocPlocHandler = new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, + objects::UART_COM_IF, plocUartCookie); mpsocPlocHandler->setStartUpImmediately(); #endif diff --git a/bsp_q7s/devices/CMakeLists.txt b/bsp_q7s/devices/CMakeLists.txt index 70705e83..2a0597ea 100644 --- a/bsp_q7s/devices/CMakeLists.txt +++ b/bsp_q7s/devices/CMakeLists.txt @@ -1,7 +1,2 @@ -target_sources(${TARGET_NAME} PRIVATE - PlocSupervisorHandler.cpp - PlocUpdater.cpp - PlocMemoryDumper.cpp -) - -add_subdirectory(startracker) \ No newline at end of file +add_subdirectory(startracker) +add_subdirectory(ploc) \ No newline at end of file diff --git a/bsp_q7s/devices/ploc/CMakeLists.txt b/bsp_q7s/devices/ploc/CMakeLists.txt new file mode 100644 index 00000000..4da93545 --- /dev/null +++ b/bsp_q7s/devices/ploc/CMakeLists.txt @@ -0,0 +1,5 @@ +target_sources(${TARGET_NAME} PRIVATE + PlocSupervisorHandler.cpp + PlocUpdater.cpp + PlocMemoryDumper.cpp +) diff --git a/bsp_q7s/devices/PlocMemoryDumper.cpp b/bsp_q7s/devices/ploc/PlocMemoryDumper.cpp similarity index 100% rename from bsp_q7s/devices/PlocMemoryDumper.cpp rename to bsp_q7s/devices/ploc/PlocMemoryDumper.cpp diff --git a/bsp_q7s/devices/PlocMemoryDumper.h b/bsp_q7s/devices/ploc/PlocMemoryDumper.h similarity index 100% rename from bsp_q7s/devices/PlocMemoryDumper.h rename to bsp_q7s/devices/ploc/PlocMemoryDumper.h diff --git a/bsp_q7s/devices/PlocSupervisorHandler.cpp b/bsp_q7s/devices/ploc/PlocSupervisorHandler.cpp similarity index 99% rename from bsp_q7s/devices/PlocSupervisorHandler.cpp rename to bsp_q7s/devices/ploc/PlocSupervisorHandler.cpp index 30ea9572..6bb5008a 100644 --- a/bsp_q7s/devices/PlocSupervisorHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocSupervisorHandler.cpp @@ -2,10 +2,8 @@ #include #include #include - #include "PlocSupervisorHandler.h" #include "OBSWConfig.h" - #include #include #include @@ -31,13 +29,11 @@ ReturnValue_t PlocSupervisorHandler::initialize() { uartComIf = dynamic_cast(communicationInterface); if (uartComIf == nullptr) { sif::warning << "PlocSupervisorHandler::initialize: Invalid uart com if" << std::endl; - return INVALID_UART_COM_IF; + return ObjectManagerIF::CHILD_INIT_FAILED; } - #if BOARD_TE0720 == 0 sdcMan = SdCardManager::instance(); #endif /* BOARD_TE0720 == 0 */ - return result; } @@ -603,15 +599,11 @@ ReturnValue_t PlocSupervisorHandler::enableReplyInReplyMap(DeviceCommandMap::ite } ReturnValue_t PlocSupervisorHandler::verifyPacket(const uint8_t* start, size_t foundLen) { - uint16_t receivedCrc = *(start + foundLen - 2) << 8 | *(start + foundLen - 1); - uint16_t recalculatedCrc = CRC::crc16ccitt(start, foundLen - 2); - if (receivedCrc != recalculatedCrc) { return CRC_FAILURE; } - return RETURN_OK; } diff --git a/bsp_q7s/devices/PlocSupervisorHandler.h b/bsp_q7s/devices/ploc/PlocSupervisorHandler.h similarity index 97% rename from bsp_q7s/devices/PlocSupervisorHandler.h rename to bsp_q7s/devices/ploc/PlocSupervisorHandler.h index f22c86b1..b238d0e9 100644 --- a/bsp_q7s/devices/PlocSupervisorHandler.h +++ b/bsp_q7s/devices/ploc/PlocSupervisorHandler.h @@ -1,9 +1,8 @@ #ifndef MISSION_DEVICES_PLOCSUPERVISORHANDLER_H_ #define MISSION_DEVICES_PLOCSUPERVISORHANDLER_H_ -#include "devicedefinitions/PlocSupervisorDefinitions.h" +#include #include - #include #include @@ -62,28 +61,26 @@ private: static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3); //! [EXPORT] : [COMMENT] Failed to read current system time static const ReturnValue_t GET_TIME_FAILURE = MAKE_RETURN_CODE(0xA4); - //! [EXPORT] : [COMMENT] Invalid communication interface specified - static const ReturnValue_t INVALID_UART_COM_IF = MAKE_RETURN_CODE(0xA5); //! [EXPORT] : [COMMENT] Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT - static const ReturnValue_t INVALID_WATCHDOG = MAKE_RETURN_CODE(0xA6); + static const ReturnValue_t INVALID_WATCHDOG = MAKE_RETURN_CODE(0xA5); //! [EXPORT] : [COMMENT] Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms. - static const ReturnValue_t INVALID_WATCHDOG_TIMEOUT = MAKE_RETURN_CODE(0xA7); + static const ReturnValue_t INVALID_WATCHDOG_TIMEOUT = MAKE_RETURN_CODE(0xA6); //! [EXPORT] : [COMMENT] Received latchup config command with invalid latchup ID - static const ReturnValue_t INVALID_LATCHUP_ID = MAKE_RETURN_CODE(0xA8); + static const ReturnValue_t INVALID_LATCHUP_ID = MAKE_RETURN_CODE(0xA7); //! [EXPORT] : [COMMENT] Received set adc sweep period command with invalid sweep period. Must be larger than 21. - static const ReturnValue_t SWEEP_PERIOD_TOO_SMALL = MAKE_RETURN_CODE(0xA9); + static const ReturnValue_t SWEEP_PERIOD_TOO_SMALL = MAKE_RETURN_CODE(0xA8); //! [EXPORT] : [COMMENT] Receive auto EM test command with invalid test param. Valid params are 1 and 2. - static const ReturnValue_t INVALID_TEST_PARAM = MAKE_RETURN_CODE(0xAA); + static const ReturnValue_t INVALID_TEST_PARAM = MAKE_RETURN_CODE(0xA9); //! [EXPORT] : [COMMENT] Returned when scanning for MRAM dump packets failed. - static const ReturnValue_t MRAM_PACKET_PARSING_FAILURE = MAKE_RETURN_CODE(0xAB); + static const ReturnValue_t MRAM_PACKET_PARSING_FAILURE = MAKE_RETURN_CODE(0xAA); //! [EXPORT] : [COMMENT] Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address) - static const ReturnValue_t INVALID_MRAM_ADDRESSES = MAKE_RETURN_CODE(0xAC); + static const ReturnValue_t INVALID_MRAM_ADDRESSES = MAKE_RETURN_CODE(0xAB); //! [EXPORT] : [COMMENT] Expect reception of an MRAM dump packet but received space packet with other apid. - static const ReturnValue_t NO_MRAM_PACKET = MAKE_RETURN_CODE(0xAD); + static const ReturnValue_t NO_MRAM_PACKET = MAKE_RETURN_CODE(0xAC); //! [EXPORT] : [COMMENT] Path to PLOC directory on SD card does not exist - static const ReturnValue_t PATH_DOES_NOT_EXIST = MAKE_RETURN_CODE(0xAE); + static const ReturnValue_t PATH_DOES_NOT_EXIST = MAKE_RETURN_CODE(0xAD); //! [EXPORT] : [COMMENT] MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet. - static const ReturnValue_t MRAM_FILE_NOT_EXISTS = MAKE_RETURN_CODE(0xAF); + static const ReturnValue_t MRAM_FILE_NOT_EXISTS = MAKE_RETURN_CODE(0xAE); static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_SUPERVISOR_HANDLER; diff --git a/bsp_q7s/devices/PlocUpdater.cpp b/bsp_q7s/devices/ploc/PlocUpdater.cpp similarity index 100% rename from bsp_q7s/devices/PlocUpdater.cpp rename to bsp_q7s/devices/ploc/PlocUpdater.cpp diff --git a/bsp_q7s/devices/PlocUpdater.h b/bsp_q7s/devices/ploc/PlocUpdater.h similarity index 98% rename from bsp_q7s/devices/PlocUpdater.h rename to bsp_q7s/devices/ploc/PlocUpdater.h index d016b9e5..be559604 100644 --- a/bsp_q7s/devices/PlocUpdater.h +++ b/bsp_q7s/devices/ploc/PlocUpdater.h @@ -2,7 +2,7 @@ #define MISSION_DEVICES_PLOCUPDATER_H_ #include "OBSWConfig.h" -#include "devicedefinitions/PlocSupervisorDefinitions.h" +#include #include "fsfw/action/CommandActionHelper.h" #include "fsfw/action/ActionHelper.h" diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 07bc4a8f..8f3878e9 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -764,7 +764,7 @@ ReturnValue_t pst::pstTest(FixedTimeslotTaskIF* thisSequence) { ReturnValue_t pst::pollingSequenceTE0720(FixedTimeslotTaskIF *thisSequence) { uint32_t length = thisSequence->getPeriodMs(); -#if TEST_PLOC_MPSOC_HANDLER == 1 +#if OBSW_ADD_PLOC_MPSOC == 1 thisSequence->addSlot(objects::PLOC_MPSOC_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::PLOC_MPSOC_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::PLOC_MPSOC_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE); diff --git a/mission/devices/PlocMPSoCHandler.cpp b/mission/devices/PlocMPSoCHandler.cpp index dcc81ef7..f684e6f0 100644 --- a/mission/devices/PlocMPSoCHandler.cpp +++ b/mission/devices/PlocMPSoCHandler.cpp @@ -4,8 +4,9 @@ #include #include -PlocMPSoCHandler::PlocMPSoCHandler(object_id_t objectId, object_id_t comIF, CookieIF * comCookie) : - DeviceHandlerBase(objectId, comIF, comCookie) { +PlocMPSoCHandler::PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, + CookieIF * comCookie) : + DeviceHandlerBase(objectId, uartComIFid, comCookie) { if (comCookie == NULL) { sif::error << "PlocMPSoCHandler: Invalid com cookie" << std::endl; } @@ -14,11 +15,27 @@ PlocMPSoCHandler::PlocMPSoCHandler(object_id_t objectId, object_id_t comIF, Cook PlocMPSoCHandler::~PlocMPSoCHandler() { } +ReturnValue_t PlocMPSoCHandler::initialize() { + ReturnValue_t result = RETURN_OK; + result = DeviceHandlerBase::initialize(); + if (result != RETURN_OK) { + return result; + } + uartComIf = dynamic_cast(communicationInterface); + if (uartComIf == nullptr) { + sif::warning << "PlocMPSoCHandler::initialize: Invalid uart com if" << std::endl; + return ObjectManagerIF::CHILD_INIT_FAILED; + } + return result; +} + void PlocMPSoCHandler::doStartUp(){ - if(mode == _MODE_START_UP){ - setMode(MODE_ON); - } +#if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1 + setMode(MODE_NORMAL); +#else + setMode(_MODE_TO_ON); +#endif } void PlocMPSoCHandler::doShutDown(){ @@ -27,7 +44,7 @@ void PlocMPSoCHandler::doShutDown(){ ReturnValue_t PlocMPSoCHandler::buildNormalDeviceCommand( DeviceCommandId_t * id) { - return RETURN_OK; + return NOTHING_TO_SEND; } ReturnValue_t PlocMPSoCHandler::buildTransitionDeviceCommand( @@ -38,18 +55,30 @@ ReturnValue_t PlocMPSoCHandler::buildTransitionDeviceCommand( ReturnValue_t PlocMPSoCHandler::buildCommandFromCommand( DeviceCommandId_t deviceCommand, const uint8_t * commandData, size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; switch(deviceCommand) { case(PLOC_MPSOC::TC_MEM_WRITE): { - return prepareTcMemWriteCommand(commandData, commandDataLen); + result = prepareTcMemWriteCommand(commandData, commandDataLen); + break; } case(PLOC_MPSOC::TC_MEM_READ): { - return prepareTcMemReadCommand(commandData, commandDataLen); + result = prepareTcMemReadCommand(commandData, commandDataLen); + break; } default: sif::debug << "PlocMPSoCHandler::buildCommandFromCommand: Command not implemented" << std::endl; - return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; + result = DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; + break; } - return HasReturnvaluesIF::RETURN_FAILED; + + if (result == RETURN_OK) { + /** + * Flushing the receive buffer to make sure there are no data left from a faulty reply. + */ + uartComIf->flushUartRxBuffer(comCookie); + } + + return result; } void PlocMPSoCHandler::fillCommandAndReplyMap() { @@ -94,13 +123,7 @@ ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t *start, return INVALID_APID; } } - - /** - * This should normally never fail. However, this function is also responsible for incrementing - * the packet sequence count why it is called here. - */ result = checkPacketSequenceCount(start); - return result; } @@ -182,20 +205,15 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandD rawPacket = commandBuffer; rawPacketLen = tcMemRead.getFullSize(); nextReplyId = PLOC_MPSOC::ACK_REPORT; - return RETURN_OK; } ReturnValue_t PlocMPSoCHandler::verifyPacket(const uint8_t* start, size_t foundLen) { - uint16_t receivedCrc = *(start + foundLen - 2) << 8 | *(start + foundLen - 1); - uint16_t recalculatedCrc = CRC::crc16ccitt(start, foundLen - 2); - if (receivedCrc != recalculatedCrc) { return CRC_FAILURE; } - return RETURN_OK; } @@ -290,11 +308,8 @@ ReturnValue_t PlocMPSoCHandler::handleExecutionReport(const uint8_t* data) { } ReturnValue_t PlocMPSoCHandler::handleMemoryReadReport(const uint8_t* data) { - ReturnValue_t result = RETURN_OK; - result = verifyPacket(data, PLOC_MPSOC::SIZE_TM_MEM_READ_REPORT); - if(result == CRC_FAILURE) { sif::error << "PlocMPSoCHandler::handleMemoryReadReport: Memory read report has invalid crc" << std::endl; @@ -302,9 +317,7 @@ ReturnValue_t PlocMPSoCHandler::handleMemoryReadReport(const uint8_t* data) { /** Send data to commanding queue */ handleDeviceTM(data + PLOC_MPSOC::DATA_FIELD_OFFSET, PLOC_MPSOC::SIZE_MEM_READ_REPORT_DATA, PLOC_MPSOC::TM_MEMORY_READ_REPORT); - nextReplyId = PLOC_MPSOC::EXE_REPORT; - return result; } @@ -483,15 +496,14 @@ void PlocMPSoCHandler::disableExeReportReply() { } ReturnValue_t PlocMPSoCHandler::checkPacketSequenceCount(const uint8_t* data) { - uint16_t receivedSequenceCount = (*(data + 2) << 8 | *(data + 3)) & PACKET_SEQUENCE_COUNT_MASK; - uint16_t expectedPacketSequenceCount = ((packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK); - if (receivedSequenceCount != expectedPacketSequenceCount) { - sif::debug - << "PlocMPSoCHandler::checkPacketSequenceCount: Packet sequence count mismatch. " - << std::endl; - sif::debug << "Received sequence count: " << receivedSequenceCount << ". OBSW sequence " - << "count: " << expectedPacketSequenceCount << std::endl; + uint16_t receivedSeqCnt = (*(data + 2) << 8 | *(data + 3)) & PACKET_SEQUENCE_COUNT_MASK; + uint16_t expectedSeqCnt = ((packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK); + if (receivedSeqCnt != expectedSeqCnt) { + sif::warning << "PlocMPSoCHandler::checkPacketSequenceCount: Packet sequence count " + "mismatch. Received: " << receivedSeqCnt << ", Expected: " + << expectedSeqCnt << std::endl; + triggerEvent(SEQ_CNT_MISMATCH, expectedSeqCnt, receivedSeqCnt); } - packetSequenceCount = receivedSequenceCount; + packetSequenceCount = receivedSeqCnt; return RETURN_OK; } diff --git a/mission/devices/PlocMPSoCHandler.h b/mission/devices/PlocMPSoCHandler.h index 2b3f6a57..2773c6be 100644 --- a/mission/devices/PlocMPSoCHandler.h +++ b/mission/devices/PlocMPSoCHandler.h @@ -4,6 +4,7 @@ #include #include #include +#include /** * @brief This is the device handler for the MPSoC which is programmed by the ILH of the @@ -21,9 +22,10 @@ class PlocMPSoCHandler: public DeviceHandlerBase { public: - PlocMPSoCHandler(object_id_t objectId, object_id_t comIF, CookieIF * comCookie); + PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF * comCookie); virtual ~PlocMPSoCHandler(); + virtual ReturnValue_t initialize() override; /** * @brief Sets mode to MODE_NORMAL. Can be used for debugging. */ @@ -54,17 +56,29 @@ private: static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HANDLER; - static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0); //!> Space Packet received from PLOC has invalid CRC - static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1); //!> Received ACK failure reply from PLOC - static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2); //!> Received execution failure reply from PLOC - static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3); //!> Received space packet with invalid APID from PLOC + //! [EXPORT] : [COMMENT] Space Packet received from PLOC has invalid CRC + static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0); + //! [EXPORT] : [COMMENT] Received ACK failure reply from PLOC + static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1); + //! [EXPORT] : [COMMENT] Received execution failure reply from PLOC + static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2); + //! [EXPORT] : [COMMENT] Received space packet with invalid APID from PLOC + static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3); static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HANDLER; - static const Event MEMORY_READ_RPT_CRC_FAILURE = MAKE_EVENT(1, severity::LOW); //!> PLOC crc failure in telemetry packet - static const Event ACK_FAILURE = MAKE_EVENT(2, severity::LOW); //!> PLOC receive acknowledgment failure report - static const Event EXE_FAILURE = MAKE_EVENT(3, severity::LOW); //!> PLOC receive execution failure report - static const Event CRC_FAILURE_EVENT = MAKE_EVENT(4, severity::LOW); //!> PLOC reply has invalid crc + //! [EXPORT] : [COMMENT] PLOC crc failure in telemetry packet + static const Event MEMORY_READ_RPT_CRC_FAILURE = MAKE_EVENT(1, severity::LOW); + //! [EXPORT] : [COMMENT] PLOC receive acknowledgment failure report + static const Event ACK_FAILURE = MAKE_EVENT(2, severity::LOW); + //! [EXPORT] : [COMMENT] PLOC receive execution failure report + static const Event EXE_FAILURE = MAKE_EVENT(3, severity::LOW); + //! [EXPORT] : [COMMENT] PLOC reply has invalid crc + static const Event CRC_FAILURE_EVENT = MAKE_EVENT(4, severity::LOW); + //! [EXPORT] : [COMMENT] Packet sequence count in received space packet does not match expected count + //! P1: Expected sequence count + //! P2: Received sequence count + static const Event SEQ_CNT_MISMATCH = MAKE_EVENT(5, severity::LOW); static const uint16_t APID_MASK = 0x7FF; static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF; @@ -90,6 +104,8 @@ private: */ DeviceCommandId_t nextReplyId = PLOC_MPSOC::NONE; + UartComIF* uartComIf = nullptr; + /** * @brief This function fills the commandBuffer to initiate the write memory command. * diff --git a/mission/devices/devicedefinitions/PlocMPSoCDefinitions.h b/mission/devices/devicedefinitions/PlocMPSoCDefinitions.h index 2b9466ab..9910db8a 100644 --- a/mission/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/mission/devices/devicedefinitions/PlocMPSoCDefinitions.h @@ -7,166 +7,174 @@ namespace PLOC_MPSOC { - static const DeviceCommandId_t NONE = 0x0; - static const DeviceCommandId_t TC_MEM_WRITE = 0x1; - static const DeviceCommandId_t TC_MEM_READ = 0x2; - static const DeviceCommandId_t ACK_REPORT = 0x3; - static const DeviceCommandId_t EXE_REPORT = 0x5; - static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 0x6; +static const DeviceCommandId_t NONE = 0x0; +static const DeviceCommandId_t TC_MEM_WRITE = 0x1; +static const DeviceCommandId_t TC_MEM_READ = 0x2; +static const DeviceCommandId_t ACK_REPORT = 0x3; +static const DeviceCommandId_t EXE_REPORT = 0x5; +static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 0x6; - static const uint16_t SIZE_ACK_REPORT = 14; - static const uint16_t SIZE_EXE_REPORT = 14; - static const uint16_t SIZE_TM_MEM_READ_REPORT = 18; +static const uint16_t SIZE_ACK_REPORT = 14; +static const uint16_t SIZE_EXE_REPORT = 14; +static const uint16_t SIZE_TM_MEM_READ_REPORT = 18; + +/** + * SpacePacket apids of PLOC telecommands and telemetry. + */ +static const uint16_t APID_TC_MEM_WRITE = 0x714; +static const uint16_t APID_TC_MEM_READ = 0x715; +static const uint16_t APID_TM_MEMORY_READ_REPORT = 0x404; +static const uint16_t APID_ACK_SUCCESS = 0x400; +static const uint16_t APID_ACK_FAILURE = 0x401; +static const uint16_t APID_EXE_SUCCESS = 0x402; +static const uint16_t APID_EXE_FAILURE = 0x403; + +/** Offset from first byte in Space packet to first byte of data field */ +static const uint8_t DATA_FIELD_OFFSET = 6; + +/** + * The size of payload data which will be forwarded to the requesting object. e.g. PUS Service + * 8. + */ +static const uint8_t SIZE_MEM_READ_REPORT_DATA = 10; + +/** + * PLOC space packet length for fixed size packets. This is the size of the whole packet data + * field. For the length field in the space packet this size will be substracted by one. + */ +static const uint16_t LENGTH_TC_MEM_WRITE = 12; +static const uint16_t LENGTH_TC_MEM_READ = 8; + +static const size_t MAX_REPLY_SIZE = SIZE_TM_MEM_READ_REPORT; +static const size_t MAX_COMMAND_SIZE = 18; + +/** + * @brief This class helps to build the memory read command for the PLOC. + * + * @details The last two bytes of the packet data field contain a CRC calculated over the whole + * space packet. This is the CRC-16-CCITT as specified in + * ECSS-E-ST-70-41C Telemetry and telecommand packet utilization. + */ +class TcMemRead: public SpacePacket { +public: /** - * SpacePacket apids of PLOC telecommands and telemetry. - */ - static const uint16_t APID_TC_MEM_WRITE = 0x714; - static const uint16_t APID_TC_MEM_READ = 0x715; - static const uint16_t APID_TM_MEMORY_READ_REPORT = 0x404; - static const uint16_t APID_ACK_SUCCESS = 0x400; - static const uint16_t APID_ACK_FAILURE = 0x401; - static const uint16_t APID_EXE_SUCCESS = 0x402; - static const uint16_t APID_EXE_FAILURE = 0x403; - - /** Offset from first byte in Space packet to first byte of data field */ - static const uint8_t DATA_FIELD_OFFSET = 6; - - /** - * The size of payload data which will be forwarded to the requesting object. e.g. PUS Service - * 8. - */ - static const uint8_t SIZE_MEM_READ_REPORT_DATA = 10; - - /** - * PLOC space packet length for fixed size packets. This is the size of the whole packet data - * field. For the length field in the space packet this size will be substracted by one. - */ - static const uint16_t LENGTH_TC_MEM_WRITE = 12; - static const uint16_t LENGTH_TC_MEM_READ = 8; - - static const size_t MAX_REPLY_SIZE = SIZE_TM_MEM_READ_REPORT; - static const size_t MAX_COMMAND_SIZE = 18; - - /** - * @brief This class helps to build the memory read command for the PLOC. + * @brief Constructor * - * @details The last two bytes of the packet data field contain a CRC calculated over the whole - * space packet. This is the CRC-16-CCITT as specified in - * ECSS-E-ST-70-41C Telemetry and telecommand packet utilization. + * @param memAddr The memory address to read from. */ - class TcMemRead : public SpacePacket { - public: - - /** - * @brief Constructor - * - * @param memAddr The memory address to read from. - */ TcMemRead(const uint32_t memAddr, uint16_t sequenceCount) : SpacePacket(LENGTH_TC_MEM_READ - 1, true, APID_TC_MEM_READ, sequenceCount) { fillPacketDataField(&memAddr); } - private: +private: - /** - * @brief This function builds the packet data field for the mem read command. - * - * @param memAddrPtr Pointer to the memory address to read from. - */ - void fillPacketDataField(const uint32_t* memAddrPtr) { - /* Add memAddr to packet data field */ - size_t serializedSize = 0; - uint8_t* memoryAddressPos = this->localData.fields.buffer; - SerializeAdapter::serialize(memAddrPtr, &memoryAddressPos, &serializedSize, - sizeof(*memAddrPtr), SerializeIF::Endianness::LITTLE); - - /* Add memLen to packet data field */ - this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD] = 1; - this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD + 1] = 0; - - /* Calculate crc */ - uint16_t crc = CRC::crc16ccitt(this->localData.byteStream, - sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_READ - CRC_SIZE); - - /* Add crc to packet data field of space packet */ - serializedSize = 0; - uint8_t* crcPos = this->localData.fields.buffer + CRC_OFFSET; - SerializeAdapter::serialize(&crc, &crcPos, &serializedSize, - sizeof(crc), SerializeIF::Endianness::BIG); - } - - static const uint8_t OFFSET_MEM_LEN_FIELD = 4; - static const uint8_t CRC_OFFSET = 6; - - }; + static const uint8_t OFFSET_ADDRESS = 0; + static const uint8_t OFFSET_MEM_LEN_FIELD = 4; + static const uint8_t CRC_OFFSET = 6; + const uint16_t MEM_LEN = 1; /** - * @brief This class helps to generate the space packet to write to a memory address within - * the PLOC. - * @details The last two bytes of the packet data field contain a CRC calculated over the whole - * space packet. This is the CRC-16-CCITT as specified in - * ECSS-E-ST-70-41C Telemetry and telecommand packet utilization. + * @brief This function builds the packet data field for the mem read command. + * + * @param memAddr Pointer to the memory address to read from. */ - class TcMemWrite : public SpacePacket { - public: - /** - * @brief Constructor - * - * @param memAddr The PLOC memory address where to write to. - * @param memoryData The data to write to the specified memory address. - * @param sequenceCount The subsequence count. Must be incremented with each new packet. - */ - TcMemWrite(const uint32_t memAddr, const uint32_t memoryData, uint16_t sequenceCount) : - SpacePacket(LENGTH_TC_MEM_WRITE - 1, true, APID_TC_MEM_WRITE, sequenceCount) { - fillPacketDataField(&memAddr, &memoryData); + void fillPacketDataField(const uint32_t* memAddr) { + ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; + size_t serializedSize = 0; + result = SerializeAdapter::serialize(memAddr, + this->localData.fields.buffer + OFFSET_ADDRESS, &serializedSize, sizeof(*memAddr), + SerializeIF::Endianness::BIG); + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize address field" + << std::endl; } + result = SerializeAdapter::serialize(&MEM_LEN, + this->localData.fields.buffer + OFFSET_MEM_LEN_FIELD, &serializedSize, + sizeof(MEM_LEN), SerializeIF::Endianness::BIG); + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize mem len field" + << std::endl; + } + // Calculate crc + uint16_t crc = CRC::crc16ccitt(this->localData.byteStream, + sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_READ - CRC_SIZE); + // Add crc to packet data field of space packet */ + result = SerializeAdapter::serialize(&crc, + this->localData.fields.buffer + CRC_OFFSET, &serializedSize, sizeof(crc), + SerializeIF::Endianness::BIG); + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize crc field" + << std::endl; + } + } +}; - private: +/** + * @brief This class helps to generate the space packet to write to a memory address within + * the PLOC. + * @details The last two bytes of the packet data field contain a CRC calculated over the whole + * space packet. This is the CRC-16-CCITT as specified in + * ECSS-E-ST-70-41C Telemetry and telecommand packet utilization. + */ +class TcMemWrite: public SpacePacket { +public: + /** + * @brief Constructor + * + * @param memAddr The PLOC memory address where to write to. + * @param memoryData The data to write to the specified memory address. + * @param sequenceCount The subsequence count. Must be incremented with each new packet. + */ + TcMemWrite(const uint32_t memAddr, const uint32_t memoryData, uint16_t sequenceCount) : + SpacePacket(LENGTH_TC_MEM_WRITE - 1, true, APID_TC_MEM_WRITE, sequenceCount) { + fillPacketDataField(&memAddr, &memoryData); + } - /** - * @brief This function builds the packet data field for the mem write command. - * - * @param memAddrPtr Pointer to the PLOC memory address where to write to. - * @param memoryDataPtr Pointer to the memoryData to write - */ - void fillPacketDataField(const uint32_t* memAddrPtr, const uint32_t* memoryDataPtr) { +private: - /* Add memAddr to packet data field */ - size_t serializedSize = 0; - uint8_t* memoryAddressPos = this->localData.fields.buffer; - SerializeAdapter::serialize(memAddrPtr, &memoryAddressPos, &serializedSize, - sizeof(*memAddrPtr), SerializeIF::Endianness::BIG); + /** + * @brief This function builds the packet data field for the mem write command. + * + * @param memAddrPtr Pointer to the PLOC memory address where to write to. + * @param memoryDataPtr Pointer to the memoryData to write + */ + void fillPacketDataField(const uint32_t* memAddrPtr, const uint32_t* memoryDataPtr) { - /* Add memLen to packet data field */ - this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD] = 1; - this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD + 1] = 0; + /* Add memAddr to packet data field */ + size_t serializedSize = 0; + uint8_t* memoryAddressPos = this->localData.fields.buffer; + SerializeAdapter::serialize(memAddrPtr, &memoryAddressPos, &serializedSize, + sizeof(*memAddrPtr), SerializeIF::Endianness::BIG); - /* Add memData to packet data field */ - serializedSize = 0; - uint8_t* memoryDataPos = this->localData.fields.buffer + OFFSET_MEM_DATA_FIELD; - SerializeAdapter::serialize(memoryDataPtr, &memoryDataPos, &serializedSize, + /* Add memLen to packet data field */ + this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD] = 1; + this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD + 1] = 0; + + /* Add memData to packet data field */ + serializedSize = 0; + uint8_t* memoryDataPos = this->localData.fields.buffer + OFFSET_MEM_DATA_FIELD; + SerializeAdapter::serialize(memoryDataPtr, &memoryDataPos, &serializedSize, sizeof(*memoryDataPtr), SerializeIF::Endianness::BIG); - /* Calculate crc */ - uint16_t crc = CRC::crc16ccitt(this->localData.byteStream, - sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_WRITE - CRC_SIZE); + /* Calculate crc */ + uint16_t crc = CRC::crc16ccitt(this->localData.byteStream, + sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_WRITE - CRC_SIZE); - serializedSize = 0; - uint8_t* crcPos = this->localData.fields.buffer + CRC_OFFSET; - /* Add crc to packet data field of space packet */ - SerializeAdapter::serialize(&crc, &crcPos, &serializedSize, - sizeof(crc), SerializeIF::Endianness::BIG); - } + serializedSize = 0; + uint8_t* crcPos = this->localData.fields.buffer + CRC_OFFSET; + /* Add crc to packet data field of space packet */ + SerializeAdapter::serialize(&crc, &crcPos, &serializedSize, sizeof(crc), + SerializeIF::Endianness::BIG); + } - /** Offsets from base address of packet data field */ - static const uint8_t OFFSET_MEM_LEN_FIELD = 4; - static const uint8_t OFFSET_MEM_DATA_FIELD = 6; - static const uint8_t CRC_OFFSET = 10; - }; + /** Offsets from base address of packet data field */ + static const uint8_t OFFSET_MEM_LEN_FIELD = 4; + static const uint8_t OFFSET_MEM_DATA_FIELD = 6; + static const uint8_t CRC_OFFSET = 10; +}; } - #endif /* MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_ */ From 305e63cf4e5c68d4e445a47442489cb08d254098 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Wed, 5 Jan 2022 11:26:01 +0100 Subject: [PATCH 002/309] mpsoc flash fopen command --- bsp_q7s/core/ObjectFactory.cpp | 8 +- .../devicedefinitions/PlocMPSoCDefinitions.h | 172 +++++++++++++++--- bsp_q7s/devices/ploc/CMakeLists.txt | 1 + .../devices/ploc}/PlocMPSoCHandler.cpp | 168 ++++++++++------- .../devices/ploc}/PlocMPSoCHandler.h | 55 +++--- common/config/commonClassIds.h | 1 + mission/devices/CMakeLists.txt | 1 - 7 files changed, 278 insertions(+), 128 deletions(-) rename {mission => bsp_q7s}/devices/devicedefinitions/PlocMPSoCDefinitions.h (55%) rename {mission/devices => bsp_q7s/devices/ploc}/PlocMPSoCHandler.cpp (76%) rename {mission/devices => bsp_q7s/devices/ploc}/PlocMPSoCHandler.h (90%) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 71857207..3db0d607 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -1,6 +1,7 @@ #include #include "ObjectFactory.h" +#include "bsp_q7s/devices/ploc/PlocMPSoCHandler.h" #include "bsp_q7s/devices/startracker/StrHelper.h" #include "bsp_q7s/devices/startracker/StarTrackerDefinitions.h" #include "OBSWConfig.h" @@ -41,12 +42,11 @@ #include "mission/devices/GyroADIS1650XHandler.h" #include "mission/devices/IMTQHandler.h" #include "mission/devices/SyrlinksHkHandler.h" -#include "mission/devices/PlocMPSoCHandler.h" #include "mission/devices/RadiationSensorHandler.h" #include "mission/devices/RwHandler.h" #include "mission/devices/devicedefinitions/GomspaceDefinitions.h" #include "mission/devices/devicedefinitions/SyrlinksDefinitions.h" -#include "mission/devices/devicedefinitions/PlocMPSoCDefinitions.h" +#include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" #include "mission/devices/devicedefinitions/RadSensorDefinitions.h" #include "mission/devices/devicedefinitions/Max31865Definitions.h" #include "mission/devices/devicedefinitions/RwDefinitions.h" @@ -154,7 +154,7 @@ void ObjectFactory::produce(void* args) { #if OBSW_ADD_PLOC_MPSOC == 1 UartCookie* plocMpsocCookie = new UartCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV, UartModes::NON_CANONICAL, uart::PLOC_MPSOC_BAUD, - PLOC_MPSOC::MAX_REPLY_SIZE); + mpsoc::MAX_REPLY_SIZE); new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, plocMpsocCookie); #endif /* OBSW_ADD_PLOC_MPSOC == 1 */ @@ -1075,7 +1075,7 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { #if BOARD_TE0720 == 1 && OBSW_ADD_PLOC_MPSOC == 1 UartCookie* plocUartCookie = new UartCookie(objects::PLOC_MPSOC_HANDLER, "/dev/ttyUL1", - UartModes::NON_CANONICAL, uart::PLOC_MPSOC_BAUD, PLOC_MPSOC::MAX_REPLY_SIZE); + UartModes::NON_CANONICAL, uart::PLOC_MPSOC_BAUD, mpsoc::MAX_REPLY_SIZE); /* Testing PlocMPSoCHandler on TE0720-03-1CFA */ PlocMPSoCHandler* mpsocPlocHandler = new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, plocUartCookie); diff --git a/mission/devices/devicedefinitions/PlocMPSoCDefinitions.h b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h similarity index 55% rename from mission/devices/devicedefinitions/PlocMPSoCDefinitions.h rename to bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h index 9910db8a..e28236e9 100644 --- a/mission/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h @@ -4,15 +4,17 @@ #include #include #include +#include -namespace PLOC_MPSOC { +namespace mpsoc { -static const DeviceCommandId_t NONE = 0x0; -static const DeviceCommandId_t TC_MEM_WRITE = 0x1; -static const DeviceCommandId_t TC_MEM_READ = 0x2; -static const DeviceCommandId_t ACK_REPORT = 0x3; -static const DeviceCommandId_t EXE_REPORT = 0x5; -static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 0x6; +static const DeviceCommandId_t NONE = 0; +static const DeviceCommandId_t TC_MEM_WRITE = 1; +static const DeviceCommandId_t TC_MEM_READ = 2; +static const DeviceCommandId_t ACK_REPORT = 3; +static const DeviceCommandId_t EXE_REPORT = 5; +static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 6; +static const DeviceCommandId_t TC_FLASHFOPEN = 7; static const uint16_t SIZE_ACK_REPORT = 14; static const uint16_t SIZE_EXE_REPORT = 14; @@ -21,15 +23,18 @@ static const uint16_t SIZE_TM_MEM_READ_REPORT = 18; /** * SpacePacket apids of PLOC telecommands and telemetry. */ -static const uint16_t APID_TC_MEM_WRITE = 0x714; -static const uint16_t APID_TC_MEM_READ = 0x715; -static const uint16_t APID_TM_MEMORY_READ_REPORT = 0x404; -static const uint16_t APID_ACK_SUCCESS = 0x400; -static const uint16_t APID_ACK_FAILURE = 0x401; -static const uint16_t APID_EXE_SUCCESS = 0x402; -static const uint16_t APID_EXE_FAILURE = 0x403; +namespace apid { + static const uint16_t TC_MEM_WRITE = 0x114; + static const uint16_t TC_MEM_READ = 0x115; + static const uint16_t TC_FLASHFOPEN = 0x119; + static const uint16_t TM_MEMORY_READ_REPORT = 0x404; + static const uint16_t ACK_SUCCESS = 0x400; + static const uint16_t ACK_FAILURE = 0x401; + static const uint16_t EXE_SUCCESS = 0x402; + static const uint16_t EXE_FAILURE = 0x403; +} -/** Offset from first byte in Space packet to first byte of data field */ +/** Offset from first byte in space packet to first byte of data field */ static const uint8_t DATA_FIELD_OFFSET = 6; /** @@ -38,6 +43,8 @@ static const uint8_t DATA_FIELD_OFFSET = 6; */ static const uint8_t SIZE_MEM_READ_REPORT_DATA = 10; +static const size_t MAX_FILENAME_SIZE = 256; + /** * PLOC space packet length for fixed size packets. This is the size of the whole packet data * field. For the length field in the space packet this size will be substracted by one. @@ -48,6 +55,79 @@ static const uint16_t LENGTH_TC_MEM_READ = 8; static const size_t MAX_REPLY_SIZE = SIZE_TM_MEM_READ_REPORT; static const size_t MAX_COMMAND_SIZE = 18; +/** + * @breif Abstract base class for TC space packet of MPSoC. + */ +class TcBase : public SpacePacket, public HasReturnvaluesIF { +public: + + // Initial length field of space packet. Will always be updated when packet is created. + static const uint16_t INIT_LENGTH = 1; + + static const uint8_t INTERFACE_ID = CLASS_ID::MPSOC_CMD; + + //! [EXPORT] : [COMMENT] Received command with invalid length + static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xA0); + + /** + * @brief Constructor + * + * @param sequenceCount Sequence count of space packet which will be incremented with each + * sent and received packet.s + */ + TcBase(uint16_t apid, uint16_t sequenceCount) : + SpacePacket(INIT_LENGTH, true, apid, sequenceCount) { + } + + /** + * @brief Function to initialitze the space packet + * + * @param commandData Pointer to command specific data + * @param commandDataLen Length of command data + * + * @return RETURN_OK if packet creation was successful, otherwise error return value + */ + ReturnValue_t createPacket(const uint8_t* commandData, size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; + result = initPacket(commandData, commandDataLen); + if (result != RETURN_OK) { + return result; + } + result = addCrc(); + if (result != RETURN_OK) { + return result; + } + return result; + } + +protected: + /** + * @brief Must be overwritten by the child class to define the command specific parameters + * + * @param commandData Pointer to received command data + * @param commandDataLen Length of received command data + */ + virtual ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) = 0; + +private: + /** + * @brief Calculates and adds the CRC + */ + ReturnValue_t addCrc() { + ReturnValue_t result = RETURN_OK; + size_t serializedSize = 0; + uint32_t full_size = getFullSize(); + uint16_t crc = CRC::crc16ccitt(getWholeData(), full_size - CRC_SIZE); + result = SerializeAdapter::serialize(&crc, + this->localData.byteStream + full_size - CRC_SIZE, &serializedSize, sizeof(crc), + SerializeIF::Endianness::BIG); + if (result != RETURN_OK) { + sif::debug << "TcBase::addCrc: Failed to serialize crc field" << std::endl; + } + return result; + } +}; + /** * @brief This class helps to build the memory read command for the PLOC. * @@ -64,7 +144,7 @@ public: * @param memAddr The memory address to read from. */ TcMemRead(const uint32_t memAddr, uint16_t sequenceCount) : - SpacePacket(LENGTH_TC_MEM_READ - 1, true, APID_TC_MEM_READ, sequenceCount) { + SpacePacket(LENGTH_TC_MEM_READ - 1, true, apid::TC_MEM_READ, sequenceCount) { fillPacketDataField(&memAddr); } @@ -128,12 +208,17 @@ public: * @param sequenceCount The subsequence count. Must be incremented with each new packet. */ TcMemWrite(const uint32_t memAddr, const uint32_t memoryData, uint16_t sequenceCount) : - SpacePacket(LENGTH_TC_MEM_WRITE - 1, true, APID_TC_MEM_WRITE, sequenceCount) { + SpacePacket(LENGTH_TC_MEM_WRITE - 1, true, apid::TC_MEM_WRITE, sequenceCount) { fillPacketDataField(&memAddr, &memoryData); } private: + /** Offsets from base address of packet data field */ + static const uint8_t OFFSET_MEM_LEN_FIELD = 4; + static const uint8_t OFFSET_MEM_DATA_FIELD = 6; + static const uint8_t CRC_OFFSET = 10; + /** * @brief This function builds the packet data field for the mem write command. * @@ -168,11 +253,56 @@ private: SerializeAdapter::serialize(&crc, &crcPos, &serializedSize, sizeof(crc), SerializeIF::Endianness::BIG); } +}; - /** Offsets from base address of packet data field */ - static const uint8_t OFFSET_MEM_LEN_FIELD = 4; - static const uint8_t OFFSET_MEM_DATA_FIELD = 6; - static const uint8_t CRC_OFFSET = 10; +/** + * @brief Class to generate the flash file open command + */ +class FlashFopen : public TcBase { +public: + /** + * @brief Constructor + * + * @param sequenceCount Packet sequence count which is incremented with each sent and received + * packet. + */ + FlashFopen(uint16_t sequenceCount) : + TcBase(apid::TC_FLASHFOPEN, sequenceCount) { + } + +protected: + + ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; + result = lengthCheck(commandDataLen); + if (result != RETURN_OK) { + return result; + } + filename = std::string(reinterpret_cast(commandData), commandDataLen - 1); + accessMode = *(commandData + commandDataLen); + truePacketLen = filename.size() + sizeof(accessMode) + CRC_SIZE; + this->setPacketDataLength(truePacketLen - 1); + std::memcpy(this->getPacketData(), filename.c_str(), + truePacketLen - CRC_SIZE - sizeof(accessMode)); + std::memcpy(this->getPacketData() + truePacketLen - CRC_SIZE, &accessMode, + sizeof(accessMode)); + return RETURN_OK; + } + +private: + uint8_t accessMode = 0; + std::string filename; + uint16_t truePacketLen = 0; + + /** + * @brief Check length of received command + */ + ReturnValue_t lengthCheck(size_t commandDataLen) { + if (commandDataLen > MAX_FILENAME_SIZE + sizeof(accessMode)) { + return INVALID_LENGTH; + } + return RETURN_OK; + } }; } diff --git a/bsp_q7s/devices/ploc/CMakeLists.txt b/bsp_q7s/devices/ploc/CMakeLists.txt index 4da93545..ab8edb36 100644 --- a/bsp_q7s/devices/ploc/CMakeLists.txt +++ b/bsp_q7s/devices/ploc/CMakeLists.txt @@ -2,4 +2,5 @@ target_sources(${TARGET_NAME} PRIVATE PlocSupervisorHandler.cpp PlocUpdater.cpp PlocMemoryDumper.cpp + PlocMPSoCHandler.cpp ) diff --git a/mission/devices/PlocMPSoCHandler.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp similarity index 76% rename from mission/devices/PlocMPSoCHandler.cpp rename to bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp index f684e6f0..09c203f3 100644 --- a/mission/devices/PlocMPSoCHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp @@ -1,4 +1,5 @@ -#include "PlocMPSoCHandler.h" +#include "../../bsp_q7s/devices/ploc/PlocMPSoCHandler.h" + #include "OBSWConfig.h" #include @@ -57,14 +58,18 @@ ReturnValue_t PlocMPSoCHandler::buildCommandFromCommand( size_t commandDataLen) { ReturnValue_t result = RETURN_OK; switch(deviceCommand) { - case(PLOC_MPSOC::TC_MEM_WRITE): { + case(mpsoc::TC_MEM_WRITE): { result = prepareTcMemWriteCommand(commandData, commandDataLen); break; } - case(PLOC_MPSOC::TC_MEM_READ): { + case(mpsoc::TC_MEM_READ): { result = prepareTcMemReadCommand(commandData, commandDataLen); break; } + case(mpsoc::TC_FLASHFOPEN): { + result = prepareFlashFopenCmd(commandData, commandDataLen); + break; + } default: sif::debug << "PlocMPSoCHandler::buildCommandFromCommand: Command not implemented" << std::endl; result = DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; @@ -82,11 +87,12 @@ ReturnValue_t PlocMPSoCHandler::buildCommandFromCommand( } void PlocMPSoCHandler::fillCommandAndReplyMap() { - this->insertInCommandMap(PLOC_MPSOC::TC_MEM_WRITE); - this->insertInCommandMap(PLOC_MPSOC::TC_MEM_READ); - this->insertInReplyMap(PLOC_MPSOC::ACK_REPORT, 1, nullptr, PLOC_MPSOC::SIZE_ACK_REPORT); - this->insertInReplyMap(PLOC_MPSOC::EXE_REPORT, 3, nullptr, PLOC_MPSOC::SIZE_EXE_REPORT); - this->insertInReplyMap(PLOC_MPSOC::TM_MEMORY_READ_REPORT, 2, nullptr, PLOC_MPSOC::SIZE_TM_MEM_READ_REPORT); + this->insertInCommandMap(mpsoc::TC_MEM_WRITE); + this->insertInCommandMap(mpsoc::TC_MEM_READ); + this->insertInCommandMap(mpsoc::TC_FLASHFOPEN); + this->insertInReplyMap(mpsoc::ACK_REPORT, 1, nullptr, mpsoc::SIZE_ACK_REPORT); + this->insertInReplyMap(mpsoc::EXE_REPORT, 3, nullptr, mpsoc::SIZE_EXE_REPORT); + this->insertInReplyMap(mpsoc::TM_MEMORY_READ_REPORT, 2, nullptr, mpsoc::SIZE_TM_MEM_READ_REPORT); } ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t *start, @@ -97,25 +103,25 @@ ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t *start, uint16_t apid = (*(start) << 8 | *(start + 1)) & APID_MASK; switch(apid) { - case(PLOC_MPSOC::APID_ACK_SUCCESS): - *foundLen = PLOC_MPSOC::SIZE_ACK_REPORT; - *foundId = PLOC_MPSOC::ACK_REPORT; + case(mpsoc::apid::ACK_SUCCESS): + *foundLen = mpsoc::SIZE_ACK_REPORT; + *foundId = mpsoc::ACK_REPORT; break; - case(PLOC_MPSOC::APID_ACK_FAILURE): - *foundLen = PLOC_MPSOC::SIZE_ACK_REPORT; - *foundId = PLOC_MPSOC::ACK_REPORT; + case(mpsoc::apid::ACK_FAILURE): + *foundLen = mpsoc::SIZE_ACK_REPORT; + *foundId = mpsoc::ACK_REPORT; break; - case(PLOC_MPSOC::APID_TM_MEMORY_READ_REPORT): - *foundLen = PLOC_MPSOC::SIZE_TM_MEM_READ_REPORT; - *foundId = PLOC_MPSOC::TM_MEMORY_READ_REPORT; + case(mpsoc::apid::TM_MEMORY_READ_REPORT): + *foundLen = mpsoc::SIZE_TM_MEM_READ_REPORT; + *foundId = mpsoc::TM_MEMORY_READ_REPORT; break; - case(PLOC_MPSOC::APID_EXE_SUCCESS): - *foundLen = PLOC_MPSOC::SIZE_EXE_REPORT; - *foundId = PLOC_MPSOC::EXE_REPORT; + case(mpsoc::apid::EXE_SUCCESS): + *foundLen = mpsoc::SIZE_EXE_REPORT; + *foundId = mpsoc::EXE_REPORT; break; - case(PLOC_MPSOC::APID_EXE_FAILURE): - *foundLen = PLOC_MPSOC::SIZE_EXE_REPORT; - *foundId = PLOC_MPSOC::EXE_REPORT; + case(mpsoc::apid::EXE_FAILURE): + *foundLen = mpsoc::SIZE_EXE_REPORT; + *foundId = mpsoc::EXE_REPORT; break; default: { sif::debug << "PlocMPSoCHandler::scanForReply: Reply has invalid apid" << std::endl; @@ -133,15 +139,15 @@ ReturnValue_t PlocMPSoCHandler::interpretDeviceReply(DeviceCommandId_t id, ReturnValue_t result = RETURN_OK; switch (id) { - case PLOC_MPSOC::ACK_REPORT: { + case mpsoc::ACK_REPORT: { result = handleAckReport(packet); break; } - case (PLOC_MPSOC::TM_MEMORY_READ_REPORT): { + case (mpsoc::TM_MEMORY_READ_REPORT): { result = handleMemoryReadReport(packet); break; } - case (PLOC_MPSOC::EXE_REPORT): { + case (mpsoc::EXE_REPORT): { result = handleExecutionReport(packet); break; } @@ -179,15 +185,15 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemWriteCommand(const uint8_t * command const uint32_t memoryData = *(commandData + 4) << 24 | *(commandData + 5) << 16 | *(commandData + 6) << 8 | *(commandData + 7); packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - PLOC_MPSOC::TcMemWrite tcMemWrite(memoryAddress, memoryData, packetSequenceCount); - if (tcMemWrite.getFullSize() > PLOC_MPSOC::MAX_COMMAND_SIZE) { + mpsoc::TcMemWrite tcMemWrite(memoryAddress, memoryData, packetSequenceCount); + if (tcMemWrite.getFullSize() > mpsoc::MAX_COMMAND_SIZE) { sif::debug << "PlocMPSoCHandler::prepareTcMemWriteCommand: Command too big" << std::endl; return RETURN_FAILED; } memcpy(commandBuffer, tcMemWrite.getWholeData(), tcMemWrite.getFullSize()); rawPacket = commandBuffer; rawPacketLen = tcMemWrite.getFullSize(); - nextReplyId = PLOC_MPSOC::ACK_REPORT; + nextReplyId = mpsoc::ACK_REPORT; return RETURN_OK; } @@ -196,18 +202,41 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandD const uint32_t memoryAddress = *(commandData) << 24 | *(commandData + 1) << 16 | *(commandData + 2) << 8 | *(commandData + 3); packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - PLOC_MPSOC::TcMemRead tcMemRead(memoryAddress, packetSequenceCount); - if (tcMemRead.getFullSize() > PLOC_MPSOC::MAX_COMMAND_SIZE) { + mpsoc::TcMemRead tcMemRead(memoryAddress, packetSequenceCount); + if (tcMemRead.getFullSize() > mpsoc::MAX_COMMAND_SIZE) { sif::debug << "PlocMPSoCHandler::prepareTcMemReadCommand: Command too big" << std::endl; return RETURN_FAILED; } memcpy(commandBuffer, tcMemRead.getWholeData(), tcMemRead.getFullSize()); rawPacket = commandBuffer; rawPacketLen = tcMemRead.getFullSize(); - nextReplyId = PLOC_MPSOC::ACK_REPORT; + nextReplyId = mpsoc::ACK_REPORT; return RETURN_OK; } +ReturnValue_t PlocMPSoCHandler::prepareFlashFopenCmd(const uint8_t * commandData, + size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; + packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; + mpsoc::FlashFopen flashFopen(packetSequenceCount); + result = flashFopen.createPacket(commandData, commandDataLen); + if (result != RETURN_OK) { + return result; + } + copyToCommandBuffer(&flashFopen); + return RETURN_OK; +} + +void PlocMPSoCHandler::copyToCommandBuffer(mpsoc::TcBase* tc) { + if (tc == nullptr) { + sif::debug << "PlocMPSoCHandler::copyToCommandBuffer: Invalid TC" << std::endl; + } + memcpy(commandBuffer, tc->getWholeData(), tc->getFullSize()); + rawPacket = commandBuffer; + rawPacketLen = tc->getFullSize(); + nextReplyId = mpsoc::ACK_REPORT; +} + ReturnValue_t PlocMPSoCHandler::verifyPacket(const uint8_t* start, size_t foundLen) { uint16_t receivedCrc = *(start + foundLen - 2) << 8 | *(start + foundLen - 1); uint16_t recalculatedCrc = CRC::crc16ccitt(start, foundLen - 2); @@ -221,13 +250,13 @@ ReturnValue_t PlocMPSoCHandler::handleAckReport(const uint8_t* data) { ReturnValue_t result = RETURN_OK; - result = verifyPacket(data, PLOC_MPSOC::SIZE_ACK_REPORT); + result = verifyPacket(data, mpsoc::SIZE_ACK_REPORT); if(result == CRC_FAILURE) { sif::error << "PlocMPSoCHandler::handleAckReport: CRC failure" << std::endl; - nextReplyId = PLOC_MPSOC::NONE; - replyRawReplyIfnotWiretapped(data, PLOC_MPSOC::SIZE_ACK_REPORT); + nextReplyId = mpsoc::NONE; + replyRawReplyIfnotWiretapped(data, mpsoc::SIZE_ACK_REPORT); triggerEvent(CRC_FAILURE_EVENT); - sendFailureReport(PLOC_MPSOC::ACK_REPORT, CRC_FAILURE); + sendFailureReport(mpsoc::ACK_REPORT, CRC_FAILURE); disableAllReplies(); return IGNORE_REPLY_DATA; } @@ -235,20 +264,20 @@ ReturnValue_t PlocMPSoCHandler::handleAckReport(const uint8_t* data) { uint16_t apid = (*(data) << 8 | *(data + 1)) & APID_MASK; switch(apid) { - case PLOC_MPSOC::APID_ACK_FAILURE: { + case mpsoc::apid::ACK_FAILURE: { //TODO: Interpretation of status field in acknowledgment report sif::debug << "PlocMPSoCHandler::handleAckReport: Received Ack failure report" << std::endl; DeviceCommandId_t commandId = getPendingCommand(); if (commandId != DeviceHandlerIF::NO_COMMAND_ID) { triggerEvent(ACK_FAILURE, commandId); } - sendFailureReport(PLOC_MPSOC::ACK_REPORT, RECEIVED_ACK_FAILURE); + sendFailureReport(mpsoc::ACK_REPORT, RECEIVED_ACK_FAILURE); disableAllReplies(); - nextReplyId = PLOC_MPSOC::NONE; + nextReplyId = mpsoc::NONE; result = IGNORE_REPLY_DATA; break; } - case PLOC_MPSOC::APID_ACK_SUCCESS: { + case mpsoc::apid::ACK_SUCCESS: { setNextReplyId(); break; } @@ -263,23 +292,22 @@ ReturnValue_t PlocMPSoCHandler::handleAckReport(const uint8_t* data) { } ReturnValue_t PlocMPSoCHandler::handleExecutionReport(const uint8_t* data) { - ReturnValue_t result = RETURN_OK; - result = verifyPacket(data, PLOC_MPSOC::SIZE_EXE_REPORT); + result = verifyPacket(data, mpsoc::SIZE_EXE_REPORT); if(result == CRC_FAILURE) { sif::error << "PlocMPSoCHandler::handleExecutionReport: CRC failure" << std::endl; - nextReplyId = PLOC_MPSOC::NONE; + nextReplyId = mpsoc::NONE; return result; } uint16_t apid = (*(data) << 8 | *(data + 1)) & APID_MASK; switch (apid) { - case (PLOC_MPSOC::APID_EXE_SUCCESS): { + case (mpsoc::apid::EXE_SUCCESS): { break; } - case (PLOC_MPSOC::APID_EXE_FAILURE): { + case (mpsoc::apid::EXE_FAILURE): { //TODO: Interpretation of status field in execution report sif::error << "PlocMPSoCHandler::handleExecutionReport: Received execution failure report" << std::endl; @@ -290,7 +318,7 @@ ReturnValue_t PlocMPSoCHandler::handleExecutionReport(const uint8_t* data) { else { sif::debug << "PlocMPSoCHandler::handleExecutionReport: Unknown command id" << std::endl; } - sendFailureReport(PLOC_MPSOC::EXE_REPORT, RECEIVED_EXE_FAILURE); + sendFailureReport(mpsoc::EXE_REPORT, RECEIVED_EXE_FAILURE); disableExeReportReply(); result = IGNORE_REPLY_DATA; break; @@ -301,23 +329,21 @@ ReturnValue_t PlocMPSoCHandler::handleExecutionReport(const uint8_t* data) { break; } } - - nextReplyId = PLOC_MPSOC::NONE; - + nextReplyId = mpsoc::NONE; return result; } ReturnValue_t PlocMPSoCHandler::handleMemoryReadReport(const uint8_t* data) { ReturnValue_t result = RETURN_OK; - result = verifyPacket(data, PLOC_MPSOC::SIZE_TM_MEM_READ_REPORT); + result = verifyPacket(data, mpsoc::SIZE_TM_MEM_READ_REPORT); if(result == CRC_FAILURE) { sif::error << "PlocMPSoCHandler::handleMemoryReadReport: Memory read report has invalid crc" << std::endl; } /** Send data to commanding queue */ - handleDeviceTM(data + PLOC_MPSOC::DATA_FIELD_OFFSET, PLOC_MPSOC::SIZE_MEM_READ_REPORT_DATA, - PLOC_MPSOC::TM_MEMORY_READ_REPORT); - nextReplyId = PLOC_MPSOC::EXE_REPORT; + handleDeviceTM(data + mpsoc::DATA_FIELD_OFFSET, mpsoc::SIZE_MEM_READ_REPORT_DATA, + mpsoc::TM_MEMORY_READ_REPORT); + nextReplyId = mpsoc::EXE_REPORT; return result; } @@ -330,16 +356,17 @@ ReturnValue_t PlocMPSoCHandler::enableReplyInReplyMap(DeviceCommandMap::iterator uint8_t enabledReplies = 0; switch (command->first) { - case PLOC_MPSOC::TC_MEM_WRITE: + case mpsoc::TC_MEM_WRITE: + case mpsoc::TC_FLASHFOPEN: enabledReplies = 2; break; - case PLOC_MPSOC::TC_MEM_READ: { + case mpsoc::TC_MEM_READ: { enabledReplies = 3; result = DeviceHandlerBase::enableReplyInReplyMap(command, enabledReplies, true, - PLOC_MPSOC::TM_MEMORY_READ_REPORT); + mpsoc::TM_MEMORY_READ_REPORT); if (result != RETURN_OK) { sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id " - << PLOC_MPSOC::TM_MEMORY_READ_REPORT << " not in replyMap" << std::endl; + << mpsoc::TM_MEMORY_READ_REPORT << " not in replyMap" << std::endl; } break; } @@ -353,16 +380,16 @@ ReturnValue_t PlocMPSoCHandler::enableReplyInReplyMap(DeviceCommandMap::iterator * replies will be enabled here. */ result = DeviceHandlerBase::enableReplyInReplyMap(command, - enabledReplies, true, PLOC_MPSOC::ACK_REPORT); + enabledReplies, true, mpsoc::ACK_REPORT); if (result != RETURN_OK) { - sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id " << PLOC_MPSOC::ACK_REPORT + sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id " << mpsoc::ACK_REPORT << " not in replyMap" << std::endl; } result = DeviceHandlerBase::enableReplyInReplyMap(command, - enabledReplies, true, PLOC_MPSOC::EXE_REPORT); + enabledReplies, true, mpsoc::EXE_REPORT); if (result != RETURN_OK) { - sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id " << PLOC_MPSOC::EXE_REPORT + sif::debug << "PlocMPSoCHandler::enableReplyInReplyMap: Reply with id " << mpsoc::EXE_REPORT << " not in replyMap" << std::endl; } @@ -371,12 +398,12 @@ ReturnValue_t PlocMPSoCHandler::enableReplyInReplyMap(DeviceCommandMap::iterator void PlocMPSoCHandler::setNextReplyId() { switch(getPendingCommand()) { - case PLOC_MPSOC::TC_MEM_READ: - nextReplyId = PLOC_MPSOC::TM_MEMORY_READ_REPORT; + case mpsoc::TC_MEM_READ: + nextReplyId = mpsoc::TM_MEMORY_READ_REPORT; break; default: /* If no telemetry is expected the next reply is always the execution report */ - nextReplyId = PLOC_MPSOC::EXE_REPORT; + nextReplyId = mpsoc::EXE_REPORT; break; } } @@ -384,7 +411,7 @@ size_t PlocMPSoCHandler::getNextReplyLength(DeviceCommandId_t commandId){ size_t replyLen = 0; - if (nextReplyId == PLOC_MPSOC::NONE) { + if (nextReplyId == mpsoc::NONE) { return replyLen; } @@ -435,7 +462,7 @@ void PlocMPSoCHandler::disableAllReplies() { DeviceReplyMap::iterator iter; /* Disable ack reply */ - iter = deviceReplyMap.find(PLOC_MPSOC::ACK_REPORT); + iter = deviceReplyMap.find(mpsoc::ACK_REPORT); DeviceReplyInfo *info = &(iter->second); info->delayCycles = 0; info->command = deviceCommandMap.end(); @@ -444,10 +471,11 @@ void PlocMPSoCHandler::disableAllReplies() { /* If the command expects a telemetry packet the appropriate tm reply will be disabled here */ switch (commandId) { - case PLOC_MPSOC::TC_MEM_WRITE: + case mpsoc::TC_MEM_WRITE: + case mpsoc::TC_FLASHFOPEN: break; - case PLOC_MPSOC::TC_MEM_READ: { - iter = deviceReplyMap.find(PLOC_MPSOC::TM_MEMORY_READ_REPORT); + case mpsoc::TC_MEM_READ: { + iter = deviceReplyMap.find(mpsoc::TM_MEMORY_READ_REPORT); info = &(iter->second); info->delayCycles = 0; info->command = deviceCommandMap.end(); @@ -487,7 +515,7 @@ void PlocMPSoCHandler::sendFailureReport(DeviceCommandId_t replyId, ReturnValue_ } void PlocMPSoCHandler::disableExeReportReply() { - DeviceReplyIter iter = deviceReplyMap.find(PLOC_MPSOC::EXE_REPORT); + DeviceReplyIter iter = deviceReplyMap.find(mpsoc::EXE_REPORT); DeviceReplyInfo *info = &(iter->second); info->delayCycles = 0; info->command = deviceCommandMap.end(); diff --git a/mission/devices/PlocMPSoCHandler.h b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h similarity index 90% rename from mission/devices/PlocMPSoCHandler.h rename to bsp_q7s/devices/ploc/PlocMPSoCHandler.h index 2773c6be..1e0878f1 100644 --- a/mission/devices/PlocMPSoCHandler.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h @@ -1,8 +1,8 @@ -#ifndef MISSION_DEVICES_PLOCMPSOCHANDLER_H_ -#define MISSION_DEVICES_PLOCMPSOCHANDLER_H_ +#ifndef BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ +#define BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ #include -#include +#include #include #include @@ -22,6 +22,19 @@ class PlocMPSoCHandler: public DeviceHandlerBase { public: + static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HANDLER; + + //! [EXPORT] : [COMMENT] Space Packet received from PLOC has invalid CRC + static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0); + //! [EXPORT] : [COMMENT] Received ACK failure reply from PLOC + static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1); + //! [EXPORT] : [COMMENT] Received execution failure reply from PLOC + static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2); + //! [EXPORT] : [COMMENT] Received space packet with invalid APID from PLOC + static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3); + //! [EXPORT] : [COMMENT] Received command with invalid length + static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xA4); + PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF * comCookie); virtual ~PlocMPSoCHandler(); @@ -54,17 +67,6 @@ protected: private: - static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HANDLER; - - //! [EXPORT] : [COMMENT] Space Packet received from PLOC has invalid CRC - static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0); - //! [EXPORT] : [COMMENT] Received ACK failure reply from PLOC - static const ReturnValue_t RECEIVED_ACK_FAILURE = MAKE_RETURN_CODE(0xA1); - //! [EXPORT] : [COMMENT] Received execution failure reply from PLOC - static const ReturnValue_t RECEIVED_EXE_FAILURE = MAKE_RETURN_CODE(0xA2); - //! [EXPORT] : [COMMENT] Received space packet with invalid APID from PLOC - static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3); - static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HANDLER; //! [EXPORT] : [COMMENT] PLOC crc failure in telemetry packet @@ -83,7 +85,7 @@ private: static const uint16_t APID_MASK = 0x7FF; static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF; - uint8_t commandBuffer[PLOC_MPSOC::MAX_COMMAND_SIZE]; + uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE]; /** * @brief This object is incremented each time a packet is sent or received. By checking the @@ -102,29 +104,18 @@ private: * because the PLOC sends as reply to each command at least one acknowledgment and execution * report. */ - DeviceCommandId_t nextReplyId = PLOC_MPSOC::NONE; + DeviceCommandId_t nextReplyId = mpsoc::NONE; UartComIF* uartComIf = nullptr; - /** - * @brief This function fills the commandBuffer to initiate the write memory command. - * - * @param commandData Pointer to action command data. - * @param commanDataLen Size of command data in bytes. - * - * @return RETURN_OK if successful, else RETURN_FAILURE. - */ ReturnValue_t prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen); + ReturnValue_t prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen); + ReturnValue_t prepareFlashFopenCmd(const uint8_t * commandData, size_t commandDataLen); /** - * @brief This function fills the commandBuffer to initiate the write reads command. - * - * @param commandData Pointer to action command data. - * @param commanDataLen Size of command data in bytes. - * - * @return RETURN_OK if successful, else RETURN_FAILURE. + * @brief Copies space packet into command buffer */ - ReturnValue_t prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen); + void copyToCommandBuffer(mpsoc::TcBase* tc); /** * @brief This function checks the crc of the received PLOC reply. @@ -219,4 +210,4 @@ private: ReturnValue_t checkPacketSequenceCount(const uint8_t* data); }; -#endif /* MISSION_DEVICES_PLOCMPSOCHANDLER_H_ */ +#endif /* BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ */ diff --git a/common/config/commonClassIds.h b/common/config/commonClassIds.h index cd90272d..06ee63b6 100644 --- a/common/config/commonClassIds.h +++ b/common/config/commonClassIds.h @@ -14,6 +14,7 @@ enum commonClassIds: uint8_t { RW_HANDLER, //RWHA STR_HANDLER, //STRH PLOC_MPSOC_HANDLER, //PLMP + MPSOC_CMD, //MPCMD PLOC_SUPERVISOR_HANDLER, //PLSV SUS_HANDLER, //SUSS CCSDS_IP_CORE_BRIDGE, //IPCI diff --git a/mission/devices/CMakeLists.txt b/mission/devices/CMakeLists.txt index ed811ed3..7416a068 100644 --- a/mission/devices/CMakeLists.txt +++ b/mission/devices/CMakeLists.txt @@ -11,7 +11,6 @@ target_sources(${TARGET_NAME} PUBLIC Max31865PT1000Handler.cpp IMTQHandler.cpp HeaterHandler.cpp - PlocMPSoCHandler.cpp RadiationSensorHandler.cpp GyroADIS1650XHandler.cpp RwHandler.cpp From b0df5b943926cd5bf8dcfb93ca465623945f527a Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Thu, 6 Jan 2022 10:12:08 +0100 Subject: [PATCH 003/309] flash close command --- .../devicedefinitions/PlocMPSoCDefinitions.h | 204 ++++++++---------- bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp | 53 +++-- bsp_q7s/devices/ploc/PlocMPSoCHandler.h | 1 + 3 files changed, 127 insertions(+), 131 deletions(-) diff --git a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h index e28236e9..97819866 100644 --- a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h @@ -15,6 +15,7 @@ static const DeviceCommandId_t ACK_REPORT = 3; static const DeviceCommandId_t EXE_REPORT = 5; static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 6; static const DeviceCommandId_t TC_FLASHFOPEN = 7; +static const DeviceCommandId_t TC_FLASHFCLOSE = 8; static const uint16_t SIZE_ACK_REPORT = 14; static const uint16_t SIZE_EXE_REPORT = 14; @@ -27,6 +28,7 @@ namespace apid { static const uint16_t TC_MEM_WRITE = 0x114; static const uint16_t TC_MEM_READ = 0x115; static const uint16_t TC_FLASHFOPEN = 0x119; + static const uint16_t TC_FLASHFCLOSE = 0x11A; static const uint16_t TM_MEMORY_READ_REPORT = 0x404; static const uint16_t ACK_SUCCESS = 0x400; static const uint16_t ACK_FAILURE = 0x401; @@ -130,142 +132,95 @@ private: /** * @brief This class helps to build the memory read command for the PLOC. - * - * @details The last two bytes of the packet data field contain a CRC calculated over the whole - * space packet. This is the CRC-16-CCITT as specified in - * ECSS-E-ST-70-41C Telemetry and telecommand packet utilization. */ -class TcMemRead: public SpacePacket { +class TcMemRead: public TcBase { public: /** * @brief Constructor - * - * @param memAddr The memory address to read from. */ - TcMemRead(const uint32_t memAddr, uint16_t sequenceCount) : - SpacePacket(LENGTH_TC_MEM_READ - 1, true, apid::TC_MEM_READ, sequenceCount) { - fillPacketDataField(&memAddr); + TcMemRead(uint16_t sequenceCount) : + TcBase(apid::TC_MEM_READ, sequenceCount) { + this->setPacketDataLength(PACKET_LENGTH); + } + +protected: + + ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; + result = lengthCheck(commandDataLen); + if (result != RETURN_OK) { + return result; + } + std::memcpy(this->localData.fields.buffer, commandData, MEM_ADDRESS_SIZE); + std::memcpy(this->localData.fields.buffer + MEM_ADDRESS_SIZE, + commandData + MEM_ADDRESS_SIZE, MEM_LEN_SIZE); + return result; } private: - static const uint8_t OFFSET_ADDRESS = 0; - static const uint8_t OFFSET_MEM_LEN_FIELD = 4; - static const uint8_t CRC_OFFSET = 6; - const uint16_t MEM_LEN = 1; + static const size_t COMMAND_LENGTH = 6; + static const size_t MEM_ADDRESS_SIZE = 4; + static const size_t MEM_LEN_SIZE = 2; + static const uint16_t PACKET_LENGTH = 7; - /** - * @brief This function builds the packet data field for the mem read command. - * - * @param memAddr Pointer to the memory address to read from. - */ - void fillPacketDataField(const uint32_t* memAddr) { - ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; - size_t serializedSize = 0; - result = SerializeAdapter::serialize(memAddr, - this->localData.fields.buffer + OFFSET_ADDRESS, &serializedSize, sizeof(*memAddr), - SerializeIF::Endianness::BIG); - if (result != HasReturnvaluesIF::RETURN_OK) { - sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize address field" - << std::endl; - } - result = SerializeAdapter::serialize(&MEM_LEN, - this->localData.fields.buffer + OFFSET_MEM_LEN_FIELD, &serializedSize, - sizeof(MEM_LEN), SerializeIF::Endianness::BIG); - if (result != HasReturnvaluesIF::RETURN_OK) { - sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize mem len field" - << std::endl; - } - // Calculate crc - uint16_t crc = CRC::crc16ccitt(this->localData.byteStream, - sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_READ - CRC_SIZE); - // Add crc to packet data field of space packet */ - result = SerializeAdapter::serialize(&crc, - this->localData.fields.buffer + CRC_OFFSET, &serializedSize, sizeof(crc), - SerializeIF::Endianness::BIG); - if (result != HasReturnvaluesIF::RETURN_OK) { - sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize crc field" - << std::endl; + ReturnValue_t lengthCheck(size_t commandDataLen) { + if (commandDataLen != COMMAND_LENGTH){ + return INVALID_LENGTH; } + return RETURN_OK; } }; /** - * @brief This class helps to generate the space packet to write to a memory address within + * @brief This class helps to generate the space packet to write data to a memory address within * the PLOC. - * @details The last two bytes of the packet data field contain a CRC calculated over the whole - * space packet. This is the CRC-16-CCITT as specified in - * ECSS-E-ST-70-41C Telemetry and telecommand packet utilization. */ -class TcMemWrite: public SpacePacket { +class TcMemWrite: public TcBase { public: /** * @brief Constructor - * - * @param memAddr The PLOC memory address where to write to. - * @param memoryData The data to write to the specified memory address. - * @param sequenceCount The subsequence count. Must be incremented with each new packet. */ - TcMemWrite(const uint32_t memAddr, const uint32_t memoryData, uint16_t sequenceCount) : - SpacePacket(LENGTH_TC_MEM_WRITE - 1, true, apid::TC_MEM_WRITE, sequenceCount) { - fillPacketDataField(&memAddr, &memoryData); + TcMemWrite(uint16_t sequenceCount) : TcBase(apid::TC_MEM_WRITE, sequenceCount) { + this->setPacketDataLength(PACKET_LENGTH); + } + +protected: + + ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; + result = lengthCheck(commandDataLen); + if (result != RETURN_OK) { + return result; + } + std::memcpy(this->localData.fields.buffer, commandData, MEM_ADDRESS_SIZE); + std::memcpy(this->localData.fields.buffer + MEM_ADDRESS_SIZE, + commandData + MEM_ADDRESS_SIZE, MEM_DATA_SIZE); + return result; } private: - /** Offsets from base address of packet data field */ - static const uint8_t OFFSET_MEM_LEN_FIELD = 4; - static const uint8_t OFFSET_MEM_DATA_FIELD = 6; - static const uint8_t CRC_OFFSET = 10; + static const size_t COMMAND_LENGTH = 8; + static const uint16_t PACKET_LENGTH = 9; + static const size_t MEM_ADDRESS_SIZE = 4; + static const size_t MEM_DATA_SIZE = 4; - /** - * @brief This function builds the packet data field for the mem write command. - * - * @param memAddrPtr Pointer to the PLOC memory address where to write to. - * @param memoryDataPtr Pointer to the memoryData to write - */ - void fillPacketDataField(const uint32_t* memAddrPtr, const uint32_t* memoryDataPtr) { - - /* Add memAddr to packet data field */ - size_t serializedSize = 0; - uint8_t* memoryAddressPos = this->localData.fields.buffer; - SerializeAdapter::serialize(memAddrPtr, &memoryAddressPos, &serializedSize, - sizeof(*memAddrPtr), SerializeIF::Endianness::BIG); - - /* Add memLen to packet data field */ - this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD] = 1; - this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD + 1] = 0; - - /* Add memData to packet data field */ - serializedSize = 0; - uint8_t* memoryDataPos = this->localData.fields.buffer + OFFSET_MEM_DATA_FIELD; - SerializeAdapter::serialize(memoryDataPtr, &memoryDataPos, &serializedSize, - sizeof(*memoryDataPtr), SerializeIF::Endianness::BIG); - - /* Calculate crc */ - uint16_t crc = CRC::crc16ccitt(this->localData.byteStream, - sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_WRITE - CRC_SIZE); - - serializedSize = 0; - uint8_t* crcPos = this->localData.fields.buffer + CRC_OFFSET; - /* Add crc to packet data field of space packet */ - SerializeAdapter::serialize(&crc, &crcPos, &serializedSize, sizeof(crc), - SerializeIF::Endianness::BIG); + ReturnValue_t lengthCheck(size_t commandDataLen) { + if (commandDataLen != COMMAND_LENGTH) { + return INVALID_LENGTH; + } + return RETURN_OK; } }; /** - * @brief Class to generate the flash file open command + * @brief Class to help creation of flash fopen command. */ class FlashFopen : public TcBase { public: - /** - * @brief Constructor - * - * @param sequenceCount Packet sequence count which is incremented with each sent and received - * packet. - */ + FlashFopen(uint16_t sequenceCount) : TcBase(apid::TC_FLASHFOPEN, sequenceCount) { } @@ -278,9 +233,9 @@ protected: if (result != RETURN_OK) { return result; } - filename = std::string(reinterpret_cast(commandData), commandDataLen - 1); + std::string filename = std::string(reinterpret_cast(commandData), commandDataLen - 1); accessMode = *(commandData + commandDataLen); - truePacketLen = filename.size() + sizeof(accessMode) + CRC_SIZE; + uint16_t truePacketLen = filename.size() + sizeof(accessMode) + CRC_SIZE; this->setPacketDataLength(truePacketLen - 1); std::memcpy(this->getPacketData(), filename.c_str(), truePacketLen - CRC_SIZE - sizeof(accessMode)); @@ -291,12 +246,7 @@ protected: private: uint8_t accessMode = 0; - std::string filename; - uint16_t truePacketLen = 0; - /** - * @brief Check length of received command - */ ReturnValue_t lengthCheck(size_t commandDataLen) { if (commandDataLen > MAX_FILENAME_SIZE + sizeof(accessMode)) { return INVALID_LENGTH; @@ -305,6 +255,42 @@ private: } }; +/** + * @brief Class to help creation of flash fclose command. + */ +class FlashFclose : public TcBase { +public: + + FlashFclose(uint16_t sequenceCount) : + TcBase(apid::TC_FLASHFCLOSE, sequenceCount) { + } + +protected: + + ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; + result = lengthCheck(commandDataLen); + if (result != RETURN_OK) { + return result; + } + std::string filename = std::string(reinterpret_cast(commandData), commandDataLen - 1); + uint16_t truePacketLen = filename.size() + CRC_SIZE; + this->setPacketDataLength(truePacketLen - 1); + std::memcpy(this->getPacketData(), filename.c_str(), + truePacketLen - CRC_SIZE); + return RETURN_OK; + } + +private: + + ReturnValue_t lengthCheck(size_t commandDataLen) { + if (commandDataLen > MAX_FILENAME_SIZE) { + return INVALID_LENGTH; + } + return RETURN_OK; + } +}; + } #endif /* MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_ */ diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp index 09c203f3..7f6905a4 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp @@ -70,6 +70,10 @@ ReturnValue_t PlocMPSoCHandler::buildCommandFromCommand( result = prepareFlashFopenCmd(commandData, commandDataLen); break; } + case(mpsoc::TC_FLASHFCLOSE): { + result = prepareFlashFcloseCmd(commandData, commandDataLen); + break; + } default: sif::debug << "PlocMPSoCHandler::buildCommandFromCommand: Command not implemented" << std::endl; result = DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; @@ -90,6 +94,7 @@ void PlocMPSoCHandler::fillCommandAndReplyMap() { this->insertInCommandMap(mpsoc::TC_MEM_WRITE); this->insertInCommandMap(mpsoc::TC_MEM_READ); this->insertInCommandMap(mpsoc::TC_FLASHFOPEN); + this->insertInCommandMap(mpsoc::TC_FLASHFCLOSE); this->insertInReplyMap(mpsoc::ACK_REPORT, 1, nullptr, mpsoc::SIZE_ACK_REPORT); this->insertInReplyMap(mpsoc::EXE_REPORT, 3, nullptr, mpsoc::SIZE_EXE_REPORT); this->insertInReplyMap(mpsoc::TM_MEMORY_READ_REPORT, 2, nullptr, mpsoc::SIZE_TM_MEM_READ_REPORT); @@ -180,37 +185,27 @@ void PlocMPSoCHandler::setModeNormal() { ReturnValue_t PlocMPSoCHandler::prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen) { - const uint32_t memoryAddress = *(commandData) << 24 | *(commandData + 1) << 16 - | *(commandData + 2) << 8 | *(commandData + 3); - const uint32_t memoryData = *(commandData + 4) << 24 | *(commandData + 5) << 16 - | *(commandData + 6) << 8 | *(commandData + 7); + ReturnValue_t result = RETURN_OK; packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - mpsoc::TcMemWrite tcMemWrite(memoryAddress, memoryData, packetSequenceCount); - if (tcMemWrite.getFullSize() > mpsoc::MAX_COMMAND_SIZE) { - sif::debug << "PlocMPSoCHandler::prepareTcMemWriteCommand: Command too big" << std::endl; - return RETURN_FAILED; + mpsoc::TcMemWrite tcMemWrite(packetSequenceCount); + result = tcMemWrite.createPacket(commandData, commandDataLen); + if (result != RETURN_OK) { + return result; } - memcpy(commandBuffer, tcMemWrite.getWholeData(), tcMemWrite.getFullSize()); - rawPacket = commandBuffer; - rawPacketLen = tcMemWrite.getFullSize(); - nextReplyId = mpsoc::ACK_REPORT; + copyToCommandBuffer(&tcMemWrite); return RETURN_OK; } ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen) { - const uint32_t memoryAddress = *(commandData) << 24 | *(commandData + 1) << 16 - | *(commandData + 2) << 8 | *(commandData + 3); + ReturnValue_t result = RETURN_OK; packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - mpsoc::TcMemRead tcMemRead(memoryAddress, packetSequenceCount); - if (tcMemRead.getFullSize() > mpsoc::MAX_COMMAND_SIZE) { - sif::debug << "PlocMPSoCHandler::prepareTcMemReadCommand: Command too big" << std::endl; - return RETURN_FAILED; + mpsoc::TcMemRead tcMemRead(packetSequenceCount); + result = tcMemRead.createPacket(commandData, commandDataLen); + if (result != RETURN_OK) { + return result; } - memcpy(commandBuffer, tcMemRead.getWholeData(), tcMemRead.getFullSize()); - rawPacket = commandBuffer; - rawPacketLen = tcMemRead.getFullSize(); - nextReplyId = mpsoc::ACK_REPORT; + copyToCommandBuffer(&tcMemRead); return RETURN_OK; } @@ -227,6 +222,19 @@ ReturnValue_t PlocMPSoCHandler::prepareFlashFopenCmd(const uint8_t * commandData return RETURN_OK; } +ReturnValue_t PlocMPSoCHandler::prepareFlashFcloseCmd(const uint8_t * commandData, + size_t commandDataLen) { + ReturnValue_t result = RETURN_OK; + packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; + mpsoc::FlashFclose flashFclose(packetSequenceCount); + result = flashFclose.createPacket(commandData, commandDataLen); + if (result != RETURN_OK) { + return result; + } + copyToCommandBuffer(&flashFclose); + return RETURN_OK; +} + void PlocMPSoCHandler::copyToCommandBuffer(mpsoc::TcBase* tc) { if (tc == nullptr) { sif::debug << "PlocMPSoCHandler::copyToCommandBuffer: Invalid TC" << std::endl; @@ -358,6 +366,7 @@ ReturnValue_t PlocMPSoCHandler::enableReplyInReplyMap(DeviceCommandMap::iterator switch (command->first) { case mpsoc::TC_MEM_WRITE: case mpsoc::TC_FLASHFOPEN: + case mpsoc::TC_FLASHFCLOSE: enabledReplies = 2; break; case mpsoc::TC_MEM_READ: { diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h index 1e0878f1..7239e399 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h @@ -111,6 +111,7 @@ private: ReturnValue_t prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen); ReturnValue_t prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen); ReturnValue_t prepareFlashFopenCmd(const uint8_t * commandData, size_t commandDataLen); + ReturnValue_t prepareFlashFcloseCmd(const uint8_t * commandData, size_t commandDataLen); /** * @brief Copies space packet into command buffer From 7fae7afdf63f1f1ea96dc6ed8dfc72690d99f350 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Thu, 6 Jan 2022 10:22:18 +0100 Subject: [PATCH 004/309] removed unsued variable --- bsp_q7s/devices/startracker/StrHelper.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/bsp_q7s/devices/startracker/StrHelper.h b/bsp_q7s/devices/startracker/StrHelper.h index e140a4d6..7f8ba654 100644 --- a/bsp_q7s/devices/startracker/StrHelper.h +++ b/bsp_q7s/devices/startracker/StrHelper.h @@ -300,9 +300,6 @@ private: // Communication cookie. Must be set by the star tracker handler CookieIF* comCookie = nullptr; - // Queue id of raw data receiver - MessageQueueId_t rawDataReceiver = MessageQueueIF::NO_QUEUE; - /** * @brief Performs image uploading */ From 996a8a226e87e5d022a101567267354d0ecdcbfe Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Thu, 6 Jan 2022 18:05:21 +0100 Subject: [PATCH 005/309] flash write wip --- .../devicedefinitions/PlocMPSoCDefinitions.h | 57 ++++- bsp_q7s/devices/ploc/CMakeLists.txt | 1 + bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp | 56 +++++ bsp_q7s/devices/ploc/MPSoCSequenceCount.h | 48 ++++ bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp | 93 ++++++-- bsp_q7s/devices/ploc/PlocMPSoCHandler.h | 60 +++-- bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp | 215 ++++++++++++++++++ bsp_q7s/devices/ploc/PlocMPSoCHelper.h | 143 ++++++++++++ .../startracker/StarTrackerHandler.cpp | 30 +-- .../devices/startracker/StarTrackerHandler.h | 4 +- bsp_q7s/devices/startracker/StrHelper.cpp | 28 +-- bsp_q7s/devices/startracker/StrHelper.h | 15 +- bsp_q7s/memory/FilesystemHelper.cpp | 34 +++ bsp_q7s/memory/FilesystemHelper.h | 47 ++++ common/config/commonClassIds.h | 3 + common/config/commonSubsystemIds.h | 1 + linux/fsfwconfig/OBSWConfig.h.in | 5 +- tmtc | 2 +- 18 files changed, 733 insertions(+), 109 deletions(-) create mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp create mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.h create mode 100644 bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp create mode 100644 bsp_q7s/devices/ploc/PlocMPSoCHelper.h create mode 100644 bsp_q7s/memory/FilesystemHelper.cpp create mode 100644 bsp_q7s/memory/FilesystemHelper.h diff --git a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h index 97819866..4b169d5f 100644 --- a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h @@ -16,6 +16,7 @@ static const DeviceCommandId_t EXE_REPORT = 5; static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 6; static const DeviceCommandId_t TC_FLASHFOPEN = 7; static const DeviceCommandId_t TC_FLASHFCLOSE = 8; +static const DeviceCommandId_t TC_FLASHWRITE = 9; static const uint16_t SIZE_ACK_REPORT = 14; static const uint16_t SIZE_EXE_REPORT = 14; @@ -27,6 +28,7 @@ static const uint16_t SIZE_TM_MEM_READ_REPORT = 18; namespace apid { static const uint16_t TC_MEM_WRITE = 0x114; static const uint16_t TC_MEM_READ = 0x115; + static const uint16_t TC_FLASHWRITE = 0x117; static const uint16_t TC_FLASHFOPEN = 0x119; static const uint16_t TC_FLASHFCLOSE = 0x11A; static const uint16_t TM_MEMORY_READ_REPORT = 0x404; @@ -54,8 +56,9 @@ static const size_t MAX_FILENAME_SIZE = 256; static const uint16_t LENGTH_TC_MEM_WRITE = 12; static const uint16_t LENGTH_TC_MEM_READ = 8; -static const size_t MAX_REPLY_SIZE = SIZE_TM_MEM_READ_REPORT; -static const size_t MAX_COMMAND_SIZE = 18; +static const size_t MAX_REPLY_SIZE = SpacePacket::PACKET_MAX_SIZE; +static const size_t MAX_COMMAND_SIZE = SpacePacket::PACKET_MAX_SIZE; +static const size_t MAX_DATA_SIZE = 1016; /** * @breif Abstract base class for TC space packet of MPSoC. @@ -130,6 +133,33 @@ private: } }; +/** + * @brief Class for handling tm replies of the PLOC MPSoC. + */ +class TmPacket : public SpacePacket, public HasReturnvaluesIF { +public: + + static const uint8_t INTERFACE_ID = CLASS_ID::MPSOC_CMD; + + //! [EXPORT] : [COMMENT] CRC check of received packet failed + static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xA0); + /** + * @brief Constructor creates idle packet and sets length field to maximum allowed size. + */ + TmPacket() : SpacePacket(PACKET_MAX_SIZE) { + } + + ReturnValue_t checkCrc() { + uint8_t crcPtr = this->getPacketData() + this->getPacketDataLength() - 1; + uint16_t receivedCrc = *(crcPtr) << 8 | *(crcPtr + 1); + uint16_t recalculatedCrc = CRC::crc16ccitt(this->localData.byteStream, this->getFullSize()); + if (recalculatedCrc != this->ge) { + return CRC_FAILURE; + } + return RETURN_OK; + } +}; + /** * @brief This class helps to build the memory read command for the PLOC. */ @@ -291,6 +321,29 @@ private: } }; +/** + * @brief Class to build flash write space packet. + */ +class FlashWrite : public TcBase { +public: + + FlashWrite(uint16_t sequenceCount) : + TcBase(apid::TC_FLASHWRITE, sequenceCount) { + } + +protected: + + ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) { + if (commandDataLen > MAX_DATA_SIZE) { + sif::debug << "FlashWrite::initPacket: Command data too big" << std::endl; + return RETURN_FAILED; + } + std::memcpy(this->getPacketData(), commandData, commandDataLen); + this->setPacketDataLength(static_cast(commandDataLen + CRC_SIZE - 1)); + return RETURN_OK; + } +}; + } #endif /* MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_ */ diff --git a/bsp_q7s/devices/ploc/CMakeLists.txt b/bsp_q7s/devices/ploc/CMakeLists.txt index ab8edb36..0babd089 100644 --- a/bsp_q7s/devices/ploc/CMakeLists.txt +++ b/bsp_q7s/devices/ploc/CMakeLists.txt @@ -3,4 +3,5 @@ target_sources(${TARGET_NAME} PRIVATE PlocUpdater.cpp PlocMemoryDumper.cpp PlocMPSoCHandler.cpp + PlocMPSoCHelper.cpp ) diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp b/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp new file mode 100644 index 00000000..88b66ad0 --- /dev/null +++ b/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp @@ -0,0 +1,56 @@ +#include "MPSoCSequenceCount.h" + +MPSoCSequenceCount::MPSoCSequenceCount() { +} + +MPSoCSequenceCount::~MPSoCSequenceCount() { +} + +MPSoCSequenceCount::increment() { + ReturnValue_t result = RETURN_OK; + result = spiMutex->lockMutex(timeoutType, timeoutMs); + if (result != RETURN_OK) { + sif::warning << "MPSoCSequenceCount::increment: Failed to lock mutex" << std::endl; + return result; + } + sequenceCount = (sequenceCount + 1) & SEQUENCE_COUNT_MASK; + result = spiMutex->unlockMutex(timeoutType, timeoutMs); + if (result != RETURN_OK) { + sif::warning << "MPSoCSequenceCount::increment: Failed to unlock mutex" << std::endl; + return result; + } +} + +MPSoCSequenceCount::set(uint16_t sequenceCount_) { + ReturnValue_t result = RETURN_OK; + result = spiMutex->lockMutex(timeoutType, timeoutMs); + if (result != RETURN_OK) { + sif::warning << "MPSoCSequenceCount::set: Failed to lock mutex" << std::endl; + return result; + } + sequenceCount = sequenceCount_; + result = spiMutex->unlockMutex(timeoutType, timeoutMs); + if (result != RETURN_OK) { + sif::warning << "MPSoCSequenceCount::set: Failed to unlock mutex" << std::endl; + return result; + } +} + +MPSoCSequenceCount::reset() { + ReturnValue_t result = RETURN_OK; + result = spiMutex->lockMutex(timeoutType, timeoutMs); + if (result != RETURN_OK) { + sif::warning << "MPSoCSequenceCount::reset: Failed to lock mutex" << std::endl; + return result; + } + sequenceCount = 0; + result = spiMutex->unlockMutex(timeoutType, timeoutMs); + if (result != RETURN_OK) { + sif::warning << "MPSoCSequenceCount::reset: Failed to unlock mutex" << std::endl; + return result; + } +} + +uint16_t MPSoCSequenceCount::get() { + return sequenceCount; +} diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.h b/bsp_q7s/devices/ploc/MPSoCSequenceCount.h new file mode 100644 index 00000000..57587d0a --- /dev/null +++ b/bsp_q7s/devices/ploc/MPSoCSequenceCount.h @@ -0,0 +1,48 @@ +#ifndef BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ +#define BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ + +/** + * @brief Manages incrementing, resetting and harmonization of the sequence count in the space + * packet based communication between MPSoC and OBC. + * + * @author J. Meier + */ +class MPSoCSequenceCount { +public: + MPSoCSequenceCount(); + virtual ~MPSoCSequenceCount(); + + /** + * @brief Increments the sequence count. + */ + void increment(); + + /** + * @brief Sets the value of the sequence count + * + * @param sequenceCount The sequence count to set + */ + void set(uint16_t sequenceCount_); + + /** + * @brief Resets the sequence count to zero + */ + void reset(); + + /** + * @brief Returns the current value sequence count + */ + uint16_t get(); + +private: + + MutexIF* spiMutex = nullptr; + MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING; + uint32_t timeoutMs = 20; + + static const uint16_t SEQUENCE_COUNT_MASK = 0x3FFF; + + uint16_t sequenceCount = 0x3FFF; +}; + +#endif /* BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ */ diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp index 7f6905a4..c9daad77 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp @@ -1,13 +1,11 @@ -#include "../../bsp_q7s/devices/ploc/PlocMPSoCHandler.h" - #include "OBSWConfig.h" - -#include -#include +#include "PlocMPSoCHandler.h" +#include "fsfw/globalfunctions/CRC.h" +#include "fsfw/datapool/PoolReadGuard.h" PlocMPSoCHandler::PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, - CookieIF * comCookie) : - DeviceHandlerBase(objectId, uartComIFid, comCookie) { + CookieIF * comCookie, PlocMPSoCHelper* plocMPSoCHelper) : + DeviceHandlerBase(objectId, uartComIFid, comCookie), plocMPSoCHelper(plocMPSoCHelper) { if (comCookie == NULL) { sif::error << "PlocMPSoCHandler: Invalid com cookie" << std::endl; } @@ -27,9 +25,66 @@ ReturnValue_t PlocMPSoCHandler::initialize() { sif::warning << "PlocMPSoCHandler::initialize: Invalid uart com if" << std::endl; return ObjectManagerIF::CHILD_INIT_FAILED; } + +EventManagerIF* manager = ObjectManager::instance()->get( + objects::EVENT_MANAGER); + if (manager == nullptr) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::error << "PlocMPSoCHandler::initialize: Invalid event manager" << std::endl; +#endif + return ObjectManagerIF::CHILD_INIT_FAILED;; + } + result = manager->registerListener(eventQueue->getId()); + if (result != RETURN_OK) { + return result; + } + result = manager->subscribeToEventRange(eventQueue->getId(), + event::getEventId(PlocMPSoCHelper::FLASH_WRITE_FAILED), + event::getEventId(PlocMPSoCHelper::FLASH_WRITE_SUCCESSFUL)); + if (result != RETURN_OK) { +#if FSFW_CPP_OSTREAM_ENABLED == 1 + sif::warning << "PlocMPSoCHandler::initialize: Failed to subscribe to events from " + " ploc mpsoc helper" << std::endl; +#endif + return ObjectManagerIF::CHILD_INIT_FAILED; + } + + result = plocMPSoCHelper->setComIF(communicationInterface); + if (result != RETURN_OK) { + return ObjectManagerIF::CHILD_INIT_FAILED; + } + plocMPSoCHelper->setComCookie(comCookie); + plocMPSoCHelper->setSequenceCount(&sequenceCount); return result; } +ReturnValue_t PlocMPSoCHandler::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, + const uint8_t* data, size_t size) { + ReturnValue_t result = RETURN_OK; + + if (plocMPSoCHelperExecuting) { + return MPSOC_HELPER_EXECUTING; + } + + switch(actionId) { + case mpsoc::TC_FLASHWRITE: { + if (size > config::MAX_PATH_SIZE + config::MAX_FILE_NAME) { + return FILENAME_TOO_LONG; + } + result = plocMPSoCHelper->startFlashWrite( + std::string(reinterpret_cast(data), size)); + if (result != RETURN_OK) { + return result; + } + plocMPSoCHelperExecuting = true; + break; + } + default: + break; + } + return DeviceHandlerBase::executeAction(actionId, commandedBy, data, size); +} + void PlocMPSoCHandler::doStartUp(){ #if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1 @@ -179,15 +234,11 @@ ReturnValue_t PlocMPSoCHandler::initializeLocalDataPool(localpool::DataPool& loc return HasReturnvaluesIF::RETURN_OK; } -void PlocMPSoCHandler::setModeNormal() { - mode = MODE_NORMAL; -} - ReturnValue_t PlocMPSoCHandler::prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - mpsoc::TcMemWrite tcMemWrite(packetSequenceCount); + sequenceCount.increment(); + mpsoc::TcMemWrite tcMemWrite(sequenceCount.get()); result = tcMemWrite.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -199,8 +250,8 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemWriteCommand(const uint8_t * command ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - mpsoc::TcMemRead tcMemRead(packetSequenceCount); + sequenceCount.increment(); + mpsoc::TcMemRead tcMemRead(sequenceCount.get()); result = tcMemRead.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -212,8 +263,8 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandD ReturnValue_t PlocMPSoCHandler::prepareFlashFopenCmd(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - mpsoc::FlashFopen flashFopen(packetSequenceCount); + sequenceCount.increment(); + mpsoc::FlashFopen flashFopen(sequenceCount.get()); result = flashFopen.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -225,8 +276,8 @@ ReturnValue_t PlocMPSoCHandler::prepareFlashFopenCmd(const uint8_t * commandData ReturnValue_t PlocMPSoCHandler::prepareFlashFcloseCmd(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - packetSequenceCount = (packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK; - mpsoc::FlashFclose flashFclose(packetSequenceCount); + sequenceCount.increment(); + mpsoc::FlashFclose flashFclose(sequenceCount.get()); result = flashFclose.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -534,13 +585,13 @@ void PlocMPSoCHandler::disableExeReportReply() { ReturnValue_t PlocMPSoCHandler::checkPacketSequenceCount(const uint8_t* data) { uint16_t receivedSeqCnt = (*(data + 2) << 8 | *(data + 3)) & PACKET_SEQUENCE_COUNT_MASK; - uint16_t expectedSeqCnt = ((packetSequenceCount + 1) & PACKET_SEQUENCE_COUNT_MASK); + uint16_t expectedSeqCnt = sequenceCount.get(); if (receivedSeqCnt != expectedSeqCnt) { sif::warning << "PlocMPSoCHandler::checkPacketSequenceCount: Packet sequence count " "mismatch. Received: " << receivedSeqCnt << ", Expected: " << expectedSeqCnt << std::endl; triggerEvent(SEQ_CNT_MISMATCH, expectedSeqCnt, receivedSeqCnt); } - packetSequenceCount = receivedSeqCnt; + sequenceCount.set(receivedSeqCnt); return RETURN_OK; } diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h index 7239e399..55be8102 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h @@ -1,22 +1,24 @@ #ifndef BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ #define BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ -#include -#include +#include "fsfw/devicehandlers/DeviceHandlerBase.h" +#include "devicedefinitions/PlocMPSoCDefinitions.h" +#include "fsfw_hal/linux/uart/UartComIF.h" +#include "MPSoCSequenceCount.h" +#include "PlocMPSoCHelper.h" #include -#include /** - * @brief This is the device handler for the MPSoC which is programmed by the ILH of the - * university of stuttgart. + * @brief This is the device handler for the MPSoC of the payload computer. + * + * @details The PLOC uses the space packet protocol for communication. On each command the PLOC + * answers with at least one acknowledgment and one execution report. + * Flight manual: https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/PLOC_MPSoC + * ICD: https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_TAS-ILH-IRS/ICD-PLOC/ILH&fileid=1030263 + * + * @note The sequence count in the space packets must be incremented with each received and sent + * packet. * - * @details - * The PLOC uses the space packet protocol for communication. To each command the PLOC - * answers with at least one acknowledgment and one execution report. - * Flight manual: - * https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/PLOC_Commands - * ILH ICD: https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/ - * Arbeitsdaten/08_Used%20Components/PLOC&fileid=940960 * @author J. Meier */ class PlocMPSoCHandler: public DeviceHandlerBase { @@ -34,15 +36,17 @@ public: static const ReturnValue_t INVALID_APID = MAKE_RETURN_CODE(0xA3); //! [EXPORT] : [COMMENT] Received command with invalid length static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xA4); + //! [EXPORT] : [COMMENT] Received command with invalid filename + static const ReturnValue_t FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xA5); + //! [EXPORT] : [COMMENT] MPSoC helper is currently executing a command + static const ReturnValue_t MPSOC_HELPER_EXECUTING = MAKE_RETURN_CODE(0xA6); - PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF * comCookie); + PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF * comCookie, + PlocMPSoCHelper* plocMPSoCHelper); virtual ~PlocMPSoCHandler(); - virtual ReturnValue_t initialize() override; - /** - * @brief Sets mode to MODE_NORMAL. Can be used for debugging. - */ - void setModeNormal(); + ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, + const uint8_t* data, size_t size) override; protected: void doStartUp() override; @@ -83,22 +87,11 @@ private: static const Event SEQ_CNT_MISMATCH = MAKE_EVENT(5, severity::LOW); static const uint16_t APID_MASK = 0x7FF; - static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF; + + MPSoCSequenceCount sequenceCount; uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE]; - /** - * @brief This object is incremented each time a packet is sent or received. By checking the - * packet sequence count of a received packet, no packets can be lost without noticing - * it. Only the least significant 14 bits represent the packet sequence count in a - * space packet. Thus the maximum value amounts to 16383 (0x3FFF). - * @note Normally this should never happen because the PLOC replies are always sent in a - * fixed order. However, the PLOC software checks this value and will return an ACK - * failure report in case the sequence count is not incremented with each transferred - * space packet. - */ - uint16_t packetSequenceCount = 0x3FFF; - /** * This variable is used to store the id of the next reply to receive. This is necessary * because the PLOC sends as reply to each command at least one acknowledgment and execution @@ -108,6 +101,11 @@ private: UartComIF* uartComIf = nullptr; + PlocMPSoCHelper* plocMPSoCHelper = nullptr; + + // Used to block incoming commands when MPSoC helper class is currently executing a command + bool plocMPSoCHelperExecuting = false; + ReturnValue_t prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen); ReturnValue_t prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen); ReturnValue_t prepareFlashFopenCmd(const uint8_t * commandData, size_t commandDataLen); diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp new file mode 100644 index 00000000..06151c33 --- /dev/null +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp @@ -0,0 +1,215 @@ +#include "PlocMPSoCHelper.h" +#include "mission/utility/Timestamp.h" +#include +#include + +PlocMPSoCHelper::PlocMPSoCHelper(object_id_t objectId) : SystemObject(objectId){ + +} + +PlocMPSoCHelper::~PlocMPSoCHelper() { +} + +ReturnValue_t PlocMPSoCHelper::initialize() { + sdcMan = SdCardManager::instance(); + if (sdcMan == nullptr) { + sif::warning << "PlocMPSoCHelper::initialize: Invalid SD Card Manager" << std::endl; + return RETURN_FAILED; + } + return RETURN_OK; +} + +ReturnValue_t PlocMPSoCHelper::performOperation(uint8_t operationCode) { + ReturnValue_t result = RETURN_OK; + semaphore.acquire(); + while(true) { + switch(internalState) { + case InternalState::IDLE: { + semaphore.acquire(); + break; + } + case InternalState::FLASH_WRITE: { + result = performFlashWrite(); + if (result == RETURN_OK){ + triggerEvent(FLASH_WRITE_SUCCESSFUL); + } + else { + triggerEvent(FLASH_WRITE_FAILED); + } + internalState = InternalState::IDLE; + break; + } + default: + sif::debug << "PlocMPSoCHelper::performOperation: Invalid state" << std::endl; + break; + } + } +} + +ReturnValue_t PlocMPSoCHelper::setComIF(DeviceCommunicationIF* communicationInterface_) { + uartComIF = dynamic_cast(communicationInterface_); + if (uartComIF == nullptr) { + sif::warning << "PlocMPSoCHelper::initialize: Invalid uart com if" << std::endl; + return RETURN_FAILED; + } + return RETURN_OK; +} + +void PlocMPSoCHelper::setComCookie(CookieIF* comCookie_) { + comCookie = comCookie_; +} + +void PlocMPSoCHelper::setSequenceCount(MPSoCSequenceCount* sequenceCount_) { + sequenceCount = sequenceCount_; +} + +ReturnValue_t PlocMPSoCHelper::startFlashWrite(std::string file) { + ReturnValue_t result = FilesystemHelper::checkPath(file); + if (result != RETURN_OK) { + return result; + } + result = FilesystemHelper::fileExists(file); + if (result != RETURN_OK) { + return result; + } + flashWrite.file = file; + internalState = InternalState::FLASH_WRITE; + semaphore.release(); + terminate = false; + return RETURN_OK; +} + +void PlocMPSoCHelper::stopProcess() { + terminate = true; +} + +ReturnValue_t PlocMPSoCHelper::performFlashWrite() { + ReturnValue_t result = RETURN_OK; + std::ifstream file(flashWrite.file, std::ifstream::binary); + // Set position of next character to end of file input stream + file.seekg(0, file.end); + // tellg returns position of character in input stream + imageSize = file.tellg(); + sequenceCount->increment(); + mpsoc::FlashWrite tc(sequenceCount->get()); + result = sendCommand(tc); + if (result != REUTRN_OK) { + return result; + } + result = handleAck(); + if (result != RETURN_OK) { + return result; + } + result = handleExe(); + if (result != RETURN_OK) { + return result; + } + return result; +} + +ReturnValue_t PlocMPSoCHelper::sendCommand(TcBase* tc) { + ReturnValue_t result = RETURN_OK; + result = uartComIF->sendMessage(comCookie, tc->getWholeData(), tc->getFullSize()); + if (result != RETURN_OK) { + sif::warning << "PlocMPSoCHelper::sendCommand: Failed to send command" << std::endl; + triggerEvent(SENDING_COMMAND_FAILED, result, internalState); + return result; + } + return result; +} + +ReturnValue_t PlocMPSoCHelper::handleAck() { + ReturnValue_t result = RETURN_OK; + mpsoc::TmPacket tmPacket; + result = handleTmReception(tmPacket, mpsoc::SIZE_ACK_REPORT); + if (result != RETURN_OK) { + return result; + } + uint16_t apid = tmPacket.getAPID(); + if (apid != mpsoc::apid::ACK_SUCCESS) { + handleAckApidFailure(apid); + return RETURN_FAILED; + } + return RETURN_OK; +} + +void PlocMPSoCHelper::handleAckApidFailure(uint16_t apid) { + if (apid == mpsoc::apid::ACK_FAILURE) { + triggerEvent(ACK_FAILURE_REPORT, internalState); + sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Received acknowledgement failure " + << "report" << std::endl; + } + else { + triggerEvent(ACK_INVALID_APID, apid, internalState); + sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Expected acknowledgement report " + << "but received space packet with apid " << std::hex << apid << std::endl; + } +} + +ReturnValue_t PlocMPSoCHelper::handleExe() { + ReturnValue_t result = RETURN_OK; + mpsoc::TmPacket tmPacket; + result = handleTmReception(tmPacket, mpsoc::SIZE_EXE_REPORT); + if (result != RETURN_OK) { + return result; + } + uint16_t apid = tmPacket.getAPID(); + if (apid != mpsoc::apid::EXE_SUCCESS) { + handleExeApidFailure(apid); + return RETURN_FAILED; + } + return RETURN_OK; +} + +void PlocMPSoCHelper::handleExeApidFailure(uint16_t apid) { + if (apid == mpsoc::apid::EXE_FAILURE) { + triggerEvent(EXE_FAILURE_REPORT, internalState); + sif::warning << "PlocMPSoCHelper::handleExeApidFailure: Received execution failure " + << "report" << std::endl; + } + else { + triggerEvent(EXE_INVALID_APID, apid, internalState); + sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Expected execution report " + << "but received space packet with apid " << std::hex << apid << std::endl; + } +} + +ReturnValue_t PlocMPSoCHelper::handleTmReception(TmPacket* tmPacket, size_t remainingBytes) { + size_t readBytes = 0; + for(int retries = 0; retries < RETRIES; retries++) { + result = receive(tmPacket->getWholeData(), readBytes, remainingBytes); + if (result != RETURN_OK) { + return result; + } + remainingBytes = remainingBytes - readBytes; + if (remainingBytes == 0) { + break; + } + } + if (remainingBytes != 0) { + sif::warning << "PlocMPSoCHelper::handleTmReception: Failed to receive reply" << std::endl; + triggerEvent(MISSING_EXE, remainingBytes, internalState); + return RETURN_FAILED; + } + result = tmPacket->checkCrc(); + if (result != RETURN_OK) { + sif::warning << "PlocMPSoCHelper::handleTmReception: CRC check failed" << std::endl; + return result; + } +} + +ReturnValue_t PlocMPSoCHelper::receive(uint8_t* data, size_t* readBytes, size_t requestBytes) { + ReturnValue_t result = RETURN_OK; + result = uartComIF->requestReceiveMessage(comCookie, requestBytes); + if (result != RETURN_OK) { + sif::warning << "PlocMPSoCHelper::receive: Failed to request reply" << std::endl; + triggerEvent(MPSOC_HELPER_REQUESTING_REPLY_FAILED, result, internalState); + return RETURN_FAILED; + } + result = uartComIF->readReceivedMessage(comCookie, &data, readBytes); + if (result != RETURN_OK) { + sif::warning << "PlocMPSoCHelper::receive: Failed to read received message" << std::endl; + triggerEvent(MPSOC_HELPER_READING_REPLY_FAILED, result, internalState); + return RETURN_FAILED; + } +} diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h new file mode 100644 index 00000000..ee399a51 --- /dev/null +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h @@ -0,0 +1,143 @@ +#ifndef BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ +#define BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ + +#include +#include "fsfw/osal/linux/BinarySemaphore.h" +#include "bsp_q7s/memory/SdCardManager.h" +#include "fsfw/returnvalues/HasReturnvaluesIF.h" +#include "fsfw/objectmanager/SystemObject.h" +#include "fsfw/tasks/ExecutableObjectIF.h" +#include "fsfw_hal/linux/uart/UartComIF.h" +#include "fsfw/devicehandlers/CookieIF.h" +#include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" +#include "MPSoCSequenceCount.h" + +/** + * @brief Helper class for MPSoC of PLOC intended to accelerate large data transfers between + * MPSoC and OBC. + * @author J. Meier + */ +class PlocMPSoCHelper: public SystemObject, public ExecutableObjectIF, public HasReturnvaluesIF { +public: + + static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HELPER; + + //! [EXPORT] : [COMMENT] Flash write fails + static const Event FLASH_WRITE_FAILED = MAKE_EVENT(0, severity::LOW); + //! [EXPORT] : [COMMENT] Flash write successful + static const Event FLASH_WRITE_SUCCESSFUL = MAKE_EVENT(1, severity::LOW); + //! [EXPORT] : [COMMENT] Communication interface returned failure when trying to send the command ot the PLOC + //!P1: Return value returned by the communication interface sendMessage function + //!P2: Internal state of MPSoC helper + static const Event SENDING_COMMAND_FAILED = MAKE_EVENT(2, severity::LOW); + //! [EXPORT] : [COMMENT] Request receive message of communication interface failed + //!P1: Return value returned by the communication interface requestReceiveMessage function + //!P2: Internal state of MPSoC helper + static const Event MPSOC_HELPER_REQUESTING_REPLY_FAILED = MAKE_EVENT(3, severity::LOW); + //! [EXPORT] : [COMMENT] Reading receive message of communication interface failed + //!P1: Return value returned by the communication interface readingReceivedMessage function + //!P2: Internal state of MPSoC helper + static const Event MPSOC_HELPER_REQUESTING_REPLY_FAILED = MAKE_EVENT(4, severity::LOW); + //! [EXPORT] : [COMMENT] Did not receive acknowledgement report + //!P1: Number of bytes missing + //!P2: Internal state of MPSoC helper + static const Event MISSING_ACK = MAKE_EVENT(5, severity::LOW); + //! [EXPORT] : [COMMENT] Did not receive execution report + //!P1: Number of bytes missing + //!P2: Internal state of MPSoC helper + static const Event MISSING_EXE = MAKE_EVENT(6, severity::LOW); + //! [EXPORT] : [COMMENT] Received acknowledgement failure report + //!P1: Internal state of MPSoC + static const Event ACK_FAILURE_REPORT = MAKE_EVENT(7, severity::LOW); + //! [EXPORT] : [COMMENT] Received execution failure report + //!P1: Internal state of MPSoC + static const Event EXE_FAILURE_REPORT = MAKE_EVENT(8, severity::LOW); + //! [EXPORT] : [COMMENT] Expected acknowledgement report but received space packet with other apid + //!P1: Apid of received space packet + //!P2: Internal state of MPSoC + static const Event ACK_INVALID_APID = MAKE_EVENT(9, severity::LOW); + //! [EXPORT] : [COMMENT] Expected execution report but received space packet with other apid + //!P1: Apid of received space packet + //!P2: Internal state of MPSoC + static const Event EXE_INVALID_APID = MAKE_EVENT(10, severity::LOW); + + PlocMPSoCHelper(object_id_t objectId); + virtual ~PlocMPSoCHelper(); + + ReturnValue_t initialize() override; + ReturnValue_t performOperation(uint8_t operationCode = 0) override; + + ReturnValue_t setComIF(DeviceCommunicationIF* communicationInterface_); + void setComCookie(CookieIF* comCookie_); + + /** + * @brief Starts flash write sequence + * + * @param file File with data to write + * + * @return RETURN_OK if successful, otherwise error return value + */ + ReturnValue_t startFlashWrite(std::string file); + + /** + * @brief Can be used to interrupt a running data transfer. + */ + void stopProcess(); + + /** + * @brief Sets the sequence count object responsible for the sequence count handling + */ + void setSequenceCount(MPSoCSequenceCount* sequenceCount_); + +private: + + static const uint8_t INTERFACE_ID = CLASS_ID::PLOC_MPSOC_HELPER; + + // Maximum number of times the communication interface retries polling data from the reply + // buffer + static const int RETRIES = 3; + + class FlashWrite { + public: + static const std::string file; + }; + + FlashWrite flashWrite; + + enum class InternalState { + IDLE, + FLASH_WRITE, + FLASH_READ + }; + + InternalState internalState = InternalState::IDLE; + + BinarySemaphore semaphore; + + SdCardManager* sdcMan = nullptr; + + uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE]; + + bool terminate = false; + + /** + * Communication interface of MPSoC responsible for low level access. Must be set by the + * MPSoC Handler. + */ + UartComIF* uartComIF = nullptr; + // Communication cookie. Must be set by the MPSoC Handler + CookieIF* comCookie = nullptr; + // Sequence count, must be set by Ploc MPSoC Handler + MPSoCSequenceCount* sequenceCount; + + ReturnValue_t performFlashWrite(); + ReturnValue_t sendCommand(TcBase* tc); + ReturnValue_t receive(uint8_t* data, size_t* readBytes, size_t requestBytes); + ReturnValue_t handleAck(); + ReturnValue_t handleExe(); + void handleAckApidFailure(uint16_t apid); + void handleExeApidFailure(uint16_t apid); + ReturnValue_t handleTmReception(TmPacket* tmPacket, size_t remainingBytes); +}; + +#endif /* BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ */ diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp index de70037a..85fb415b 100644 --- a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp +++ b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp @@ -81,7 +81,7 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu return EXECUTION_FINISHED; } case(StarTracker::SET_JSON_FILE_NAME): { - if (size > MAX_PATH_SIZE) { + if (size > config::MAX_PATH_SIZE) { return FILE_PATH_TOO_LONG; } paramJsonFile = std::string(reinterpret_cast(data), size); @@ -91,8 +91,8 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu break; } - if (strHelperExecuting == true) { - return IMAGE_LOADER_EXECUTING; + if (strHelperExecuting) { + return STR_HELPER_EXECUTING; } result = checkMode(actionId); @@ -107,7 +107,7 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu if (result != RETURN_OK) { return result; } - if (size > MAX_PATH_SIZE + MAX_FILE_NAME) { + if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) { return FILE_PATH_TOO_LONG; } result = strHelper->startImageUpload( @@ -123,7 +123,7 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu if (result != RETURN_OK) { return result; } - if (size > MAX_PATH_SIZE) { + if (size > config::MAX_PATH_SIZE) { return FILE_PATH_TOO_LONG; } result = strHelper->startImageDownload( @@ -160,7 +160,7 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu return EXECUTION_FINISHED; } case(StarTracker::CHANGE_DOWNLOAD_FILE): { - if (size > MAX_FILE_NAME) { + if (size > config::MAX_FILENAME_SIZE) { return FILENAME_TOO_LONG; } strHelper->setDownloadImageName( @@ -168,14 +168,14 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu return EXECUTION_FINISHED; } case(StarTracker::CHANGE_FPGA_DOWNLOAD_FILE): { - if (size > MAX_FILE_NAME) { + if (size > config::MAX_FILENAME_SIZE) { return FILENAME_TOO_LONG; } strHelper->setDownloadFpgaImage(std::string(reinterpret_cast(data), size)); return EXECUTION_FINISHED; } case(StarTracker::SET_READ_FILENAME): { - if (size > MAX_FILE_NAME) { + if (size > config::MAX_FILENAME_SIZE) { return FILENAME_TOO_LONG; } strHelper->setDownloadImageName( @@ -187,7 +187,7 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu if (result != RETURN_OK) { return result; } - if (size > MAX_PATH_SIZE) { + if (size > config::MAX_PATH_SIZE) { return FILE_PATH_TOO_LONG; } result = executeFpgaDownloadCommand(data, size); @@ -202,7 +202,7 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu if (result != RETURN_OK) { return result; } - if (size > MAX_PATH_SIZE + MAX_FILE_NAME) { + if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) { return FILE_PATH_TOO_LONG; } result = strHelper->startFpgaUpload(std::string(reinterpret_cast(data), size)); @@ -1170,7 +1170,7 @@ ReturnValue_t StarTrackerHandler::executeWriteCommand(const uint8_t* commandData << std::endl; return result; } - if (commandDataLen - sizeof(address) - sizeof(region) > MAX_PATH_SIZE) { + if (commandDataLen - sizeof(address) - sizeof(region) > config::MAX_PATH_SIZE) { sif::warning << "StarTrackerHandler::executeWriteCommand: Received command with invalid" << " path and filename" << std::endl; return FILE_PATH_TOO_LONG; @@ -1211,7 +1211,7 @@ ReturnValue_t StarTrackerHandler::executeFpgaDownloadCommand(const uint8_t* comm << std::endl; return result; } - if (commandDataLen - sizeof(position) - sizeof(length) > MAX_PATH_SIZE) { + if (commandDataLen - sizeof(position) - sizeof(length) > config::MAX_PATH_SIZE) { sif::warning << "StarTrackerHandler::executeFpgaDownloadCommand: Received command with " " invalid path and filename" << std::endl; return FILE_PATH_TOO_LONG; @@ -1253,7 +1253,7 @@ ReturnValue_t StarTrackerHandler::executeReadCommand(const uint8_t* commandData, << std::endl; return result; } - if (commandDataLen - sizeof(address) - sizeof(region) - sizeof(length) > MAX_PATH_SIZE) { + if (commandDataLen - sizeof(address) - sizeof(region) - sizeof(length) > config::MAX_PATH_SIZE) { sif::warning << "StarTrackerHandler::executeReadCommand: Received command with invalid" << " path and filename" << std::endl; return FILE_PATH_TOO_LONG; @@ -1397,7 +1397,7 @@ ReturnValue_t StarTrackerHandler::prepareDownloadCentroidCommand(const uint8_t* ReturnValue_t StarTrackerHandler::prepareUploadCentroidCommand(const uint8_t* commandData, size_t commandDataLen) { - if (commandDataLen > MAX_PATH_SIZE) { + if (commandDataLen > config::MAX_PATH_SIZE) { return FILE_PATH_TOO_LONG; } ReturnValue_t result = RETURN_OK; @@ -1616,7 +1616,7 @@ void StarTrackerHandler::prepareErrorResetRequest() { ReturnValue_t StarTrackerHandler::prepareParamCommand(const uint8_t* commandData, size_t commandDataLen, ArcsecJsonParamBase& paramSet) { ReturnValue_t result = RETURN_OK; - if (commandDataLen > MAX_PATH_SIZE) { + if (commandDataLen > config::MAX_PATH_SIZE) { return FILE_PATH_TOO_LONG; } std::string fullName(reinterpret_cast(commandData), commandDataLen); diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.h b/bsp_q7s/devices/startracker/StarTrackerHandler.h index 65bd65b8..2f58a145 100644 --- a/bsp_q7s/devices/startracker/StarTrackerHandler.h +++ b/bsp_q7s/devices/startracker/StarTrackerHandler.h @@ -78,8 +78,8 @@ private: static const ReturnValue_t REPLY_TOO_SHORT = MAKE_RETURN_CODE(0xB0); //! [EXPORT] : [COMMENT] Received reply with invalid CRC static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xB1); - //! [EXPORT] : [COMMENT] Image loader executing - static const ReturnValue_t IMAGE_LOADER_EXECUTING = MAKE_RETURN_CODE(0xB2); + //! [EXPORT] : [COMMENT] Star tracker helper class currently executing a command + static const ReturnValue_t STR_HELPER_EXECUTING = MAKE_RETURN_CODE(0xB2); static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::STR_HANDLER; diff --git a/bsp_q7s/devices/startracker/StrHelper.cpp b/bsp_q7s/devices/startracker/StrHelper.cpp index 0be38ad7..8e1f2622 100644 --- a/bsp_q7s/devices/startracker/StrHelper.cpp +++ b/bsp_q7s/devices/startracker/StrHelper.cpp @@ -1,7 +1,6 @@ #include "StrHelper.h" - #include "mission/utility/Timestamp.h" - +#include "bsp_q7s/memory/FilesystemHelper.h" #include #include @@ -117,7 +116,7 @@ void StrHelper::setComCookie(CookieIF* comCookie_) { } ReturnValue_t StrHelper::startImageUpload(std::string fullname) { - ReturnValue_t result = checkPath(fullname); + ReturnValue_t result = FilesystemHelper::checkPath(fullname); if (result != RETURN_OK) { return result; } @@ -132,7 +131,7 @@ ReturnValue_t StrHelper::startImageUpload(std::string fullname) { } ReturnValue_t StrHelper::startImageDownload(std::string path) { - ReturnValue_t result = checkPath(path); + ReturnValue_t result = FilesystemHelper::checkPath(path); if (result != RETURN_OK) { return result; } @@ -164,7 +163,7 @@ void StrHelper::setDownloadFpgaImage(std::string filename) { ReturnValue_t StrHelper::startFlashWrite(std::string fullname, uint8_t region, uint32_t address) { - ReturnValue_t result = checkPath(fullname); + ReturnValue_t result = FilesystemHelper::checkPath(fullname); if (result != RETURN_OK) { return result; } @@ -182,7 +181,7 @@ ReturnValue_t StrHelper::startFlashWrite(std::string fullname, uint8_t region, ReturnValue_t StrHelper::startFlashRead(std::string path, uint8_t region, uint32_t address, uint32_t length) { - ReturnValue_t result = checkPath(path); + ReturnValue_t result = FilesystemHelper::checkPath(path); if (result != RETURN_OK) { return result; } @@ -683,20 +682,3 @@ ReturnValue_t StrHelper::checkFpgaActionReply(uint32_t expectedPosition, } return result; } - -ReturnValue_t StrHelper::checkPath(std::string name) { - if (name.substr(0, sizeof(SdCardManager::SD_0_MOUNT_POINT)) - == std::string(SdCardManager::SD_0_MOUNT_POINT)) { - if (!sdcMan->isSdCardMounted(sd::SLOT_0)) { - sif::warning << "StrHelper::checkPath: SD card 0 not mounted" << std::endl; - return SD_NOT_MOUNTED; - } - } else if (name.substr(0, sizeof(SdCardManager::SD_1_MOUNT_POINT)) - == std::string(SdCardManager::SD_1_MOUNT_POINT)) { - if (!sdcMan->isSdCardMounted(sd::SLOT_0)) { - sif::warning << "StrHelper::checkPath: SD card 1 not mounted" << std::endl; - return SD_NOT_MOUNTED; - } - } - return RETURN_OK; -} diff --git a/bsp_q7s/devices/startracker/StrHelper.h b/bsp_q7s/devices/startracker/StrHelper.h index 7f8ba654..c8aa7393 100644 --- a/bsp_q7s/devices/startracker/StrHelper.h +++ b/bsp_q7s/devices/startracker/StrHelper.h @@ -60,11 +60,11 @@ public: //!P1: Position of upload or download packet for which no reply was sent static const Event STR_HELPER_NO_REPLY = MAKE_EVENT(14, severity::LOW); //! [EXPORT] : [COMMENT] Error during decoding of received reply occurred - //P1: Return value of decoding function - //P2: Position of upload/download packet, or address of flash write/read request + //!P1: Return value of decoding function + //!P2: Position of upload/download packet, or address of flash write/read request static const Event STR_HELPER_DEC_ERROR = MAKE_EVENT(15, severity::LOW); //! [EXPORT] : [COMMENT] Position mismatch - //! P1: The expected position and thus the position for which the image upload/download failed + //!P1: The expected position and thus the position for which the image upload/download failed static const Event POSITION_MISMATCH = MAKE_EVENT(16, severity::LOW); //! [EXPORT] : [COMMENT] Specified file does not exist //!P1: Internal state of str helper @@ -163,8 +163,6 @@ private: static const uint8_t INTERFACE_ID = CLASS_ID::STR_HELPER; - //! [EXPORT] : [COMMENT] SD card specified in path string not mounted - static const ReturnValue_t SD_NOT_MOUNTED = MAKE_RETURN_CODE(0xA0); //! [EXPORT] : [COMMENT] Specified file does not exist on filesystem static const ReturnValue_t FILE_NOT_EXISTS = MAKE_RETURN_CODE(0xA1); //! [EXPORT] : [COMMENT] Specified path does not exist @@ -382,13 +380,6 @@ private: * @param expectedLength The expected length field in the reply */ ReturnValue_t checkFpgaActionReply(uint32_t expectedPosition, uint32_t expectedLength); - - /** - * @brief Checks if a path points to an sd card and whether the SD card is monuted. - * - * @return SD_NOT_MOUNTED id SD card is not mounted, otherwise RETURN_OK - */ - ReturnValue_t checkPath(std::string name); }; #endif /* BSP_Q7S_DEVICES_STRHELPER_H_ */ diff --git a/bsp_q7s/memory/FilesystemHelper.cpp b/bsp_q7s/memory/FilesystemHelper.cpp new file mode 100644 index 00000000..7413541f --- /dev/null +++ b/bsp_q7s/memory/FilesystemHelper.cpp @@ -0,0 +1,34 @@ +#include "FilesystemHelper.h" +#include "bsp_q7s/memory/SdCardManager.h" + +FilesystemHelper::FilesystemHelper() { +} + +FilesystemHelper::~FilesystemHelper() { +} + +ReturnValue_t FilesystemHelper::checkPath(std::string path) { + SdCardManager sdcMan = SdCardManager::instance(); + if (sdcMan == nullptr) { + sif::warning << "FilesystemHelper::checkPath: Invalid SD card manager" << std::endl; + return RETURN_FAILED; + } + if (path.substr(0, sizeof(SdCardManager::SD_0_MOUNT_POINT)) + == std::string(SdCardManager::SD_0_MOUNT_POINT)) { + if (!sdcMan->isSdCardMounted(sd::SLOT_0)) { + sif::warning << "FilesystemHelper::checkPath: SD card 0 not mounted" << std::endl; + return SD_NOT_MOUNTED; + } + } else if (path.substr(0, sizeof(SdCardManager::SD_1_MOUNT_POINT)) + == std::string(SdCardManager::SD_1_MOUNT_POINT)) { + if (!sdcMan->isSdCardMounted(sd::SLOT_0)) { + sif::warning << "FilesystemHelper::checkPath: SD card 1 not mounted" << std::endl; + return SD_NOT_MOUNTED; + } + } + return RETURN_OK; +} + +ReturnValue_t FilesystemHelper::fileExists(std::string file) { + +} diff --git a/bsp_q7s/memory/FilesystemHelper.h b/bsp_q7s/memory/FilesystemHelper.h new file mode 100644 index 00000000..4efe74c0 --- /dev/null +++ b/bsp_q7s/memory/FilesystemHelper.h @@ -0,0 +1,47 @@ +#ifndef BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_ +#define BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_ + +#include "fsfw/returnvalues/HasReturnvaluesIF.h" + +/** + * @brief This class implements often used functions concerning the file system management. + * + * @author J. Meier + */ +class FilesystemHelper : public HasReturnvaluesIF { +public: + + static const uint8_t INTERFACE_ID = CLASS_ID::FILE_SYSTEM_HELPER; + + //! [EXPORT] : [COMMENT] SD card specified with path string not mounted + static const ReturnValue_t SD_NOT_MOUNTED = MAKE_RETURN_CODE(0xA0); + //! [EXPORT] : [COMMENT] Specified file does not exist on filesystem + static const ReturnValue_t FILE_NOT_EXISTS = MAKE_RETURN_CODE(0xA1); + + FilesystemHelper(); + virtual ~FilesystemHelper(); + + /** + * @brief In case the path points to a directory on the sd card the function checks if the + * appropriate SD card is mounted. + * + * @param path Path to check + * + * @return RETURN_OK if path points to SD card and the appropriate SD card is mounted or if + * path does not point to SD card. + * Return error code if path points to SD card and the corresponding SD card is not + * mounted. + */ + static const ReturnValue_t checkPath(std::string path); + + /** + * @brief Checks if the file exists on the filesystem. + * + * param file File to check + * + * @return RETURN_OK if fiel exists, otherwise return error code. + */ + static const ReturnValue_t fileExists(std::string file); +}; + +#endif /* BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_ */ diff --git a/common/config/commonClassIds.h b/common/config/commonClassIds.h index 06ee63b6..aff16097 100644 --- a/common/config/commonClassIds.h +++ b/common/config/commonClassIds.h @@ -15,6 +15,7 @@ enum commonClassIds: uint8_t { STR_HANDLER, //STRH PLOC_MPSOC_HANDLER, //PLMP MPSOC_CMD, //MPCMD + MPSOC_TM, //MPTM PLOC_SUPERVISOR_HANDLER, //PLSV SUS_HANDLER, //SUSS CCSDS_IP_CORE_BRIDGE, //IPCI @@ -27,6 +28,8 @@ enum commonClassIds: uint8_t { CCSDS_HANDLER, //CCSDS ARCSEC_JSON_BASE, //JSONBASE NVM_PARAM_BASE, //NVMB + FILE_SYSTEM_HELPER, //FSHLP + PLOC_MPSOC_HELPER, // PLMPHLP COMMON_CLASS_ID_END // [EXPORT] : [END] }; diff --git a/common/config/commonSubsystemIds.h b/common/config/commonSubsystemIds.h index 55a4bed4..2e07f887 100644 --- a/common/config/commonSubsystemIds.h +++ b/common/config/commonSubsystemIds.h @@ -19,6 +19,7 @@ enum: uint8_t { PLOC_MEMORY_DUMPER = 118, PDEC_HANDLER = 119, STR_HELPER = 120, + PLOC_MPSOC_HELPER = 121, COMMON_SUBSYSTEM_ID_END }; } diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index 4a7bca35..30192ead 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -131,8 +131,9 @@ namespace config { /* Add mission configuration flags here */ static constexpr uint32_t OBSW_FILESYSTEM_HANDLER_QUEUE_SIZE = 50; static constexpr uint32_t PLOC_UPDATER_QUEUE_SIZE = 50; -static constexpr uint32_t STR_IMG_HELPER_QUEUE_SIZE = 50; - +/* Global config values to check validity of received file path strings and filenames */ +static constexpr uint32_t MAX_PATH_SIZE = 100; +static constexpr uint32_t MAX_FILENAME_SIZE = 50; static constexpr uint8_t LIVE_TM = 0; #ifdef __cplusplus diff --git a/tmtc b/tmtc index 734dc5ae..5816f05c 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 734dc5aef88d9fef4ad59817b6ea315db954205c +Subproject commit 5816f05ccf8971f3cf2dd1d603dd3f5a33f6f504 From f8eebe2e7dbc652e9babc183c0019aa61fa9203a Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Fri, 7 Jan 2022 09:48:56 +0100 Subject: [PATCH 006/309] flash write wip --- bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp | 56 --------------------- bsp_q7s/devices/ploc/MPSoCSequenceCount.h | 48 ------------------ 2 files changed, 104 deletions(-) delete mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp delete mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.h diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp b/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp deleted file mode 100644 index 88b66ad0..00000000 --- a/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "MPSoCSequenceCount.h" - -MPSoCSequenceCount::MPSoCSequenceCount() { -} - -MPSoCSequenceCount::~MPSoCSequenceCount() { -} - -MPSoCSequenceCount::increment() { - ReturnValue_t result = RETURN_OK; - result = spiMutex->lockMutex(timeoutType, timeoutMs); - if (result != RETURN_OK) { - sif::warning << "MPSoCSequenceCount::increment: Failed to lock mutex" << std::endl; - return result; - } - sequenceCount = (sequenceCount + 1) & SEQUENCE_COUNT_MASK; - result = spiMutex->unlockMutex(timeoutType, timeoutMs); - if (result != RETURN_OK) { - sif::warning << "MPSoCSequenceCount::increment: Failed to unlock mutex" << std::endl; - return result; - } -} - -MPSoCSequenceCount::set(uint16_t sequenceCount_) { - ReturnValue_t result = RETURN_OK; - result = spiMutex->lockMutex(timeoutType, timeoutMs); - if (result != RETURN_OK) { - sif::warning << "MPSoCSequenceCount::set: Failed to lock mutex" << std::endl; - return result; - } - sequenceCount = sequenceCount_; - result = spiMutex->unlockMutex(timeoutType, timeoutMs); - if (result != RETURN_OK) { - sif::warning << "MPSoCSequenceCount::set: Failed to unlock mutex" << std::endl; - return result; - } -} - -MPSoCSequenceCount::reset() { - ReturnValue_t result = RETURN_OK; - result = spiMutex->lockMutex(timeoutType, timeoutMs); - if (result != RETURN_OK) { - sif::warning << "MPSoCSequenceCount::reset: Failed to lock mutex" << std::endl; - return result; - } - sequenceCount = 0; - result = spiMutex->unlockMutex(timeoutType, timeoutMs); - if (result != RETURN_OK) { - sif::warning << "MPSoCSequenceCount::reset: Failed to unlock mutex" << std::endl; - return result; - } -} - -uint16_t MPSoCSequenceCount::get() { - return sequenceCount; -} diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.h b/bsp_q7s/devices/ploc/MPSoCSequenceCount.h deleted file mode 100644 index 57587d0a..00000000 --- a/bsp_q7s/devices/ploc/MPSoCSequenceCount.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ -#define BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ - -/** - * @brief Manages incrementing, resetting and harmonization of the sequence count in the space - * packet based communication between MPSoC and OBC. - * - * @author J. Meier - */ -class MPSoCSequenceCount { -public: - MPSoCSequenceCount(); - virtual ~MPSoCSequenceCount(); - - /** - * @brief Increments the sequence count. - */ - void increment(); - - /** - * @brief Sets the value of the sequence count - * - * @param sequenceCount The sequence count to set - */ - void set(uint16_t sequenceCount_); - - /** - * @brief Resets the sequence count to zero - */ - void reset(); - - /** - * @brief Returns the current value sequence count - */ - uint16_t get(); - -private: - - MutexIF* spiMutex = nullptr; - MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING; - uint32_t timeoutMs = 20; - - static const uint16_t SEQUENCE_COUNT_MASK = 0x3FFF; - - uint16_t sequenceCount = 0x3FFF; -}; - -#endif /* BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ */ From 45c7f9555d597b045feed4590a2490e15547d9fb Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Fri, 7 Jan 2022 09:50:04 +0100 Subject: [PATCH 007/309] flash write wip --- bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp | 37 ++++++++++++++--- bsp_q7s/devices/ploc/PlocMPSoCHandler.h | 12 ++++-- bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp | 40 +++++++++++-------- bsp_q7s/devices/ploc/PlocMPSoCHelper.h | 12 +++--- .../startracker/StarTrackerHandler.cpp | 2 +- bsp_q7s/memory/CMakeLists.txt | 1 + common/config/commonObjects.h | 3 +- 7 files changed, 73 insertions(+), 34 deletions(-) diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp index c9daad77..6842d9b1 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp @@ -58,6 +58,22 @@ EventManagerIF* manager = ObjectManager::instance()->get( return result; } +void PlocMPSoCHandler::performOperationHook() { + EventMessage event; + for (ReturnValue_t result = eventQueue->receiveMessage(&event); + result == RETURN_OK; result = eventQueue->receiveMessage(&event)) { + switch (event.getMessageId()) { + case EventMessage::EVENT_MESSAGE: + handleEvent(&event); + break; + default: + sif::debug << "PlocMPSoCHandler::performOperationHook: Did not subscribe to this event" + << " message" << std::endl; + break; + } + } +} + ReturnValue_t PlocMPSoCHandler::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) { ReturnValue_t result = RETURN_OK; @@ -234,6 +250,20 @@ ReturnValue_t PlocMPSoCHandler::initializeLocalDataPool(localpool::DataPool& loc return HasReturnvaluesIF::RETURN_OK; } +void PlocMPSoCHandler::handleEvent(EventMessage* eventMessage) { + object_id_t objectId = eventMessage->getReporter(); + switch(objectId){ + case objects::PLOC_MPSOC_HELPER: { + plocMPSoCHelperExecuting = false; + break; + } + default: + sif::debug << "PlocMPSoCHandler::handleEvent: Did not subscribe to this event" + << std::endl; + break; + } +} + ReturnValue_t PlocMPSoCHandler::prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; @@ -553,21 +583,16 @@ void PlocMPSoCHandler::disableAllReplies() { } void PlocMPSoCHandler::sendFailureReport(DeviceCommandId_t replyId, ReturnValue_t status) { - DeviceReplyIter iter = deviceReplyMap.find(replyId); - if (iter == deviceReplyMap.end()) { sif::debug << "PlocMPSoCHandler::sendFailureReport: Reply not in reply map" << std::endl; return; } - DeviceCommandInfo* info = &(iter->second.command->second); - if (info == nullptr) { sif::debug << "PlocMPSoCHandler::sendFailureReport: Reply has no active command" << std::endl; return; } - if (info->sendReplyTo != NO_COMMANDER) { actionHelper.finish(false, info->sendReplyTo, iter->first, status); } @@ -592,6 +617,6 @@ ReturnValue_t PlocMPSoCHandler::checkPacketSequenceCount(const uint8_t* data) { << expectedSeqCnt << std::endl; triggerEvent(SEQ_CNT_MISMATCH, expectedSeqCnt, receivedSeqCnt); } - sequenceCount.set(receivedSeqCnt); + sequenceCount.reset(receivedSeqCnt); return RETURN_OK; } diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h index 55be8102..3fef3a58 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h @@ -2,9 +2,9 @@ #define BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ #include "fsfw/devicehandlers/DeviceHandlerBase.h" -#include "devicedefinitions/PlocMPSoCDefinitions.h" +#include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" #include "fsfw_hal/linux/uart/UartComIF.h" -#include "MPSoCSequenceCount.h" +#include "fsfw/tmtcservices/SourceSequenceCounter.h" #include "PlocMPSoCHelper.h" #include @@ -47,6 +47,7 @@ public: virtual ReturnValue_t initialize() override; ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) override; + void performOperationHook() override; protected: void doStartUp() override; @@ -88,7 +89,7 @@ private: static const uint16_t APID_MASK = 0x7FF; - MPSoCSequenceCount sequenceCount; + SourceSequenceCounter sequenceCount; uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE]; @@ -106,6 +107,11 @@ private: // Used to block incoming commands when MPSoC helper class is currently executing a command bool plocMPSoCHelperExecuting = false; + /** + * @brief Handles events received from the PLOC MPSoC helper + */ + void handleEvent(EventMessage* eventMessage); + ReturnValue_t prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen); ReturnValue_t prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen); ReturnValue_t prepareFlashFopenCmd(const uint8_t * commandData, size_t commandDataLen); diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp index 06151c33..4511c881 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp @@ -1,5 +1,6 @@ #include "PlocMPSoCHelper.h" #include "mission/utility/Timestamp.h" +#include "bsp_q7s/memory/FileSystemHelper.h" #include #include @@ -59,7 +60,7 @@ void PlocMPSoCHelper::setComCookie(CookieIF* comCookie_) { comCookie = comCookie_; } -void PlocMPSoCHelper::setSequenceCount(MPSoCSequenceCount* sequenceCount_) { +void PlocMPSoCHelper::setSequenceCount(SourceSequenceCounter* sequenceCount_) { sequenceCount = sequenceCount_; } @@ -89,11 +90,11 @@ ReturnValue_t PlocMPSoCHelper::performFlashWrite() { // Set position of next character to end of file input stream file.seekg(0, file.end); // tellg returns position of character in input stream - imageSize = file.tellg(); + size_t imageSize = file.tellg(); sequenceCount->increment(); mpsoc::FlashWrite tc(sequenceCount->get()); - result = sendCommand(tc); - if (result != REUTRN_OK) { + result = sendCommand(&tc); + if (result != RETURN_OK) { return result; } result = handleAck(); @@ -107,12 +108,12 @@ ReturnValue_t PlocMPSoCHelper::performFlashWrite() { return result; } -ReturnValue_t PlocMPSoCHelper::sendCommand(TcBase* tc) { +ReturnValue_t PlocMPSoCHelper::sendCommand(mpsoc::TcBase* tc) { ReturnValue_t result = RETURN_OK; result = uartComIF->sendMessage(comCookie, tc->getWholeData(), tc->getFullSize()); if (result != RETURN_OK) { sif::warning << "PlocMPSoCHelper::sendCommand: Failed to send command" << std::endl; - triggerEvent(SENDING_COMMAND_FAILED, result, internalState); + triggerEvent(SENDING_COMMAND_FAILED, result, static_cast(internalState)); return result; } return result; @@ -121,7 +122,7 @@ ReturnValue_t PlocMPSoCHelper::sendCommand(TcBase* tc) { ReturnValue_t PlocMPSoCHelper::handleAck() { ReturnValue_t result = RETURN_OK; mpsoc::TmPacket tmPacket; - result = handleTmReception(tmPacket, mpsoc::SIZE_ACK_REPORT); + result = handleTmReception(&tmPacket, mpsoc::SIZE_ACK_REPORT); if (result != RETURN_OK) { return result; } @@ -135,12 +136,12 @@ ReturnValue_t PlocMPSoCHelper::handleAck() { void PlocMPSoCHelper::handleAckApidFailure(uint16_t apid) { if (apid == mpsoc::apid::ACK_FAILURE) { - triggerEvent(ACK_FAILURE_REPORT, internalState); + triggerEvent(ACK_FAILURE_REPORT, static_cast(internalState)); sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Received acknowledgement failure " << "report" << std::endl; } else { - triggerEvent(ACK_INVALID_APID, apid, internalState); + triggerEvent(ACK_INVALID_APID, apid, static_cast(internalState)); sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Expected acknowledgement report " << "but received space packet with apid " << std::hex << apid << std::endl; } @@ -149,7 +150,7 @@ void PlocMPSoCHelper::handleAckApidFailure(uint16_t apid) { ReturnValue_t PlocMPSoCHelper::handleExe() { ReturnValue_t result = RETURN_OK; mpsoc::TmPacket tmPacket; - result = handleTmReception(tmPacket, mpsoc::SIZE_EXE_REPORT); + result = handleTmReception(&tmPacket, mpsoc::SIZE_EXE_REPORT); if (result != RETURN_OK) { return result; } @@ -163,21 +164,22 @@ ReturnValue_t PlocMPSoCHelper::handleExe() { void PlocMPSoCHelper::handleExeApidFailure(uint16_t apid) { if (apid == mpsoc::apid::EXE_FAILURE) { - triggerEvent(EXE_FAILURE_REPORT, internalState); + triggerEvent(EXE_FAILURE_REPORT, static_cast(internalState)); sif::warning << "PlocMPSoCHelper::handleExeApidFailure: Received execution failure " << "report" << std::endl; } else { - triggerEvent(EXE_INVALID_APID, apid, internalState); + triggerEvent(EXE_INVALID_APID, apid, static_cast(internalState)); sif::warning << "PlocMPSoCHelper::handleAckApidFailure: Expected execution report " << "but received space packet with apid " << std::hex << apid << std::endl; } } -ReturnValue_t PlocMPSoCHelper::handleTmReception(TmPacket* tmPacket, size_t remainingBytes) { +ReturnValue_t PlocMPSoCHelper::handleTmReception(mpsoc::TmPacket* tmPacket, size_t remainingBytes) { + ReturnValue_t result = RETURN_OK; size_t readBytes = 0; for(int retries = 0; retries < RETRIES; retries++) { - result = receive(tmPacket->getWholeData(), readBytes, remainingBytes); + result = receive(tmPacket->getWholeData(), &readBytes, remainingBytes); if (result != RETURN_OK) { return result; } @@ -188,7 +190,7 @@ ReturnValue_t PlocMPSoCHelper::handleTmReception(TmPacket* tmPacket, size_t rema } if (remainingBytes != 0) { sif::warning << "PlocMPSoCHelper::handleTmReception: Failed to receive reply" << std::endl; - triggerEvent(MISSING_EXE, remainingBytes, internalState); + triggerEvent(MISSING_EXE, remainingBytes, static_cast(internalState)); return RETURN_FAILED; } result = tmPacket->checkCrc(); @@ -196,6 +198,7 @@ ReturnValue_t PlocMPSoCHelper::handleTmReception(TmPacket* tmPacket, size_t rema sif::warning << "PlocMPSoCHelper::handleTmReception: CRC check failed" << std::endl; return result; } + return result; } ReturnValue_t PlocMPSoCHelper::receive(uint8_t* data, size_t* readBytes, size_t requestBytes) { @@ -203,13 +206,16 @@ ReturnValue_t PlocMPSoCHelper::receive(uint8_t* data, size_t* readBytes, size_t result = uartComIF->requestReceiveMessage(comCookie, requestBytes); if (result != RETURN_OK) { sif::warning << "PlocMPSoCHelper::receive: Failed to request reply" << std::endl; - triggerEvent(MPSOC_HELPER_REQUESTING_REPLY_FAILED, result, internalState); + triggerEvent(MPSOC_HELPER_REQUESTING_REPLY_FAILED, result, + static_cast(static_cast(internalState))); return RETURN_FAILED; } result = uartComIF->readReceivedMessage(comCookie, &data, readBytes); if (result != RETURN_OK) { sif::warning << "PlocMPSoCHelper::receive: Failed to read received message" << std::endl; - triggerEvent(MPSOC_HELPER_READING_REPLY_FAILED, result, internalState); + triggerEvent(MPSOC_HELPER_READING_REPLY_FAILED, result, + static_cast(internalState)); return RETURN_FAILED; } + return result; } diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h index ee399a51..0655e2cc 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h @@ -10,7 +10,7 @@ #include "fsfw_hal/linux/uart/UartComIF.h" #include "fsfw/devicehandlers/CookieIF.h" #include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" -#include "MPSoCSequenceCount.h" +#include "fsfw/tmtcservices/SourceSequenceCounter.h" /** * @brief Helper class for MPSoC of PLOC intended to accelerate large data transfers between @@ -37,7 +37,7 @@ public: //! [EXPORT] : [COMMENT] Reading receive message of communication interface failed //!P1: Return value returned by the communication interface readingReceivedMessage function //!P2: Internal state of MPSoC helper - static const Event MPSOC_HELPER_REQUESTING_REPLY_FAILED = MAKE_EVENT(4, severity::LOW); + static const Event MPSOC_HELPER_READING_REPLY_FAILED = MAKE_EVENT(4, severity::LOW); //! [EXPORT] : [COMMENT] Did not receive acknowledgement report //!P1: Number of bytes missing //!P2: Internal state of MPSoC helper @@ -87,7 +87,7 @@ public: /** * @brief Sets the sequence count object responsible for the sequence count handling */ - void setSequenceCount(MPSoCSequenceCount* sequenceCount_); + void setSequenceCount(SourceSequenceCounter* sequenceCount_); private: @@ -128,16 +128,16 @@ private: // Communication cookie. Must be set by the MPSoC Handler CookieIF* comCookie = nullptr; // Sequence count, must be set by Ploc MPSoC Handler - MPSoCSequenceCount* sequenceCount; + SourceSequenceCounter* sequenceCount; ReturnValue_t performFlashWrite(); - ReturnValue_t sendCommand(TcBase* tc); + ReturnValue_t sendCommand(mpsoc::TcBase* tc); ReturnValue_t receive(uint8_t* data, size_t* readBytes, size_t requestBytes); ReturnValue_t handleAck(); ReturnValue_t handleExe(); void handleAckApidFailure(uint16_t apid); void handleExeApidFailure(uint16_t apid); - ReturnValue_t handleTmReception(TmPacket* tmPacket, size_t remainingBytes); + ReturnValue_t handleTmReception(mpsoc::TmPacket* tmPacket, size_t remainingBytes); }; #endif /* BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ */ diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp index 85fb415b..52eb8c9b 100644 --- a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp +++ b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp @@ -227,7 +227,7 @@ void StarTrackerHandler::performOperationHook() { handleEvent(&event); break; default: - sif::debug << "CCSDSHandler::checkEvents: Did not subscribe to this event message" + sif::debug << "StarTrackerHandler::checkEvents: Did not subscribe to this event message" << std::endl; break; } diff --git a/bsp_q7s/memory/CMakeLists.txt b/bsp_q7s/memory/CMakeLists.txt index 6c7d0a94..d3aba9f3 100644 --- a/bsp_q7s/memory/CMakeLists.txt +++ b/bsp_q7s/memory/CMakeLists.txt @@ -2,4 +2,5 @@ target_sources(${TARGET_NAME} PRIVATE FileSystemHandler.cpp SdCardManager.cpp scratchApi.cpp + FilesystemHelper.cpp ) \ No newline at end of file diff --git a/common/config/commonObjects.h b/common/config/commonObjects.h index cce3616f..791031a9 100644 --- a/common/config/commonObjects.h +++ b/common/config/commonObjects.h @@ -91,7 +91,8 @@ enum commonObjects: uint32_t { PLOC_UPDATER = 0x44330000, PLOC_MEMORY_DUMPER = 0x44330001, - STR_HELPER = 0x44330002 + STR_HELPER = 0x44330002, + PLOC_MPSOC_HELPER = 0x44330003 }; } From 0f0f5e2fcb957e72faa4efeadd841e4d7da963e5 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Mon, 10 Jan 2022 16:18:18 +0100 Subject: [PATCH 008/309] mpsoc sequence count restructured --- bsp_q7s/core/InitMission.cpp | 26 ++++++++-- bsp_q7s/core/ObjectFactory.cpp | 3 +- .../devicedefinitions/PlocMPSoCDefinitions.h | 5 +- bsp_q7s/devices/ploc/CMakeLists.txt | 1 + bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp | 18 +++++++ bsp_q7s/devices/ploc/MPSoCSequenceCount.h | 21 ++++++++ bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp | 43 +++++++-------- bsp_q7s/devices/ploc/PlocMPSoCHandler.h | 27 +++------- bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp | 52 +++++++++++++------ bsp_q7s/devices/ploc/PlocMPSoCHelper.h | 12 +++-- bsp_q7s/memory/FilesystemHelper.cpp | 10 +++- bsp_q7s/memory/FilesystemHelper.h | 5 +- .../Q7S/win_path_helper_xilinx_tools.sh | 4 +- 13 files changed, 151 insertions(+), 76 deletions(-) create mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp create mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.h diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index 7977deed..39441975 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -129,13 +129,23 @@ void initmission::initTasks() { #if OBSW_ADD_STAR_TRACKER == 1 PeriodicTaskIF* strImgLoaderTask = factory->createPeriodicTask( - "FILE_SYSTEM_TASK", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc); + "STR_HELPER_TASK", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc); result = strImgLoaderTask->addComponent(objects::STR_HELPER); if(result != HasReturnvaluesIF::RETURN_OK) { - initmission::printAddObjectError("FILE_SYSTEM_TASK", objects::STR_HELPER); + initmission::printAddObjectError("STR_HELPER_TASK", objects::STR_HELPER); } #endif /* OBSW_ADD_STAR_TRACKER == 1 */ +#if OBSW_ADD_PLOC_MPSOC == 1 + PeriodicTaskIF* plocMPSoCHelperTask = factory->createPeriodicTask( + "PLOC_MPSOC_HELPER_TASK", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc); + result = plocMPSoCHelperTask->addComponent(objects::PLOC_MPSOC_HELPER); + if(result != HasReturnvaluesIF::RETURN_OK) { + initmission::printAddObjectError("PLOC_MPSOC_HELPER_TASK", objects::PLOC_MPSOC_HELPER); + } +#endif /* OBSW_ADD_PLOC_MPSOC == 1 */ + + #endif /* BOARD_TE0720 */ #if OBSW_TEST_CCSDS_BRIDGE == 1 @@ -336,7 +346,7 @@ void initmission::createPusTasks(TaskFactory &factory, void initmission::createTestTasks(TaskFactory& factory, TaskDeadlineMissedFunction missedDeadlineFunc, std::vector& taskVec) { -#if OBSW_ADD_TEST_TASK == 1 || OBSW_ADD_SPI_TEST_CODE == 1 || (BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1) +#if OBSW_ADD_TEST_TASK == 1 || OBSW_ADD_SPI_TEST_CODE == 1 || (BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1) || OBSW_ADD_PLOC_MPSOC == 1 ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; #endif PeriodicTaskIF* testTask = factory.createPeriodicTask( @@ -360,5 +370,15 @@ void initmission::createTestTasks(TaskFactory& factory, TaskDeadlineMissedFuncti initmission::printAddObjectError("GPIOD_TEST", objects::LIBGPIOD_TEST); } #endif /* BOARD_TE0720 == 1 && OBSW_TEST_LIBGPIOD == 1 */ + +#if OBSW_ADD_PLOC_MPSOC == 1 + PeriodicTaskIF* plocMPSoCHelperTask = factory.createPeriodicTask( + "PLOC_MPSOC_HELPER_TASK", 20, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc); + result = plocMPSoCHelperTask->addComponent(objects::PLOC_MPSOC_HELPER); + if(result != HasReturnvaluesIF::RETURN_OK) { + initmission::printAddObjectError("PLOC_MPSOC_HELPER_TASK", objects::PLOC_MPSOC_HELPER); + } +#endif /* OBSW_ADD_PLOC_MPSOC == 1 */ + taskVec.push_back(testTask); } diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 3db0d607..845eaf03 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -1076,9 +1076,10 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { #if BOARD_TE0720 == 1 && OBSW_ADD_PLOC_MPSOC == 1 UartCookie* plocUartCookie = new UartCookie(objects::PLOC_MPSOC_HANDLER, "/dev/ttyUL1", UartModes::NON_CANONICAL, uart::PLOC_MPSOC_BAUD, mpsoc::MAX_REPLY_SIZE); + PlocMPSoCHelper* plocMPSoCHelper = new PlocMPSoCHelper(objects::PLOC_MPSOC_HELPER); /* Testing PlocMPSoCHandler on TE0720-03-1CFA */ PlocMPSoCHandler* mpsocPlocHandler = new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, - objects::UART_COM_IF, plocUartCookie); + objects::UART_COM_IF, plocUartCookie, plocMPSoCHelper); mpsocPlocHandler->setStartUpImmediately(); #endif diff --git a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h index 4b169d5f..a57b3c26 100644 --- a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h @@ -4,7 +4,6 @@ #include #include #include -#include namespace mpsoc { @@ -150,10 +149,10 @@ public: } ReturnValue_t checkCrc() { - uint8_t crcPtr = this->getPacketData() + this->getPacketDataLength() - 1; + uint8_t* crcPtr = this->getPacketData() + this->getPacketDataLength() - 1; uint16_t receivedCrc = *(crcPtr) << 8 | *(crcPtr + 1); uint16_t recalculatedCrc = CRC::crc16ccitt(this->localData.byteStream, this->getFullSize()); - if (recalculatedCrc != this->ge) { + if (recalculatedCrc != receivedCrc) { return CRC_FAILURE; } return RETURN_OK; diff --git a/bsp_q7s/devices/ploc/CMakeLists.txt b/bsp_q7s/devices/ploc/CMakeLists.txt index 0babd089..2a80d64c 100644 --- a/bsp_q7s/devices/ploc/CMakeLists.txt +++ b/bsp_q7s/devices/ploc/CMakeLists.txt @@ -4,4 +4,5 @@ target_sources(${TARGET_NAME} PRIVATE PlocMemoryDumper.cpp PlocMPSoCHandler.cpp PlocMPSoCHelper.cpp + MPSoCSequenceCount.cpp ) diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp b/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp new file mode 100644 index 00000000..450900d4 --- /dev/null +++ b/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp @@ -0,0 +1,18 @@ +#include "fsfw/serviceInterface/ServiceInterfaceStream.h" +#include "MPSoCSequenceCount.h" + +MPSoCSequenceCount::MPSoCSequenceCount() : SourceSequenceCounter() { +} + +ReturnValue_t MPSoCSequenceCount::compare(uint16_t recvSeqCount) { + if (recvSeqCount != *this) { + sif::warning << "MPSoCSequenceCount::compare: Packet sequence count mismatch. Received: " + << recvSeqCount << ", Expected: " << *this << std::endl; + return HasReturnvaluesIF::RETURN_FAILED; + } + return HasReturnvaluesIF::RETURN_OK; +} + +MPSoCSequenceCount::~MPSoCSequenceCount() { +} + diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.h b/bsp_q7s/devices/ploc/MPSoCSequenceCount.h new file mode 100644 index 00000000..9495f6a2 --- /dev/null +++ b/bsp_q7s/devices/ploc/MPSoCSequenceCount.h @@ -0,0 +1,21 @@ +#ifndef BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ +#define BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ + +#include "fsfw/tmtcservices/SourceSequenceCounter.h" +#include "fsfw/returnvalues/HasReturnvaluesIF.h" + +/** + * @brief Class to manage the sequence count of the space packets exchanged with the MPSoC of the + * PLOC. + * + * @author J. Meier + */ +class MPSoCSequenceCount : public SourceSequenceCounter { +public: + MPSoCSequenceCount(); + virtual ~MPSoCSequenceCount(); + + ReturnValue_t compare(uint16_t recvSeqCount); +}; + +#endif /* BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ */ diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp index 6842d9b1..b9d17a8a 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp @@ -9,6 +9,7 @@ PlocMPSoCHandler::PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid if (comCookie == NULL) { sif::error << "PlocMPSoCHandler: Invalid com cookie" << std::endl; } + eventQueue = QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5); } PlocMPSoCHandler::~PlocMPSoCHandler() { @@ -26,8 +27,8 @@ ReturnValue_t PlocMPSoCHandler::initialize() { return ObjectManagerIF::CHILD_INIT_FAILED; } -EventManagerIF* manager = ObjectManager::instance()->get( - objects::EVENT_MANAGER); + EventManagerIF* manager = ObjectManager::instance()->get( + objects::EVENT_MANAGER); if (manager == nullptr) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "PlocMPSoCHandler::initialize: Invalid event manager" << std::endl; @@ -84,7 +85,7 @@ ReturnValue_t PlocMPSoCHandler::executeAction(ActionId_t actionId, MessageQueueI switch(actionId) { case mpsoc::TC_FLASHWRITE: { - if (size > config::MAX_PATH_SIZE + config::MAX_FILE_NAME) { + if (size > config::MAX_PATH_SIZE + config::MAX_FILENAME_SIZE) { return FILENAME_TOO_LONG; } result = plocMPSoCHelper->startFlashWrite( @@ -205,7 +206,12 @@ ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t *start, return INVALID_APID; } } - result = checkPacketSequenceCount(start); + uint16_t recvSeqCnt = (*(start + 2) << 8 | *(start + 3)) & PACKET_SEQUENCE_COUNT_MASK; + result = sequenceCount.compare(recvSeqCnt); + if (result != RETURN_OK) { + triggerEvent(SEQ_CNT_MISMATCH, sequenceCount, recvSeqCnt); + sequenceCount = recvSeqCnt; + } return result; } @@ -267,8 +273,8 @@ void PlocMPSoCHandler::handleEvent(EventMessage* eventMessage) { ReturnValue_t PlocMPSoCHandler::prepareTcMemWriteCommand(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - sequenceCount.increment(); - mpsoc::TcMemWrite tcMemWrite(sequenceCount.get()); + sequenceCount++; + mpsoc::TcMemWrite tcMemWrite(sequenceCount); result = tcMemWrite.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -280,8 +286,8 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemWriteCommand(const uint8_t * command ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - sequenceCount.increment(); - mpsoc::TcMemRead tcMemRead(sequenceCount.get()); + sequenceCount++; + mpsoc::TcMemRead tcMemRead(sequenceCount); result = tcMemRead.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -293,8 +299,8 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandD ReturnValue_t PlocMPSoCHandler::prepareFlashFopenCmd(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - sequenceCount.increment(); - mpsoc::FlashFopen flashFopen(sequenceCount.get()); + sequenceCount++; + mpsoc::FlashFopen flashFopen(sequenceCount); result = flashFopen.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -306,8 +312,8 @@ ReturnValue_t PlocMPSoCHandler::prepareFlashFopenCmd(const uint8_t * commandData ReturnValue_t PlocMPSoCHandler::prepareFlashFcloseCmd(const uint8_t * commandData, size_t commandDataLen) { ReturnValue_t result = RETURN_OK; - sequenceCount.increment(); - mpsoc::FlashFclose flashFclose(sequenceCount.get()); + sequenceCount++; + mpsoc::FlashFclose flashFclose(sequenceCount); result = flashFclose.createPacket(commandData, commandDataLen); if (result != RETURN_OK) { return result; @@ -607,16 +613,3 @@ void PlocMPSoCHandler::disableExeReportReply() { /* Expected replies is set to one here. The value will set to 0 in replyToReply() */ info->command->second.expectedReplies = 0; } - -ReturnValue_t PlocMPSoCHandler::checkPacketSequenceCount(const uint8_t* data) { - uint16_t receivedSeqCnt = (*(data + 2) << 8 | *(data + 3)) & PACKET_SEQUENCE_COUNT_MASK; - uint16_t expectedSeqCnt = sequenceCount.get(); - if (receivedSeqCnt != expectedSeqCnt) { - sif::warning << "PlocMPSoCHandler::checkPacketSequenceCount: Packet sequence count " - "mismatch. Received: " << receivedSeqCnt << ", Expected: " - << expectedSeqCnt << std::endl; - triggerEvent(SEQ_CNT_MISMATCH, expectedSeqCnt, receivedSeqCnt); - } - sequenceCount.reset(receivedSeqCnt); - return RETURN_OK; -} diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h index 3fef3a58..a85bf432 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h @@ -1,12 +1,13 @@ #ifndef BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ #define BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ +#include #include "fsfw/devicehandlers/DeviceHandlerBase.h" -#include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" #include "fsfw_hal/linux/uart/UartComIF.h" -#include "fsfw/tmtcservices/SourceSequenceCounter.h" +#include "fsfw/ipc/QueueFactory.h" +#include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" +#include "MPSoCSequenceCount.h" #include "PlocMPSoCHelper.h" -#include /** * @brief This is the device handler for the MPSoC of the payload computer. @@ -88,8 +89,11 @@ private: static const Event SEQ_CNT_MISMATCH = MAKE_EVENT(5, severity::LOW); static const uint16_t APID_MASK = 0x7FF; + static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF; - SourceSequenceCounter sequenceCount; + MessageQueueIF* eventQueue = nullptr; + + MPSoCSequenceCount sequenceCount; uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE]; @@ -198,21 +202,6 @@ private: * the variable expectedReplies of an active command will be set to 0. */ void disableExeReportReply(); - - /** - * @brief This function checks and increments the packet sequence count of a received space - * packet. - * - * @param data Pointer to a space packet. - * - * @return RETURN_OK if successful - * - * @details There should be never a case in which a wrong packet sequence count is received - * because the communication scheme between PLOC and OBC always follows a strict - * procedure. Thus this function mainly serves for debugging purposes to detected an - * invalid handling of the packet sequence count. - */ - ReturnValue_t checkPacketSequenceCount(const uint8_t* data); }; #endif /* BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ */ diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp index 4511c881..b922a44d 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp @@ -60,7 +60,7 @@ void PlocMPSoCHelper::setComCookie(CookieIF* comCookie_) { comCookie = comCookie_; } -void PlocMPSoCHelper::setSequenceCount(SourceSequenceCounter* sequenceCount_) { +void PlocMPSoCHelper::setSequenceCount(MPSoCSequenceCount* sequenceCount_) { sequenceCount = sequenceCount_; } @@ -86,24 +86,39 @@ void PlocMPSoCHelper::stopProcess() { ReturnValue_t PlocMPSoCHelper::performFlashWrite() { ReturnValue_t result = RETURN_OK; + uint8_t tempData[mpsoc::MAX_DATA_SIZE]; std::ifstream file(flashWrite.file, std::ifstream::binary); // Set position of next character to end of file input stream file.seekg(0, file.end); // tellg returns position of character in input stream - size_t imageSize = file.tellg(); - sequenceCount->increment(); - mpsoc::FlashWrite tc(sequenceCount->get()); - result = sendCommand(&tc); - if (result != RETURN_OK) { - return result; - } - result = handleAck(); - if (result != RETURN_OK) { - return result; - } - result = handleExe(); - if (result != RETURN_OK) { - return result; + size_t remainingSize = file.tellg(); + size_t dataLength = 0; + while (remainingSize > 0) { + if (terminate) { + return RETURN_OK; + } + if (remainingSize > mpsoc::MAX_DATA_SIZE) { + dataLength = mpsoc::MAX_DATA_SIZE; + } + else { + dataLength = remainingSize; + } + file.read(reinterpret_cast(tempData), dataLength); + sequenceCount++; + mpsoc::FlashWrite tc(*sequenceCount); + tc.createPacket(tempData, dataLength); + result = sendCommand(&tc); + if (result != RETURN_OK) { + return result; + } + result = handleAck(); + if (result != RETURN_OK) { + return result; + } + result = handleExe(); + if (result != RETURN_OK) { + return result; + } } return result; } @@ -198,6 +213,13 @@ ReturnValue_t PlocMPSoCHelper::handleTmReception(mpsoc::TmPacket* tmPacket, size sif::warning << "PlocMPSoCHelper::handleTmReception: CRC check failed" << std::endl; return result; } + uint16_t recvSeqCnt = tmPacket->getPacketSequenceCount(); + result = sequenceCount->compare(recvSeqCnt); + if (result != RETURN_OK) { + triggerEvent(SEQ_CNT_MISMATCH, *sequenceCount, recvSeqCnt); + *sequenceCount = recvSeqCnt; + return result; + } return result; } diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h index 0655e2cc..8cd77e74 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h @@ -10,7 +10,7 @@ #include "fsfw_hal/linux/uart/UartComIF.h" #include "fsfw/devicehandlers/CookieIF.h" #include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" -#include "fsfw/tmtcservices/SourceSequenceCounter.h" +#include "MPSoCSequenceCount.h" /** * @brief Helper class for MPSoC of PLOC intended to accelerate large data transfers between @@ -60,6 +60,10 @@ public: //!P1: Apid of received space packet //!P2: Internal state of MPSoC static const Event EXE_INVALID_APID = MAKE_EVENT(10, severity::LOW); + //! [EXPORT] : [COMMENT] Received sequence count does not match expected sequence count + //!P1: Expected sequence count + //!P2: Received sequence count + static const Event SEQ_CNT_MISMATCH = MAKE_EVENT(11, severity::LOW); PlocMPSoCHelper(object_id_t objectId); virtual ~PlocMPSoCHelper(); @@ -87,7 +91,7 @@ public: /** * @brief Sets the sequence count object responsible for the sequence count handling */ - void setSequenceCount(SourceSequenceCounter* sequenceCount_); + void setSequenceCount(MPSoCSequenceCount* sequenceCount_); private: @@ -99,7 +103,7 @@ private: class FlashWrite { public: - static const std::string file; + std::string file; }; FlashWrite flashWrite; @@ -128,7 +132,7 @@ private: // Communication cookie. Must be set by the MPSoC Handler CookieIF* comCookie = nullptr; // Sequence count, must be set by Ploc MPSoC Handler - SourceSequenceCounter* sequenceCount; + MPSoCSequenceCount* sequenceCount; ReturnValue_t performFlashWrite(); ReturnValue_t sendCommand(mpsoc::TcBase* tc); diff --git a/bsp_q7s/memory/FilesystemHelper.cpp b/bsp_q7s/memory/FilesystemHelper.cpp index 7413541f..1c990426 100644 --- a/bsp_q7s/memory/FilesystemHelper.cpp +++ b/bsp_q7s/memory/FilesystemHelper.cpp @@ -1,5 +1,8 @@ +#include +#include #include "FilesystemHelper.h" #include "bsp_q7s/memory/SdCardManager.h" +#include "fsfw/serviceinterface/serviceInterfaceStream.h" FilesystemHelper::FilesystemHelper() { } @@ -8,7 +11,7 @@ FilesystemHelper::~FilesystemHelper() { } ReturnValue_t FilesystemHelper::checkPath(std::string path) { - SdCardManager sdcMan = SdCardManager::instance(); + SdCardManager* sdcMan = SdCardManager::instance(); if (sdcMan == nullptr) { sif::warning << "FilesystemHelper::checkPath: Invalid SD card manager" << std::endl; return RETURN_FAILED; @@ -30,5 +33,8 @@ ReturnValue_t FilesystemHelper::checkPath(std::string path) { } ReturnValue_t FilesystemHelper::fileExists(std::string file) { - + if (not std::filesystem::exists(file)) { + return FILE_NOT_EXISTS; + } + return RETURN_OK; } diff --git a/bsp_q7s/memory/FilesystemHelper.h b/bsp_q7s/memory/FilesystemHelper.h index 4efe74c0..a3e59dea 100644 --- a/bsp_q7s/memory/FilesystemHelper.h +++ b/bsp_q7s/memory/FilesystemHelper.h @@ -1,6 +1,7 @@ #ifndef BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_ #define BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_ +#include #include "fsfw/returnvalues/HasReturnvaluesIF.h" /** @@ -32,7 +33,7 @@ public: * Return error code if path points to SD card and the corresponding SD card is not * mounted. */ - static const ReturnValue_t checkPath(std::string path); + static ReturnValue_t checkPath(std::string path); /** * @brief Checks if the file exists on the filesystem. @@ -41,7 +42,7 @@ public: * * @return RETURN_OK if fiel exists, otherwise return error code. */ - static const ReturnValue_t fileExists(std::string file); + static ReturnValue_t fileExists(std::string file); }; #endif /* BSP_Q7S_MEMORY_FILESYSTEMHELPER_H_ */ diff --git a/cmake/scripts/Q7S/win_path_helper_xilinx_tools.sh b/cmake/scripts/Q7S/win_path_helper_xilinx_tools.sh index a8352331..780a4a95 100644 --- a/cmake/scripts/Q7S/win_path_helper_xilinx_tools.sh +++ b/cmake/scripts/Q7S/win_path_helper_xilinx_tools.sh @@ -1,5 +1,5 @@ #!/bin/sh -export PATH=$PATH:"/c/Xilinx/SDK/2018.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin" +export PATH=$PATH:"/c/Users/Xilinx/SDK/2018.2/gnu/aarch32/nt/gcc-arm-linux-gnueabi/bin" export CROSS_COMPILE="arm-linux-gnueabihf" -export Q7S_SYSROOT="/c/Users/${USER}/Documents/EIVE/cortexa9hf-neon-xiphos-linux-gnueabi" +#export Q7S_SYSROOT="/c/Users/${USER}/Documents/EIVE/cortexa9hf-neon-xiphos-linux-gnueabi" From f0bf743f88b96eb3d2d171323dc83c53a494de3c Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Tue, 11 Jan 2022 12:56:02 +0100 Subject: [PATCH 009/309] improved sequence count --- .../devicedefinitions/PlocMPSoCDefinitions.h | 18 ++++++++-------- bsp_q7s/devices/ploc/CMakeLists.txt | 1 - bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp | 18 ---------------- bsp_q7s/devices/ploc/MPSoCSequenceCount.h | 21 ------------------- bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp | 6 +++--- bsp_q7s/devices/ploc/PlocMPSoCHandler.h | 4 ++-- bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp | 5 ++--- bsp_q7s/devices/ploc/PlocMPSoCHelper.h | 6 +++--- 8 files changed, 19 insertions(+), 60 deletions(-) delete mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp delete mode 100644 bsp_q7s/devices/ploc/MPSoCSequenceCount.h diff --git a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h index a57b3c26..1ed6e298 100644 --- a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h @@ -71,7 +71,7 @@ public: static const uint8_t INTERFACE_ID = CLASS_ID::MPSOC_CMD; //! [EXPORT] : [COMMENT] Received command with invalid length - static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xA0); + static const ReturnValue_t INVALID_LENGTH = MAKE_RETURN_CODE(0xC0); /** * @brief Constructor @@ -212,7 +212,6 @@ public: * @brief Constructor */ TcMemWrite(uint16_t sequenceCount) : TcBase(apid::TC_MEM_WRITE, sequenceCount) { - this->setPacketDataLength(PACKET_LENGTH); } protected: @@ -223,21 +222,22 @@ protected: if (result != RETURN_OK) { return result; } - std::memcpy(this->localData.fields.buffer, commandData, MEM_ADDRESS_SIZE); - std::memcpy(this->localData.fields.buffer + MEM_ADDRESS_SIZE, - commandData + MEM_ADDRESS_SIZE, MEM_DATA_SIZE); + std::memcpy(this->localData.fields.buffer, commandData, commandDataLen); + uint16_t memLen = *(commandData + MEM_ADDRESS_SIZE) << 8 + | *(commandData + MEM_ADDRESS_SIZE + 1); + this->setPacketDataLength(memLen * 4 + FIX_LENGTH - 1); return result; } private: - static const size_t COMMAND_LENGTH = 8; - static const uint16_t PACKET_LENGTH = 9; + // Min length consists of 4 byte address, 2 byte mem length field, 4 byte data (1 word) + static const size_t MIN_COMMAND_DATA_LENGTH = 10; static const size_t MEM_ADDRESS_SIZE = 4; - static const size_t MEM_DATA_SIZE = 4; + static const size_t FIX_LENGTH = 8; ReturnValue_t lengthCheck(size_t commandDataLen) { - if (commandDataLen != COMMAND_LENGTH) { + if (commandDataLen < MIN_COMMAND_DATA_LENGTH) { return INVALID_LENGTH; } return RETURN_OK; diff --git a/bsp_q7s/devices/ploc/CMakeLists.txt b/bsp_q7s/devices/ploc/CMakeLists.txt index 2a80d64c..0babd089 100644 --- a/bsp_q7s/devices/ploc/CMakeLists.txt +++ b/bsp_q7s/devices/ploc/CMakeLists.txt @@ -4,5 +4,4 @@ target_sources(${TARGET_NAME} PRIVATE PlocMemoryDumper.cpp PlocMPSoCHandler.cpp PlocMPSoCHelper.cpp - MPSoCSequenceCount.cpp ) diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp b/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp deleted file mode 100644 index 450900d4..00000000 --- a/bsp_q7s/devices/ploc/MPSoCSequenceCount.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "fsfw/serviceInterface/ServiceInterfaceStream.h" -#include "MPSoCSequenceCount.h" - -MPSoCSequenceCount::MPSoCSequenceCount() : SourceSequenceCounter() { -} - -ReturnValue_t MPSoCSequenceCount::compare(uint16_t recvSeqCount) { - if (recvSeqCount != *this) { - sif::warning << "MPSoCSequenceCount::compare: Packet sequence count mismatch. Received: " - << recvSeqCount << ", Expected: " << *this << std::endl; - return HasReturnvaluesIF::RETURN_FAILED; - } - return HasReturnvaluesIF::RETURN_OK; -} - -MPSoCSequenceCount::~MPSoCSequenceCount() { -} - diff --git a/bsp_q7s/devices/ploc/MPSoCSequenceCount.h b/bsp_q7s/devices/ploc/MPSoCSequenceCount.h deleted file mode 100644 index 9495f6a2..00000000 --- a/bsp_q7s/devices/ploc/MPSoCSequenceCount.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ -#define BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ - -#include "fsfw/tmtcservices/SourceSequenceCounter.h" -#include "fsfw/returnvalues/HasReturnvaluesIF.h" - -/** - * @brief Class to manage the sequence count of the space packets exchanged with the MPSoC of the - * PLOC. - * - * @author J. Meier - */ -class MPSoCSequenceCount : public SourceSequenceCounter { -public: - MPSoCSequenceCount(); - virtual ~MPSoCSequenceCount(); - - ReturnValue_t compare(uint16_t recvSeqCount); -}; - -#endif /* BSP_Q7S_DEVICES_PLOC_MPSOCSEQUENCECOUNT_H_ */ diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp index b9d17a8a..0fa4eb04 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp @@ -207,10 +207,10 @@ ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t *start, } } uint16_t recvSeqCnt = (*(start + 2) << 8 | *(start + 3)) & PACKET_SEQUENCE_COUNT_MASK; - result = sequenceCount.compare(recvSeqCnt); - if (result != RETURN_OK) { + if (recvSeqCnt != sequenceCount) { triggerEvent(SEQ_CNT_MISMATCH, sequenceCount, recvSeqCnt); - sequenceCount = recvSeqCnt; + sequenceCount = recvSeqCnt; + return result; } return result; } diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h index a85bf432..63eaa17b 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h @@ -5,8 +5,8 @@ #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "fsfw_hal/linux/uart/UartComIF.h" #include "fsfw/ipc/QueueFactory.h" +#include "fsfw/tmtcservices/SourceSequenceCounter.h" #include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" -#include "MPSoCSequenceCount.h" #include "PlocMPSoCHelper.h" /** @@ -93,7 +93,7 @@ private: MessageQueueIF* eventQueue = nullptr; - MPSoCSequenceCount sequenceCount; + SourceSequenceCounter sequenceCount; uint8_t commandBuffer[mpsoc::MAX_COMMAND_SIZE]; diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp index b922a44d..cc20036c 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp @@ -60,7 +60,7 @@ void PlocMPSoCHelper::setComCookie(CookieIF* comCookie_) { comCookie = comCookie_; } -void PlocMPSoCHelper::setSequenceCount(MPSoCSequenceCount* sequenceCount_) { +void PlocMPSoCHelper::setSequenceCount(SourceSequenceCounter* sequenceCount_) { sequenceCount = sequenceCount_; } @@ -214,8 +214,7 @@ ReturnValue_t PlocMPSoCHelper::handleTmReception(mpsoc::TmPacket* tmPacket, size return result; } uint16_t recvSeqCnt = tmPacket->getPacketSequenceCount(); - result = sequenceCount->compare(recvSeqCnt); - if (result != RETURN_OK) { + if (recvSeqCnt != *sequenceCount) { triggerEvent(SEQ_CNT_MISMATCH, *sequenceCount, recvSeqCnt); *sequenceCount = recvSeqCnt; return result; diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h index 8cd77e74..82e98dd7 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h @@ -9,8 +9,8 @@ #include "fsfw/tasks/ExecutableObjectIF.h" #include "fsfw_hal/linux/uart/UartComIF.h" #include "fsfw/devicehandlers/CookieIF.h" +#include "fsfw/tmtcservices/SourceSequenceCounter.h" #include "bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h" -#include "MPSoCSequenceCount.h" /** * @brief Helper class for MPSoC of PLOC intended to accelerate large data transfers between @@ -91,7 +91,7 @@ public: /** * @brief Sets the sequence count object responsible for the sequence count handling */ - void setSequenceCount(MPSoCSequenceCount* sequenceCount_); + void setSequenceCount(SourceSequenceCounter* sequenceCount_); private: @@ -132,7 +132,7 @@ private: // Communication cookie. Must be set by the MPSoC Handler CookieIF* comCookie = nullptr; // Sequence count, must be set by Ploc MPSoC Handler - MPSoCSequenceCount* sequenceCount; + SourceSequenceCounter* sequenceCount; ReturnValue_t performFlashWrite(); ReturnValue_t sendCommand(mpsoc::TcBase* tc); From 1133ea08c87e0b4230fde09828cd1f98ae45d59b Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Tue, 11 Jan 2022 17:58:59 +0100 Subject: [PATCH 010/309] ploc mpsoc handler improved tc mem read --- .../devicedefinitions/PlocMPSoCDefinitions.h | 18 +- bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp | 31 +- bsp_q7s/devices/ploc/PlocMPSoCHandler.h | 12 +- bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp | 6 +- bsp_q7s/devices/ploc/PlocMPSoCHelper.h | 6 +- .../startracker/StarTrackerHandler.cpp | 4 +- bsp_q7s/devices/startracker/StrHelper.cpp | 26 +- bsp_q7s/devices/startracker/StrHelper.h | 26 +- generators/bsp_q7s_events.csv | 293 +++++++++--------- generators/bsp_q7s_objects.csv | 1 + generators/events/translateEvents.cpp | 99 ++++-- generators/objects/translateObjects.cpp | 7 +- linux/fsfwconfig/OBSWConfig.h.in | 2 + linux/fsfwconfig/events/translateEvents.cpp | 99 ++++-- linux/fsfwconfig/objects/translateObjects.cpp | 7 +- mission/core/GenericFactory.cpp | 3 + 16 files changed, 389 insertions(+), 251 deletions(-) diff --git a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h index 1ed6e298..2d8b9bc6 100644 --- a/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/bsp_q7s/devices/devicedefinitions/PlocMPSoCDefinitions.h @@ -39,12 +39,13 @@ namespace apid { /** Offset from first byte in space packet to first byte of data field */ static const uint8_t DATA_FIELD_OFFSET = 6; +static const size_t MEM_READ_RPT_LEN_OFFSET = 10; /** * The size of payload data which will be forwarded to the requesting object. e.g. PUS Service * 8. */ -static const uint8_t SIZE_MEM_READ_REPORT_DATA = 10; +static const uint8_t SIZE_MEM_READ_RPT_FIX = 6; static const size_t MAX_FILENAME_SIZE = 256; @@ -55,7 +56,7 @@ static const size_t MAX_FILENAME_SIZE = 256; static const uint16_t LENGTH_TC_MEM_WRITE = 12; static const uint16_t LENGTH_TC_MEM_READ = 8; -static const size_t MAX_REPLY_SIZE = SpacePacket::PACKET_MAX_SIZE; +static const size_t MAX_REPLY_SIZE = SpacePacket::PACKET_MAX_SIZE * 3; static const size_t MAX_COMMAND_SIZE = SpacePacket::PACKET_MAX_SIZE; static const size_t MAX_DATA_SIZE = 1016; @@ -173,6 +174,10 @@ public: this->setPacketDataLength(PACKET_LENGTH); } + uint16_t getMemLen() const { + return memLen; + } + protected: ReturnValue_t initPacket(const uint8_t* commandData, size_t commandDataLen) { @@ -184,6 +189,13 @@ protected: std::memcpy(this->localData.fields.buffer, commandData, MEM_ADDRESS_SIZE); std::memcpy(this->localData.fields.buffer + MEM_ADDRESS_SIZE, commandData + MEM_ADDRESS_SIZE, MEM_LEN_SIZE); + size_t size = sizeof(memLen); + const uint8_t* memLenPtr = commandData + MEM_ADDRESS_SIZE; + result = SerializeAdapter::deSerialize(&memLen, &memLenPtr, &size, + SerializeIF::Endianness::BIG); + if(result != RETURN_OK) { + return result; + } return result; } @@ -194,6 +206,8 @@ private: static const size_t MEM_LEN_SIZE = 2; static const uint16_t PACKET_LENGTH = 7; + uint16_t memLen = 0; + ReturnValue_t lengthCheck(size_t commandDataLen) { if (commandDataLen != COMMAND_LENGTH){ return INVALID_LENGTH; diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp index 0fa4eb04..2e7464d1 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.cpp @@ -40,8 +40,8 @@ ReturnValue_t PlocMPSoCHandler::initialize() { return result; } result = manager->subscribeToEventRange(eventQueue->getId(), - event::getEventId(PlocMPSoCHelper::FLASH_WRITE_FAILED), - event::getEventId(PlocMPSoCHelper::FLASH_WRITE_SUCCESSFUL)); + event::getEventId(PlocMPSoCHelper::MPSOC_FLASH_WRITE_FAILED), + event::getEventId(PlocMPSoCHelper::MPSOC_FLASH_WRITE_SUCCESSFUL)); if (result != RETURN_OK) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::warning << "PlocMPSoCHandler::initialize: Failed to subscribe to events from " @@ -189,7 +189,7 @@ ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t *start, *foundId = mpsoc::ACK_REPORT; break; case(mpsoc::apid::TM_MEMORY_READ_REPORT): - *foundLen = mpsoc::SIZE_TM_MEM_READ_REPORT; + *foundLen = tmMemReadReport.rememberRequestedSize; *foundId = mpsoc::TM_MEMORY_READ_REPORT; break; case(mpsoc::apid::EXE_SUCCESS): @@ -206,11 +206,11 @@ ReturnValue_t PlocMPSoCHandler::scanForReply(const uint8_t *start, return INVALID_APID; } } + sequenceCount++; uint16_t recvSeqCnt = (*(start + 2) << 8 | *(start + 3)) & PACKET_SEQUENCE_COUNT_MASK; if (recvSeqCnt != sequenceCount) { - triggerEvent(SEQ_CNT_MISMATCH, sequenceCount, recvSeqCnt); + triggerEvent(MPSOC_HANDLER_SEQ_CNT_MISMATCH, sequenceCount, recvSeqCnt); sequenceCount = recvSeqCnt; - return result; } return result; } @@ -293,6 +293,7 @@ ReturnValue_t PlocMPSoCHandler::prepareTcMemReadCommand(const uint8_t * commandD return result; } copyToCommandBuffer(&tcMemRead); + tmMemReadReport.rememberRequestedSize = tcMemRead.getMemLen() * 4 + TmMemReadReport::FIX_SIZE; return RETURN_OK; } @@ -350,7 +351,7 @@ ReturnValue_t PlocMPSoCHandler::handleAckReport(const uint8_t* data) { sif::error << "PlocMPSoCHandler::handleAckReport: CRC failure" << std::endl; nextReplyId = mpsoc::NONE; replyRawReplyIfnotWiretapped(data, mpsoc::SIZE_ACK_REPORT); - triggerEvent(CRC_FAILURE_EVENT); + triggerEvent(MPSOC_HANDLER_CRC_FAILURE); sendFailureReport(mpsoc::ACK_REPORT, CRC_FAILURE); disableAllReplies(); return IGNORE_REPLY_DATA; @@ -430,13 +431,15 @@ ReturnValue_t PlocMPSoCHandler::handleExecutionReport(const uint8_t* data) { ReturnValue_t PlocMPSoCHandler::handleMemoryReadReport(const uint8_t* data) { ReturnValue_t result = RETURN_OK; - result = verifyPacket(data, mpsoc::SIZE_TM_MEM_READ_REPORT); + result = verifyPacket(data, tmMemReadReport.rememberRequestedSize); if(result == CRC_FAILURE) { sif::error << "PlocMPSoCHandler::handleMemoryReadReport: Memory read report has invalid crc" << std::endl; } + uint16_t memLen = *(data + mpsoc::MEM_READ_RPT_LEN_OFFSET) << 8 + | *(data + mpsoc::MEM_READ_RPT_LEN_OFFSET + 1); /** Send data to commanding queue */ - handleDeviceTM(data + mpsoc::DATA_FIELD_OFFSET, mpsoc::SIZE_MEM_READ_REPORT_DATA, + handleDeviceTM(data + mpsoc::DATA_FIELD_OFFSET, mpsoc::SIZE_MEM_READ_RPT_FIX + memLen * 4, mpsoc::TM_MEMORY_READ_REPORT); nextReplyId = mpsoc::EXE_REPORT; return result; @@ -512,12 +515,22 @@ size_t PlocMPSoCHandler::getNextReplyLength(DeviceCommandId_t commandId){ } DeviceReplyIter iter = deviceReplyMap.find(nextReplyId); + if (iter != deviceReplyMap.end()) { if (iter->second.delayCycles == 0) { /* Reply inactive */ return replyLen; } - replyLen = iter->second.replyLen; + switch(nextReplyId) { + case mpsoc::TM_MEMORY_READ_REPORT: { + replyLen = tmMemReadReport.rememberRequestedSize; + break; + } + default: { + replyLen = iter->second.replyLen; + break; + } + } } else { sif::debug << "PlocMPSoCHandler::getNextReplyLength: No entry for reply with reply id " diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h index 63eaa17b..2fbd00cb 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHandler.h @@ -82,11 +82,11 @@ private: //! [EXPORT] : [COMMENT] PLOC receive execution failure report static const Event EXE_FAILURE = MAKE_EVENT(3, severity::LOW); //! [EXPORT] : [COMMENT] PLOC reply has invalid crc - static const Event CRC_FAILURE_EVENT = MAKE_EVENT(4, severity::LOW); + static const Event MPSOC_HANDLER_CRC_FAILURE = MAKE_EVENT(4, severity::LOW); //! [EXPORT] : [COMMENT] Packet sequence count in received space packet does not match expected count //! P1: Expected sequence count //! P2: Received sequence count - static const Event SEQ_CNT_MISMATCH = MAKE_EVENT(5, severity::LOW); + static const Event MPSOC_HANDLER_SEQ_CNT_MISMATCH = MAKE_EVENT(5, severity::LOW); static const uint16_t APID_MASK = 0x7FF; static const uint16_t PACKET_SEQUENCE_COUNT_MASK = 0x3FFF; @@ -111,6 +111,14 @@ private: // Used to block incoming commands when MPSoC helper class is currently executing a command bool plocMPSoCHelperExecuting = false; + class TmMemReadReport { + public: + static const uint8_t FIX_SIZE = 14; + size_t rememberRequestedSize = 0; + }; + + TmMemReadReport tmMemReadReport; + /** * @brief Handles events received from the PLOC MPSoC helper */ diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp index cc20036c..fd10c061 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.cpp @@ -32,10 +32,10 @@ ReturnValue_t PlocMPSoCHelper::performOperation(uint8_t operationCode) { case InternalState::FLASH_WRITE: { result = performFlashWrite(); if (result == RETURN_OK){ - triggerEvent(FLASH_WRITE_SUCCESSFUL); + triggerEvent(MPSOC_FLASH_WRITE_SUCCESSFUL); } else { - triggerEvent(FLASH_WRITE_FAILED); + triggerEvent(MPSOC_FLASH_WRITE_FAILED); } internalState = InternalState::IDLE; break; @@ -215,7 +215,7 @@ ReturnValue_t PlocMPSoCHelper::handleTmReception(mpsoc::TmPacket* tmPacket, size } uint16_t recvSeqCnt = tmPacket->getPacketSequenceCount(); if (recvSeqCnt != *sequenceCount) { - triggerEvent(SEQ_CNT_MISMATCH, *sequenceCount, recvSeqCnt); + triggerEvent(MPSOC_HELPER_SEQ_CNT_MISMATCH, *sequenceCount, recvSeqCnt); *sequenceCount = recvSeqCnt; return result; } diff --git a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h index 82e98dd7..87fe21db 100644 --- a/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +++ b/bsp_q7s/devices/ploc/PlocMPSoCHelper.h @@ -23,9 +23,9 @@ public: static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PLOC_MPSOC_HELPER; //! [EXPORT] : [COMMENT] Flash write fails - static const Event FLASH_WRITE_FAILED = MAKE_EVENT(0, severity::LOW); + static const Event MPSOC_FLASH_WRITE_FAILED = MAKE_EVENT(0, severity::LOW); //! [EXPORT] : [COMMENT] Flash write successful - static const Event FLASH_WRITE_SUCCESSFUL = MAKE_EVENT(1, severity::LOW); + static const Event MPSOC_FLASH_WRITE_SUCCESSFUL = MAKE_EVENT(1, severity::LOW); //! [EXPORT] : [COMMENT] Communication interface returned failure when trying to send the command ot the PLOC //!P1: Return value returned by the communication interface sendMessage function //!P2: Internal state of MPSoC helper @@ -63,7 +63,7 @@ public: //! [EXPORT] : [COMMENT] Received sequence count does not match expected sequence count //!P1: Expected sequence count //!P2: Received sequence count - static const Event SEQ_CNT_MISMATCH = MAKE_EVENT(11, severity::LOW); + static const Event MPSOC_HELPER_SEQ_CNT_MISMATCH = MAKE_EVENT(11, severity::LOW); PlocMPSoCHelper(object_id_t objectId); virtual ~PlocMPSoCHelper(); diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp index 52eb8c9b..3d40585f 100644 --- a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp +++ b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp @@ -52,8 +52,8 @@ ReturnValue_t StarTrackerHandler::initialize() { return result; } result = manager->subscribeToEventRange(eventQueue->getId(), - event::getEventId(StrHelper::IMAGE_UPLOAD_FAILED), - event::getEventId(StrHelper::FPGA_UPLOAD_FAILED)); + event::getEventId(StrHelper::STR_HELPER_IMAGE_UPLOAD_FAILED), + event::getEventId(StrHelper::STR_HELPER_FPGA_UPLOAD_FAILED)); if (result != RETURN_OK) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::warning << "StarTrackerHandler::initialize: Failed to subscribe to events from " diff --git a/bsp_q7s/devices/startracker/StrHelper.cpp b/bsp_q7s/devices/startracker/StrHelper.cpp index 8e1f2622..6b6465ef 100644 --- a/bsp_q7s/devices/startracker/StrHelper.cpp +++ b/bsp_q7s/devices/startracker/StrHelper.cpp @@ -32,10 +32,10 @@ ReturnValue_t StrHelper::performOperation(uint8_t operationCode) { case InternalState::UPLOAD_IMAGE: { result = performImageUpload(); if (result == RETURN_OK){ - triggerEvent(IMAGE_UPLOAD_SUCCESSFUL); + triggerEvent(STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL); } else { - triggerEvent(IMAGE_UPLOAD_FAILED); + triggerEvent(STR_HELPER_IMAGE_UPLOAD_FAILED); } internalState = InternalState::IDLE; break; @@ -43,10 +43,10 @@ ReturnValue_t StrHelper::performOperation(uint8_t operationCode) { case InternalState::DOWNLOAD_IMAGE: { result = performImageDownload(); if (result == RETURN_OK){ - triggerEvent(IMAGE_DOWNLOAD_SUCCESSFUL); + triggerEvent(STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL); } else { - triggerEvent(IMAGE_DOWNLOAD_FAILED); + triggerEvent(STR_HELPER_IMAGE_DOWNLOAD_FAILED); } internalState = InternalState::IDLE; break; @@ -54,10 +54,10 @@ ReturnValue_t StrHelper::performOperation(uint8_t operationCode) { case InternalState::FLASH_WRITE: { result = performFlashWrite(); if (result == RETURN_OK){ - triggerEvent(FLASH_WRITE_SUCCESSFUL); + triggerEvent(STR_HELPER_FLASH_WRITE_SUCCESSFUL); } else { - triggerEvent(FLASH_WRITE_FAILED); + triggerEvent(STR_HELPER_FLASH_WRITE_FAILED); } internalState = InternalState::IDLE; break; @@ -65,10 +65,10 @@ ReturnValue_t StrHelper::performOperation(uint8_t operationCode) { case InternalState::FLASH_READ: { result = performFlashRead(); if (result == RETURN_OK){ - triggerEvent(FLASH_READ_SUCCESSFUL); + triggerEvent(STR_HELPER_FLASH_READ_SUCCESSFUL); } else { - triggerEvent(FLASH_READ_FAILED); + triggerEvent(STR_HELPER_FLASH_READ_FAILED); } internalState = InternalState::IDLE; break; @@ -76,10 +76,10 @@ ReturnValue_t StrHelper::performOperation(uint8_t operationCode) { case InternalState::DOWNLOAD_FPGA_IMAGE: { result = performFpgaDownload(); if (result == RETURN_OK){ - triggerEvent(FPGA_DOWNLOAD_SUCCESSFUL); + triggerEvent(STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL); } else { - triggerEvent(FPGA_DOWNLOAD_FAILED); + triggerEvent(STR_HELPER_FPGA_DOWNLOAD_FAILED); } internalState = InternalState::IDLE; break; @@ -87,10 +87,10 @@ ReturnValue_t StrHelper::performOperation(uint8_t operationCode) { case InternalState::UPLOAD_FPGA_IMAGE: { result = performFpgaUpload(); if (result == RETURN_OK){ - triggerEvent(FPGA_UPLOAD_SUCCESSFUL); + triggerEvent(STR_HELPER_FPGA_UPLOAD_SUCCESSFUL); } else { - triggerEvent(FPGA_UPLOAD_FAILED); + triggerEvent(STR_HELPER_FPGA_UPLOAD_FAILED); } internalState = InternalState::IDLE; break; @@ -608,7 +608,7 @@ ReturnValue_t StrHelper::checkReplyPosition(uint32_t expectedPosition) { uint32_t receivedPosition = 0; std::memcpy(&receivedPosition, datalinkLayer.getReply() + POS_OFFSET, sizeof(receivedPosition)); if (receivedPosition != expectedPosition) { - triggerEvent(POSITION_MISMATCH, receivedPosition); + triggerEvent(STR_HELPER_POSITION_MISMATCH, receivedPosition); return RETURN_FAILED; } return RETURN_OK; diff --git a/bsp_q7s/devices/startracker/StrHelper.h b/bsp_q7s/devices/startracker/StrHelper.h index c8aa7393..1b1a6a62 100644 --- a/bsp_q7s/devices/startracker/StrHelper.h +++ b/bsp_q7s/devices/startracker/StrHelper.h @@ -25,29 +25,29 @@ public: static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::STR_HELPER; //! [EXPORT] : [COMMENT] Image upload failed - static const Event IMAGE_UPLOAD_FAILED = MAKE_EVENT(0, severity::LOW); + static const Event STR_HELPER_IMAGE_UPLOAD_FAILED = MAKE_EVENT(0, severity::LOW); //! [EXPORT] : [COMMENT] Image download failed - static const Event IMAGE_DOWNLOAD_FAILED = MAKE_EVENT(1, severity::LOW); + static const Event STR_HELPER_IMAGE_DOWNLOAD_FAILED = MAKE_EVENT(1, severity::LOW); //! [EXPORT] : [COMMENT] Uploading image to star tracker was successfulop - static const Event IMAGE_UPLOAD_SUCCESSFUL = MAKE_EVENT(2, severity::LOW); + static const Event STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL = MAKE_EVENT(2, severity::LOW); //! [EXPORT] : [COMMENT] Image download was successful - static const Event IMAGE_DOWNLOAD_SUCCESSFUL = MAKE_EVENT(3, severity::LOW); + static const Event STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL = MAKE_EVENT(3, severity::LOW); //! [EXPORT] : [COMMENT] Finished flash write procedure successfully - static const Event FLASH_WRITE_SUCCESSFUL = MAKE_EVENT(4, severity::LOW); + static const Event STR_HELPER_FLASH_WRITE_SUCCESSFUL = MAKE_EVENT(4, severity::LOW); //! [EXPORT] : [COMMENT] Finished flash read procedure successfully - static const Event FLASH_READ_SUCCESSFUL = MAKE_EVENT(5, severity::LOW); + static const Event STR_HELPER_FLASH_READ_SUCCESSFUL = MAKE_EVENT(5, severity::LOW); //! [EXPORT] : [COMMENT] Flash write procedure failed - static const Event FLASH_WRITE_FAILED = MAKE_EVENT(6, severity::LOW); + static const Event STR_HELPER_FLASH_WRITE_FAILED = MAKE_EVENT(6, severity::LOW); //! [EXPORT] : [COMMENT] Flash read procedure failed - static const Event FLASH_READ_FAILED = MAKE_EVENT(7, severity::LOW); + static const Event STR_HELPER_FLASH_READ_FAILED = MAKE_EVENT(7, severity::LOW); //! [EXPORT] : [COMMENT] Download of FPGA image successful - static const Event FPGA_DOWNLOAD_SUCCESSFUL = MAKE_EVENT(8, severity::LOW); + static const Event STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL = MAKE_EVENT(8, severity::LOW); //! [EXPORT] : [COMMENT] Download of FPGA image failed - static const Event FPGA_DOWNLOAD_FAILED = MAKE_EVENT(9, severity::LOW); + static const Event STR_HELPER_FPGA_DOWNLOAD_FAILED = MAKE_EVENT(9, severity::LOW); //! [EXPORT] : [COMMENT] Upload of FPGA image successful - static const Event FPGA_UPLOAD_SUCCESSFUL = MAKE_EVENT(10, severity::LOW); + static const Event STR_HELPER_FPGA_UPLOAD_SUCCESSFUL = MAKE_EVENT(10, severity::LOW); //! [EXPORT] : [COMMENT] Upload of FPGA image failed - static const Event FPGA_UPLOAD_FAILED = MAKE_EVENT(11, severity::LOW); + static const Event STR_HELPER_FPGA_UPLOAD_FAILED = MAKE_EVENT(11, severity::LOW); //! [EXPORT] : [COMMENT] Failed to read communication interface reply data //!P1: Return code of failed communication interface read call //!P1: Upload/download position for which the read call failed @@ -65,7 +65,7 @@ public: static const Event STR_HELPER_DEC_ERROR = MAKE_EVENT(15, severity::LOW); //! [EXPORT] : [COMMENT] Position mismatch //!P1: The expected position and thus the position for which the image upload/download failed - static const Event POSITION_MISMATCH = MAKE_EVENT(16, severity::LOW); + static const Event STR_HELPER_POSITION_MISMATCH = MAKE_EVENT(16, severity::LOW); //! [EXPORT] : [COMMENT] Specified file does not exist //!P1: Internal state of str helper static const Event STR_HELPER_FILE_NOT_EXISTS = MAKE_EVENT(17, severity::LOW); diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index cdf4d181..756bcbd4 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -1,140 +1,153 @@ -2200;STORE_SEND_WRITE_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2201;STORE_WRITE_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2202;STORE_SEND_READ_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2203;STORE_READ_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2204;UNEXPECTED_MSG;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2205;STORING_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2206;TM_DUMP_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2207;STORE_INIT_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2208;STORE_INIT_EMPTY;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2209;STORE_CONTENT_CORRUPTED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2210;STORE_INITIALIZE;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2211;INIT_DONE;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2212;DUMP_FINISHED;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2213;DELETION_FINISHED;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2214;DELETION_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2215;AUTO_CATALOGS_SENDING_FAILED;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h -2600;GET_DATA_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h -2601;STORE_DATA_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h -2800;DEVICE_BUILDING_COMMAND_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2801;DEVICE_SENDING_COMMAND_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2802;DEVICE_REQUESTING_REPLY_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2803;DEVICE_READING_REPLY_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2804;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2805;DEVICE_MISSED_REPLY;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2806;DEVICE_UNKNOWN_REPLY;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2807;DEVICE_UNREQUESTED_REPLY;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2808;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2809;MONITORING_LIMIT_EXCEEDED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -2810;MONITORING_AMBIGUOUS;HIGH;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h -4201;FUSE_CURRENT_HIGH;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/power/Fuse.h -4202;FUSE_WENT_OFF;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/power/Fuse.h -4204;POWER_ABOVE_HIGH_LIMIT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/power/Fuse.h -4205;POWER_BELOW_LOW_LIMIT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/power/Fuse.h -4300;SWITCH_WENT_OFF;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/power/PowerSwitchIF.h -5000;HEATER_ON;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h -5001;HEATER_OFF;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h -5002;HEATER_TIMEOUT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h -5003;HEATER_STAYED_ON;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h -5004;HEATER_STAYED_OFF;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h -5200;TEMP_SENSOR_HIGH;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h -5201;TEMP_SENSOR_LOW;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h -5202;TEMP_SENSOR_GRADIENT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h -5901;COMPONENT_TEMP_LOW;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h -5902;COMPONENT_TEMP_HIGH;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h -5903;COMPONENT_TEMP_OOL_LOW;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h -5904;COMPONENT_TEMP_OOL_HIGH;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h -5905;TEMP_NOT_IN_OP_RANGE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h -7101;FDIR_CHANGED_STATE;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h -7102;FDIR_STARTS_RECOVERY;MEDIUM;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h -7103;FDIR_TURNS_OFF_DEVICE;MEDIUM;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h -7201;MONITOR_CHANGED_STATE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h -7202;VALUE_BELOW_LOW_LIMIT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h -7203;VALUE_ABOVE_HIGH_LIMIT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h -7204;VALUE_OUT_OF_RANGE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h -7301;SWITCHING_TM_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/datapool/HkSwitchHelper.h -7400;CHANGING_MODE;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7401;MODE_INFO;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7402;FALLBACK_FAILED;HIGH;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7403;MODE_TRANSITION_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7404;CANT_KEEP_MODE;HIGH;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7405;OBJECT_IN_INVALID_MODE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7406;FORCING_MODE;MEDIUM;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7407;MODE_CMD_REJECTED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h -7506;HEALTH_INFO;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h -7507;CHILD_CHANGED_HEALTH;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h -7508;CHILD_PROBLEMS;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h -7509;OVERWRITING_HEALTH;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h -7510;TRYING_RECOVERY;MEDIUM;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h -7511;RECOVERY_STEP;MEDIUM;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h -7512;RECOVERY_DONE;MEDIUM;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h -7900;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7901;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7902;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7903;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -7905;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h -8900;CLOCK_SET;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h -8901;CLOCK_SET_FAILURE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h -9700;TEST;INFO;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/src/fsfw/pus/Service17Test.h -10600;CHANGE_OF_SETUP_PARAMETER;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h -10900;GPIO_PULL_HIGH_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/HeaterHandler.h -10901;GPIO_PULL_LOW_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/HeaterHandler.h -10902;SWITCH_ALREADY_ON;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/HeaterHandler.h -10903;SWITCH_ALREADY_OFF;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/HeaterHandler.h -10904;MAIN_SWITCH_TIMEOUT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/HeaterHandler.h -11000;MAIN_SWITCH_ON_TIMEOUT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h -11001;MAIN_SWITCH_OFF_TIMEOUT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h -11002;DEPLOYMENT_FAILED;HIGH;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h -11003;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h -11004;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h -11101;MEMORY_READ_RPT_CRC_FAILURE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/PlocMPSoCHandler.h -11102;ACK_FAILURE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/PlocMPSoCHandler.h -11103;EXE_FAILURE;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/PlocMPSoCHandler.h -11104;CRC_FAILURE_EVENT;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/PlocMPSoCHandler.h -11201;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11202;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11203;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11204;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11205;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11206;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11207;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11208;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/IMTQHandler.h -11301;ERROR_STATE;HIGH;Reaction wheel signals an error state;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/mission/devices/RwHandler.h -11501;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h -11502;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h -11503;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h -11504;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocSupervisorHandler.h -11600;SANITIZATION_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/memory/SdCardManager.h -11700;UPDATE_FILE_NOT_EXISTS;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocUpdater.h -11701;ACTION_COMMANDING_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocUpdater.h -11702;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocUpdater.h -11703;UPDATE_TRANSFER_FAILED;LOW;Supervisor handler failed to transfer an update space packet. P1: Parameter holds the number of update packets already sent (inclusive the failed packet);C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocUpdater.h -11704;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocUpdater.h -11705;UPDATE_FINISHED;INFO;MPSoC update successful completed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocUpdater.h -11800;SEND_MRAM_DUMP_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocMemoryDumper.h -11801;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocMemoryDumper.h -11802;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/PlocMemoryDumper.h -11901;INVALID_TC_FRAME;HIGH;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/obc/PdecHandler.h -11902;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/obc/PdecHandler.h -11903;CARRIER_LOCK;INFO;Carrier lock detected;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/obc/PdecHandler.h -11904;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/linux/obc/PdecHandler.h -12000;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12001;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12002;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12003;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12004;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12005;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12006;FLASH_WRITE_FAILED;LOW;Flash write procedure failed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12007;FLASH_READ_FAILED;LOW;Flash read procedure failed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12008;FPGA_DOWNLOAD_SUCCESSFUL;LOW;Download of FPGA image successful;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12009;FPGA_DOWNLOAD_FAILED;LOW;Download of FPGA image failed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12010;FPGA_UPLOAD_SUCCESSFUL;LOW;Upload of FPGA image successful;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12011;FPGA_UPLOAD_FAILED;LOW;Upload of FPGA image failed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12012;STR_HELPER_READING_REPLY_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12013;STR_HELPER_COM_ERROR;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12014;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off)P1: Position of upload or download packet for which no reply was sent;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12015;STR_HELPER_DEC_ERROR;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12016;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12017;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not existP1: Internal state of str helper;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12018;STR_HELPER_SENDING_PACKET_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h -12019;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;C:\Users\jakob\OneDrive\Work\EIVE\Q7S\Software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +2200;STORE_SEND_WRITE_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2201;STORE_WRITE_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2202;STORE_SEND_READ_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2203;STORE_READ_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2204;UNEXPECTED_MSG;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2205;STORING_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2206;TM_DUMP_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2207;STORE_INIT_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2208;STORE_INIT_EMPTY;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2209;STORE_CONTENT_CORRUPTED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2210;STORE_INITIALIZE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2211;INIT_DONE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2212;DUMP_FINISHED;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2213;DELETION_FINISHED;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2214;DELETION_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2215;AUTO_CATALOGS_SENDING_FAILED;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/tmstorage/TmStoreBackendIF.h +2600;GET_DATA_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h +2601;STORE_DATA_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/storagemanager/StorageManagerIF.h +2800;DEVICE_BUILDING_COMMAND_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2801;DEVICE_SENDING_COMMAND_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2802;DEVICE_REQUESTING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2803;DEVICE_READING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2804;DEVICE_INTERPRETING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2805;DEVICE_MISSED_REPLY;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2806;DEVICE_UNKNOWN_REPLY;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2807;DEVICE_UNREQUESTED_REPLY;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2808;INVALID_DEVICE_COMMAND;LOW;Indicates a SW bug in child class.;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2809;MONITORING_LIMIT_EXCEEDED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +2810;MONITORING_AMBIGUOUS;HIGH;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/devicehandlers/DeviceHandlerIF.h +4201;FUSE_CURRENT_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h +4202;FUSE_WENT_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h +4204;POWER_ABOVE_HIGH_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h +4205;POWER_BELOW_LOW_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/Fuse.h +4300;SWITCH_WENT_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/power/PowerSwitchIF.h +5000;HEATER_ON;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h +5001;HEATER_OFF;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h +5002;HEATER_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h +5003;HEATER_STAYED_ON;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h +5004;HEATER_STAYED_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/Heater.h +5200;TEMP_SENSOR_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h +5201;TEMP_SENSOR_LOW;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h +5202;TEMP_SENSOR_GRADIENT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/AbstractTemperatureSensor.h +5901;COMPONENT_TEMP_LOW;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h +5902;COMPONENT_TEMP_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h +5903;COMPONENT_TEMP_OOL_LOW;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h +5904;COMPONENT_TEMP_OOL_HIGH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h +5905;TEMP_NOT_IN_OP_RANGE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/thermal/ThermalComponentIF.h +7101;FDIR_CHANGED_STATE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h +7102;FDIR_STARTS_RECOVERY;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h +7103;FDIR_TURNS_OFF_DEVICE;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/fdir/FailureIsolationBase.h +7201;MONITOR_CHANGED_STATE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h +7202;VALUE_BELOW_LOW_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h +7203;VALUE_ABOVE_HIGH_LIMIT;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h +7204;VALUE_OUT_OF_RANGE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/monitoring/MonitoringIF.h +7301;SWITCHING_TM_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datapool/HkSwitchHelper.h +7400;CHANGING_MODE;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7401;MODE_INFO;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7402;FALLBACK_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7403;MODE_TRANSITION_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7404;CANT_KEEP_MODE;HIGH;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7405;OBJECT_IN_INVALID_MODE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7406;FORCING_MODE;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7407;MODE_CMD_REJECTED;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/modes/HasModesIF.h +7506;HEALTH_INFO;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h +7507;CHILD_CHANGED_HEALTH;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h +7508;CHILD_PROBLEMS;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h +7509;OVERWRITING_HEALTH;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h +7510;TRYING_RECOVERY;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h +7511;RECOVERY_STEP;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h +7512;RECOVERY_DONE;MEDIUM;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/health/HasHealthIF.h +7900;RF_AVAILABLE;INFO;A RF available signal was detected. P1: raw RFA state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h +7901;RF_LOST;INFO;A previously found RF available signal was lost. P1: raw RFA state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h +7902;BIT_LOCK;INFO;A Bit Lock signal. Was detected. P1: raw BLO state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h +7903;BIT_LOCK_LOST;INFO;A previously found Bit Lock signal was lost. P1: raw BLO state, P2: 0;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h +7905;FRAME_PROCESSING_FAILED;LOW;The CCSDS Board could not interpret a TC;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/datalinklayer/DataLinkLayer.h +8900;CLOCK_SET;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h +8901;CLOCK_SET_FAILURE;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/pus/Service9TimeManagement.h +9700;TEST;INFO;;C:\Users\jakob\eive-software\eive_obsw/fsfw/src/fsfw/pus/Service17Test.h +10600;CHANGE_OF_SETUP_PARAMETER;LOW;;C:\Users\jakob\eive-software\eive_obsw/fsfw/hal/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h +10900;GPIO_PULL_HIGH_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h +10901;GPIO_PULL_LOW_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h +10902;SWITCH_ALREADY_ON;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h +10903;SWITCH_ALREADY_OFF;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h +10904;MAIN_SWITCH_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/mission/devices/HeaterHandler.h +11000;MAIN_SWITCH_ON_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h +11001;MAIN_SWITCH_OFF_TIMEOUT;LOW;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h +11002;DEPLOYMENT_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h +11003;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h +11004;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/devices/SolarArrayDeploymentHandler.h +11101;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +11102;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +11103;EXE_FAILURE;LOW;PLOC receive execution failure report;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +11104;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +11105;MPSOC_HANDLER_SEQ_CNT_MISMATCH;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHandler.h +11201;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11202;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11203;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11204;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11205;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11206;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11207;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11208;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;C:\Users\jakob\eive-software\eive_obsw/mission/devices/IMTQHandler.h +11301;ERROR_STATE;HIGH;Reaction wheel signals an error state;C:\Users\jakob\eive-software\eive_obsw/mission/devices/RwHandler.h +11501;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocSupervisorHandler.h +11502;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocSupervisorHandler.h +11503;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocSupervisorHandler.h +11504;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocSupervisorHandler.h +11600;SANITIZATION_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/memory/SdCardManager.h +11700;UPDATE_FILE_NOT_EXISTS;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocUpdater.h +11701;ACTION_COMMANDING_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocUpdater.h +11702;UPDATE_AVAILABLE_FAILED;LOW;Supervisor handler replied action message indicating a command execution failure of the update available command;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocUpdater.h +11703;UPDATE_TRANSFER_FAILED;LOW;Supervisor handler failed to transfer an update space packet. P1: Parameter holds the number of update packets already sent (inclusive the failed packet);C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocUpdater.h +11704;UPDATE_VERIFY_FAILED;LOW;Supervisor failed to execute the update verify command.;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocUpdater.h +11705;UPDATE_FINISHED;INFO;MPSoC update successful completed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocUpdater.h +11800;SEND_MRAM_DUMP_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMemoryDumper.h +11801;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMemoryDumper.h +11802;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMemoryDumper.h +11901;INVALID_TC_FRAME;HIGH;;C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h +11902;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h +11903;CARRIER_LOCK;INFO;Carrier lock detected;C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h +11904;BIT_LOCK_PDEC;INFO;Bit lock detected (data valid);C:\Users\jakob\eive-software\eive_obsw/linux/obc/PdecHandler.h +12000;STR_HELPER_IMAGE_UPLOAD_FAILED;LOW;Image upload failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12001;STR_HELPER_IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12002;STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12003;STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12004;STR_HELPER_FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12005;STR_HELPER_FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12006;STR_HELPER_FLASH_WRITE_FAILED;LOW;Flash write procedure failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12007;STR_HELPER_FLASH_READ_FAILED;LOW;Flash read procedure failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12008;STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL;LOW;Download of FPGA image successful;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12009;STR_HELPER_FPGA_DOWNLOAD_FAILED;LOW;Download of FPGA image failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12010;STR_HELPER_FPGA_UPLOAD_SUCCESSFUL;LOW;Upload of FPGA image successful;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12011;STR_HELPER_FPGA_UPLOAD_FAILED;LOW;Upload of FPGA image failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12012;STR_HELPER_READING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12013;STR_HELPER_COM_ERROR;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12014;STR_HELPER_NO_REPLY;LOW;Star tracker did not send replies (maybe device is powered off)P1: Position of upload or download packet for which no reply was sent;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12015;STR_HELPER_DEC_ERROR;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12016;STR_HELPER_POSITION_MISMATCH;LOW;Position mismatchP1: The expected position and thus the position for which the image upload/download failed;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12017;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not existP1: Internal state of str helper;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12018;STR_HELPER_SENDING_PACKET_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12019;STR_HELPER_REQUESTING_MSG_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/startracker/StrHelper.h +12100;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12101;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12102;SENDING_COMMAND_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12103;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12104;MPSOC_HELPER_READING_REPLY_FAILED;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12105;MISSING_ACK;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12106;MISSING_EXE;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12107;ACK_FAILURE_REPORT;LOW;Received acknowledgement failure reportP1: Internal state of MPSoC;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12108;EXE_FAILURE_REPORT;LOW;Received execution failure reportP1: Internal state of MPSoC;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12109;ACK_INVALID_APID;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12110;EXE_INVALID_APID;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h +12111;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;;C:\Users\jakob\eive-software\eive_obsw/bsp_q7s/devices/ploc/PlocMPSoCHelper.h diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv index af48751f..4a34752c 100644 --- a/generators/bsp_q7s_objects.csv +++ b/generators/bsp_q7s_objects.csv @@ -40,6 +40,7 @@ 0x44330000;PLOC_UPDATER 0x44330001;PLOC_MEMORY_DUMPER 0x44330002;STR_HELPER +0x44330003;PLOC_MPSOC_HELPER 0x44330015;PLOC_MPSOC_HANDLER 0x44330016;PLOC_SUPERVISOR_HANDLER 0x444100A2;SOLAR_ARRAY_DEPL_HANDLER diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index 17150762..48223d9c 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 140 translations. + * @brief Auto-generated event translation file. Contains 153 translations. * @details - * Generated on: 2021-12-29 20:24:08 + * Generated on: 2022-01-11 14:16:26 */ #include "translateEvents.h" @@ -97,7 +97,8 @@ const char *DEPL_SA2_GPIO_SWTICH_ON_FAILED_STRING = "DEPL_SA2_GPIO_SWTICH_ON_FAI const char *MEMORY_READ_RPT_CRC_FAILURE_STRING = "MEMORY_READ_RPT_CRC_FAILURE"; const char *ACK_FAILURE_STRING = "ACK_FAILURE"; const char *EXE_FAILURE_STRING = "EXE_FAILURE"; -const char *CRC_FAILURE_EVENT_STRING = "CRC_FAILURE_EVENT"; +const char *MPSOC_HANDLER_CRC_FAILURE_STRING = "MPSOC_HANDLER_CRC_FAILURE"; +const char *MPSOC_HANDLER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HANDLER_SEQ_CNT_MISMATCH"; const char *SELF_TEST_I2C_FAILURE_STRING = "SELF_TEST_I2C_FAILURE"; const char *SELF_TEST_SPI_FAILURE_STRING = "SELF_TEST_SPI_FAILURE"; const char *SELF_TEST_ADC_FAILURE_STRING = "SELF_TEST_ADC_FAILURE"; @@ -125,26 +126,38 @@ const char *INVALID_TC_FRAME_STRING = "INVALID_TC_FRAME"; const char *INVALID_FAR_STRING = "INVALID_FAR"; const char *CARRIER_LOCK_STRING = "CARRIER_LOCK"; const char *BIT_LOCK_PDEC_STRING = "BIT_LOCK_PDEC"; -const char *IMAGE_UPLOAD_FAILED_STRING = "IMAGE_UPLOAD_FAILED"; -const char *IMAGE_DOWNLOAD_FAILED_STRING = "IMAGE_DOWNLOAD_FAILED"; -const char *IMAGE_UPLOAD_SUCCESSFUL_STRING = "IMAGE_UPLOAD_SUCCESSFUL"; -const char *IMAGE_DOWNLOAD_SUCCESSFUL_STRING = "IMAGE_DOWNLOAD_SUCCESSFUL"; -const char *FLASH_WRITE_SUCCESSFUL_STRING = "FLASH_WRITE_SUCCESSFUL"; -const char *FLASH_READ_SUCCESSFUL_STRING = "FLASH_READ_SUCCESSFUL"; -const char *FLASH_WRITE_FAILED_STRING = "FLASH_WRITE_FAILED"; -const char *FLASH_READ_FAILED_STRING = "FLASH_READ_FAILED"; -const char *FPGA_DOWNLOAD_SUCCESSFUL_STRING = "FPGA_DOWNLOAD_SUCCESSFUL"; -const char *FPGA_DOWNLOAD_FAILED_STRING = "FPGA_DOWNLOAD_FAILED"; -const char *FPGA_UPLOAD_SUCCESSFUL_STRING = "FPGA_UPLOAD_SUCCESSFUL"; -const char *FPGA_UPLOAD_FAILED_STRING = "FPGA_UPLOAD_FAILED"; +const char *STR_HELPER_IMAGE_UPLOAD_FAILED_STRING = "STR_HELPER_IMAGE_UPLOAD_FAILED"; +const char *STR_HELPER_IMAGE_DOWNLOAD_FAILED_STRING = "STR_HELPER_IMAGE_DOWNLOAD_FAILED"; +const char *STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL_STRING = "STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL"; +const char *STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL_STRING = "STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL"; +const char *STR_HELPER_FLASH_WRITE_SUCCESSFUL_STRING = "STR_HELPER_FLASH_WRITE_SUCCESSFUL"; +const char *STR_HELPER_FLASH_READ_SUCCESSFUL_STRING = "STR_HELPER_FLASH_READ_SUCCESSFUL"; +const char *STR_HELPER_FLASH_WRITE_FAILED_STRING = "STR_HELPER_FLASH_WRITE_FAILED"; +const char *STR_HELPER_FLASH_READ_FAILED_STRING = "STR_HELPER_FLASH_READ_FAILED"; +const char *STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL_STRING = "STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL"; +const char *STR_HELPER_FPGA_DOWNLOAD_FAILED_STRING = "STR_HELPER_FPGA_DOWNLOAD_FAILED"; +const char *STR_HELPER_FPGA_UPLOAD_SUCCESSFUL_STRING = "STR_HELPER_FPGA_UPLOAD_SUCCESSFUL"; +const char *STR_HELPER_FPGA_UPLOAD_FAILED_STRING = "STR_HELPER_FPGA_UPLOAD_FAILED"; const char *STR_HELPER_READING_REPLY_FAILED_STRING = "STR_HELPER_READING_REPLY_FAILED"; const char *STR_HELPER_COM_ERROR_STRING = "STR_HELPER_COM_ERROR"; const char *STR_HELPER_NO_REPLY_STRING = "STR_HELPER_NO_REPLY"; const char *STR_HELPER_DEC_ERROR_STRING = "STR_HELPER_DEC_ERROR"; -const char *POSITION_MISMATCH_STRING = "POSITION_MISMATCH"; +const char *STR_HELPER_POSITION_MISMATCH_STRING = "STR_HELPER_POSITION_MISMATCH"; const char *STR_HELPER_FILE_NOT_EXISTS_STRING = "STR_HELPER_FILE_NOT_EXISTS"; const char *STR_HELPER_SENDING_PACKET_FAILED_STRING = "STR_HELPER_SENDING_PACKET_FAILED"; const char *STR_HELPER_REQUESTING_MSG_FAILED_STRING = "STR_HELPER_REQUESTING_MSG_FAILED"; +const char *MPSOC_FLASH_WRITE_FAILED_STRING = "MPSOC_FLASH_WRITE_FAILED"; +const char *MPSOC_FLASH_WRITE_SUCCESSFUL_STRING = "MPSOC_FLASH_WRITE_SUCCESSFUL"; +const char *SENDING_COMMAND_FAILED_STRING = "SENDING_COMMAND_FAILED"; +const char *MPSOC_HELPER_REQUESTING_REPLY_FAILED_STRING = "MPSOC_HELPER_REQUESTING_REPLY_FAILED"; +const char *MPSOC_HELPER_READING_REPLY_FAILED_STRING = "MPSOC_HELPER_READING_REPLY_FAILED"; +const char *MISSING_ACK_STRING = "MISSING_ACK"; +const char *MISSING_EXE_STRING = "MISSING_EXE"; +const char *ACK_FAILURE_REPORT_STRING = "ACK_FAILURE_REPORT"; +const char *EXE_FAILURE_REPORT_STRING = "EXE_FAILURE_REPORT"; +const char *ACK_INVALID_APID_STRING = "ACK_INVALID_APID"; +const char *EXE_INVALID_APID_STRING = "EXE_INVALID_APID"; +const char *MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HELPER_SEQ_CNT_MISMATCH"; const char * translateEvents(Event event) { switch( (event & 0xffff) ) { @@ -333,7 +346,9 @@ const char * translateEvents(Event event) { case(11103): return EXE_FAILURE_STRING; case(11104): - return CRC_FAILURE_EVENT_STRING; + return MPSOC_HANDLER_CRC_FAILURE_STRING; + case(11105): + return MPSOC_HANDLER_SEQ_CNT_MISMATCH_STRING; case(11201): return SELF_TEST_I2C_FAILURE_STRING; case(11202): @@ -389,29 +404,29 @@ const char * translateEvents(Event event) { case(11904): return BIT_LOCK_PDEC_STRING; case(12000): - return IMAGE_UPLOAD_FAILED_STRING; + return STR_HELPER_IMAGE_UPLOAD_FAILED_STRING; case(12001): - return IMAGE_DOWNLOAD_FAILED_STRING; + return STR_HELPER_IMAGE_DOWNLOAD_FAILED_STRING; case(12002): - return IMAGE_UPLOAD_SUCCESSFUL_STRING; + return STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL_STRING; case(12003): - return IMAGE_DOWNLOAD_SUCCESSFUL_STRING; + return STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL_STRING; case(12004): - return FLASH_WRITE_SUCCESSFUL_STRING; + return STR_HELPER_FLASH_WRITE_SUCCESSFUL_STRING; case(12005): - return FLASH_READ_SUCCESSFUL_STRING; + return STR_HELPER_FLASH_READ_SUCCESSFUL_STRING; case(12006): - return FLASH_WRITE_FAILED_STRING; + return STR_HELPER_FLASH_WRITE_FAILED_STRING; case(12007): - return FLASH_READ_FAILED_STRING; + return STR_HELPER_FLASH_READ_FAILED_STRING; case(12008): - return FPGA_DOWNLOAD_SUCCESSFUL_STRING; + return STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL_STRING; case(12009): - return FPGA_DOWNLOAD_FAILED_STRING; + return STR_HELPER_FPGA_DOWNLOAD_FAILED_STRING; case(12010): - return FPGA_UPLOAD_SUCCESSFUL_STRING; + return STR_HELPER_FPGA_UPLOAD_SUCCESSFUL_STRING; case(12011): - return FPGA_UPLOAD_FAILED_STRING; + return STR_HELPER_FPGA_UPLOAD_FAILED_STRING; case(12012): return STR_HELPER_READING_REPLY_FAILED_STRING; case(12013): @@ -421,13 +436,37 @@ const char * translateEvents(Event event) { case(12015): return STR_HELPER_DEC_ERROR_STRING; case(12016): - return POSITION_MISMATCH_STRING; + return STR_HELPER_POSITION_MISMATCH_STRING; case(12017): return STR_HELPER_FILE_NOT_EXISTS_STRING; case(12018): return STR_HELPER_SENDING_PACKET_FAILED_STRING; case(12019): return STR_HELPER_REQUESTING_MSG_FAILED_STRING; + case(12100): + return MPSOC_FLASH_WRITE_FAILED_STRING; + case(12101): + return MPSOC_FLASH_WRITE_SUCCESSFUL_STRING; + case(12102): + return SENDING_COMMAND_FAILED_STRING; + case(12103): + return MPSOC_HELPER_REQUESTING_REPLY_FAILED_STRING; + case(12104): + return MPSOC_HELPER_READING_REPLY_FAILED_STRING; + case(12105): + return MISSING_ACK_STRING; + case(12106): + return MISSING_EXE_STRING; + case(12107): + return ACK_FAILURE_REPORT_STRING; + case(12108): + return EXE_FAILURE_REPORT_STRING; + case(12109): + return ACK_INVALID_APID_STRING; + case(12110): + return EXE_INVALID_APID_STRING; + case(12111): + return MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 49900a5d..a7862c08 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 113 translations. - * Generated on: 2021-12-21 17:21:23 + * Contains 114 translations. + * Generated on: 2022-01-11 12:57:41 */ #include "translateObjects.h" @@ -48,6 +48,7 @@ const char *RAD_SENSOR_STRING = "RAD_SENSOR"; const char *PLOC_UPDATER_STRING = "PLOC_UPDATER"; const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER"; const char *STR_HELPER_STRING = "STR_HELPER"; +const char *PLOC_MPSOC_HELPER_STRING = "PLOC_MPSOC_HELPER"; const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER"; const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER"; const char *SOLAR_ARRAY_DEPL_HANDLER_STRING = "SOLAR_ARRAY_DEPL_HANDLER"; @@ -206,6 +207,8 @@ const char* translateObject(object_id_t object) { return PLOC_MEMORY_DUMPER_STRING; case 0x44330002: return STR_HELPER_STRING; + case 0x44330003: + return PLOC_MPSOC_HELPER_STRING; case 0x44330015: return PLOC_MPSOC_HANDLER_STRING; case 0x44330016: diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index 30192ead..c8feafdf 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -111,6 +111,8 @@ debugging. */ #define OBSW_DEBUG_PLOC_SUPERVISOR 0 #define OBSW_DEBUG_PDEC_HANDLER 1 +#define TCP_SERVER_WIRETAPPING 0 + /*******************************************************************/ /** Hardcoded */ /*******************************************************************/ diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index 17150762..48223d9c 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 140 translations. + * @brief Auto-generated event translation file. Contains 153 translations. * @details - * Generated on: 2021-12-29 20:24:08 + * Generated on: 2022-01-11 14:16:26 */ #include "translateEvents.h" @@ -97,7 +97,8 @@ const char *DEPL_SA2_GPIO_SWTICH_ON_FAILED_STRING = "DEPL_SA2_GPIO_SWTICH_ON_FAI const char *MEMORY_READ_RPT_CRC_FAILURE_STRING = "MEMORY_READ_RPT_CRC_FAILURE"; const char *ACK_FAILURE_STRING = "ACK_FAILURE"; const char *EXE_FAILURE_STRING = "EXE_FAILURE"; -const char *CRC_FAILURE_EVENT_STRING = "CRC_FAILURE_EVENT"; +const char *MPSOC_HANDLER_CRC_FAILURE_STRING = "MPSOC_HANDLER_CRC_FAILURE"; +const char *MPSOC_HANDLER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HANDLER_SEQ_CNT_MISMATCH"; const char *SELF_TEST_I2C_FAILURE_STRING = "SELF_TEST_I2C_FAILURE"; const char *SELF_TEST_SPI_FAILURE_STRING = "SELF_TEST_SPI_FAILURE"; const char *SELF_TEST_ADC_FAILURE_STRING = "SELF_TEST_ADC_FAILURE"; @@ -125,26 +126,38 @@ const char *INVALID_TC_FRAME_STRING = "INVALID_TC_FRAME"; const char *INVALID_FAR_STRING = "INVALID_FAR"; const char *CARRIER_LOCK_STRING = "CARRIER_LOCK"; const char *BIT_LOCK_PDEC_STRING = "BIT_LOCK_PDEC"; -const char *IMAGE_UPLOAD_FAILED_STRING = "IMAGE_UPLOAD_FAILED"; -const char *IMAGE_DOWNLOAD_FAILED_STRING = "IMAGE_DOWNLOAD_FAILED"; -const char *IMAGE_UPLOAD_SUCCESSFUL_STRING = "IMAGE_UPLOAD_SUCCESSFUL"; -const char *IMAGE_DOWNLOAD_SUCCESSFUL_STRING = "IMAGE_DOWNLOAD_SUCCESSFUL"; -const char *FLASH_WRITE_SUCCESSFUL_STRING = "FLASH_WRITE_SUCCESSFUL"; -const char *FLASH_READ_SUCCESSFUL_STRING = "FLASH_READ_SUCCESSFUL"; -const char *FLASH_WRITE_FAILED_STRING = "FLASH_WRITE_FAILED"; -const char *FLASH_READ_FAILED_STRING = "FLASH_READ_FAILED"; -const char *FPGA_DOWNLOAD_SUCCESSFUL_STRING = "FPGA_DOWNLOAD_SUCCESSFUL"; -const char *FPGA_DOWNLOAD_FAILED_STRING = "FPGA_DOWNLOAD_FAILED"; -const char *FPGA_UPLOAD_SUCCESSFUL_STRING = "FPGA_UPLOAD_SUCCESSFUL"; -const char *FPGA_UPLOAD_FAILED_STRING = "FPGA_UPLOAD_FAILED"; +const char *STR_HELPER_IMAGE_UPLOAD_FAILED_STRING = "STR_HELPER_IMAGE_UPLOAD_FAILED"; +const char *STR_HELPER_IMAGE_DOWNLOAD_FAILED_STRING = "STR_HELPER_IMAGE_DOWNLOAD_FAILED"; +const char *STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL_STRING = "STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL"; +const char *STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL_STRING = "STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL"; +const char *STR_HELPER_FLASH_WRITE_SUCCESSFUL_STRING = "STR_HELPER_FLASH_WRITE_SUCCESSFUL"; +const char *STR_HELPER_FLASH_READ_SUCCESSFUL_STRING = "STR_HELPER_FLASH_READ_SUCCESSFUL"; +const char *STR_HELPER_FLASH_WRITE_FAILED_STRING = "STR_HELPER_FLASH_WRITE_FAILED"; +const char *STR_HELPER_FLASH_READ_FAILED_STRING = "STR_HELPER_FLASH_READ_FAILED"; +const char *STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL_STRING = "STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL"; +const char *STR_HELPER_FPGA_DOWNLOAD_FAILED_STRING = "STR_HELPER_FPGA_DOWNLOAD_FAILED"; +const char *STR_HELPER_FPGA_UPLOAD_SUCCESSFUL_STRING = "STR_HELPER_FPGA_UPLOAD_SUCCESSFUL"; +const char *STR_HELPER_FPGA_UPLOAD_FAILED_STRING = "STR_HELPER_FPGA_UPLOAD_FAILED"; const char *STR_HELPER_READING_REPLY_FAILED_STRING = "STR_HELPER_READING_REPLY_FAILED"; const char *STR_HELPER_COM_ERROR_STRING = "STR_HELPER_COM_ERROR"; const char *STR_HELPER_NO_REPLY_STRING = "STR_HELPER_NO_REPLY"; const char *STR_HELPER_DEC_ERROR_STRING = "STR_HELPER_DEC_ERROR"; -const char *POSITION_MISMATCH_STRING = "POSITION_MISMATCH"; +const char *STR_HELPER_POSITION_MISMATCH_STRING = "STR_HELPER_POSITION_MISMATCH"; const char *STR_HELPER_FILE_NOT_EXISTS_STRING = "STR_HELPER_FILE_NOT_EXISTS"; const char *STR_HELPER_SENDING_PACKET_FAILED_STRING = "STR_HELPER_SENDING_PACKET_FAILED"; const char *STR_HELPER_REQUESTING_MSG_FAILED_STRING = "STR_HELPER_REQUESTING_MSG_FAILED"; +const char *MPSOC_FLASH_WRITE_FAILED_STRING = "MPSOC_FLASH_WRITE_FAILED"; +const char *MPSOC_FLASH_WRITE_SUCCESSFUL_STRING = "MPSOC_FLASH_WRITE_SUCCESSFUL"; +const char *SENDING_COMMAND_FAILED_STRING = "SENDING_COMMAND_FAILED"; +const char *MPSOC_HELPER_REQUESTING_REPLY_FAILED_STRING = "MPSOC_HELPER_REQUESTING_REPLY_FAILED"; +const char *MPSOC_HELPER_READING_REPLY_FAILED_STRING = "MPSOC_HELPER_READING_REPLY_FAILED"; +const char *MISSING_ACK_STRING = "MISSING_ACK"; +const char *MISSING_EXE_STRING = "MISSING_EXE"; +const char *ACK_FAILURE_REPORT_STRING = "ACK_FAILURE_REPORT"; +const char *EXE_FAILURE_REPORT_STRING = "EXE_FAILURE_REPORT"; +const char *ACK_INVALID_APID_STRING = "ACK_INVALID_APID"; +const char *EXE_INVALID_APID_STRING = "EXE_INVALID_APID"; +const char *MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING = "MPSOC_HELPER_SEQ_CNT_MISMATCH"; const char * translateEvents(Event event) { switch( (event & 0xffff) ) { @@ -333,7 +346,9 @@ const char * translateEvents(Event event) { case(11103): return EXE_FAILURE_STRING; case(11104): - return CRC_FAILURE_EVENT_STRING; + return MPSOC_HANDLER_CRC_FAILURE_STRING; + case(11105): + return MPSOC_HANDLER_SEQ_CNT_MISMATCH_STRING; case(11201): return SELF_TEST_I2C_FAILURE_STRING; case(11202): @@ -389,29 +404,29 @@ const char * translateEvents(Event event) { case(11904): return BIT_LOCK_PDEC_STRING; case(12000): - return IMAGE_UPLOAD_FAILED_STRING; + return STR_HELPER_IMAGE_UPLOAD_FAILED_STRING; case(12001): - return IMAGE_DOWNLOAD_FAILED_STRING; + return STR_HELPER_IMAGE_DOWNLOAD_FAILED_STRING; case(12002): - return IMAGE_UPLOAD_SUCCESSFUL_STRING; + return STR_HELPER_IMAGE_UPLOAD_SUCCESSFUL_STRING; case(12003): - return IMAGE_DOWNLOAD_SUCCESSFUL_STRING; + return STR_HELPER_IMAGE_DOWNLOAD_SUCCESSFUL_STRING; case(12004): - return FLASH_WRITE_SUCCESSFUL_STRING; + return STR_HELPER_FLASH_WRITE_SUCCESSFUL_STRING; case(12005): - return FLASH_READ_SUCCESSFUL_STRING; + return STR_HELPER_FLASH_READ_SUCCESSFUL_STRING; case(12006): - return FLASH_WRITE_FAILED_STRING; + return STR_HELPER_FLASH_WRITE_FAILED_STRING; case(12007): - return FLASH_READ_FAILED_STRING; + return STR_HELPER_FLASH_READ_FAILED_STRING; case(12008): - return FPGA_DOWNLOAD_SUCCESSFUL_STRING; + return STR_HELPER_FPGA_DOWNLOAD_SUCCESSFUL_STRING; case(12009): - return FPGA_DOWNLOAD_FAILED_STRING; + return STR_HELPER_FPGA_DOWNLOAD_FAILED_STRING; case(12010): - return FPGA_UPLOAD_SUCCESSFUL_STRING; + return STR_HELPER_FPGA_UPLOAD_SUCCESSFUL_STRING; case(12011): - return FPGA_UPLOAD_FAILED_STRING; + return STR_HELPER_FPGA_UPLOAD_FAILED_STRING; case(12012): return STR_HELPER_READING_REPLY_FAILED_STRING; case(12013): @@ -421,13 +436,37 @@ const char * translateEvents(Event event) { case(12015): return STR_HELPER_DEC_ERROR_STRING; case(12016): - return POSITION_MISMATCH_STRING; + return STR_HELPER_POSITION_MISMATCH_STRING; case(12017): return STR_HELPER_FILE_NOT_EXISTS_STRING; case(12018): return STR_HELPER_SENDING_PACKET_FAILED_STRING; case(12019): return STR_HELPER_REQUESTING_MSG_FAILED_STRING; + case(12100): + return MPSOC_FLASH_WRITE_FAILED_STRING; + case(12101): + return MPSOC_FLASH_WRITE_SUCCESSFUL_STRING; + case(12102): + return SENDING_COMMAND_FAILED_STRING; + case(12103): + return MPSOC_HELPER_REQUESTING_REPLY_FAILED_STRING; + case(12104): + return MPSOC_HELPER_READING_REPLY_FAILED_STRING; + case(12105): + return MISSING_ACK_STRING; + case(12106): + return MISSING_EXE_STRING; + case(12107): + return ACK_FAILURE_REPORT_STRING; + case(12108): + return EXE_FAILURE_REPORT_STRING; + case(12109): + return ACK_INVALID_APID_STRING; + case(12110): + return EXE_INVALID_APID_STRING; + case(12111): + return MPSOC_HELPER_SEQ_CNT_MISMATCH_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 49900a5d..a7862c08 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 113 translations. - * Generated on: 2021-12-21 17:21:23 + * Contains 114 translations. + * Generated on: 2022-01-11 12:57:41 */ #include "translateObjects.h" @@ -48,6 +48,7 @@ const char *RAD_SENSOR_STRING = "RAD_SENSOR"; const char *PLOC_UPDATER_STRING = "PLOC_UPDATER"; const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER"; const char *STR_HELPER_STRING = "STR_HELPER"; +const char *PLOC_MPSOC_HELPER_STRING = "PLOC_MPSOC_HELPER"; const char *PLOC_MPSOC_HANDLER_STRING = "PLOC_MPSOC_HANDLER"; const char *PLOC_SUPERVISOR_HANDLER_STRING = "PLOC_SUPERVISOR_HANDLER"; const char *SOLAR_ARRAY_DEPL_HANDLER_STRING = "SOLAR_ARRAY_DEPL_HANDLER"; @@ -206,6 +207,8 @@ const char* translateObject(object_id_t object) { return PLOC_MEMORY_DUMPER_STRING; case 0x44330002: return STR_HELPER_STRING; + case 0x44330003: + return PLOC_MPSOC_HELPER_STRING; case 0x44330015: return PLOC_MPSOC_HANDLER_STRING; case 0x44330016: diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index 14c8791a..5ea64d33 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -111,6 +111,9 @@ void ObjectFactory::produceGenericObjects() { tcpServer->setSpacePacketParsingOptions({common::PUS_PACKET_ID}); sif::info << "Created TCP server for TMTC commanding with listener port " << tcpServer->getTcpPort() << std::endl; +#if TCP_SERVER_WIRETAPPING == 1 + tcpServer->enableWiretapping(true); +#endif /* TCP_SERVER_WIRETAPPING == 1 */ #endif /* OBSW_USE_TMTC_TCP_BRIDGE == 0 */ tmtcBridge->setMaxNumberOfPacketsStored(70); #endif /* OBSW_ADD_TCPIP_BRIDGE == 1 */ From 5634f152934324ccd76dbc046e922700ca933109 Mon Sep 17 00:00:00 2001 From: Markus Koller Date: Thu, 13 Jan 2022 14:14:33 +0100 Subject: [PATCH 011/309] fix ack size --- bsp_q7s/core/ObjectFactory.cpp | 6 ++++++ mission/devices/SyrlinksHkHandler.h | 6 +++--- mission/devices/devicedefinitions/SyrlinksDefinitions.h | 2 +- tmtc | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 1c5bb2df..760e2a4a 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -154,8 +154,14 @@ void ObjectFactory::produce(void* args) { #if OBSW_ADD_PLOC_MPSOC == 1 UartCookie* plocMpsocCookie = new UartCookie(objects::PLOC_MPSOC_HANDLER, q7s::UART_PLOC_MPSOC_DEV, UartModes::NON_CANONICAL, uart::PLOC_MPSOC_BAUD, +<<<<<<< Updated upstream PLOC_MPSOC::MAX_REPLY_SIZE); new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, plocMpsocCookie); +======= + mpsoc::MAX_REPLY_SIZE); + PlocMPSoCHandler* plocMpsocHandler = new PlocMPSoCHandler(objects::PLOC_MPSOC_HANDLER, objects::UART_COM_IF, plocMpsocCookie); + plocMpsocHandler->setStartUpImmediately(); +>>>>>>> Stashed changes #endif /* OBSW_ADD_PLOC_MPSOC == 1 */ #if OBSW_ADD_PLOC_SUPERVISOR == 1 diff --git a/mission/devices/SyrlinksHkHandler.h b/mission/devices/SyrlinksHkHandler.h index c194fd18..f30fb5bb 100644 --- a/mission/devices/SyrlinksHkHandler.h +++ b/mission/devices/SyrlinksHkHandler.h @@ -61,10 +61,10 @@ private: std::string resetCommand = ""; std::string readRxStatusRegCommand = ""; - std::string setTxModeStandby = ""; + std::string setTxModeStandby = ""; /** W - write, 04 - 4 bytes in data field, 01 - value, 40 register to write value */ - std::string setTxModeModulation = ""; - std::string setTxModeCw = ""; + std::string setTxModeModulation = ""; + std::string setTxModeCw = ""; std::string readTxStatus = ""; std::string readTxWaveform = ""; std::string readTxAgcValueHighByte = ""; diff --git a/mission/devices/devicedefinitions/SyrlinksDefinitions.h b/mission/devices/devicedefinitions/SyrlinksDefinitions.h index 7aa75b99..43ce16f2 100644 --- a/mission/devices/devicedefinitions/SyrlinksDefinitions.h +++ b/mission/devices/devicedefinitions/SyrlinksDefinitions.h @@ -21,7 +21,7 @@ namespace SYRLINKS { static const DeviceCommandId_t READ_TX_AGC_VALUE_LOW_BYTE = 0x0A; /** Size of a simple transmission success response */ - static const uint8_t ACK_SIZE = 11; + static const uint8_t ACK_SIZE = 12; static const uint8_t SIZE_CRC_AND_TERMINATION = 5; /** The size of the header with the message identifier and the payload size field */ static const uint8_t MESSAGE_HEADER_SIZE = 5; diff --git a/tmtc b/tmtc index 734dc5ae..5816f05c 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 734dc5aef88d9fef4ad59817b6ea315db954205c +Subproject commit 5816f05ccf8971f3cf2dd1d603dd3f5a33f6f504 From c20acfc9c8c916c81cc845d5d0a9dcfa4cdfbe07 Mon Sep 17 00:00:00 2001 From: Markus Koller Date: Thu, 13 Jan 2022 16:32:30 +0100 Subject: [PATCH 012/309] crc fixes --- mission/devices/SyrlinksHkHandler.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mission/devices/SyrlinksHkHandler.h b/mission/devices/SyrlinksHkHandler.h index f30fb5bb..bf8a489a 100644 --- a/mission/devices/SyrlinksHkHandler.h +++ b/mission/devices/SyrlinksHkHandler.h @@ -61,9 +61,9 @@ private: std::string resetCommand = ""; std::string readRxStatusRegCommand = ""; - std::string setTxModeStandby = ""; + std::string setTxModeStandby = ""; /** W - write, 04 - 4 bytes in data field, 01 - value, 40 register to write value */ - std::string setTxModeModulation = ""; + std::string setTxModeModulation = ""; std::string setTxModeCw = ""; std::string readTxStatus = ""; std::string readTxWaveform = ""; From 02a8fd124f4706969269b6908a5c1cb9884f7ff2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 14:24:34 +0100 Subject: [PATCH 013/309] added empty PL PCDU handler --- fsfw | 2 +- linux/devices/CMakeLists.txt | 1 + linux/devices/PayloadPcduHandler.cpp | 43 ++++++++++++++++++++++++++++ linux/devices/PayloadPcduHandler.h | 26 +++++++++++++++++ linux/devices/SusHandler.h | 9 +++--- 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 linux/devices/PayloadPcduHandler.cpp create mode 100644 linux/devices/PayloadPcduHandler.h diff --git a/fsfw b/fsfw index 32a9e0c7..81f5b0c3 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 32a9e0c7044665f0265c10108c8d62d45c047769 +Subproject commit 81f5b0c3bf3e602f5cc459dc39bc1e8885c932a7 diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt index b02c8e57..86b4f44c 100644 --- a/linux/devices/CMakeLists.txt +++ b/linux/devices/CMakeLists.txt @@ -1,4 +1,5 @@ target_sources(${TARGET_NAME} PRIVATE SolarArrayDeploymentHandler.cpp + PayloadPcduHandler.cpp SusHandler.cpp ) diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp new file mode 100644 index 00000000..9a1dd292 --- /dev/null +++ b/linux/devices/PayloadPcduHandler.cpp @@ -0,0 +1,43 @@ +#include "PayloadPcduHandler.h" + +PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie) + : DeviceHandlerBase(objectId, comIF, cookie) {} + +void PayloadPcduHandler::doStartUp() {} + +void PayloadPcduHandler::doShutDown() {} + +ReturnValue_t PayloadPcduHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { + return HasReturnvaluesIF::RETURN_OK; +} + +ReturnValue_t PayloadPcduHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { + return HasReturnvaluesIF::RETURN_OK; +} + +void PayloadPcduHandler::fillCommandAndReplyMap() {} + +ReturnValue_t PayloadPcduHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, + const uint8_t* commandData, + size_t commandDataLen) { + return HasReturnvaluesIF::RETURN_OK; +} + +ReturnValue_t PayloadPcduHandler::scanForReply(const uint8_t* start, size_t remainingSize, + DeviceCommandId_t* foundId, size_t* foundLen) { + return HasReturnvaluesIF::RETURN_OK; +} + +ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, + const uint8_t* packet) { + return HasReturnvaluesIF::RETURN_OK; +} + +uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { + return 10000; +} + +ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, + LocalDataPoolManager& poolManager) { + return HasReturnvaluesIF::RETURN_OK; +} diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h new file mode 100644 index 00000000..61bfa225 --- /dev/null +++ b/linux/devices/PayloadPcduHandler.h @@ -0,0 +1,26 @@ +#ifndef LINUX_DEVICES_PLPCDUHANDLER_H_ +#define LINUX_DEVICES_PLPCDUHANDLER_H_ + +#include + +class PayloadPcduHandler: DeviceHandlerBase { +public: + PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie); +private: + void doStartUp() override; + void doShutDown() override; + ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; + ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t* id) override; + void fillCommandAndReplyMap() override; + ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData, + size_t commandDataLen) override; + ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, + size_t* foundLen) override; + ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override; + uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; + ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, + LocalDataPoolManager& poolManager) override; + +}; + +#endif /* LINUX_DEVICES_PLPCDUHANDLER_H_ */ diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 0eab5fd0..9968f301 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -7,11 +7,12 @@ #include "devicedefinitions/SusDefinitions.h" /** - * @brief This is the device handler class for the SUS sensor. The sensor is - * based on the MAX1227 ADC. Details about the SUS electronic can be found at - * https://egit.irs.uni-stuttgart.de/eive/eive_dokumente/src/branch/master/400_Raumsegment/443_SunSensorDocumentation/release + * @brief This is the device handler class for the SUS sensor based on the MAX1227 ADC. * - * @details Datasheet of MAX1227: https://datasheets.maximintegrated.com/en/ds/MAX1227-MAX1231.pdf + * @details + * Datasheet of MAX1227: https://datasheets.maximintegrated.com/en/ds/MAX1227-MAX1231.pdf + * Details about the SUS electronic can be found at + * https://egit.irs.uni-stuttgart.de/eive/eive_dokumente/src/branch/master/400_Raumsegment/443_SunSensorDocumentation/release * * @note When adding a SusHandler to the polling sequence table make sure to add a slot with * the executionStep FIRST_WRITE. Otherwise the communication sequence will never be From 77f718bfce3fc26fa8eb0193881fe3431c56217c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 14:31:33 +0100 Subject: [PATCH 014/309] added PL PCDU GPIO names --- bsp_q7s/boardconfig/busConf.h | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/bsp_q7s/boardconfig/busConf.h b/bsp_q7s/boardconfig/busConf.h index 2083ac6b..7c4fa830 100644 --- a/bsp_q7s/boardconfig/busConf.h +++ b/bsp_q7s/boardconfig/busConf.h @@ -29,6 +29,7 @@ static const int PTME_CONFIG = 4; } // namespace uiomapids namespace gpioNames { + static constexpr char GYRO_0_ADIS_CS[] = "gyro_0_adis_chip_select"; static constexpr char GYRO_1_L3G_CS[] = "gyro_1_l3g_chip_select"; static constexpr char GYRO_2_ADIS_CS[] = "gyro_2_adis_chip_select"; @@ -44,6 +45,8 @@ static constexpr char GNSS_1_ENABLE[] = "enable_gnss_1"; static constexpr char GYRO_0_ENABLE[] = "enable_gyro_0"; static constexpr char GYRO_2_ENABLE[] = "enable_gyro_2"; static constexpr char GNSS_SELECT[] = "gnss_mux_select"; +static constexpr char GNSS_MUX_SELECT[] = "gnss_mux_select"; + static constexpr char HEATER_0[] = "heater0"; static constexpr char HEATER_1[] = "heater1"; static constexpr char HEATER_2[] = "heater2"; @@ -65,7 +68,7 @@ static constexpr char EN_RW_1[] = "enable_rw_1"; static constexpr char EN_RW_2[] = "enable_rw_2"; static constexpr char EN_RW_3[] = "enable_rw_3"; static constexpr char EN_RW_4[] = "enable_rw_4"; -static constexpr char GNSS_MUX_SELECT[] = "gnss_mux_select"; + static constexpr char RAD_SENSOR_CHIP_SELECT[] = "rad_sensor_chip_select"; static constexpr char PAPB_BUSY_SIGNAL_VC0[] = "papb_busy_signal_vc0"; static constexpr char PAPB_EMPTY_SIGNAL_VC0[] = "papb_empty_signal_vc0"; @@ -80,6 +83,16 @@ static constexpr char RS485_EN_TX_DATA[] = "tx_data_enable_ltc2872"; static constexpr char RS485_EN_RX_CLOCK[] = "rx_clock_enable_ltc2872"; static constexpr char RS485_EN_RX_DATA[] = "rx_data_enable_ltc2872"; static constexpr char PDEC_RESET[] = "pdec_reset"; + +static constexpr char PL_PCDU_ENABLE_VBAT0[] = "enable_plpcdu_vbat0"; +static constexpr char PL_PCDU_ENABLE_VBAT1[] = "enable_plpcdu_vbat1"; +static constexpr char PL_PCDU_ENABLE_DRO[] = "enable_plpcdu_dro"; +static constexpr char PL_PCDU_ENABLE_HPA[] = "enable_plpcdu_hpa"; +static constexpr char PL_PCDU_ENABLE_MPA[] = "enable_plpcdu_mpa"; +static constexpr char PL_PCDU_ENABLE_X8[] = "enable_plpcdu_x8"; +static constexpr char PL_PCDU_ENABLE_TX[] = "enable_plpcdu_tx"; +static constexpr char PL_PCDU_ADC_CS[] = "plpcdu_adc_chip_select"; + } // namespace gpioNames } // namespace q7s From 9313fa46399dd10c992f56fb4be69010df6c80dc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 15:39:54 +0100 Subject: [PATCH 015/309] plpcdu stuff --- bsp_q7s/core/ObjectFactory.cpp | 51 +++++++++++++++++++ bsp_q7s/core/ObjectFactory.h | 2 + common/config/commonObjects.h | 1 + linux/devices/PayloadPcduHandler.cpp | 4 +- linux/devices/PayloadPcduHandler.h | 8 +-- .../payloadPcduDefinitions.h | 12 +++++ linux/fsfwconfig/OBSWConfig.h.in | 1 + linux/fsfwconfig/devices/addresses.h | 3 +- linux/fsfwconfig/devices/gpioIds.h | 11 +++- .../pollingSequenceFactory.cpp | 7 +++ 10 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 linux/devices/devicedefinitions/payloadPcduDefinitions.h diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 8b2c4366..7340e02d 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -46,6 +46,8 @@ #include "linux/devices/SolarArrayDeploymentHandler.h" #include "linux/devices/SusHandler.h" #include "linux/devices/devicedefinitions/SusDefinitions.h" +#include "linux/devices/PayloadPcduHandler.h" +#include "linux/devices/devicedefinitions/payloadPcduDefinitions.h" #include "mission/core/GenericFactory.h" #include "mission/devices/ACUHandler.h" #include "mission/devices/BpxBatteryHandler.h" @@ -1034,6 +1036,55 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) { #endif /* BOARD_TE0720 == 0 */ } +void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF) { + // Create all GPIO components first + GpioCookie* plPcduGpios = new GpioCookie; + GpiodRegularByLineName* gpio = nullptr; + std::string consumer; + // Switch pins are active high + consumer = "PLPCDU_ENB_VBAT_0"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_VBAT0, consumer, gpio::DIR_OUT, + gpio::Levels::LOW); + plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_VBAT0, gpio); + consumer = "PLPCDU_ENB_VBAT_1"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_VBAT0, consumer, gpio::DIR_OUT, + gpio::Levels::LOW); + plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_VBAT1, gpio); + consumer = "PLPCDU_ENB_DRO"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_DRO, consumer, gpio::DIR_OUT, + gpio::Levels::LOW); + plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_DRO, gpio); + consumer = "PLPCDU_ENB_HPA"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_HPA, consumer, gpio::DIR_OUT, + gpio::Levels::LOW); + plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_HPA, gpio); + consumer = "PLPCDU_ENB_MPA"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_MPA, consumer, gpio::DIR_OUT, + gpio::Levels::LOW); + plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_MPA, gpio); + + consumer = "PLPCDU_ENB_X8"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_X8, consumer, gpio::DIR_OUT, + gpio::Levels::LOW); + plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_X8, gpio); + consumer = "PLPCDU_ENB_TX"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_TX, consumer, gpio::DIR_OUT, + gpio::Levels::LOW); + plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_TX, gpio); + + // Chip select pin is active low + consumer = "PLPCDU_ADC_CS"; + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ADC_CS, consumer, gpio::DIR_OUT, + gpio::Levels::HIGH); + plPcduGpios->addGpio(gpioIds::PLPCDU_ADC_CS, gpio); + gpioComIF->addGpios(plPcduGpios); + SpiCookie* spiCookie = new SpiCookie(addresses::PLPCDU_ADC, gpioIds::PLPCDU_ADC_CS, + q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE, spi::DEFAULT_MAX_1227_MODE, + spi::DEFAULT_MAX_1227_SPEED); + // Create device handler components + auto plPcduHandler = PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie); +} + void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { #if BOARD_TE0720 == 0 new Q7STestTask(objects::TEST_TASK); diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h index b4ccbea4..ecc92f01 100644 --- a/bsp_q7s/core/ObjectFactory.h +++ b/bsp_q7s/core/ObjectFactory.h @@ -13,6 +13,8 @@ void produce(void* args); void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, UartComIF** uartComIF, SpiComIF** spiComIF, I2cComIF** i2cComIF); + +void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF); void createTmpComponents(); void createPcduComponents(LinuxLibgpioIF* gpioComIF); void createRadSensorComponent(LinuxLibgpioIF* gpioComIF); diff --git a/common/config/commonObjects.h b/common/config/commonObjects.h index 09facbc1..eb182f1d 100644 --- a/common/config/commonObjects.h +++ b/common/config/commonObjects.h @@ -36,6 +36,7 @@ enum commonObjects: uint32_t { GYRO_1_L3G_HANDLER = 0x44120111, GYRO_2_ADIS_HANDLER = 0x44120212, GYRO_3_L3G_HANDLER = 0x44120313, + PLPCDU_HANDLER = 0x44300000, IMTQ_HANDLER = 0x44140014, PLOC_MPSOC_HANDLER = 0x44330015, diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index 9a1dd292..7f5b5b9f 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -33,9 +33,7 @@ ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, return HasReturnvaluesIF::RETURN_OK; } -uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { - return 10000; -} +uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 10000; } ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h index 61bfa225..609d0973 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/linux/devices/PayloadPcduHandler.h @@ -3,10 +3,11 @@ #include -class PayloadPcduHandler: DeviceHandlerBase { -public: +class PayloadPcduHandler : DeviceHandlerBase { + public: PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie); -private: + + private: void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; @@ -20,7 +21,6 @@ private: uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; - }; #endif /* LINUX_DEVICES_PLPCDUHANDLER_H_ */ diff --git a/linux/devices/devicedefinitions/payloadPcduDefinitions.h b/linux/devices/devicedefinitions/payloadPcduDefinitions.h new file mode 100644 index 00000000..a2c362a0 --- /dev/null +++ b/linux/devices/devicedefinitions/payloadPcduDefinitions.h @@ -0,0 +1,12 @@ +#ifndef LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ +#define LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ + +#include + +namespace plpcdu { + +static constexpr size_t MAX_ADC_REPLY_SIZE = 32; + +} + +#endif /* LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ */ diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index fd5ae534..9419aedd 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -52,6 +52,7 @@ debugging. */ #define OBSW_ADD_RTD_DEVICES 0 #define OBSW_ADD_TMP_DEVICES 0 #define OBSW_ADD_RAD_SENSORS 0 +#define OBSW_ADD_PL_PCDU 0 #define OBSW_ADD_SYRLINKS 0 #define OBSW_ENABLE_SYRLINKS_TRANSMIT_TIMEOUT 0 #define OBSW_ENABLE_PERIODIC_HK 0 diff --git a/linux/fsfwconfig/devices/addresses.h b/linux/fsfwconfig/devices/addresses.h index a69cdaf9..9add3c3e 100644 --- a/linux/fsfwconfig/devices/addresses.h +++ b/linux/fsfwconfig/devices/addresses.h @@ -71,7 +71,8 @@ enum spiAddresses : address_t { RW1, RW2, RW3, - RW4 + RW4, + PLPCDU_ADC }; /* Addresses of devices supporting the CSP protocol */ diff --git a/linux/fsfwconfig/devices/gpioIds.h b/linux/fsfwconfig/devices/gpioIds.h index 46717569..311d5a0b 100644 --- a/linux/fsfwconfig/devices/gpioIds.h +++ b/linux/fsfwconfig/devices/gpioIds.h @@ -110,7 +110,16 @@ enum gpioId_t { RS485_EN_RX_DATA, RS485_EN_RX_CLOCK, - BIT_RATE_SEL + BIT_RATE_SEL, + + PLPCDU_ENB_VBAT0, + PLPCDU_ENB_VBAT1, + PLPCDU_ENB_DRO, + PLPCDU_ENB_HPA, + PLPCDU_ENB_MPA, + PLPCDU_ENB_X8, + PLPCDU_ENB_TX, + PLPCDU_ADC_CS }; } diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 9ddff5d3..83fb70e8 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -28,6 +28,13 @@ ReturnValue_t pst::pstGpio(FixedTimeslotTaskIF *thisSequence) { ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { uint32_t length = thisSequence->getPeriodMs(); static_cast(length); +#if OBSW_ADD_PL_PCDU == 1 + thisSequence->addSlot(objects::PLPCDU_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::PLPCDU_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::PLPCDU_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::PLPCDU_HANDLER, length * 0.6, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::PLPCDU_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ); +#endif #if OBSW_ADD_TMP_DEVICES == 1 thisSequence->addSlot(objects::TMP1075_HANDLER_1, length * 0, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::TMP1075_HANDLER_2, length * 0, DeviceHandlerIF::PERFORM_OPERATION); From 00f411eaca9636beec747e7ac1c6374fbe2c27ac Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 16:05:36 +0100 Subject: [PATCH 016/309] added first startup code version --- linux/devices/PayloadPcduHandler.cpp | 21 +++++++++++++++++++-- linux/devices/PayloadPcduHandler.h | 9 +++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index 7f5b5b9f..95789c87 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -1,9 +1,26 @@ #include "PayloadPcduHandler.h" PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie) - : DeviceHandlerBase(objectId, comIF, cookie) {} + : DeviceHandlerBase(objectId, comIF, cookie), state(States::ON) {} -void PayloadPcduHandler::doStartUp() {} +void PayloadPcduHandler::doStartUp() { + switch(state) { + case(States::ADC_OFF_PL_OFF): { + break; + } + case(States::SWITCH_ON_RELAY): { + // If necessary, check whether a certain amount of time has elapaed + break; + } + case(States::ADC_OFF_PL_OFF): { + break; + } + case(States::SWITCH_ON_HPA): { + // If necessary, check whether a certain amount of time has elapaed + break; + } + } +} void PayloadPcduHandler::doShutDown() {} diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h index 609d0973..5b8b7ce4 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/linux/devices/PayloadPcduHandler.h @@ -8,6 +8,15 @@ class PayloadPcduHandler : DeviceHandlerBase { PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie); private: + enum class States { + ADC_OFF_PL_OFF, + SWITCH_ON_RELAY, + ADC_ON_PL_OFF, + SWITCH_ON_HPA, + ADC_ON_PL_ON + }; + States state; + void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; From 513c907962b6711bad909f9d9ef9eab25073ffa0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 16:55:06 +0100 Subject: [PATCH 017/309] pass comn if to handler --- bsp_q7s/core/ObjectFactory.cpp | 3 +- linux/devices/PayloadPcduHandler.cpp | 52 ++++++++++++++++++++++------ linux/devices/PayloadPcduHandler.h | 12 +++++-- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 7340e02d..0ba71665 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -1082,7 +1082,8 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); // Create device handler components - auto plPcduHandler = PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie); + auto plPcduHandler = PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, + gpioComIF); } void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index 95789c87..fdd98b73 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -1,24 +1,54 @@ #include "PayloadPcduHandler.h" -PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie) - : DeviceHandlerBase(objectId, comIF, cookie), state(States::ON) {} +#include "devices/gpioIds.h" + +PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, + GpioIF* gpioIF) + : DeviceHandlerBase(objectId, comIF, cookie), state(States::ADC_OFF_PL_OFF), gpioIF(gpioIF) {} void PayloadPcduHandler::doStartUp() { switch(state) { case(States::ADC_OFF_PL_OFF): { + // Switch on relays here + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); + state = States::SWITCH_ON_RELAY_TRANSITION; break; } - case(States::SWITCH_ON_RELAY): { - // If necessary, check whether a certain amount of time has elapaed + case(States::SWITCH_ON_RELAY_TRANSITION): { + // If necessary, check whether a certain amount of time has elapsed + state = States::ADC_OFF_PL_OFF; break; } - case(States::ADC_OFF_PL_OFF): { - break; - } - case(States::SWITCH_ON_HPA): { - // If necessary, check whether a certain amount of time has elapaed - break; + default: + // Config error + sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl; } +} + +void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { + if(mode == _MODE_TO_NORMAL) { + switch(state) { + case(States::ADC_OFF_PL_OFF): { + // Switch on HPA here + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_DRO); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_TX); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_X8); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_HPA); + state = States::SWITCH_ON_HPA_TRANSITION; + break; + } + case(States::SWITCH_ON_HPA_TRANSITION): { + // If necessary, check whether a certain amount of time has elapsed + state = States::ADC_ON_PL_ON; + setMode(MODE_NORMAL); + break; + } + default: + // Config error + sif::error << "PayloadPcduHandler::doTransition: Invalid state" << std::endl; + } } } @@ -52,6 +82,8 @@ ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 10000; } + + ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { return HasReturnvaluesIF::RETURN_OK; diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h index 5b8b7ce4..1e946a09 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/linux/devices/PayloadPcduHandler.h @@ -2,21 +2,27 @@ #define LINUX_DEVICES_PLPCDUHANDLER_H_ #include +#include "fsfw_hal/common/gpio/GpioIF.h" class PayloadPcduHandler : DeviceHandlerBase { public: - PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie); + PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF); private: enum class States { ADC_OFF_PL_OFF, - SWITCH_ON_RELAY, + SWITCH_ON_RELAY_TRANSITION, + // In this mode, the handler can start polling the ADC. This is the ON mode ADC_ON_PL_OFF, - SWITCH_ON_HPA, + SWITCH_ON_HPA_TRANSITION, + // Now the ADC is actually spitting out sensible values. This is the normal mode with the + // experiment being on. ADC_ON_PL_ON }; States state; + GpioIF* gpioIF; + void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override; void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; From 656eaf4deae6788dce313c1c9088df1d507184ed Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 16:55:18 +0100 Subject: [PATCH 018/309] apply auto format --- bsp_q7s/core/ObjectFactory.cpp | 10 +++--- linux/devices/PayloadPcduHandler.cpp | 46 +++++++++++++--------------- linux/devices/PayloadPcduHandler.h | 1 + 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 0ba71665..ed1f2ed1 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -43,10 +43,10 @@ #include "linux/boardtest/SpiTestClass.h" #include "linux/csp/CspComIF.h" #include "linux/csp/CspCookie.h" +#include "linux/devices/PayloadPcduHandler.h" #include "linux/devices/SolarArrayDeploymentHandler.h" #include "linux/devices/SusHandler.h" #include "linux/devices/devicedefinitions/SusDefinitions.h" -#include "linux/devices/PayloadPcduHandler.h" #include "linux/devices/devicedefinitions/payloadPcduDefinitions.h" #include "mission/core/GenericFactory.h" #include "mission/devices/ACUHandler.h" @@ -1079,11 +1079,11 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* plPcduGpios->addGpio(gpioIds::PLPCDU_ADC_CS, gpio); gpioComIF->addGpios(plPcduGpios); SpiCookie* spiCookie = new SpiCookie(addresses::PLPCDU_ADC, gpioIds::PLPCDU_ADC_CS, - q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE, spi::DEFAULT_MAX_1227_MODE, - spi::DEFAULT_MAX_1227_SPEED); + q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); // Create device handler components - auto plPcduHandler = PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, - gpioComIF); + auto plPcduHandler = + PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, gpioComIF); } void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index fdd98b73..5ce7d590 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -3,33 +3,33 @@ #include "devices/gpioIds.h" PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, - GpioIF* gpioIF) + GpioIF* gpioIF) : DeviceHandlerBase(objectId, comIF, cookie), state(States::ADC_OFF_PL_OFF), gpioIF(gpioIF) {} void PayloadPcduHandler::doStartUp() { - switch(state) { - case(States::ADC_OFF_PL_OFF): { - // Switch on relays here - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); - state = States::SWITCH_ON_RELAY_TRANSITION; - break; - } - case(States::SWITCH_ON_RELAY_TRANSITION): { - // If necessary, check whether a certain amount of time has elapsed - state = States::ADC_OFF_PL_OFF; - break; - } - default: - // Config error - sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl; + switch (state) { + case (States::ADC_OFF_PL_OFF): { + // Switch on relays here + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); + state = States::SWITCH_ON_RELAY_TRANSITION; + break; + } + case (States::SWITCH_ON_RELAY_TRANSITION): { + // If necessary, check whether a certain amount of time has elapsed + state = States::ADC_OFF_PL_OFF; + break; + } + default: + // Config error + sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl; } } void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { - if(mode == _MODE_TO_NORMAL) { - switch(state) { - case(States::ADC_OFF_PL_OFF): { + if (mode == _MODE_TO_NORMAL) { + switch (state) { + case (States::ADC_OFF_PL_OFF): { // Switch on HPA here gpioIF->pullHigh(gpioIds::PLPCDU_ENB_DRO); gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA); @@ -39,7 +39,7 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { state = States::SWITCH_ON_HPA_TRANSITION; break; } - case(States::SWITCH_ON_HPA_TRANSITION): { + case (States::SWITCH_ON_HPA_TRANSITION): { // If necessary, check whether a certain amount of time has elapsed state = States::ADC_ON_PL_ON; setMode(MODE_NORMAL); @@ -48,7 +48,7 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { default: // Config error sif::error << "PayloadPcduHandler::doTransition: Invalid state" << std::endl; - } + } } } @@ -82,8 +82,6 @@ ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 10000; } - - ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { return HasReturnvaluesIF::RETURN_OK; diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h index 1e946a09..b1b22542 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/linux/devices/PayloadPcduHandler.h @@ -2,6 +2,7 @@ #define LINUX_DEVICES_PLPCDUHANDLER_H_ #include + #include "fsfw_hal/common/gpio/GpioIF.h" class PayloadPcduHandler : DeviceHandlerBase { From ce566b0fa8916ba7d87c081e9dd4ac7ff8a924f4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 18:02:49 +0100 Subject: [PATCH 019/309] implemented core switch on state machine --- bsp_q7s/boardconfig/busConf.h | 4 +- linux/devices/PayloadPcduHandler.cpp | 130 ++++++++++++++++++++------- linux/devices/PayloadPcduHandler.h | 56 +++++++++--- linux/fsfwconfig/devices/gpioIds.h | 4 +- 4 files changed, 150 insertions(+), 44 deletions(-) diff --git a/bsp_q7s/boardconfig/busConf.h b/bsp_q7s/boardconfig/busConf.h index 7c4fa830..5b37e847 100644 --- a/bsp_q7s/boardconfig/busConf.h +++ b/bsp_q7s/boardconfig/busConf.h @@ -87,10 +87,10 @@ static constexpr char PDEC_RESET[] = "pdec_reset"; static constexpr char PL_PCDU_ENABLE_VBAT0[] = "enable_plpcdu_vbat0"; static constexpr char PL_PCDU_ENABLE_VBAT1[] = "enable_plpcdu_vbat1"; static constexpr char PL_PCDU_ENABLE_DRO[] = "enable_plpcdu_dro"; -static constexpr char PL_PCDU_ENABLE_HPA[] = "enable_plpcdu_hpa"; -static constexpr char PL_PCDU_ENABLE_MPA[] = "enable_plpcdu_mpa"; static constexpr char PL_PCDU_ENABLE_X8[] = "enable_plpcdu_x8"; static constexpr char PL_PCDU_ENABLE_TX[] = "enable_plpcdu_tx"; +static constexpr char PL_PCDU_ENABLE_HPA[] = "enable_plpcdu_hpa"; +static constexpr char PL_PCDU_ENABLE_MPA[] = "enable_plpcdu_mpa"; static constexpr char PL_PCDU_ADC_CS[] = "plpcdu_adc_chip_select"; } // namespace gpioNames diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index 5ce7d590..367937d2 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -4,50 +4,120 @@ PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF) - : DeviceHandlerBase(objectId, comIF, cookie), state(States::ADC_OFF_PL_OFF), gpioIF(gpioIF) {} + : DeviceHandlerBase(objectId, comIF, cookie), gpioIF(gpioIF) {} void PayloadPcduHandler::doStartUp() { - switch (state) { - case (States::ADC_OFF_PL_OFF): { - // Switch on relays here - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); - state = States::SWITCH_ON_RELAY_TRANSITION; - break; + if((state != States::PCDU_OFF) and (state != States::ON_TRANS_SSR)) { + // Config error + sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl; + } + if (state == States::PCDU_OFF) { + // Switch on relays here + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); + state = States::ON_TRANS_SSR; + transitionOk = true; + } + if (state == States::ON_TRANS_SSR) { + // If necessary, check whether a certain amount of time has elapsed + if(transitionOk) { + transitionOk = false; + // We are now in ON mode + setMode(MODE_ON); + // The ADC can now be read. If the values are not close to zero, we should not allow + // transition + monMode = MonitoringMode::CLOSE_TO_ZERO; } - case (States::SWITCH_ON_RELAY_TRANSITION): { - // If necessary, check whether a certain amount of time has elapsed - state = States::ADC_OFF_PL_OFF; - break; - } - default: - // Config error - sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl; } } void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { if (mode == _MODE_TO_NORMAL) { - switch (state) { - case (States::ADC_OFF_PL_OFF): { - // Switch on HPA here + if (state == States::ON_TRANS_ADC_CLOSE_ZERO) { + if(not commandExecuted) { + countdown.resetTimer(); + commandExecuted = true; + } + // ADC values are ok, 5 seconds have elapsed + if(transitionOk and countdown.hasTimedOut()) { + state = States::ON_TRANS_DRO; + // Now start monitoring for negative voltages instead + monMode = MonitoringMode::NEGATIVE; + countdown.resetTimer(); + commandExecuted = false; + transitionOk = false; + } + } + if (state == States::ON_TRANS_DRO) { + if(not commandExecuted) { + // Switch on DRO and start monitoring for negative voltagea gpioIF->pullHigh(gpioIds::PLPCDU_ENB_DRO); - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA); - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_TX); + commandExecuted = true; + } + // ADC values are ok, 5 seconds have elapsed + if(transitionOk and countdown.hasTimedOut()) { + state = States::ON_TRANS_X8; + countdown.resetTimer(); + commandExecuted = false; + transitionOk = false; + } + } + if (state == States::ON_TRANS_X8) { + if(not commandExecuted) { + // Switch on X8 gpioIF->pullHigh(gpioIds::PLPCDU_ENB_X8); + commandExecuted = true; + } + // ADC values are ok, 5 seconds have elapsed + if(transitionOk and countdown.hasTimedOut()) { + state = States::ON_TRANS_TX; + countdown.resetTimer(); + commandExecuted = false; + transitionOk = false; + } + } + if(state == States::ON_TRANS_TX) { + if(not commandExecuted) { + // Switch on TX + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_TX); + commandExecuted = true; + } + // ADC values are ok, 5 seconds have elapsed + if(transitionOk and countdown.hasTimedOut()) { + state = States::ON_TRANS_MPA; + countdown.resetTimer(); + commandExecuted = false; + transitionOk = false; + } + } + if(state == States::ON_TRANS_MPA) { + if(not commandExecuted) { + // Switch on MPA + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA); + commandExecuted = true; + } + // ADC values are ok, 5 seconds have elapsed + if(transitionOk and countdown.hasTimedOut()) { + state = States::ON_TRANS_HPA; + countdown.resetTimer(); + commandExecuted = false; + transitionOk = false; + } + } + if(state == States::ON_TRANS_HPA) { + if(not commandExecuted) { + // Switch on HPA gpioIF->pullHigh(gpioIds::PLPCDU_ENB_HPA); - state = States::SWITCH_ON_HPA_TRANSITION; - break; + commandExecuted = true; } - case (States::SWITCH_ON_HPA_TRANSITION): { - // If necessary, check whether a certain amount of time has elapsed - state = States::ADC_ON_PL_ON; + // ADC values are ok, 5 seconds have elapsed + if(transitionOk and countdown.hasTimedOut()) { + state = States::PCDU_ON; setMode(MODE_NORMAL); - break; + countdown.resetTimer(); + commandExecuted = false; + transitionOk = false; } - default: - // Config error - sif::error << "PayloadPcduHandler::doTransition: Invalid state" << std::endl; } } } diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h index b1b22542..b5f6e556 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/linux/devices/PayloadPcduHandler.h @@ -2,25 +2,61 @@ #define LINUX_DEVICES_PLPCDUHANDLER_H_ #include +#include #include "fsfw_hal/common/gpio/GpioIF.h" +/** + * @brief Device handler for the EIVE Payload PCDU + * @details + * Documentation: + * https://egit.irs.uni-stuttgart.de/eive/eive_dokumente/src/branch/master/400_Raumsegment/412_PayloaPCDUDocumentation/release/EIVE-D-421-001_PLPCDU_Documentation.pdf + * + * Important components: + * - SSR - Solid State Relay: Decouples voltages from battery + * - DRO - Dielectric Resonsant Oscillator: Generates modulation signal + * - X8: Frequency X8 Multiplicator + * - TX: Transmitter/Sender module. Modulates data onto carrier signal + * - MPA - Medium Power Amplifier + * - HPA - High Power Amplifier + */ class PayloadPcduHandler : DeviceHandlerBase { public: PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF); private: enum class States { - ADC_OFF_PL_OFF, - SWITCH_ON_RELAY_TRANSITION, - // In this mode, the handler can start polling the ADC. This is the ON mode - ADC_ON_PL_OFF, - SWITCH_ON_HPA_TRANSITION, - // Now the ADC is actually spitting out sensible values. This is the normal mode with the - // experiment being on. - ADC_ON_PL_ON - }; - States state; + PCDU_OFF, + // Solid State Relay, enable battery voltages VBAT0 and VBAT1. This will also switch on + // the ADC + ON_TRANS_SSR, + ON_TRANS_ADC_CLOSE_ZERO, + // Enable Dielectric Resonant Oscillator and start monitoring voltages as + // soon as DRO voltage reaches 6V + ON_TRANS_DRO, + // Switch on X8 compoennt and monitor voltages for 5 seconds + ON_TRANS_X8, + // Switch on TX component and monitor voltages for 5 seconds + ON_TRANS_TX, + // Switch on MPA component and monitor voltages for 5 seconds + ON_TRANS_MPA, + // Switch on HPA component and monitor voltages for 5 seconds + ON_TRANS_HPA, + // All components of the experiment are on + PCDU_ON, + } state = States::PCDU_OFF; + + enum class MonitoringMode { + NONE, + CLOSE_TO_ZERO, + NEGATIVE + } monMode = MonitoringMode::NONE; + + // This variable is tied to DRO +6 V voltage. Voltages, currents are monitored and the experiment + // is shut down immediately if there is a negative voltage. + bool transitionOk = false; + bool commandExecuted = false; + Countdown countdown = Countdown(5000); GpioIF* gpioIF; void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override; diff --git a/linux/fsfwconfig/devices/gpioIds.h b/linux/fsfwconfig/devices/gpioIds.h index 311d5a0b..fc9305ea 100644 --- a/linux/fsfwconfig/devices/gpioIds.h +++ b/linux/fsfwconfig/devices/gpioIds.h @@ -115,10 +115,10 @@ enum gpioId_t { PLPCDU_ENB_VBAT0, PLPCDU_ENB_VBAT1, PLPCDU_ENB_DRO, - PLPCDU_ENB_HPA, - PLPCDU_ENB_MPA, PLPCDU_ENB_X8, PLPCDU_ENB_TX, + PLPCDU_ENB_HPA, + PLPCDU_ENB_MPA, PLPCDU_ADC_CS }; } From 773242cc8e8b9cfcc7f82a2d62b1a919316883bc Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 18:04:53 +0100 Subject: [PATCH 020/309] transition delay 20 minutes --- linux/devices/PayloadPcduHandler.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index 367937d2..e6a53059 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -150,7 +150,10 @@ ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, return HasReturnvaluesIF::RETURN_OK; } -uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 10000; } +uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { + // 20 minutes transition delay is allowed + return 20 * 60 * 60; +} ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { From d51e2c19f6a9cea8c2fcd386d58b7ea609979756 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 18:05:14 +0100 Subject: [PATCH 021/309] auto formatter --- linux/devices/PayloadPcduHandler.cpp | 44 ++++++++++++++-------------- linux/devices/PayloadPcduHandler.h | 6 +--- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index e6a53059..08ebd6a5 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -7,7 +7,7 @@ PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, : DeviceHandlerBase(objectId, comIF, cookie), gpioIF(gpioIF) {} void PayloadPcduHandler::doStartUp() { - if((state != States::PCDU_OFF) and (state != States::ON_TRANS_SSR)) { + if ((state != States::PCDU_OFF) and (state != States::ON_TRANS_SSR)) { // Config error sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl; } @@ -20,7 +20,7 @@ void PayloadPcduHandler::doStartUp() { } if (state == States::ON_TRANS_SSR) { // If necessary, check whether a certain amount of time has elapsed - if(transitionOk) { + if (transitionOk) { transitionOk = false; // We are now in ON mode setMode(MODE_ON); @@ -34,12 +34,12 @@ void PayloadPcduHandler::doStartUp() { void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { if (mode == _MODE_TO_NORMAL) { if (state == States::ON_TRANS_ADC_CLOSE_ZERO) { - if(not commandExecuted) { + if (not commandExecuted) { countdown.resetTimer(); commandExecuted = true; } // ADC values are ok, 5 seconds have elapsed - if(transitionOk and countdown.hasTimedOut()) { + if (transitionOk and countdown.hasTimedOut()) { state = States::ON_TRANS_DRO; // Now start monitoring for negative voltages instead monMode = MonitoringMode::NEGATIVE; @@ -49,13 +49,13 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { } } if (state == States::ON_TRANS_DRO) { - if(not commandExecuted) { + if (not commandExecuted) { // Switch on DRO and start monitoring for negative voltagea gpioIF->pullHigh(gpioIds::PLPCDU_ENB_DRO); - commandExecuted = true; + commandExecuted = true; } // ADC values are ok, 5 seconds have elapsed - if(transitionOk and countdown.hasTimedOut()) { + if (transitionOk and countdown.hasTimedOut()) { state = States::ON_TRANS_X8; countdown.resetTimer(); commandExecuted = false; @@ -63,55 +63,55 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { } } if (state == States::ON_TRANS_X8) { - if(not commandExecuted) { + if (not commandExecuted) { // Switch on X8 gpioIF->pullHigh(gpioIds::PLPCDU_ENB_X8); - commandExecuted = true; + commandExecuted = true; } // ADC values are ok, 5 seconds have elapsed - if(transitionOk and countdown.hasTimedOut()) { + if (transitionOk and countdown.hasTimedOut()) { state = States::ON_TRANS_TX; countdown.resetTimer(); commandExecuted = false; transitionOk = false; } } - if(state == States::ON_TRANS_TX) { - if(not commandExecuted) { + if (state == States::ON_TRANS_TX) { + if (not commandExecuted) { // Switch on TX gpioIF->pullHigh(gpioIds::PLPCDU_ENB_TX); - commandExecuted = true; + commandExecuted = true; } // ADC values are ok, 5 seconds have elapsed - if(transitionOk and countdown.hasTimedOut()) { + if (transitionOk and countdown.hasTimedOut()) { state = States::ON_TRANS_MPA; countdown.resetTimer(); commandExecuted = false; transitionOk = false; } } - if(state == States::ON_TRANS_MPA) { - if(not commandExecuted) { + if (state == States::ON_TRANS_MPA) { + if (not commandExecuted) { // Switch on MPA gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA); - commandExecuted = true; + commandExecuted = true; } // ADC values are ok, 5 seconds have elapsed - if(transitionOk and countdown.hasTimedOut()) { + if (transitionOk and countdown.hasTimedOut()) { state = States::ON_TRANS_HPA; countdown.resetTimer(); commandExecuted = false; transitionOk = false; } } - if(state == States::ON_TRANS_HPA) { - if(not commandExecuted) { + if (state == States::ON_TRANS_HPA) { + if (not commandExecuted) { // Switch on HPA gpioIF->pullHigh(gpioIds::PLPCDU_ENB_HPA); - commandExecuted = true; + commandExecuted = true; } // ADC values are ok, 5 seconds have elapsed - if(transitionOk and countdown.hasTimedOut()) { + if (transitionOk and countdown.hasTimedOut()) { state = States::PCDU_ON; setMode(MODE_NORMAL); countdown.resetTimer(); diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h index b5f6e556..53a96a5e 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/linux/devices/PayloadPcduHandler.h @@ -46,11 +46,7 @@ class PayloadPcduHandler : DeviceHandlerBase { PCDU_ON, } state = States::PCDU_OFF; - enum class MonitoringMode { - NONE, - CLOSE_TO_ZERO, - NEGATIVE - } monMode = MonitoringMode::NONE; + enum class MonitoringMode { NONE, CLOSE_TO_ZERO, NEGATIVE } monMode = MonitoringMode::NONE; // This variable is tied to DRO +6 V voltage. Voltages, currents are monitored and the experiment // is shut down immediately if there is a negative voltage. From 201bfd1b077a96716f31d7492a61dad0298329f4 Mon Sep 17 00:00:00 2001 From: IRS Cleanroom Laptop Date: Fri, 11 Feb 2022 17:03:20 +0100 Subject: [PATCH 022/309] merge --- bsp_q7s/core/InitMission.cpp | 2 +- bsp_q7s/core/ObjectFactory.cpp | 133 +++--- common/config/commonObjects.h | 25 +- linux/boardtest/UartTestClass.cpp | 103 +++++ linux/devices/SusHandler.cpp | 8 +- linux/fsfwconfig/OBSWConfig.h.in | 1 + linux/fsfwconfig/devices/addresses.h | 3 +- .../pollingSequenceFactory.cpp | 395 +++++++++--------- 8 files changed, 386 insertions(+), 284 deletions(-) diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index 429d57f4..5729e94b 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -266,7 +266,7 @@ void initmission::createPstTasks(TaskFactory& factory, sif::error << "InitMission::initTasks: GomSpace PST initialization failed!" << std::endl; } taskVec.push_back(gomSpacePstTask); -#else /* BOARD_TE7020 == 0 */ +#else /* BOARD_TE7020 == 0 */ FixedTimeslotTaskIF* pollingSequenceTaskTE0720 = factory.createFixedTimeslotTask( "PST_TASK_TE0720", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE * 8, 3.0, missedDeadlineFunc); result = pst::pollingSequenceTE0720(pollingSequenceTaskTE0720); diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index b427b9b9..40b140e8 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -348,63 +348,82 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI gpioComIF->addGpios(gpioCookieSus); - SpiCookie* spiCookieSus1 = - new SpiCookie(addresses::SUS_1, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus2 = - new SpiCookie(addresses::SUS_2, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus3 = - new SpiCookie(addresses::SUS_3, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus4 = - new SpiCookie(addresses::SUS_4, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus5 = - new SpiCookie(addresses::SUS_5, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus6 = - new SpiCookie(addresses::SUS_6, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus7 = - new SpiCookie(addresses::SUS_7, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus8 = - new SpiCookie(addresses::SUS_8, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus9 = - new SpiCookie(addresses::SUS_9, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus10 = - new SpiCookie(addresses::SUS_10, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus11 = - new SpiCookie(addresses::SUS_11, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus12 = - new SpiCookie(addresses::SUS_12, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); - SpiCookie* spiCookieSus13 = - new SpiCookie(addresses::SUS_13, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SpiCookie* spiCookie = + new SpiCookie(addresses::SUS_0, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler0 = + new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_1); - new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookieSus1, gpioComIF, gpioIds::CS_SUS_1); - new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookieSus2, gpioComIF, gpioIds::CS_SUS_2); - new SusHandler(objects::SUS_3, objects::SPI_COM_IF, spiCookieSus3, gpioComIF, gpioIds::CS_SUS_3); - new SusHandler(objects::SUS_4, objects::SPI_COM_IF, spiCookieSus4, gpioComIF, gpioIds::CS_SUS_4); - new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookieSus5, gpioComIF, gpioIds::CS_SUS_5); - new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookieSus6, gpioComIF, gpioIds::CS_SUS_6); - new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookieSus7, gpioComIF, gpioIds::CS_SUS_7); - new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookieSus8, gpioComIF, gpioIds::CS_SUS_8); - new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookieSus9, gpioComIF, gpioIds::CS_SUS_9); - new SusHandler(objects::SUS_10, objects::SPI_COM_IF, spiCookieSus10, gpioComIF, - gpioIds::CS_SUS_10); - new SusHandler(objects::SUS_11, objects::SPI_COM_IF, spiCookieSus11, gpioComIF, - gpioIds::CS_SUS_11); - new SusHandler(objects::SUS_12, objects::SPI_COM_IF, spiCookieSus12, gpioComIF, - gpioIds::CS_SUS_12); - new SusHandler(objects::SUS_13, objects::SPI_COM_IF, spiCookieSus13, gpioComIF, - gpioIds::CS_SUS_13); + spiCookie = new SpiCookie(addresses::SUS_1, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler1 = + new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_2); + spiCookie = new SpiCookie(addresses::SUS_2, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler2 = + new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_3); + spiCookie = new SpiCookie(addresses::SUS_3, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler3 = + new SusHandler(objects::SUS_3, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_4); + spiCookie = new SpiCookie(addresses::SUS_4, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler4 = + new SusHandler(objects::SUS_4, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_5); + spiCookie = new SpiCookie(addresses::SUS_5, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler5 = + new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_6); + spiCookie = new SpiCookie(addresses::SUS_6, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler6 = + new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_7); + spiCookie = new SpiCookie(addresses::SUS_7, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler7 = + new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_8); + spiCookie = new SpiCookie(addresses::SUS_8, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler8 = + new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_9); + spiCookie = new SpiCookie(addresses::SUS_9, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler9 = + new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_10); + spiCookie = new SpiCookie(addresses::SUS_10, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler10 = new SusHandler(objects::SUS_10, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_11); + spiCookie = new SpiCookie(addresses::SUS_11, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SusHandler* susHandler11 = new SusHandler(objects::SUS_11, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_12); + static_cast(susHandler0); + static_cast(susHandler1); + static_cast(susHandler2); + static_cast(susHandler3); + static_cast(susHandler4); + static_cast(susHandler5); + static_cast(susHandler6); + static_cast(susHandler7); + static_cast(susHandler8); + static_cast(susHandler9); + static_cast(susHandler10); + static_cast(susHandler11); +#if OBSW_TEST_SUS == 1 + susHandler0->setStartUpImmediately(); + susHandler1->setStartUpImmediately(); + susHandler2->setStartUpImmediately(); + susHandler3->setStartUpImmediately(); + susHandler4->setStartUpImmediately(); + susHandler5->setStartUpImmediately(); + susHandler6->setStartUpImmediately(); + susHandler7->setStartUpImmediately(); + susHandler8->setStartUpImmediately(); + susHandler9->setStartUpImmediately(); + susHandler10->setStartUpImmediately(); + susHandler11->setStartUpImmediately(); +#endif } void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF) { @@ -1062,10 +1081,10 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { gpioComIF->addGpios(gpioCookieSus); SpiCookie* spiCookieSus = - new SpiCookie(addresses::SUS_1, std::string("/dev/spidev1.0"), SUS::MAX_CMD_SIZE, + new SpiCookie(addresses::SUS_0, std::string("/dev/spidev1.0"), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); - new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookieSus, gpioComIF, gpioIds::CS_SUS_1); + new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookieSus, gpioComIF, gpioIds::CS_SUS_1); #endif #if BOARD_TE0720 == 1 && OBSW_TEST_CCSDS_BRIDGE == 1 diff --git a/common/config/commonObjects.h b/common/config/commonObjects.h index 09facbc1..d08014b0 100644 --- a/common/config/commonObjects.h +++ b/common/config/commonObjects.h @@ -62,19 +62,18 @@ enum commonObjects: uint32_t { RTD_IC_17 = 0x44420030, RTD_IC_18 = 0x44420031, - SUS_1 = 0x44120032, - SUS_2 = 0x44120033, - SUS_3 = 0x44120034, - SUS_4 = 0x44120035, - SUS_5 = 0x44120036, - SUS_6 = 0x44120037, - SUS_7 = 0x44120038, - SUS_8 = 0x44120039, - SUS_9 = 0x44120040, - SUS_10 = 0x44120041, - SUS_11 = 0x44120042, - SUS_12 = 0x44120043, - SUS_13 = 0x44120044, + SUS_0 = 0x44120032, + SUS_1 = 0x44120033, + SUS_2 = 0x44120034, + SUS_3 = 0x44120035, + SUS_4 = 0x44120036, + SUS_5 = 0x44120037, + SUS_6 = 0x44120038, + SUS_7 = 0x44120039, + SUS_8 = 0x44120040, + SUS_9 = 0x44120041, + SUS_10 = 0x44120042, + SUS_11 = 0x44120043, GPS_CONTROLLER = 0x44130045, diff --git a/linux/boardtest/UartTestClass.cpp b/linux/boardtest/UartTestClass.cpp index e6033c09..cfa668de 100644 --- a/linux/boardtest/UartTestClass.cpp +++ b/linux/boardtest/UartTestClass.cpp @@ -1,4 +1,6 @@ #include "UartTestClass.h" + +#include #if defined(RASPBERRY_PI) #include "rpiConfig.h" #elif defined(XIPHOS_Q7S) @@ -9,8 +11,16 @@ #include // Contains file controls like O_RDWR #include // write(), read(), close() +<<<<<<< Updated upstream #include "fsfw/serviceinterface/ServiceInterface.h" #include "lwgps/lwgps.h" +======= +#include "fsfw/globalfunctions/CRC.h" +#include "fsfw/globalfunctions/DleEncoder.h" +#include "fsfw/globalfunctions/arrayprinter.h" +#include "fsfw/serviceinterface.h" +#include "mission/devices/devicedefinitions/SCEXDefinitions.h" +>>>>>>> Stashed changes #define GPS_REPLY_WIRETAPPING 0 @@ -118,3 +128,96 @@ void UartTestClass::gpsPeriodic() { } while (bytesRead > 0); #endif } + +void UartTestClass::scexInit() { +#if defined(RASPBERRY_PI) + std::string devname = "/dev/ttyUSB1"; +#else + std::string devname = "/dev/ul-scex"; +#endif + /* Get file descriptor */ + serialPort = open(devname.c_str(), O_RDWR); + if (serialPort < 0) { + sif::warning << "open call failed with error [" << errno << ", " << strerror(errno) + << std::endl; + return; + } + // Setting up UART parameters + tty.c_cflag &= ~PARENB; // Clear parity bit + tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication + tty.c_cflag &= ~CSIZE; // Clear all the size bits + tty.c_cflag |= CS8; // 8 bits per byte + tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control + tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1) + + // Use non-canonical mode and clear echo flag + tty.c_lflag &= ~(ICANON | ECHO); + + // Non-blocking mode, read until either line is 0.1 second idle or maximum of 255 bytes are + // received in one go + tty.c_cc[VTIME] = 1; // In units of 0.1 seconds + tty.c_cc[VMIN] = 255; // Read up to 255 bytes + + if (tcsetattr(serialPort, TCSANOW, &tty) != 0) { + sif::warning << "tcsetattr call failed with error [" << errno << ", " << strerror(errno) + << std::endl; + } + // Flush received and unread data + tcflush(serialPort, TCIFLUSH); +} + +void UartTestClass::scexPeriodic() { + auto dleEncoder = DleEncoder(); + std::array tmpCmdBuf = {}; + // Send ping command + tmpCmdBuf[0] = scex::CMD_PING; + // These two fields are the packet counter and the total packet count. Those are 1 and 1 for each + // telecommand so far + tmpCmdBuf[1] = 1; + tmpCmdBuf[2] = 1; + uint16_t userDataLen = 0; + tmpCmdBuf[3] = (userDataLen >> 8) & 0xff; + tmpCmdBuf[4] = userDataLen & 0xff; + uint16_t crc = CRC::crc16ccitt(tmpCmdBuf.data(), 5); + tmpCmdBuf[5] = (crc >> 8) & 0xff; + tmpCmdBuf[6] = crc & 0xff; + + size_t encodedLen = 0; + ReturnValue_t result = + dleEncoder.encode(tmpCmdBuf.data(), 7, cmdBuf.data(), cmdBuf.size(), &encodedLen, true); + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::warning << "UartTestClass::scexInit: Encoding failed" << std::endl; + return; + } + arrayprinter::print(cmdBuf.data(), 9); + size_t bytesWritten = write(serialPort, cmdBuf.data(), encodedLen); + + if (bytesWritten != encodedLen) { + sif::warning << "Sending ping command to solar experiment failed" << std::endl; + } + + TaskFactory::delayTask(20); + bytesWritten = write(serialPort, cmdBuf.data(), encodedLen); + if (bytesWritten != encodedLen) { + sif::warning << "Sending ping command to solar experiment failed" << std::endl; + } + + // Read back reply immediately + int bytesRead = 0; + do { + bytesRead = read(serialPort, reinterpret_cast(recBuf.data()), + static_cast(recBuf.size())); + if (bytesRead < 0) { + sif::warning << "UartTestClass::performPeriodicAction: read call failed with error [" << errno + << ", " << strerror(errno) << "]" << std::endl; + break; + } else if (bytesRead >= static_cast(recBuf.size())) { + sif::debug << "UartTestClass::performPeriodicAction: " + "recv buffer might not be large enough" + << std::endl; + } else if (bytesRead > 0) { + sif::info << "Received " << bytesRead << " from the Solar Cell Experiment:" << std::endl; + arrayprinter::print(recBuf.data(), bytesRead); + } + } while (bytesRead > 0); +} diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 44755f41..ca502169 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -11,10 +11,10 @@ SusHandler::SusHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCoo gpioComIF(gpioComIF), chipSelectId(chipSelectId), dataset(this) { - if (comCookie == NULL) { + if (comCookie == nullptr) { sif::error << "SusHandler: Invalid com cookie" << std::endl; } - if (gpioComIF == NULL) { + if (gpioComIF == nullptr) { sif::error << "SusHandler: Invalid GpioComIF" << std::endl; } } @@ -164,9 +164,9 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 dataset.ain3 = (*(packet + 8) << 8 | *(packet + 9)); dataset.ain4 = (*(packet + 10) << 8 | *(packet + 11)); dataset.ain5 = (*(packet + 12) << 8 | *(packet + 13)); -#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS +#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 sif::info << "SUS object id 0x" << std::hex << this->getObjectId() - << ", Temperature: " << dataset.temperatureCelcius << " °C" << std::endl; + << ", Temperature: " << dataset.temperatureCelcius << " C" << std::endl; sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN0: " << std::dec << dataset.ain0 << std::endl; sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN1: " << std::dec diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index 14956ba3..b2924041 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -78,6 +78,7 @@ debugging. */ #define OBSW_TEST_LIBGPIOD 0 #define OBSW_TEST_RADIATION_SENSOR_HANDLER 0 +#define OBSW_TEST_SUS 0 #define OBSW_TEST_SUS_HANDLER 0 #define OBSW_TEST_PLOC_HANDLER 0 #define OBSW_TEST_BPX_BATT 0 diff --git a/linux/fsfwconfig/devices/addresses.h b/linux/fsfwconfig/devices/addresses.h index a69cdaf9..2926d6f2 100644 --- a/linux/fsfwconfig/devices/addresses.h +++ b/linux/fsfwconfig/devices/addresses.h @@ -24,6 +24,7 @@ enum logicalAddresses : address_t { RAD_SENSOR = objects::RAD_SENSOR, + SUS_0 = objects::SUS_0, SUS_1 = objects::SUS_1, SUS_2 = objects::SUS_2, SUS_3 = objects::SUS_3, @@ -35,8 +36,6 @@ enum logicalAddresses : address_t { SUS_9 = objects::SUS_9, SUS_10 = objects::SUS_10, SUS_11 = objects::SUS_11, - SUS_12 = objects::SUS_12, - SUS_13 = objects::SUS_13, /* Dummy and Test Addresses */ DUMMY_ECHO = 129, diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 9ddff5d3..fc4a3570 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -153,6 +153,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #endif #if OBSW_ADD_SUN_SENSORS == 1 + /** * The sun sensor will be shutdown as soon as the chip select is pulled high. Thus all * requests to a sun sensor must be performed consecutively. Another reason for calling multiple @@ -161,138 +162,156 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { * One sun sensor communication sequence also blocks the SPI bus. So other devices can not be * inserted between the device handler cycles of one SUS. */ - /* Write setup */ - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_1, length * 0.9, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_1, length * 0.901, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.903, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.905, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.8, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.93, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_4, length * 0.911, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_5, length * 0.912, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_5, length * 0.913, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_5, length * 0.914, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_6, length * 0.915, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_READ); - /* Read ADC conversions from inernal FIFO */ - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_7, length * 0.918, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_READ); - /* Read ADC conversions from inernal FIFO */ - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_READ); + // /* Read ADC conversions */ + // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_1, length * 0.9, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_READ); + // + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_2, length * 0.903, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_READ); + // + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_3, length * 0.8, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_READ); + // + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_READ); + // + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_5, length * 0.912, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_READ); + // + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_6, length * 0.915, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_READ); + // /* Read ADC conversions from inernal FIFO */ + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_READ); + // + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_7, length * 0.918, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_READ); + // /* Read ADC conversions from inernal FIFO */ + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_READ); /* Write setup */ thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::PERFORM_OPERATION); @@ -332,81 +351,43 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_10, length * 0.927, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_11, length * 0.93, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_12, length * 0.933, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_12, length * 0.933, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_12, length * 0.933, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_12, length * 0.933, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_12, length * 0.933, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_12, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_12, length * 0.934, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_12, length * 0.934, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_12, length * 0.934, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_12, length * 0.934, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_12, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_12, length * 0.935, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_12, length * 0.935, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_12, length * 0.935, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_12, length * 0.935, DeviceHandlerIF::GET_READ); - - /* Write setup */ - thisSequence->addSlot(objects::SUS_13, length * 0.936, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_13, length * 0.936, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_13, length * 0.936, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_13, length * 0.936, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_13, length * 0.936, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_13, length * 0.937, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_13, length * 0.937, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_13, length * 0.937, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_13, length * 0.937, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_13, length * 0.937, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_13, length * 0.938, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_13, length * 0.938, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_13, length * 0.938, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_13, length * 0.938, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_13, length * 0.938, DeviceHandlerIF::GET_READ); +// /* Write setup */ +// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_10, length * 0.927, SusHandler::FIRST_WRITE); +// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_READ); +// /* Start ADC conversions */ +// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_READ); +// /* Read ADC conversions */ +// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_READ); +// +// /* Write setup */ +// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_11, length * 0.93, SusHandler::FIRST_WRITE); +// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_READ); +// /* Start ADC conversions */ +// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_READ); +// /* Read ADC conversions */ +// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_READ); #endif #if OBSW_ADD_RW == 1 From 66bd5f8fbfeefafc03ded5c1442625b643e497e3 Mon Sep 17 00:00:00 2001 From: IRS Cleanroom Laptop Date: Fri, 11 Feb 2022 17:38:02 +0100 Subject: [PATCH 023/309] refactoring --- bsp_q7s/CMakeLists.txt | 1 - bsp_q7s/callbacks/CMakeLists.txt | 1 + bsp_q7s/{gpio => callbacks}/gpioCallbacks.cpp | 69 ++- bsp_q7s/{gpio => callbacks}/gpioCallbacks.h | 0 bsp_q7s/core/ObjectFactory.cpp | 88 ++-- bsp_q7s/gpio/CMakeLists.txt | 3 - linux/devices/SusHandler.cpp | 38 +- linux/devices/SusHandler.h | 5 +- linux/fsfwconfig/devices/gpioIds.h | 3 +- .../pollingSequenceFactory.cpp | 480 ++++++++++-------- 10 files changed, 369 insertions(+), 319 deletions(-) rename bsp_q7s/{gpio => callbacks}/gpioCallbacks.cpp (97%) rename bsp_q7s/{gpio => callbacks}/gpioCallbacks.h (100%) delete mode 100644 bsp_q7s/gpio/CMakeLists.txt diff --git a/bsp_q7s/CMakeLists.txt b/bsp_q7s/CMakeLists.txt index b2c24d5f..622f62ce 100644 --- a/bsp_q7s/CMakeLists.txt +++ b/bsp_q7s/CMakeLists.txt @@ -9,7 +9,6 @@ if(Q7S_SIMPLE_MODE) else() add_subdirectory(boardconfig) add_subdirectory(comIF) - add_subdirectory(gpio) add_subdirectory(core) add_subdirectory(memory) add_subdirectory(callbacks) diff --git a/bsp_q7s/callbacks/CMakeLists.txt b/bsp_q7s/callbacks/CMakeLists.txt index a85bf6fb..831b98ed 100644 --- a/bsp_q7s/callbacks/CMakeLists.txt +++ b/bsp_q7s/callbacks/CMakeLists.txt @@ -2,4 +2,5 @@ target_sources(${TARGET_NAME} PRIVATE rwSpiCallback.cpp gnssCallback.cpp pcduSwitchCb.cpp + gpioCallbacks.cpp ) diff --git a/bsp_q7s/gpio/gpioCallbacks.cpp b/bsp_q7s/callbacks/gpioCallbacks.cpp similarity index 97% rename from bsp_q7s/gpio/gpioCallbacks.cpp rename to bsp_q7s/callbacks/gpioCallbacks.cpp index e3033b7d..e2dcc05f 100644 --- a/bsp_q7s/gpio/gpioCallbacks.cpp +++ b/bsp_q7s/callbacks/gpioCallbacks.cpp @@ -147,12 +147,16 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev disableDecoderTcsIc2(); break; } + case (gpioIds::CS_SUS_0): { + disableDecoderInterfaceBoardIc1(); + break; + } case (gpioIds::CS_SUS_1): { disableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_2): { - disableDecoderInterfaceBoardIc1(); + disableDecoderInterfaceBoardIc2(); break; } case (gpioIds::CS_SUS_3): { @@ -164,7 +168,7 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev break; } case (gpioIds::CS_SUS_5): { - disableDecoderInterfaceBoardIc2(); + disableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_6): { @@ -172,11 +176,11 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev break; } case (gpioIds::CS_SUS_7): { - disableDecoderInterfaceBoardIc1(); + disableDecoderInterfaceBoardIc2(); break; } case (gpioIds::CS_SUS_8): { - disableDecoderInterfaceBoardIc2(); + disableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_9): { @@ -184,21 +188,13 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev break; } case (gpioIds::CS_SUS_10): { - disableDecoderInterfaceBoardIc1(); + disableDecoderInterfaceBoardIc2(); break; } case (gpioIds::CS_SUS_11): { disableDecoderInterfaceBoardIc2(); break; } - case (gpioIds::CS_SUS_12): { - disableDecoderInterfaceBoardIc2(); - break; - } - case (gpioIds::CS_SUS_13): { - disableDecoderInterfaceBoardIc1(); - break; - } case (gpioIds::CS_RW1): { disableRwDecoder(); break; @@ -300,71 +296,66 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev enableDecoderTcsIc2(); break; } - case (gpioIds::CS_SUS_1): { + case (gpioIds::CS_SUS_0): { selectY0(); enableDecoderInterfaceBoardIc1(); break; } + case (gpioIds::CS_SUS_1): { + selectY1(); + enableDecoderInterfaceBoardIc1(); + break; + } case (gpioIds::CS_SUS_2): { - selectY1(); - enableDecoderInterfaceBoardIc1(); - break; - } - case (gpioIds::CS_SUS_3): { selectY0(); enableDecoderInterfaceBoardIc2(); break; } - case (gpioIds::CS_SUS_4): { + case (gpioIds::CS_SUS_3): { selectY1(); enableDecoderInterfaceBoardIc2(); break; } + case (gpioIds::CS_SUS_4): { + selectY2(); + enableDecoderInterfaceBoardIc2(); + break; + } case (gpioIds::CS_SUS_5): { selectY2(); - enableDecoderInterfaceBoardIc2(); + enableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_6): { - selectY2(); + selectY3(); enableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_7): { - selectY3(); - enableDecoderInterfaceBoardIc1(); - break; - } - case (gpioIds::CS_SUS_8): { selectY3(); enableDecoderInterfaceBoardIc2(); break; } - case (gpioIds::CS_SUS_9): { + case (gpioIds::CS_SUS_8): { selectY4(); enableDecoderInterfaceBoardIc1(); break; } + case (gpioIds::CS_SUS_9): { + selectY5(); + enableDecoderInterfaceBoardIc1(); + break; + } case (gpioIds::CS_SUS_10): { - selectY5(); - enableDecoderInterfaceBoardIc1(); - break; - } - case (gpioIds::CS_SUS_11): { selectY4(); enableDecoderInterfaceBoardIc2(); break; } - case (gpioIds::CS_SUS_12): { + case (gpioIds::CS_SUS_11): { selectY5(); enableDecoderInterfaceBoardIc2(); break; } - case (gpioIds::CS_SUS_13): { - selectY6(); - enableDecoderInterfaceBoardIc1(); - break; - } case (gpioIds::CS_RW1): { selectY0(); enableRwDecoder(); diff --git a/bsp_q7s/gpio/gpioCallbacks.h b/bsp_q7s/callbacks/gpioCallbacks.h similarity index 100% rename from bsp_q7s/gpio/gpioCallbacks.h rename to bsp_q7s/callbacks/gpioCallbacks.h diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 165c27aa..e2c5cbf4 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -8,6 +8,7 @@ #include "OBSWConfig.h" #include "bsp_q7s/boardtest/Q7STestTask.h" #include "bsp_q7s/callbacks/gnssCallback.h" +#include "bsp_q7s/callbacks/gpioCallbacks.h" #include "bsp_q7s/callbacks/pcduSwitchCb.h" #include "bsp_q7s/callbacks/rwSpiCallback.h" #include "bsp_q7s/core/CoreController.h" @@ -17,7 +18,6 @@ #include "bsp_q7s/devices/startracker/StarTrackerDefinitions.h" #include "bsp_q7s/devices/startracker/StarTrackerHandler.h" #include "bsp_q7s/devices/startracker/StrHelper.h" -#include "bsp_q7s/gpio/gpioCallbacks.h" #include "bsp_q7s/memory/FileSystemHandler.h" #include "busConf.h" #include "ccsdsConfig.h" @@ -307,6 +307,9 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI GpioCookie* gpioCookieSus = new GpioCookie(); GpioCallback* susgpio = nullptr; + susgpio = new GpioCallback("Chip select SUS 0", gpio::DIR_OUT, gpio::HIGH, + &gpioCallbacks::spiCsDecoderCallback, gpioComIF); + gpioCookieSus->addGpio(gpioIds::CS_SUS_0, susgpio); susgpio = new GpioCallback("Chip select SUS 1", gpio::DIR_OUT, gpio::HIGH, &gpioCallbacks::spiCsDecoderCallback, gpioComIF); gpioCookieSus->addGpio(gpioIds::CS_SUS_1, susgpio); @@ -340,65 +343,70 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI susgpio = new GpioCallback("Chip select SUS 11", gpio::DIR_OUT, gpio::HIGH, &gpioCallbacks::spiCsDecoderCallback, gpioComIF); gpioCookieSus->addGpio(gpioIds::CS_SUS_11, susgpio); - susgpio = new GpioCallback("Chip select SUS 12", gpio::DIR_OUT, gpio::HIGH, - &gpioCallbacks::spiCsDecoderCallback, gpioComIF); - gpioCookieSus->addGpio(gpioIds::CS_SUS_12, susgpio); - susgpio = new GpioCallback("Chip select SUS 13", gpio::DIR_OUT, gpio::HIGH, - &gpioCallbacks::spiCsDecoderCallback, gpioComIF); - gpioCookieSus->addGpio(gpioIds::CS_SUS_13, susgpio); gpioComIF->addGpios(gpioCookieSus); SpiCookie* spiCookie = - new SpiCookie(addresses::SUS_0, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler0 = - new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_1); + new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_0); - spiCookie = new SpiCookie(addresses::SUS_1, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler1 = - new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_2); - spiCookie = new SpiCookie(addresses::SUS_2, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_1); + + spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler2 = - new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_3); - spiCookie = new SpiCookie(addresses::SUS_3, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_2); + + spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler3 = - new SusHandler(objects::SUS_3, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_4); - spiCookie = new SpiCookie(addresses::SUS_4, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_3, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_3); + + spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler4 = - new SusHandler(objects::SUS_4, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_5); - spiCookie = new SpiCookie(addresses::SUS_5, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_4, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_4); + + spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler5 = - new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_6); - spiCookie = new SpiCookie(addresses::SUS_6, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_5); + + spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler6 = - new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_7); - spiCookie = new SpiCookie(addresses::SUS_7, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_6); + + spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler7 = - new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_8); - spiCookie = new SpiCookie(addresses::SUS_8, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_7); + + spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler8 = - new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_9); - spiCookie = new SpiCookie(addresses::SUS_9, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_8); + + spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler9 = - new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_10); - spiCookie = new SpiCookie(addresses::SUS_10, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), + new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_9); + + spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_10, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler10 = new SusHandler(objects::SUS_10, objects::SPI_COM_IF, spiCookie, - gpioComIF, gpioIds::CS_SUS_11); - spiCookie = new SpiCookie(addresses::SUS_11, gpio::NO_GPIO, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + gpioComIF, gpioIds::CS_SUS_10); + + spiCookie = + new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler11 = new SusHandler(objects::SUS_11, objects::SPI_COM_IF, spiCookie, - gpioComIF, gpioIds::CS_SUS_12); + gpioComIF, gpioIds::CS_SUS_11); static_cast(susHandler0); static_cast(susHandler1); static_cast(susHandler2); @@ -424,6 +432,18 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI susHandler9->setStartUpImmediately(); susHandler10->setStartUpImmediately(); susHandler11->setStartUpImmediately(); + susHandler0->setToGoToNormalMode(true); + susHandler1->setToGoToNormalMode(true); + susHandler2->setToGoToNormalMode(true); + susHandler3->setToGoToNormalMode(true); + susHandler4->setToGoToNormalMode(true); + susHandler5->setToGoToNormalMode(true); + susHandler6->setToGoToNormalMode(true); + susHandler7->setToGoToNormalMode(true); + susHandler8->setToGoToNormalMode(true); + susHandler9->setToGoToNormalMode(true); + susHandler10->setToGoToNormalMode(true); + susHandler11->setToGoToNormalMode(true); #endif } @@ -1078,14 +1098,14 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { GpioCookie* gpioCookieSus = new GpioCookie; GpiodRegular* chipSelectSus = new GpiodRegular( std::string("gpiochip1"), 9, std::string("Chip Select Sus Sensor"), gpio::DIR_OUT, 1); - gpioCookieSus->addGpio(gpioIds::CS_SUS_1, chipSelectSus); + gpioCookieSus->addGpio(gpioIds::CS_SUS_0, chipSelectSus); gpioComIF->addGpios(gpioCookieSus); SpiCookie* spiCookieSus = new SpiCookie(addresses::SUS_0, std::string("/dev/spidev1.0"), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); - new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookieSus, gpioComIF, gpioIds::CS_SUS_1); + new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookieSus, gpioComIF, gpioIds::CS_SUS_0); #endif #if BOARD_TE0720 == 1 && OBSW_TEST_CCSDS_BRIDGE == 1 diff --git a/bsp_q7s/gpio/CMakeLists.txt b/bsp_q7s/gpio/CMakeLists.txt deleted file mode 100644 index dd657546..00000000 --- a/bsp_q7s/gpio/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -target_sources(${TARGET_NAME} PRIVATE - gpioCallbacks.cpp -) diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index ca502169..452d7a25 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -8,6 +8,7 @@ SusHandler::SusHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, LinuxLibgpioIF *gpioComIF, gpioId_t chipSelectId) : DeviceHandlerBase(objectId, comIF, comCookie), + divider(5), gpioComIF(gpioComIF), chipSelectId(chipSelectId), dataset(this) { @@ -115,7 +116,10 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman return ERROR_LOCK_MUTEX; } - gpioComIF->pullLow(chipSelectId); + result = gpioComIF->pullLow(chipSelectId); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } cmdBuffer[0] = SUS::SETUP; rawPacket = cmdBuffer; rawPacketLen = 1; @@ -165,20 +169,22 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 dataset.ain4 = (*(packet + 10) << 8 | *(packet + 11)); dataset.ain5 = (*(packet + 12) << 8 | *(packet + 13)); #if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() - << ", Temperature: " << dataset.temperatureCelcius << " C" << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN0: " << std::dec - << dataset.ain0 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN1: " << std::dec - << dataset.ain1 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN2: " << std::dec - << dataset.ain2 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN3: " << std::dec - << dataset.ain3 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN4: " << std::dec - << dataset.ain4 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN5: " << std::dec - << dataset.ain5 << std::endl; + if (divider.checkAndIncrement()) { + sif::info << "SUS object id 0x" << std::hex << this->getObjectId() + << ", Temperature: " << dataset.temperatureCelcius << " C" << std::endl; + sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN0: " << std::dec + << dataset.ain0 << std::endl; + sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN1: " << std::dec + << dataset.ain1 << std::endl; + sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN2: " << std::dec + << dataset.ain2 << std::endl; + sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN3: " << std::dec + << dataset.ain3 << std::endl; + sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN4: " << std::dec + << dataset.ain4 << std::endl; + sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN5: " << std::dec + << dataset.ain5 << std::endl; + } #endif /** SUS can now be shutdown and thus the SPI bus released again */ gpioComIF->pullHigh(chipSelectId); @@ -212,3 +218,5 @@ ReturnValue_t SusHandler::initializeLocalDataPool(localpool::DataPool &localData localDataPoolMap.emplace(SUS::AIN5, new PoolEntry({0})); return HasReturnvaluesIF::RETURN_OK; } + +void SusHandler::setToGoToNormalMode(bool enable) { this->goToNormalModeImmediately = enable; } diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 0eab5fd0..22daf2a7 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -5,6 +5,7 @@ #include #include "devicedefinitions/SusDefinitions.h" +#include "fsfw/globalfunctions/PeriodicOperationDivider.h" /** * @brief This is the device handler class for the SUS sensor. The sensor is @@ -30,6 +31,7 @@ class SusHandler : public DeviceHandlerBase { virtual ReturnValue_t performOperation(uint8_t counter) override; virtual ReturnValue_t initialize() override; + void setToGoToNormalMode(bool enable); protected: void doStartUp() override; @@ -55,8 +57,9 @@ class SusHandler : public DeviceHandlerBase { enum class CommunicationStep { IDLE, WRITE_SETUP, START_CONVERSIONS, READ_CONVERSIONS }; + PeriodicOperationDivider divider; LinuxLibgpioIF* gpioComIF = nullptr; - + bool goToNormalModeImmediately = false; gpioId_t chipSelectId = gpio::NO_GPIO; SUS::SusDataset dataset; diff --git a/linux/fsfwconfig/devices/gpioIds.h b/linux/fsfwconfig/devices/gpioIds.h index 46717569..2556732b 100644 --- a/linux/fsfwconfig/devices/gpioIds.h +++ b/linux/fsfwconfig/devices/gpioIds.h @@ -54,6 +54,7 @@ enum gpioId_t { RTD_IC_17, RTD_IC_18, + CS_SUS_0, CS_SUS_1, CS_SUS_2, CS_SUS_3, @@ -65,8 +66,6 @@ enum gpioId_t { CS_SUS_9, CS_SUS_10, CS_SUS_11, - CS_SUS_12, - CS_SUS_13, SPI_MUX_BIT_1, SPI_MUX_BIT_2, diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index fc4a3570..5dcc15a2 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -154,6 +154,18 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #if OBSW_ADD_SUN_SENSORS == 1 + bool addSus0 = false; + bool addSus1 = false; + bool addSus2 = false; + bool addSus3 = false; + bool addSus4 = false; + bool addSus5 = false; + bool addSus6 = false; + bool addSus7 = false; + bool addSus8 = true; + bool addSus9 = false; + bool addSus10 = false; + bool addSus11 = false; /** * The sun sensor will be shutdown as soon as the chip select is pulled high. Thus all * requests to a sun sensor must be performed consecutively. Another reason for calling multiple @@ -162,233 +174,253 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { * One sun sensor communication sequence also blocks the SPI bus. So other devices can not be * inserted between the device handler cycles of one SUS. */ - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_READ); - // /* Read ADC conversions */ - // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_1, length * 0.9, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_READ); - // - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_2, length * 0.903, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_READ); - // - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_3, length * 0.8, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_READ); - // - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_READ); - // - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_5, length * 0.912, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_READ); - // - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_6, length * 0.915, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_READ); - // /* Read ADC conversions from inernal FIFO */ - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_READ); - // - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_7, length * 0.918, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_READ); - // /* Read ADC conversions from inernal FIFO */ - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_READ); + if (addSus0) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_READ); + /* Start ADC conversions */ + thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_READ); + /* Read ADC conversions */ + thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_READ); + } + if (addSus1) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_1, length * 0.9, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_1, length * 0.901, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_READ); + } + if (addSus2) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_2, length * 0.903, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_2, length * 0.905, SusHandler::SEND_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_READ); + } + if (addSus3) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_3, length * 0.8, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_3, length * 0.93, SusHandler::SEND_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_READ); + } + if (addSus4) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_4, length * 0.911, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_READ); + } + if (addSus5) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_5, length * 0.912, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_5, length * 0.913, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_READ); + /* Write setup */ + thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_5, length * 0.914, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_READ); + } - /* Write setup */ - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_8, length * 0.922, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_8, length * 0.922, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.922, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.922, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.922, DeviceHandlerIF::GET_READ); - /* Read ADC conversions from inernal FIFO */ - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_READ); + if (addSus6) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_6, length * 0.915, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_READ); + /* Start ADC conversions */ + thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_READ); + /* Read ADC conversions from inernal FIFO */ + thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_READ); + } - /* Write setup */ - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_9, length * 0.924, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_READ); + if (addSus7) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_7, length * 0.918, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_READ); + /* Start ADC conversions */ + thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_READ); + /* Read ADC conversions from inernal FIFO */ + thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_READ); + } -// /* Write setup */ -// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_10, length * 0.927, SusHandler::FIRST_WRITE); -// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_READ); -// /* Start ADC conversions */ -// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_READ); -// /* Read ADC conversions */ -// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_READ); -// -// /* Write setup */ -// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_11, length * 0.93, SusHandler::FIRST_WRITE); -// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_READ); -// /* Start ADC conversions */ -// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_READ); -// /* Read ADC conversions */ -// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_READ); -#endif + if (addSus8) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_READ); + /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_READ); + /* Read ADC conversions from internal FIFO */ + // thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_READ); + } + + if (addSus9) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_9, length * 0.924, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_READ); + /* Start ADC conversions */ + thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_READ); + /* Read ADC conversions */ + thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_READ); + } + + if (addSus10) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_10, length * 0.927, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_READ); + /* Start ADC conversions */ + thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_READ); + /* Read ADC conversions */ + thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_READ); + } + + if (addSus11) { + /* Write setup */ + thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_11, length * 0.93, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_READ); + /* Start ADC conversions */ + thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_READ); + /* Read ADC conversions */ + thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_READ); + } +#endif /* OBSW_ADD_SUN_SENSORS == 1 */ #if OBSW_ADD_RW == 1 thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::PERFORM_OPERATION); From a1409fbcdf724ed8d3b136f0fd6d5933873660ae Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 17:13:06 +0100 Subject: [PATCH 024/309] update SuS code --- bsp_q7s/core/InitMission.cpp | 2 +- bsp_q7s/core/ObjectFactory.cpp | 25 ++-- fsfw | 2 +- linux/devices/SusHandler.cpp | 154 +++++++++---------------- linux/devices/SusHandler.h | 13 ++- linux/fsfwconfig/OBSWConfig.h.in | 1 - linux/fsfwconfig/devices/addresses.cpp | 6 - 7 files changed, 75 insertions(+), 128 deletions(-) diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index 81f9f361..c4e3805d 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -266,7 +266,7 @@ void initmission::createPstTasks(TaskFactory& factory, sif::error << "InitMission::initTasks: GomSpace PST initialization failed!" << std::endl; } taskVec.push_back(gomSpacePstTask); -#else /* BOARD_TE7020 == 0 */ +#else /* BOARD_TE7020 == 0 */ FixedTimeslotTaskIF* pollingSequenceTaskTE0720 = factory.createFixedTimeslotTask( "PST_TASK_TE0720", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE * 8, 3.0, missedDeadlineFunc); result = pst::pollingSequenceTE0720(pollingSequenceTaskTE0720); diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index e2c5cbf4..2283952f 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -347,17 +347,17 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI gpioComIF->addGpios(gpioCookieSus); SpiCookie* spiCookie = - new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler0 = new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_0); - spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler1 = new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_1); - spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler2 = new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_2); @@ -377,34 +377,33 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI SusHandler* susHandler5 = new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_5); - spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler6 = new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_6); - spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler7 = new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_7); - spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler8 = new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_8); - spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler9 = new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_9); - spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_10, std::string(q7s::SPI_DEFAULT_DEV), + spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler10 = new SusHandler(objects::SUS_10, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_10); - spiCookie = - new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); SusHandler* susHandler11 = new SusHandler(objects::SUS_11, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_11); static_cast(susHandler0); @@ -419,7 +418,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI static_cast(susHandler9); static_cast(susHandler10); static_cast(susHandler11); -#if OBSW_TEST_SUS == 1 +#if OBSW_TEST_SUS_HANDLER == 1 susHandler0->setStartUpImmediately(); susHandler1->setStartUpImmediately(); susHandler2->setStartUpImmediately(); diff --git a/fsfw b/fsfw index 32a9e0c7..81f5b0c3 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 32a9e0c7044665f0265c10108c8d62d45c047769 +Subproject commit 81f5b0c3bf3e602f5cc459dc39bc1e8885c932a7 diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 452d7a25..e1cf4d18 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -9,39 +9,11 @@ SusHandler::SusHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCoo LinuxLibgpioIF *gpioComIF, gpioId_t chipSelectId) : DeviceHandlerBase(objectId, comIF, comCookie), divider(5), - gpioComIF(gpioComIF), - chipSelectId(chipSelectId), dataset(this) { - if (comCookie == nullptr) { - sif::error << "SusHandler: Invalid com cookie" << std::endl; - } - if (gpioComIF == nullptr) { - sif::error << "SusHandler: Invalid GpioComIF" << std::endl; - } } SusHandler::~SusHandler() {} -ReturnValue_t SusHandler::performOperation(uint8_t counter) { - if (counter != FIRST_WRITE) { - DeviceHandlerBase::performOperation(counter); - return RETURN_OK; - } - - if (mode != MODE_NORMAL) { - DeviceHandlerBase::performOperation(DeviceHandlerIF::SEND_WRITE); - return RETURN_OK; - } - - /* If device is in normale mode the communication sequence is initiated here */ - if (communicationStep == CommunicationStep::IDLE) { - communicationStep = CommunicationStep::WRITE_SETUP; - } - - DeviceHandlerBase::performOperation(DeviceHandlerIF::SEND_WRITE); - - return RETURN_OK; -} ReturnValue_t SusHandler::initialize() { ReturnValue_t result = RETURN_OK; @@ -49,48 +21,57 @@ ReturnValue_t SusHandler::initialize() { if (result != RETURN_OK) { return result; } - auto spiComIF = dynamic_cast(communicationInterface); - if (spiComIF == nullptr) { - sif::debug << "SusHandler::initialize: Invalid communication interface" << std::endl; - return ObjectManagerIF::CHILD_INIT_FAILED; - } - spiMutex = spiComIF->getMutex(); - if (spiMutex == nullptr) { - sif::debug << "SusHandler::initialize: Failed to get spi mutex" << std::endl; - return ObjectManagerIF::CHILD_INIT_FAILED; - } return RETURN_OK; } void SusHandler::doStartUp() { + if (comState == ComStates::IDLE) { + comState = ComStates::WRITE_SETUP; + } + if(comState == ComStates::WRITE_SETUP) { + if (commandExecuted) { #if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1 - setMode(MODE_NORMAL); + setMode(MODE_NORMAL); #else - setMode(_MODE_TO_ON); + setMode(_MODE_TO_ON); #endif + commandExecuted = false; + comState = ComStates::START_CONVERSIONS; + } + } } void SusHandler::doShutDown() { setMode(_MODE_POWER_DOWN); } ReturnValue_t SusHandler::buildNormalDeviceCommand(DeviceCommandId_t *id) { - if (communicationStep == CommunicationStep::IDLE) { - return NOTHING_TO_SEND; + switch (comState) { + case (ComStates::IDLE): { + return NOTHING_TO_SEND; + } + case (ComStates::WRITE_SETUP): { + *id = SUS::WRITE_SETUP; + comState = ComStates::START_CONVERSIONS; + return buildCommandFromCommand(*id, nullptr, 0); + } + case (ComStates::START_CONVERSIONS): { + *id = SUS::START_CONVERSIONS; + comState = ComStates::READ_CONVERSIONS; + return buildCommandFromCommand(*id, nullptr, 0); + } + case (ComStates::READ_CONVERSIONS): { + *id = SUS::READ_CONVERSIONS; + comState = ComStates::START_CONVERSIONS; + return buildCommandFromCommand(*id, nullptr, 0); + } } - - if (communicationStep == CommunicationStep::WRITE_SETUP) { - *id = SUS::WRITE_SETUP; - communicationStep = CommunicationStep::START_CONVERSIONS; - } else if (communicationStep == CommunicationStep::START_CONVERSIONS) { - *id = SUS::START_CONVERSIONS; - communicationStep = CommunicationStep::READ_CONVERSIONS; - } else if (communicationStep == CommunicationStep::READ_CONVERSIONS) { - *id = SUS::READ_CONVERSIONS; - communicationStep = CommunicationStep::IDLE; - } - return buildCommandFromCommand(*id, nullptr, 0); + return NOTHING_TO_SEND; } ReturnValue_t SusHandler::buildTransitionDeviceCommand(DeviceCommandId_t *id) { + if (comState == ComStates::WRITE_SETUP) { + *id = SUS::WRITE_SETUP; + return buildCommandFromCommand(*id, nullptr, 0); + } return HasReturnvaluesIF::RETURN_OK; } @@ -99,27 +80,6 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman size_t commandDataLen) { switch (deviceCommand) { case (SUS::WRITE_SETUP): { - /** - * The sun sensor ADC is shutdown when CS is pulled high, so each time requesting a - * measurement the setup has to be rewritten. There must also be a little delay between - * the transmission of the setup byte and the first conversion. Thus the conversion - * will be performed in an extra step. - * Because the chip select is driven manually by the SusHandler the SPI bus must be - * protected with a mutex here. - */ - ReturnValue_t result = spiMutex->lockMutex(timeoutType, timeoutMs); - if (result == MutexIF::MUTEX_TIMEOUT) { - sif::error << "SusHandler::buildCommandFromCommand: Mutex timeout" << std::endl; - return ERROR_LOCK_MUTEX; - } else if (result != HasReturnvaluesIF::RETURN_OK) { - sif::error << "SusHandler::buildCommandFromCommand: Failed to lock spi mutex" << std::endl; - return ERROR_LOCK_MUTEX; - } - - result = gpioComIF->pullLow(chipSelectId); - if (result != HasReturnvaluesIF::RETURN_OK) { - return result; - } cmdBuffer[0] = SUS::SETUP; rawPacket = cmdBuffer; rawPacketLen = 1; @@ -145,8 +105,8 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman } void SusHandler::fillCommandAndReplyMap() { - this->insertInCommandMap(SUS::WRITE_SETUP); - this->insertInCommandMap(SUS::START_CONVERSIONS); + this->insertInCommandAndReplyMap(SUS::WRITE_SETUP, 1); + this->insertInCommandAndReplyMap(SUS::START_CONVERSIONS, 1); this->insertInCommandAndReplyMap(SUS::READ_CONVERSIONS, 1, &dataset, SUS::SIZE_READ_CONVERSIONS); } @@ -159,6 +119,15 @@ ReturnValue_t SusHandler::scanForReply(const uint8_t *start, size_t remainingSiz ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) { switch (id) { + case SUS::WRITE_SETUP: { + if (mode == _MODE_START_UP) { + commandExecuted = true; + } + return HasReturnvaluesIF::RETURN_OK; + } + case SUS::START_CONVERSIONS: { + return HasReturnvaluesIF::RETURN_OK; + } case SUS::READ_CONVERSIONS: { PoolReadGuard readSet(&dataset); dataset.temperatureCelcius = (*(packet) << 8 | *(packet + 1)) * 0.125; @@ -170,29 +139,16 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 dataset.ain5 = (*(packet + 12) << 8 | *(packet + 13)); #if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 if (divider.checkAndIncrement()) { - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() - << ", Temperature: " << dataset.temperatureCelcius << " C" << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN0: " << std::dec - << dataset.ain0 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN1: " << std::dec - << dataset.ain1 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN2: " << std::dec - << dataset.ain2 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN3: " << std::dec - << dataset.ain3 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN4: " << std::dec - << dataset.ain4 << std::endl; - sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN5: " << std::dec - << dataset.ain5 << std::endl; + sif::info << "SUS object ID 0x" << std::hex << this->getObjectId() << ":" << std::endl; + sif::info << "Temperature: " << dataset.temperatureCelcius << " C" << std::endl; + sif::info << "AIN0: " << std::dec << dataset.ain0 << std::endl; + sif::info << "AIN1: " << std::dec << dataset.ain1 << std::endl; + sif::info << "AIN2: " << std::dec << dataset.ain2 << std::endl; + sif::info << "AIN3: " << std::dec << dataset.ain3 << std::endl; + sif::info << "AIN4: " << std::dec << dataset.ain4 << std::endl; + sif::info << "AIN5: " << std::dec << dataset.ain5 << std::endl; } #endif - /** SUS can now be shutdown and thus the SPI bus released again */ - gpioComIF->pullHigh(chipSelectId); - ReturnValue_t result = spiMutex->unlockMutex(); - if (result != RETURN_OK) { - sif::error << "SusHandler::interpretDeviceReply: Failed to unlock spi mutex" << std::endl; - return ERROR_UNLOCK_MUTEX; - } break; } default: { @@ -203,8 +159,6 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 return HasReturnvaluesIF::RETURN_OK; } -void SusHandler::setNormalDatapoolEntriesInvalid() {} - uint32_t SusHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; } ReturnValue_t SusHandler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 22daf2a7..b499e74b 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -28,7 +28,7 @@ class SusHandler : public DeviceHandlerBase { LinuxLibgpioIF* gpioComIF, gpioId_t chipSelectId); virtual ~SusHandler(); - virtual ReturnValue_t performOperation(uint8_t counter) override; + // virtual ReturnValue_t performOperation(uint8_t counter) override; virtual ReturnValue_t initialize() override; void setToGoToNormalMode(bool enable); @@ -44,7 +44,7 @@ class SusHandler : public DeviceHandlerBase { ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override; - void setNormalDatapoolEntriesInvalid() override; + //void setNormalDatapoolEntriesInvalid() override; uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; @@ -55,17 +55,18 @@ class SusHandler : public DeviceHandlerBase { static const ReturnValue_t ERROR_UNLOCK_MUTEX = MAKE_RETURN_CODE(0xA0); static const ReturnValue_t ERROR_LOCK_MUTEX = MAKE_RETURN_CODE(0xA1); - enum class CommunicationStep { IDLE, WRITE_SETUP, START_CONVERSIONS, READ_CONVERSIONS }; + enum class ComStates { IDLE, WRITE_SETUP, START_CONVERSIONS, READ_CONVERSIONS }; PeriodicOperationDivider divider; - LinuxLibgpioIF* gpioComIF = nullptr; + // LinuxLibgpioIF* gpioComIF = nullptr; bool goToNormalModeImmediately = false; - gpioId_t chipSelectId = gpio::NO_GPIO; + bool commandExecuted = false; + // gpioId_t chipSelectId = gpio::NO_GPIO; SUS::SusDataset dataset; uint8_t cmdBuffer[SUS::MAX_CMD_SIZE]; - CommunicationStep communicationStep = CommunicationStep::IDLE; + ComStates comState = ComStates::IDLE; MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING; uint32_t timeoutMs = 20; diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index e9b053e5..fd5ae534 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -78,7 +78,6 @@ debugging. */ #define OBSW_TEST_LIBGPIOD 0 #define OBSW_TEST_RADIATION_SENSOR_HANDLER 0 -#define OBSW_TEST_SUS 0 #define OBSW_TEST_SUS_HANDLER 0 #define OBSW_TEST_PLOC_HANDLER 0 #define OBSW_TEST_BPX_BATT 0 diff --git a/linux/fsfwconfig/devices/addresses.cpp b/linux/fsfwconfig/devices/addresses.cpp index 60b1370b..580818e0 100644 --- a/linux/fsfwconfig/devices/addresses.cpp +++ b/linux/fsfwconfig/devices/addresses.cpp @@ -1,7 +1 @@ -/** - * \file logicalAddresses.cpp - * - * \date 06.11.2019 - */ - #include "addresses.h" From 1981be6e2f43de44d649ce862f696e22ba39bba6 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 17:19:03 +0100 Subject: [PATCH 025/309] debug output --- linux/devices/SusHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index e1cf4d18..b65207e8 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -139,7 +139,7 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 dataset.ain5 = (*(packet + 12) << 8 | *(packet + 13)); #if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 if (divider.checkAndIncrement()) { - sif::info << "SUS object ID 0x" << std::hex << this->getObjectId() << ":" << std::endl; + sif::info << "SUS Object ID 0x" << std::hex << this->getObjectId() << ":" << std::endl; sif::info << "Temperature: " << dataset.temperatureCelcius << " C" << std::endl; sif::info << "AIN0: " << std::dec << dataset.ain0 << std::endl; sif::info << "AIN1: " << std::dec << dataset.ain1 << std::endl; From 2a4905a1f7aeb0cec896e3cdf3bf21986c4715d2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 18:38:35 +0100 Subject: [PATCH 026/309] somethings still wrong --- bsp_q7s/boardconfig/busConf.h | 12 +- bsp_q7s/callbacks/gpioCallbacks.cpp | 170 +++++++++--------- linux/devices/SusHandler.cpp | 1 + linux/fsfwconfig/devices/gpioIds.h | 2 +- .../pollingSequenceFactory.cpp | 14 +- 5 files changed, 96 insertions(+), 103 deletions(-) diff --git a/bsp_q7s/boardconfig/busConf.h b/bsp_q7s/boardconfig/busConf.h index 2083ac6b..e517894a 100644 --- a/bsp_q7s/boardconfig/busConf.h +++ b/bsp_q7s/boardconfig/busConf.h @@ -54,12 +54,12 @@ static constexpr char HEATER_6[] = "heater6"; static constexpr char HEATER_7[] = "heater7"; static constexpr char SA_DPL_PIN_0[] = "sa_dpl_0"; static constexpr char SA_DPL_PIN_1[] = "sa_dpl_1"; -static constexpr char SPI_MUX_BIT_1_PIN[] = "spi_mux_bit_1"; -static constexpr char SPI_MUX_BIT_2_PIN[] = "spi_mux_bit_2"; -static constexpr char SPI_MUX_BIT_3_PIN[] = "spi_mux_bit_3"; -static constexpr char SPI_MUX_BIT_4_PIN[] = "spi_mux_bit_4"; -static constexpr char SPI_MUX_BIT_5_PIN[] = "spi_mux_bit_5"; -static constexpr char SPI_MUX_BIT_6_PIN[] = "spi_mux_bit_6"; +static constexpr char SPI_MUX_BIT_0_PIN[] = "spi_mux_bit_1"; +static constexpr char SPI_MUX_BIT_1_PIN[] = "spi_mux_bit_2"; +static constexpr char SPI_MUX_BIT_2_PIN[] = "spi_mux_bit_3"; +static constexpr char SPI_MUX_BIT_3_PIN[] = "spi_mux_bit_4"; +static constexpr char SPI_MUX_BIT_4_PIN[] = "spi_mux_bit_5"; +static constexpr char SPI_MUX_BIT_5_PIN[] = "spi_mux_bit_6"; static constexpr char EN_RW_CS[] = "en_rw_cs"; static constexpr char EN_RW_1[] = "enable_rw_1"; static constexpr char EN_RW_2[] = "enable_rw_2"; diff --git a/bsp_q7s/callbacks/gpioCallbacks.cpp b/bsp_q7s/callbacks/gpioCallbacks.cpp index e2dcc05f..8d75fb20 100644 --- a/bsp_q7s/callbacks/gpioCallbacks.cpp +++ b/bsp_q7s/callbacks/gpioCallbacks.cpp @@ -25,38 +25,28 @@ void initSpiCsDecoder(GpioIF* gpioComIF) { GpiodRegularByLineName* spiMuxBit = nullptr; /** Setting mux bit 1 to low will disable IC21 on the interface board */ - spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_1_PIN, "SPI Mux Bit 1", + spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_0_PIN, "SPI Mux Bit 1", + gpio::DIR_OUT, gpio::HIGH); + spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_0, spiMuxBit); + /** Setting mux bit 2 to low disables IC1 on the TCS board */ + spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_1_PIN, "SPI Mux Bit 2", gpio::DIR_OUT, gpio::HIGH); spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_1, spiMuxBit); - /** Setting mux bit 2 to low disables IC1 on the TCS board */ - spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_2_PIN, "SPI Mux Bit 2", - gpio::DIR_OUT, gpio::HIGH); - spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_2, spiMuxBit); /** Setting mux bit 3 to low disables IC2 on the TCS board and IC22 on the interface board */ - spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_3_PIN, "SPI Mux Bit 3", + spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_2_PIN, "SPI Mux Bit 3", gpio::DIR_OUT, gpio::LOW); - spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_3, spiMuxBit); - - // spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_1_PIN, "SPI Mux Bit 1", - // gpio::OUT, gpio::LOW); - // spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_1, spiMuxBit); - // /** Setting mux bit 2 to low disables IC1 on the TCS board */ - // spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_2_PIN, "SPI Mux Bit 2", - // gpio::OUT, gpio::HIGH); spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_2, spiMuxBit); - // /** Setting mux bit 3 to low disables IC2 on the TCS board and IC22 on the interface board - // */ spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_3_PIN, "SPI Mux Bit - // 3", gpio::OUT, gpio::LOW); spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_3, spiMuxBit); + spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_2, spiMuxBit); /** The following gpios can take arbitrary initial values */ - spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_4_PIN, "SPI Mux Bit 4", + spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_3_PIN, "SPI Mux Bit 4", + gpio::DIR_OUT, gpio::LOW); + spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_3, spiMuxBit); + spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_4_PIN, "SPI Mux Bit 5", gpio::DIR_OUT, gpio::LOW); spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_4, spiMuxBit); - spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_5_PIN, "SPI Mux Bit 5", + spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_5_PIN, "SPI Mux Bit 6", gpio::DIR_OUT, gpio::LOW); spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_5, spiMuxBit); - spiMuxBit = new GpiodRegularByLineName(q7s::gpioNames::SPI_MUX_BIT_6_PIN, "SPI Mux Bit 6", - gpio::DIR_OUT, gpio::LOW); - spiMuxGpios->addGpio(gpioIds::SPI_MUX_BIT_6, spiMuxBit); GpiodRegularByLineName* enRwDecoder = new GpiodRegularByLineName(q7s::gpioNames::EN_RW_CS, "EN_RW_CS", gpio::DIR_OUT, gpio::HIGH); spiMuxGpios->addGpio(gpioIds::EN_RW_CS, enRwDecoder); @@ -307,45 +297,45 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev break; } case (gpioIds::CS_SUS_2): { - selectY0(); - enableDecoderInterfaceBoardIc2(); + selectY2(); + enableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_3): { - selectY1(); - enableDecoderInterfaceBoardIc2(); + selectY3(); + enableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_4): { - selectY2(); - enableDecoderInterfaceBoardIc2(); - break; - } - case (gpioIds::CS_SUS_5): { - selectY2(); - enableDecoderInterfaceBoardIc1(); - break; - } - case (gpioIds::CS_SUS_6): { - selectY3(); - enableDecoderInterfaceBoardIc1(); - break; - } - case (gpioIds::CS_SUS_7): { - selectY3(); - enableDecoderInterfaceBoardIc2(); - break; - } - case (gpioIds::CS_SUS_8): { selectY4(); enableDecoderInterfaceBoardIc1(); break; } - case (gpioIds::CS_SUS_9): { + case (gpioIds::CS_SUS_5): { selectY5(); enableDecoderInterfaceBoardIc1(); break; } + case (gpioIds::CS_SUS_6): { + selectY0(); + enableDecoderInterfaceBoardIc2(); + break; + } + case (gpioIds::CS_SUS_7): { + selectY1(); + enableDecoderInterfaceBoardIc2(); + break; + } + case (gpioIds::CS_SUS_8): { + selectY2(); + enableDecoderInterfaceBoardIc2(); + break; + } + case (gpioIds::CS_SUS_9): { + selectY3(); + enableDecoderInterfaceBoardIc2(); + break; + } case (gpioIds::CS_SUS_10): { selectY4(); enableDecoderInterfaceBoardIc2(); @@ -385,52 +375,52 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev } void enableDecoderTcsIc1() { - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_0); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); } void enableDecoderTcsIc2() { - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_0); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); +} + +void enableDecoderInterfaceBoardIc1() { + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); +} + +void enableDecoderInterfaceBoardIc2() { + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0); gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); } -void enableDecoderInterfaceBoardIc1() { - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); -} - -void enableDecoderInterfaceBoardIc2() { - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); -} - void disableDecoderTcsIc1() { + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); } void disableDecoderTcsIc2() { + // DO NOT CHANGE THE ORDER HERE + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); } void disableDecoderInterfaceBoardIc1() { + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); } void disableDecoderInterfaceBoardIc2() { + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_0); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_1); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_2); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); } void enableRwDecoder() { gpioComInterface->pullHigh(gpioIds::EN_RW_CS); } @@ -438,57 +428,57 @@ void enableRwDecoder() { gpioComInterface->pullHigh(gpioIds::EN_RW_CS); } void disableRwDecoder() { gpioComInterface->pullLow(gpioIds::EN_RW_CS); } void selectY0() { + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4); gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6); } void selectY1() { - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4); gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6); } void selectY2() { - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5); } void selectY3() { + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_6); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5); } void selectY4() { + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5); } void selectY5() { - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5); } void selectY6() { - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_4); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6); } void selectY7() { + gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_3); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_4); gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_5); - gpioComInterface->pullHigh(gpioIds::SPI_MUX_BIT_6); } void disableAllDecoder() { - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_3); - gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1); gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_2); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_0); + gpioComInterface->pullLow(gpioIds::SPI_MUX_BIT_1); gpioComInterface->pullLow(gpioIds::EN_RW_CS); } diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index b65207e8..9b529a6a 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -131,6 +131,7 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 case SUS::READ_CONVERSIONS: { PoolReadGuard readSet(&dataset); dataset.temperatureCelcius = (*(packet) << 8 | *(packet + 1)) * 0.125; + //dataset.temperatureCelcius = ((packet[1] << 8) | packet[2]) * 0.125; dataset.ain0 = (*(packet + 2) << 8 | *(packet + 3)); dataset.ain1 = (*(packet + 4) << 8 | *(packet + 5)); dataset.ain2 = (*(packet + 6) << 8 | *(packet + 7)); diff --git a/linux/fsfwconfig/devices/gpioIds.h b/linux/fsfwconfig/devices/gpioIds.h index 2556732b..0eaa8c14 100644 --- a/linux/fsfwconfig/devices/gpioIds.h +++ b/linux/fsfwconfig/devices/gpioIds.h @@ -67,12 +67,12 @@ enum gpioId_t { CS_SUS_10, CS_SUS_11, + SPI_MUX_BIT_0, SPI_MUX_BIT_1, SPI_MUX_BIT_2, SPI_MUX_BIT_3, SPI_MUX_BIT_4, SPI_MUX_BIT_5, - SPI_MUX_BIT_6, CS_RAD_SENSOR, diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 5dcc15a2..ed9a7892 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -162,8 +162,8 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { bool addSus5 = false; bool addSus6 = false; bool addSus7 = false; - bool addSus8 = true; - bool addSus9 = false; + bool addSus8 = false; + bool addSus9 = true; bool addSus10 = false; bool addSus11 = false; /** @@ -340,7 +340,8 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus8) { /* Write setup */ thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); + //thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_READ); @@ -361,18 +362,19 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus9) { /* Write setup */ thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_9, length * 0.924, SusHandler::FIRST_WRITE); + //thisSequence->addSlot(objects::SUS_9, length * 0.924, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); + //thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_READ); /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::PERFORM_OPERATION); + //thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_READ); From 84f77642d57645769c63acd5bf1badf7a0788150 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 18:41:46 +0100 Subject: [PATCH 027/309] sus 0 on now --- .../fsfwconfig/pollingsequence/pollingSequenceFactory.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index ed9a7892..63658e55 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -154,7 +154,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #if OBSW_ADD_SUN_SENSORS == 1 - bool addSus0 = false; + bool addSus0 = true; bool addSus1 = false; bool addSus2 = false; bool addSus3 = false; @@ -163,7 +163,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { bool addSus6 = false; bool addSus7 = false; bool addSus8 = false; - bool addSus9 = true; + bool addSus9 = false; bool addSus10 = false; bool addSus11 = false; /** @@ -177,7 +177,8 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus0) { /* Write setup */ thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); + //thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_READ); From a38dd52d7bd3e1bf6e0526decda443319605259e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 18:42:46 +0100 Subject: [PATCH 028/309] no perform op --- linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 63658e55..c6ceaa0d 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -183,13 +183,13 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); + //thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_READ); /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); + //thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); From 1fd7ba18e91c12ab358daa46bda7ab3fcad9c41e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 18:47:44 +0100 Subject: [PATCH 029/309] remove some code --- linux/devices/SusHandler.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 9b529a6a..b65207e8 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -131,7 +131,6 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 case SUS::READ_CONVERSIONS: { PoolReadGuard readSet(&dataset); dataset.temperatureCelcius = (*(packet) << 8 | *(packet + 1)) * 0.125; - //dataset.temperatureCelcius = ((packet[1] << 8) | packet[2]) * 0.125; dataset.ain0 = (*(packet + 2) << 8 | *(packet + 3)); dataset.ain1 = (*(packet + 4) << 8 | *(packet + 5)); dataset.ain2 = (*(packet + 6) << 8 | *(packet + 7)); From 938c361097dd42cbb17b9cd008d913487886b544 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 19:41:03 +0100 Subject: [PATCH 030/309] some minor fixes --- linux/devices/SusHandler.cpp | 128 ++++++++++++------ linux/devices/SusHandler.h | 25 +++- .../devicedefinitions/SusDefinitions.h | 17 ++- .../pollingSequenceFactory.cpp | 14 +- 4 files changed, 125 insertions(+), 59 deletions(-) diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index b65207e8..ae1663bc 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -1,20 +1,17 @@ #include "SusHandler.h" #include +#include #include #include "OBSWConfig.h" SusHandler::SusHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, LinuxLibgpioIF *gpioComIF, gpioId_t chipSelectId) - : DeviceHandlerBase(objectId, comIF, comCookie), - divider(5), - dataset(this) { -} + : DeviceHandlerBase(objectId, comIF, comCookie), divider(5), dataset(this) {} SusHandler::~SusHandler() {} - ReturnValue_t SusHandler::initialize() { ReturnValue_t result = RETURN_OK; result = DeviceHandlerBase::initialize(); @@ -27,8 +24,9 @@ ReturnValue_t SusHandler::initialize() { void SusHandler::doStartUp() { if (comState == ComStates::IDLE) { comState = ComStates::WRITE_SETUP; + commandExecuted = false; } - if(comState == ComStates::WRITE_SETUP) { + if (comState == ComStates::WRITE_SETUP) { if (commandExecuted) { #if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1 setMode(MODE_NORMAL); @@ -36,7 +34,11 @@ void SusHandler::doStartUp() { setMode(_MODE_TO_ON); #endif commandExecuted = false; - comState = ComStates::START_CONVERSIONS; + if (clkMode == Modes::INT_CLOCKED) { + comState = ComStates::START_INT_CLOCKED_CONVERSIONS; + } else { + comState = ComStates::EXT_CLOCKED_CONVERSIONS; + } } } } @@ -50,17 +52,20 @@ ReturnValue_t SusHandler::buildNormalDeviceCommand(DeviceCommandId_t *id) { } case (ComStates::WRITE_SETUP): { *id = SUS::WRITE_SETUP; - comState = ComStates::START_CONVERSIONS; return buildCommandFromCommand(*id, nullptr, 0); } - case (ComStates::START_CONVERSIONS): { - *id = SUS::START_CONVERSIONS; - comState = ComStates::READ_CONVERSIONS; + case (ComStates::EXT_CLOCKED_CONVERSIONS): { + *id = SUS::READ_EXT_TIMED_CONVERSIONS; return buildCommandFromCommand(*id, nullptr, 0); } - case (ComStates::READ_CONVERSIONS): { - *id = SUS::READ_CONVERSIONS; - comState = ComStates::START_CONVERSIONS; + case (ComStates::START_INT_CLOCKED_CONVERSIONS): { + *id = SUS::START_INT_TIMED_CONVERSIONS; + comState = ComStates::READ_INT_CLOCKED_CONVERSIONS; + return buildCommandFromCommand(*id, nullptr, 0); + } + case (ComStates::READ_INT_CLOCKED_CONVERSIONS): { + *id = SUS::READ_INT_TIMED_CONVERSIONS; + comState = ComStates::START_INT_CLOCKED_CONVERSIONS; return buildCommandFromCommand(*id, nullptr, 0); } } @@ -80,22 +85,37 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman size_t commandDataLen) { switch (deviceCommand) { case (SUS::WRITE_SETUP): { - cmdBuffer[0] = SUS::SETUP; + if (clkMode == Modes::INT_CLOCKED) { + cmdBuffer[0] = SUS::SETUP_INT_CLOKED; + } else { + cmdBuffer[0] = SUS::SETUP_EXT_CLOCKED; + } + rawPacket = cmdBuffer; rawPacketLen = 1; return RETURN_OK; } - case (SUS::START_CONVERSIONS): { + case (SUS::START_INT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); cmdBuffer[0] = SUS::CONVERSION; rawPacket = cmdBuffer; rawPacketLen = 2; return RETURN_OK; } - case (SUS::READ_CONVERSIONS): { + case (SUS::READ_INT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); rawPacket = cmdBuffer; - rawPacketLen = SUS::SIZE_READ_CONVERSIONS; + rawPacketLen = SUS::SIZE_READ_INT_CONVERSIONS; + return RETURN_OK; + } + case (SUS::READ_EXT_TIMED_CONVERSIONS): { + std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); + rawPacket = cmdBuffer; + for (uint8_t idx = 0; idx < 6; idx++) { + cmdBuffer[idx * 2] = buildConvByte(ScanModes::N_ONCE, 0, false); + cmdBuffer[idx * 2 + 1] = 0; + } + rawPacketLen = SUS::SIZE_READ_EXT_CONVERSIONS; return RETURN_OK; } default: @@ -106,8 +126,11 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman void SusHandler::fillCommandAndReplyMap() { this->insertInCommandAndReplyMap(SUS::WRITE_SETUP, 1); - this->insertInCommandAndReplyMap(SUS::START_CONVERSIONS, 1); - this->insertInCommandAndReplyMap(SUS::READ_CONVERSIONS, 1, &dataset, SUS::SIZE_READ_CONVERSIONS); + this->insertInCommandAndReplyMap(SUS::START_INT_TIMED_CONVERSIONS, 1); + this->insertInCommandAndReplyMap(SUS::READ_INT_TIMED_CONVERSIONS, 1, &dataset, + SUS::SIZE_READ_INT_CONVERSIONS); + this->insertInCommandAndReplyMap(SUS::READ_EXT_TIMED_CONVERSIONS, 1, &dataset, + SUS::SIZE_READ_EXT_CONVERSIONS); } ReturnValue_t SusHandler::scanForReply(const uint8_t *start, size_t remainingSize, @@ -119,16 +142,16 @@ ReturnValue_t SusHandler::scanForReply(const uint8_t *start, size_t remainingSiz ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) { switch (id) { - case SUS::WRITE_SETUP: { - if (mode == _MODE_START_UP) { - commandExecuted = true; - } - return HasReturnvaluesIF::RETURN_OK; - } - case SUS::START_CONVERSIONS: { - return HasReturnvaluesIF::RETURN_OK; - } - case SUS::READ_CONVERSIONS: { + case SUS::WRITE_SETUP: { + if (mode == _MODE_START_UP) { + commandExecuted = true; + } + return HasReturnvaluesIF::RETURN_OK; + } + case SUS::START_INT_TIMED_CONVERSIONS: { + return HasReturnvaluesIF::RETURN_OK; + } + case SUS::READ_INT_TIMED_CONVERSIONS: { PoolReadGuard readSet(&dataset); dataset.temperatureCelcius = (*(packet) << 8 | *(packet + 1)) * 0.125; dataset.ain0 = (*(packet + 2) << 8 | *(packet + 3)); @@ -137,18 +160,18 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 dataset.ain3 = (*(packet + 8) << 8 | *(packet + 9)); dataset.ain4 = (*(packet + 10) << 8 | *(packet + 11)); dataset.ain5 = (*(packet + 12) << 8 | *(packet + 13)); -#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 - if (divider.checkAndIncrement()) { - sif::info << "SUS Object ID 0x" << std::hex << this->getObjectId() << ":" << std::endl; - sif::info << "Temperature: " << dataset.temperatureCelcius << " C" << std::endl; - sif::info << "AIN0: " << std::dec << dataset.ain0 << std::endl; - sif::info << "AIN1: " << std::dec << dataset.ain1 << std::endl; - sif::info << "AIN2: " << std::dec << dataset.ain2 << std::endl; - sif::info << "AIN3: " << std::dec << dataset.ain3 << std::endl; - sif::info << "AIN4: " << std::dec << dataset.ain4 << std::endl; - sif::info << "AIN5: " << std::dec << dataset.ain5 << std::endl; - } -#endif + printDataset(); + break; + } + case (SUS::READ_EXT_TIMED_CONVERSIONS): { + PoolReadGuard readSet(&dataset); + dataset.ain0 = (packet[1] << 8) | packet[2]; + dataset.ain1 = (packet[3] << 8) | packet[4]; + dataset.ain2 = (packet[5] << 8) | packet[6]; + dataset.ain3 = (packet[7] << 8) | packet[8]; + dataset.ain4 = (packet[9] << 8) | packet[10]; + dataset.ain5 = (packet[11] << 8) | packet[12]; + printDataset(); break; } default: { @@ -159,7 +182,7 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 return HasReturnvaluesIF::RETURN_OK; } -uint32_t SusHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; } +uint32_t SusHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 2000; } ReturnValue_t SusHandler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { @@ -174,3 +197,22 @@ ReturnValue_t SusHandler::initializeLocalDataPool(localpool::DataPool &localData } void SusHandler::setToGoToNormalMode(bool enable) { this->goToNormalModeImmediately = enable; } + +uint8_t SusHandler::buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { + return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; +} + +void SusHandler::printDataset() { +#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 + if (divider.checkAndIncrement()) { + sif::info << "SUS Object ID 0x" << std::hex << this->getObjectId() << ":" << std::endl; + sif::info << "Temperature: " << dataset.temperatureCelcius << " C" << std::endl; + sif::info << "AIN0: " << std::dec << dataset.ain0 << std::endl; + sif::info << "AIN1: " << std::dec << dataset.ain1 << std::endl; + sif::info << "AIN2: " << std::dec << dataset.ain2 << std::endl; + sif::info << "AIN3: " << std::dec << dataset.ain3 << std::endl; + sif::info << "AIN4: " << std::dec << dataset.ain4 << std::endl; + sif::info << "AIN5: " << std::dec << dataset.ain5 << std::endl; + } +#endif +} diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index b499e74b..15a4a8a8 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -22,6 +22,15 @@ */ class SusHandler : public DeviceHandlerBase { public: + enum Modes { INT_CLOCKED, EXT_CLOCKED }; + + enum ScanModes : uint8_t { + CHANNELS_0_TO_N = 0b00, + CHANNEL_N_TO_HIGHEST = 0b01, + N_REPEATEDLY = 0b10, + N_ONCE = 0b11 + }; + static const uint8_t FIRST_WRITE = 7; SusHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, @@ -44,32 +53,42 @@ class SusHandler : public DeviceHandlerBase { ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override; - //void setNormalDatapoolEntriesInvalid() override; + // void setNormalDatapoolEntriesInvalid() override; uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; + uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp); + private: static const uint8_t INTERFACE_ID = CLASS_ID::SUS_HANDLER; static const ReturnValue_t ERROR_UNLOCK_MUTEX = MAKE_RETURN_CODE(0xA0); static const ReturnValue_t ERROR_LOCK_MUTEX = MAKE_RETURN_CODE(0xA1); - enum class ComStates { IDLE, WRITE_SETUP, START_CONVERSIONS, READ_CONVERSIONS }; + enum class ComStates { + IDLE, + WRITE_SETUP, + EXT_CLOCKED_CONVERSIONS, + START_INT_CLOCKED_CONVERSIONS, + READ_INT_CLOCKED_CONVERSIONS + }; PeriodicOperationDivider divider; // LinuxLibgpioIF* gpioComIF = nullptr; + // gpioId_t chipSelectId = gpio::NO_GPIO; bool goToNormalModeImmediately = false; bool commandExecuted = false; - // gpioId_t chipSelectId = gpio::NO_GPIO; SUS::SusDataset dataset; + Modes clkMode = Modes::INT_CLOCKED; uint8_t cmdBuffer[SUS::MAX_CMD_SIZE]; ComStates comState = ComStates::IDLE; MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING; uint32_t timeoutMs = 20; + void printDataset(); MutexIF* spiMutex = nullptr; }; diff --git a/linux/devices/devicedefinitions/SusDefinitions.h b/linux/devices/devicedefinitions/SusDefinitions.h index 2a45ebc5..92a1881a 100644 --- a/linux/devices/devicedefinitions/SusDefinitions.h +++ b/linux/devices/devicedefinitions/SusDefinitions.h @@ -21,12 +21,14 @@ static const DeviceCommandId_t WRITE_SETUP = 0x1; * This command initiates the ADC conversion for all channels including the internal * temperature sensor. */ -static const DeviceCommandId_t START_CONVERSIONS = 0x2; +static const DeviceCommandId_t START_INT_TIMED_CONVERSIONS = 0x2; /** * This command reads the internal fifo which holds the temperature and the channel * conversions. */ -static const DeviceCommandId_t READ_CONVERSIONS = 0x3; +static constexpr DeviceCommandId_t READ_INT_TIMED_CONVERSIONS = 0x3; + +static constexpr DeviceCommandId_t READ_EXT_TIMED_CONVERSIONS = 0x4; /** * @brief This is the configuration byte which will be written to the setup register after @@ -39,7 +41,8 @@ static const DeviceCommandId_t READ_CONVERSIONS = 0x3; * written to the setup register * */ -static const uint8_t SETUP = 0b01101000; +static constexpr uint8_t SETUP_INT_CLOKED = 0b01101000; +static constexpr uint8_t SETUP_EXT_CLOCKED = 0b01111000; /** * @brief This values will always be written to the ADC conversion register to specify the @@ -51,12 +54,14 @@ static const uint8_t SETUP = 0b01101000; */ static const uint8_t CONVERSION = 0b10101001; -static const uint8_t SUS_DATA_SET_ID = READ_CONVERSIONS; +static const uint8_t SUS_DATA_SET_ID = READ_EXT_TIMED_CONVERSIONS; /** Size of data replies. Temperature and 6 channel convesions (AIN0 - AIN5) */ -static const uint8_t SIZE_READ_CONVERSIONS = 14; +static const uint8_t SIZE_READ_INT_CONVERSIONS = 14; +// 6 * conv byte, 6 * 0 and one trailing zero +static constexpr uint8_t SIZE_READ_EXT_CONVERSIONS = 13; -static const uint8_t MAX_CMD_SIZE = SIZE_READ_CONVERSIONS; +static const uint8_t MAX_CMD_SIZE = 16; static const uint8_t POOL_ENTRIES = 7; diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index c6ceaa0d..31e22ecc 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -177,19 +177,19 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus0) { /* Write setup */ thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::PERFORM_OPERATION); - //thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ - //thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_READ); /* Read ADC conversions */ - //thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); @@ -341,7 +341,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus8) { /* Write setup */ thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::PERFORM_OPERATION); - //thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_READ); @@ -363,19 +363,19 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus9) { /* Write setup */ thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::PERFORM_OPERATION); - //thisSequence->addSlot(objects::SUS_9, length * 0.924, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_9, length * 0.924, SusHandler::FIRST_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ - //thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_READ); /* Read ADC conversions */ - //thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_READ); From 4c60e54fe7922339602487050059c44deb3a2119 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 14 Feb 2022 19:45:21 +0100 Subject: [PATCH 031/309] added empty file for common max 1227 code --- mission/devices/CMakeLists.txt | 1 + mission/devices/max1227.cpp | 1 + mission/devices/max1227.h | 8 ++++++++ 3 files changed, 10 insertions(+) create mode 100644 mission/devices/max1227.cpp create mode 100644 mission/devices/max1227.h diff --git a/mission/devices/CMakeLists.txt b/mission/devices/CMakeLists.txt index 03ff3556..351becdd 100644 --- a/mission/devices/CMakeLists.txt +++ b/mission/devices/CMakeLists.txt @@ -16,6 +16,7 @@ target_sources(${TARGET_NAME} PUBLIC RadiationSensorHandler.cpp GyroADIS1650XHandler.cpp RwHandler.cpp + max1227.cpp ) diff --git a/mission/devices/max1227.cpp b/mission/devices/max1227.cpp new file mode 100644 index 00000000..762b7ba1 --- /dev/null +++ b/mission/devices/max1227.cpp @@ -0,0 +1 @@ +#include "max1227.h" diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h new file mode 100644 index 00000000..e9276e03 --- /dev/null +++ b/mission/devices/max1227.h @@ -0,0 +1,8 @@ +#ifndef MISSION_DEVICES_MAX1227_H_ +#define MISSION_DEVICES_MAX1227_H_ + +namespace max1227 { + +} + +#endif /* MISSION_DEVICES_MAX1227_H_ */ From 35322add7aa0f420be6ff5c6889802b527142c0f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 11:50:42 +0100 Subject: [PATCH 032/309] fsfw update --- fsfw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsfw b/fsfw index 32a9e0c7..81f5b0c3 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 32a9e0c7044665f0265c10108c8d62d45c047769 +Subproject commit 81f5b0c3bf3e602f5cc459dc39bc1e8885c932a7 From bc88dfd9a4995028b908764a79759cfbc8d812c4 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 11:54:03 +0100 Subject: [PATCH 033/309] small fix GPS dev handler --- mission/devices/GPSHyperionLinuxController.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/mission/devices/GPSHyperionLinuxController.cpp b/mission/devices/GPSHyperionLinuxController.cpp index 0955e1c7..8fe06512 100644 --- a/mission/devices/GPSHyperionLinuxController.cpp +++ b/mission/devices/GPSHyperionLinuxController.cpp @@ -160,7 +160,6 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() { gpsSet.hours = timeOfDay.hour; gpsSet.minutes = timeOfDay.minute; gpsSet.seconds = timeOfDay.second; - debugHyperionGps = true; if (debugHyperionGps) { sif::info << "-- Hyperion GPS Data --" << std::endl; time_t timeRaw = gps->fix.time.tv_sec; From 4af119d904d97426a9f8e67cee38340f09a5089e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 14:41:41 +0100 Subject: [PATCH 034/309] changed default TMTC handler --- linux/fsfwconfig/OBSWConfig.h.in | 4 ++-- linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp | 4 ++-- tmtc | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index fd5ae534..c51e938d 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -35,9 +35,9 @@ debugging. */ #define OBSW_USE_CCSDS_IP_CORE 1 // Set to 1 if all telemetry should be sent to the PTME IP Core -#define OBSW_TM_TO_PTME 1 +#define OBSW_TM_TO_PTME 0 // Set to 1 if telecommands are received via the PDEC IP Core -#define OBSW_TC_FROM_PDEC 1 +#define OBSW_TC_FROM_PDEC 0 #define OBSW_ENABLE_TIMERS 1 #define OBSW_ADD_MGT 1 diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 31e22ecc..d630c95a 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -452,8 +452,8 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #endif #if OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 - bool enableAside = true; - bool enableBside = false; + bool enableAside = false; + bool enableBside = true; if (enableAside) { // A side thisSequence->addSlot(objects::MGM_0_LIS3_HANDLER, length * 0, diff --git a/tmtc b/tmtc index 6a783112..a671e864 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 6a78311239bdf78040e43ef217035fcaa2ab9f3b +Subproject commit a671e86400152d8480c1efde29d69848ca6b6066 From 4a5b201eba804c2d4dccda445597643339356ef9 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 14:42:59 +0100 Subject: [PATCH 035/309] added preprocessor guard to avoid hk spam --- mission/devices/GPSHyperionLinuxController.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mission/devices/GPSHyperionLinuxController.cpp b/mission/devices/GPSHyperionLinuxController.cpp index 8fe06512..c47414a8 100644 --- a/mission/devices/GPSHyperionLinuxController.cpp +++ b/mission/devices/GPSHyperionLinuxController.cpp @@ -67,7 +67,9 @@ ReturnValue_t GPSHyperionLinuxController::initializeLocalDataPool( localDataPoolMap.emplace(GpsHyperion::SATS_IN_USE, new PoolEntry()); localDataPoolMap.emplace(GpsHyperion::SATS_IN_VIEW, new PoolEntry()); localDataPoolMap.emplace(GpsHyperion::FIX_MODE, new PoolEntry()); +#if OBSW_ENABLE_PERIODIC_HK == 1 poolManager.subscribeForPeriodicPacket(gpsSet.getSid(), true, 2.0, false); +#endif return HasReturnvaluesIF::RETURN_OK; } From a2ec4a4828c7c679bd95889b23a5d3aa32db6412 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 16:40:48 +0100 Subject: [PATCH 036/309] add temp read for ext clocked mode --- bsp_q7s/core/ObjectFactory.cpp | 24 ++++++------- common/config/devConf.h | 6 ++++ linux/devices/SusHandler.cpp | 34 +++++++++++++++---- linux/devices/SusHandler.h | 7 ++-- .../devicedefinitions/SusDefinitions.h | 18 ++++------ 5 files changed, 58 insertions(+), 31 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index e164c3fb..3d72e4f0 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -350,62 +350,62 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI SpiCookie* spiCookie = new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, - spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler0 = new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_0); spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler1 = new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_1); spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler2 = new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_2); spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler3 = new SusHandler(objects::SUS_3, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_3); spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler4 = new SusHandler(objects::SUS_4, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_4); spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler5 = new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_5); spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler6 = new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_6); spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler7 = new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_7); spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler8 = new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_8); spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler9 = new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_9); spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler10 = new SusHandler(objects::SUS_10, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_10); spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, SUS::MAX1227_SPI_FREQ); + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler11 = new SusHandler(objects::SUS_11, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_11); static_cast(susHandler0); diff --git a/common/config/devConf.h b/common/config/devConf.h index 78681ec7..a83ccd23 100644 --- a/common/config/devConf.h +++ b/common/config/devConf.h @@ -23,6 +23,12 @@ static constexpr uint32_t DEFAULT_L3G_SPEED = 976'000; static constexpr uint32_t L3G_TRANSITION_DELAY = 5000; static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3; +/** + * Some MAX1227 could not be reached with frequencies around 4 MHz. Maybe this is caused by + * the decoder and buffer circuits. Thus frequency is here defined to 1 MHz. + */ +static const uint32_t SUS_MAX1227_SPI_FREQ = 1'000'000; + static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 3'900'000; static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3; diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index ae1663bc..95964cbd 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -34,7 +34,7 @@ void SusHandler::doStartUp() { setMode(_MODE_TO_ON); #endif commandExecuted = false; - if (clkMode == Modes::INT_CLOCKED) { + if (clkMode == ClkModes::INT_CLOCKED) { comState = ComStates::START_INT_CLOCKED_CONVERSIONS; } else { comState = ComStates::EXT_CLOCKED_CONVERSIONS; @@ -68,6 +68,10 @@ ReturnValue_t SusHandler::buildNormalDeviceCommand(DeviceCommandId_t *id) { comState = ComStates::START_INT_CLOCKED_CONVERSIONS; return buildCommandFromCommand(*id, nullptr, 0); } + case (ComStates::EXT_CLOCKED_TEMP): { + *id = SUS::READ_EXT_TIMED_TEMPS; + return buildCommandFromCommand(*id , nullptr, 0); + } } return NOTHING_TO_SEND; } @@ -85,7 +89,7 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman size_t commandDataLen) { switch (deviceCommand) { case (SUS::WRITE_SETUP): { - if (clkMode == Modes::INT_CLOCKED) { + if (clkMode == ClkModes::INT_CLOCKED) { cmdBuffer[0] = SUS::SETUP_INT_CLOKED; } else { cmdBuffer[0] = SUS::SETUP_EXT_CLOCKED; @@ -118,6 +122,13 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman rawPacketLen = SUS::SIZE_READ_EXT_CONVERSIONS; return RETURN_OK; } + case (SUS::READ_EXT_TIMED_TEMPS): { + cmdBuffer[0] = buildConvByte(ScanModes::N_ONCE, 0, true); + std::memset(cmdBuffer + 1, 0, 24); + rawPacket = cmdBuffer; + rawPacketLen = 25; + break; + } default: return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } @@ -125,12 +136,13 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman } void SusHandler::fillCommandAndReplyMap() { - this->insertInCommandAndReplyMap(SUS::WRITE_SETUP, 1); - this->insertInCommandAndReplyMap(SUS::START_INT_TIMED_CONVERSIONS, 1); - this->insertInCommandAndReplyMap(SUS::READ_INT_TIMED_CONVERSIONS, 1, &dataset, + insertInCommandAndReplyMap(SUS::WRITE_SETUP, 1); + insertInCommandAndReplyMap(SUS::START_INT_TIMED_CONVERSIONS, 1); + insertInCommandAndReplyMap(SUS::READ_INT_TIMED_CONVERSIONS, 1, &dataset, SUS::SIZE_READ_INT_CONVERSIONS); - this->insertInCommandAndReplyMap(SUS::READ_EXT_TIMED_CONVERSIONS, 1, &dataset, + insertInCommandAndReplyMap(SUS::READ_EXT_TIMED_CONVERSIONS, 1, &dataset, SUS::SIZE_READ_EXT_CONVERSIONS); + insertInCommandAndReplyMap(SUS::READ_EXT_TIMED_TEMPS, 1); } ReturnValue_t SusHandler::scanForReply(const uint8_t *start, size_t remainingSize, @@ -171,9 +183,19 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 dataset.ain3 = (packet[7] << 8) | packet[8]; dataset.ain4 = (packet[9] << 8) | packet[10]; dataset.ain5 = (packet[11] << 8) | packet[12]; + // Read temperature in next read cycle + if(clkMode == ClkModes::EXT_CLOCKED_WITH_TEMP) { + comState = ComStates::EXT_CLOCKED_TEMP; + } printDataset(); break; } + case (SUS::READ_EXT_TIMED_TEMPS): { + PoolReadGuard readSet(&dataset); + dataset.temperatureCelcius = (packet[23] << 8) | packet[24]; + comState = ComStates::EXT_CLOCKED_CONVERSIONS; + break; + } default: { sif::debug << "SusHandler::interpretDeviceReply: Unknown reply id" << std::endl; return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY; diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 87f1679e..3258cf73 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -23,7 +23,7 @@ */ class SusHandler : public DeviceHandlerBase { public: - enum Modes { INT_CLOCKED, EXT_CLOCKED }; + enum ClkModes { INT_CLOCKED, EXT_CLOCKED, EXT_CLOCKED_WITH_TEMP }; enum ScanModes : uint8_t { CHANNELS_0_TO_N = 0b00, @@ -71,6 +71,7 @@ class SusHandler : public DeviceHandlerBase { IDLE, WRITE_SETUP, EXT_CLOCKED_CONVERSIONS, + EXT_CLOCKED_TEMP, START_INT_CLOCKED_CONVERSIONS, READ_INT_CLOCKED_CONVERSIONS }; @@ -82,7 +83,9 @@ class SusHandler : public DeviceHandlerBase { bool commandExecuted = false; SUS::SusDataset dataset; - Modes clkMode = Modes::INT_CLOCKED; + // Read temperature in each alternating communication step when using + // externally clocked mode + ClkModes clkMode = ClkModes::EXT_CLOCKED_WITH_TEMP; uint8_t cmdBuffer[SUS::MAX_CMD_SIZE]; ComStates comState = ComStates::IDLE; diff --git a/linux/devices/devicedefinitions/SusDefinitions.h b/linux/devices/devicedefinitions/SusDefinitions.h index 92a1881a..260bfdc7 100644 --- a/linux/devices/devicedefinitions/SusDefinitions.h +++ b/linux/devices/devicedefinitions/SusDefinitions.h @@ -8,27 +8,23 @@ namespace SUS { -/** - * Some MAX1227 could not be reached with frequencies around 4 MHz. Maybe this is caused by - * the decoder and buffer circuits. Thus frequency is here defined to 1 MHz. - */ -static const uint32_t MAX1227_SPI_FREQ = 1000000; - static const DeviceCommandId_t NONE = 0x0; // Set when no command is pending -static const DeviceCommandId_t WRITE_SETUP = 0x1; +static const DeviceCommandId_t WRITE_SETUP = 1; /** * This command initiates the ADC conversion for all channels including the internal * temperature sensor. */ -static const DeviceCommandId_t START_INT_TIMED_CONVERSIONS = 0x2; +static const DeviceCommandId_t START_INT_TIMED_CONVERSIONS = 2; /** * This command reads the internal fifo which holds the temperature and the channel * conversions. */ -static constexpr DeviceCommandId_t READ_INT_TIMED_CONVERSIONS = 0x3; +static constexpr DeviceCommandId_t READ_INT_TIMED_CONVERSIONS = 3; -static constexpr DeviceCommandId_t READ_EXT_TIMED_CONVERSIONS = 0x4; +static constexpr DeviceCommandId_t READ_EXT_TIMED_CONVERSIONS = 4; + +static constexpr DeviceCommandId_t READ_EXT_TIMED_TEMPS = 5; /** * @brief This is the configuration byte which will be written to the setup register after @@ -61,7 +57,7 @@ static const uint8_t SIZE_READ_INT_CONVERSIONS = 14; // 6 * conv byte, 6 * 0 and one trailing zero static constexpr uint8_t SIZE_READ_EXT_CONVERSIONS = 13; -static const uint8_t MAX_CMD_SIZE = 16; +static const uint8_t MAX_CMD_SIZE = 32; static const uint8_t POOL_ENTRIES = 7; From 82f9d9db4bd18e89cad70fdf4728fb354e55159e Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 16:44:12 +0100 Subject: [PATCH 037/309] move generic max1227 code to separate source file --- linux/devices/SusHandler.cpp | 8 ++------ linux/devices/SusHandler.h | 10 +--------- mission/devices/max1227.cpp | 4 ++++ mission/devices/max1227.h | 12 ++++++++++++ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 95964cbd..6fd0c1c1 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -1,11 +1,10 @@ #include "SusHandler.h" +#include "OBSWConfig.h" #include #include #include -#include "OBSWConfig.h" - SusHandler::SusHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, LinuxLibgpioIF *gpioComIF, gpioId_t chipSelectId) : DeviceHandlerBase(objectId, comIF, comCookie), divider(5), dataset(this) {} @@ -87,6 +86,7 @@ ReturnValue_t SusHandler::buildTransitionDeviceCommand(DeviceCommandId_t *id) { ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t *commandData, size_t commandDataLen) { + using namespace max1227; switch (deviceCommand) { case (SUS::WRITE_SETUP): { if (clkMode == ClkModes::INT_CLOCKED) { @@ -220,10 +220,6 @@ ReturnValue_t SusHandler::initializeLocalDataPool(localpool::DataPool &localData void SusHandler::setToGoToNormalMode(bool enable) { this->goToNormalModeImmediately = enable; } -uint8_t SusHandler::buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { - return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; -} - void SusHandler::printDataset() { #if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 if (divider.checkAndIncrement()) { diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 3258cf73..40097295 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -5,6 +5,7 @@ #include #include "devicedefinitions/SusDefinitions.h" +#include "mission/devices/max1227.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" /** @@ -25,13 +26,6 @@ class SusHandler : public DeviceHandlerBase { public: enum ClkModes { INT_CLOCKED, EXT_CLOCKED, EXT_CLOCKED_WITH_TEMP }; - enum ScanModes : uint8_t { - CHANNELS_0_TO_N = 0b00, - CHANNEL_N_TO_HIGHEST = 0b01, - N_REPEATEDLY = 0b10, - N_ONCE = 0b11 - }; - static const uint8_t FIRST_WRITE = 7; SusHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, @@ -59,8 +53,6 @@ class SusHandler : public DeviceHandlerBase { ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; - uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp); - private: static const uint8_t INTERFACE_ID = CLASS_ID::SUS_HANDLER; diff --git a/mission/devices/max1227.cpp b/mission/devices/max1227.cpp index 762b7ba1..0c709f0a 100644 --- a/mission/devices/max1227.cpp +++ b/mission/devices/max1227.cpp @@ -1 +1,5 @@ #include "max1227.h" + +uint8_t max1227::buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { + return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; +} diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index e9276e03..54177201 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -1,8 +1,20 @@ #ifndef MISSION_DEVICES_MAX1227_H_ #define MISSION_DEVICES_MAX1227_H_ +#include + namespace max1227 { +enum ScanModes : uint8_t { + CHANNELS_0_TO_N = 0b00, + CHANNEL_N_TO_HIGHEST = 0b01, + N_REPEATEDLY = 0b10, + N_ONCE = 0b11 +}; + + +uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp); + } #endif /* MISSION_DEVICES_MAX1227_H_ */ From c6c9a02f0979687687202e2d2ead4367f67e03e1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 16:50:16 +0100 Subject: [PATCH 038/309] small fix --- linux/devices/SusHandler.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 6fd0c1c1..4ae3572b 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -97,20 +97,20 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman rawPacket = cmdBuffer; rawPacketLen = 1; - return RETURN_OK; + break; } case (SUS::START_INT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); cmdBuffer[0] = SUS::CONVERSION; rawPacket = cmdBuffer; rawPacketLen = 2; - return RETURN_OK; + break; } case (SUS::READ_INT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); rawPacket = cmdBuffer; rawPacketLen = SUS::SIZE_READ_INT_CONVERSIONS; - return RETURN_OK; + break; } case (SUS::READ_EXT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); @@ -120,7 +120,7 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman cmdBuffer[idx * 2 + 1] = 0; } rawPacketLen = SUS::SIZE_READ_EXT_CONVERSIONS; - return RETURN_OK; + break; } case (SUS::READ_EXT_TIMED_TEMPS): { cmdBuffer[0] = buildConvByte(ScanModes::N_ONCE, 0, true); @@ -132,7 +132,7 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman default: return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } - return HasReturnvaluesIF::RETURN_FAILED; + return HasReturnvaluesIF::RETURN_OK; } void SusHandler::fillCommandAndReplyMap() { From ce41b3316c755b9416b933c93e49befe964043de Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 17:08:57 +0100 Subject: [PATCH 039/309] apply clang format --- bsp_q7s/core/ObjectFactory.cpp | 55 ++++++++++++++++++++-------------- bsp_q7s/simple/simple.cpp | 1 - fsfw | 2 +- linux/devices/SusHandler.cpp | 11 +++---- linux/devices/SusHandler.h | 4 +-- mission/devices/max1227.h | 3 +- 6 files changed, 43 insertions(+), 33 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 3d72e4f0..28bacc3b 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -354,58 +354,69 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI SusHandler* susHandler0 = new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_0); - spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler1 = new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_1); - spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler2 = new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_2); - spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler3 = new SusHandler(objects::SUS_3, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_3); - spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler4 = new SusHandler(objects::SUS_4, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_4); - spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV), - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV), + SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler5 = new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_5); - spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler6 = new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_6); - spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler7 = new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_7); - spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler8 = new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_8); - spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler9 = new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_9); - spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler10 = new SusHandler(objects::SUS_10, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_10); - spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, - SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); + spiCookie = + new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, + spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); SusHandler* susHandler11 = new SusHandler(objects::SUS_11, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_11); static_cast(susHandler0); diff --git a/bsp_q7s/simple/simple.cpp b/bsp_q7s/simple/simple.cpp index a86fd459..1362ef23 100644 --- a/bsp_q7s/simple/simple.cpp +++ b/bsp_q7s/simple/simple.cpp @@ -1,7 +1,6 @@ #include "simple.h" #include "iostream" - #include "q7sConfig.h" #if Q7S_SIMPLE_ADD_FILE_SYSTEM_TEST == 1 diff --git a/fsfw b/fsfw index 81f5b0c3..0d6d44f7 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 81f5b0c3bf3e602f5cc459dc39bc1e8885c932a7 +Subproject commit 0d6d44f72fb28ba480482f5d8b2eee6f78d664ce diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 4ae3572b..07bef93a 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -1,10 +1,11 @@ #include "SusHandler.h" -#include "OBSWConfig.h" #include #include #include +#include "OBSWConfig.h" + SusHandler::SusHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, LinuxLibgpioIF *gpioComIF, gpioId_t chipSelectId) : DeviceHandlerBase(objectId, comIF, comCookie), divider(5), dataset(this) {} @@ -69,7 +70,7 @@ ReturnValue_t SusHandler::buildNormalDeviceCommand(DeviceCommandId_t *id) { } case (ComStates::EXT_CLOCKED_TEMP): { *id = SUS::READ_EXT_TIMED_TEMPS; - return buildCommandFromCommand(*id , nullptr, 0); + return buildCommandFromCommand(*id, nullptr, 0); } } return NOTHING_TO_SEND; @@ -139,9 +140,9 @@ void SusHandler::fillCommandAndReplyMap() { insertInCommandAndReplyMap(SUS::WRITE_SETUP, 1); insertInCommandAndReplyMap(SUS::START_INT_TIMED_CONVERSIONS, 1); insertInCommandAndReplyMap(SUS::READ_INT_TIMED_CONVERSIONS, 1, &dataset, - SUS::SIZE_READ_INT_CONVERSIONS); + SUS::SIZE_READ_INT_CONVERSIONS); insertInCommandAndReplyMap(SUS::READ_EXT_TIMED_CONVERSIONS, 1, &dataset, - SUS::SIZE_READ_EXT_CONVERSIONS); + SUS::SIZE_READ_EXT_CONVERSIONS); insertInCommandAndReplyMap(SUS::READ_EXT_TIMED_TEMPS, 1); } @@ -184,7 +185,7 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 dataset.ain4 = (packet[9] << 8) | packet[10]; dataset.ain5 = (packet[11] << 8) | packet[12]; // Read temperature in next read cycle - if(clkMode == ClkModes::EXT_CLOCKED_WITH_TEMP) { + if (clkMode == ClkModes::EXT_CLOCKED_WITH_TEMP) { comState = ComStates::EXT_CLOCKED_TEMP; } printDataset(); diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 40097295..e5de650d 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -5,8 +5,8 @@ #include #include "devicedefinitions/SusDefinitions.h" -#include "mission/devices/max1227.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" +#include "mission/devices/max1227.h" /** * @brief This is the device handler class for the SUS sensor based on the MAX1227 ADC. @@ -63,7 +63,7 @@ class SusHandler : public DeviceHandlerBase { IDLE, WRITE_SETUP, EXT_CLOCKED_CONVERSIONS, - EXT_CLOCKED_TEMP, + EXT_CLOCKED_TEMP, START_INT_CLOCKED_CONVERSIONS, READ_INT_CLOCKED_CONVERSIONS }; diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index 54177201..28fba7a3 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -12,9 +12,8 @@ enum ScanModes : uint8_t { N_ONCE = 0b11 }; - uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp); -} +} // namespace max1227 #endif /* MISSION_DEVICES_MAX1227_H_ */ From f5879f5867cb3e95238b15dc6df5e272907b3635 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 15 Feb 2022 20:40:44 +0100 Subject: [PATCH 040/309] possible some fixes in decoder logic --- bsp_q7s/callbacks/gpioCallbacks.cpp | 12 ++-- bsp_q7s/core/ObjectFactory.cpp | 1 + common/config/devConf.h | 4 +- linux/devices/SusHandler.cpp | 2 +- linux/devices/SusHandler.h | 2 +- .../pollingSequenceFactory.cpp | 66 +++++++++---------- 6 files changed, 44 insertions(+), 43 deletions(-) diff --git a/bsp_q7s/callbacks/gpioCallbacks.cpp b/bsp_q7s/callbacks/gpioCallbacks.cpp index 8d75fb20..8f554a65 100644 --- a/bsp_q7s/callbacks/gpioCallbacks.cpp +++ b/bsp_q7s/callbacks/gpioCallbacks.cpp @@ -146,15 +146,15 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev break; } case (gpioIds::CS_SUS_2): { - disableDecoderInterfaceBoardIc2(); + disableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_3): { - disableDecoderInterfaceBoardIc2(); + disableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_4): { - disableDecoderInterfaceBoardIc2(); + disableDecoderInterfaceBoardIc1(); break; } case (gpioIds::CS_SUS_5): { @@ -162,7 +162,7 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev break; } case (gpioIds::CS_SUS_6): { - disableDecoderInterfaceBoardIc1(); + disableDecoderInterfaceBoardIc2(); break; } case (gpioIds::CS_SUS_7): { @@ -170,11 +170,11 @@ void spiCsDecoderCallback(gpioId_t gpioId, gpio::GpioOperation gpioOp, gpio::Lev break; } case (gpioIds::CS_SUS_8): { - disableDecoderInterfaceBoardIc1(); + disableDecoderInterfaceBoardIc2(); break; } case (gpioIds::CS_SUS_9): { - disableDecoderInterfaceBoardIc1(); + disableDecoderInterfaceBoardIc2(); break; } case (gpioIds::CS_SUS_10): { diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 28bacc3b..cac198af 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -129,6 +129,7 @@ void ObjectFactory::produce(void* args) { #if BOARD_TE0720 == 0 new CoreController(objects::CORE_CONTROLLER); + gpioCallbacks::disableAllDecoder(); createPcduComponents(gpioComIF); createRadSensorComponent(gpioComIF); createSunSensorComponents(gpioComIF, spiComIF); diff --git a/common/config/devConf.h b/common/config/devConf.h index a83ccd23..deea6aa2 100644 --- a/common/config/devConf.h +++ b/common/config/devConf.h @@ -27,9 +27,9 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3; * Some MAX1227 could not be reached with frequencies around 4 MHz. Maybe this is caused by * the decoder and buffer circuits. Thus frequency is here defined to 1 MHz. */ -static const uint32_t SUS_MAX1227_SPI_FREQ = 1'000'000; +static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000; -static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 3'900'000; +static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000; static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3; static constexpr uint32_t DEFAULT_ADIS16507_SPEED = 976'000; diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 07bef93a..9b8e9bd0 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -117,7 +117,7 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); rawPacket = cmdBuffer; for (uint8_t idx = 0; idx < 6; idx++) { - cmdBuffer[idx * 2] = buildConvByte(ScanModes::N_ONCE, 0, false); + cmdBuffer[idx * 2] = buildConvByte(ScanModes::N_ONCE, idx, false); cmdBuffer[idx * 2 + 1] = 0; } rawPacketLen = SUS::SIZE_READ_EXT_CONVERSIONS; diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index e5de650d..d2f5f9ce 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -77,7 +77,7 @@ class SusHandler : public DeviceHandlerBase { SUS::SusDataset dataset; // Read temperature in each alternating communication step when using // externally clocked mode - ClkModes clkMode = ClkModes::EXT_CLOCKED_WITH_TEMP; + ClkModes clkMode = ClkModes::EXT_CLOCKED; uint8_t cmdBuffer[SUS::MAX_CMD_SIZE]; ComStates comState = ComStates::IDLE; diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index f9c42411..8964bd4b 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -169,7 +169,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { bool addSus5 = false; bool addSus6 = false; bool addSus7 = false; - bool addSus8 = false; + bool addSus8 = true; bool addSus9 = false; bool addSus10 = false; bool addSus11 = false; @@ -183,24 +183,24 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { */ if (addSus0) { /* Write setup */ - thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_0, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_0, length * 0.933, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.83, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.86, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.9, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.85, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_READ); +// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_READ); +// /* Read ADC conversions */ +// // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_READ); } if (addSus1) { /* Write setup */ @@ -347,24 +347,24 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus8) { /* Write setup */ - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_8, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.921, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.93, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.95, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.96, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_READ); - /* Read ADC conversions from internal FIFO */ - // thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_READ); +// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_READ); +// /* Read ADC conversions from internal FIFO */ +// // thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); +// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_WRITE); +// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_WRITE); +// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_READ); +// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_READ); } if (addSus9) { @@ -459,8 +459,8 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #endif #if OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 - bool enableAside = false; - bool enableBside = true; + bool enableAside = true; + bool enableBside = false; if (enableAside) { // A side thisSequence->addSlot(objects::MGM_0_LIS3_HANDLER, length * 0, From 3387a71399c9394de0bae2e6e9830cb835b0ede7 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 16 Feb 2022 15:16:36 +0100 Subject: [PATCH 041/309] more sus testing --- common/config/devConf.h | 2 +- linux/boardtest/SpiTestClass.cpp | 38 +- linux/boardtest/SpiTestClass.h | 10 +- linux/devices/SusHandler.cpp | 6 +- .../pollingSequenceFactory.cpp | 364 +++++++++--------- mission/devices/max1227.cpp | 4 + mission/devices/max1227.h | 27 ++ 7 files changed, 259 insertions(+), 192 deletions(-) diff --git a/common/config/devConf.h b/common/config/devConf.h index deea6aa2..7d489679 100644 --- a/common/config/devConf.h +++ b/common/config/devConf.h @@ -27,7 +27,7 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3; * Some MAX1227 could not be reached with frequencies around 4 MHz. Maybe this is caused by * the decoder and buffer circuits. Thus frequency is here defined to 1 MHz. */ -static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000; +static const uint32_t SUS_MAX1227_SPI_FREQ = 1'000'000; static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000; static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3; diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 7ef76d95..4d909d10 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -15,7 +15,9 @@ #include +#include "busConf.h" #include "devices/gpioIds.h" +#include "mission/devices/max1227.h" SpiTestClass::SpiTestClass(object_id_t objectId, GpioIF *gpioIF) : TestTask(objectId), gpioIF(gpioIF) { @@ -23,8 +25,8 @@ SpiTestClass::SpiTestClass(object_id_t objectId, GpioIF *gpioIF) sif::error << "SpiTestClass::SpiTestClass: Invalid GPIO ComIF!" << std::endl; } testMode = TestModes::MGM_LIS3MDL; - spiTransferStruct.rx_buf = reinterpret_cast<__u64>(recvBuffer.data()); - spiTransferStruct.tx_buf = reinterpret_cast<__u64>(sendBuffer.data()); + spiTransferStruct[0].rx_buf = reinterpret_cast<__u64>(recvBuffer.data()); + spiTransferStruct[0].tx_buf = reinterpret_cast<__u64>(sendBuffer.data()); } ReturnValue_t SpiTestClass::performOneShotAction() { @@ -44,6 +46,10 @@ ReturnValue_t SpiTestClass::performOneShotAction() { performL3gTest(gyro1L3gd20ChipSelect); break; } + case (TestModes::SUS_0): { + performSusTest(); + break; + } } return HasReturnvaluesIF::RETURN_OK; } @@ -180,7 +186,7 @@ void SpiTestClass::performLis3MdlTest(uint8_t lis3Id) { return; } setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed); - spiTransferStruct.delay_usecs = 0; + spiTransferStruct[0].delay_usecs = 0; uint8_t whoAmIRegVal = readStmRegister(fileDescriptor, currentGpioId, whoAmIReg, false); sif::info << "SpiTestClass::performLis3MdlTest: WHO AM I register 0b" @@ -273,6 +279,24 @@ void SpiTestClass::performL3gTest(uint8_t l3gId) { sif::info << "Z: " << angVelocZ << std::endl; } +void SpiTestClass::performSusTest() { +#ifdef XIPHOS_Q7S + std::string deviceName = q7s::SPI_DEFAULT_DEV; +#elif defined(RASPBERRY_PI) + std::string deviceName = ""; +#endif + int fileDescriptor = 0; + UnixFileGuard fileHelper(deviceName, &fileDescriptor, O_RDWR, "SpiComIF::initializeInterface"); + if (fileHelper.getOpenResult()) { + sif::error << "SpiTestClass::performLis3Mdl3100Test: File descriptor could not be opened!" + << std::endl; + return; + } + uint32_t spiSpeed = 1'000'000; + spi::SpiModes spiMode = spi::SpiModes::MODE_3; + setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed); +} + void SpiTestClass::acsInit() { GpioCookie *gpioCookie = new GpioCookie(); @@ -361,7 +385,7 @@ void SpiTestClass::setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t sp } void SpiTestClass::writeRegister(int fd, gpioId_t chipSelect, uint8_t reg, uint8_t value) { - spiTransferStruct.len = 2; + spiTransferStruct[0].len = 2; sendBuffer[0] = reg; sendBuffer[1] = value; @@ -405,7 +429,7 @@ void SpiTestClass::writeMultipleRegisters(int fd, gpioId_t chipSelect, uint8_t r sendBuffer[0] = reg; std::memcpy(sendBuffer.data() + 1, values, len); - spiTransferStruct.len = len + 1; + spiTransferStruct[0].len = len + 1; if (gpioIF != nullptr and chipSelect != gpio::NO_GPIO) { gpioIF->pullLow(chipSelect); @@ -435,7 +459,7 @@ void SpiTestClass::readMultipleRegisters(int fd, gpioId_t chipSelect, uint8_t re return; } - spiTransferStruct.len = len + 1; + spiTransferStruct[0].len = len + 1; sendBuffer[0] = reg | STM_READ_MASK; for (uint8_t idx = 0; idx < len; idx++) { @@ -465,7 +489,7 @@ uint8_t SpiTestClass::readStmRegister(int fd, gpioId_t chipSelect, uint8_t reg, } uint8_t SpiTestClass::readRegister(int fd, gpioId_t chipSelect, uint8_t reg) { - spiTransferStruct.len = 2; + spiTransferStruct[0].len = 2; sendBuffer[0] = reg; sendBuffer[1] = 0; diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h index 5df8cafb..f0274919 100644 --- a/linux/boardtest/SpiTestClass.h +++ b/linux/boardtest/SpiTestClass.h @@ -15,12 +15,7 @@ class SpiTestClass : public TestTask { public: - enum TestModes { - NONE, - MGM_LIS3MDL, - MGM_RM3100, - GYRO_L3GD20H, - }; + enum TestModes { NONE, MGM_LIS3MDL, MGM_RM3100, GYRO_L3GD20H, SUS_0 }; TestModes testMode; @@ -34,11 +29,12 @@ class SpiTestClass : public TestTask { std::array recvBuffer; std::array sendBuffer; - struct spi_ioc_transfer spiTransferStruct = {}; + struct spi_ioc_transfer spiTransferStruct[6] = {}; void performRm3100Test(uint8_t mgmId); void performLis3MdlTest(uint8_t lis3Id); void performL3gTest(uint8_t l3gId); + void performSusTest(); /* ACS board specific code which pulls all GPIOs high */ void acsInit(); diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 9b8e9bd0..8959cf1b 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -116,11 +116,13 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman case (SUS::READ_EXT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); rawPacket = cmdBuffer; - for (uint8_t idx = 0; idx < 6; idx++) { + for (uint8_t idx = 0; idx < 1; idx++) { cmdBuffer[idx * 2] = buildConvByte(ScanModes::N_ONCE, idx, false); cmdBuffer[idx * 2 + 1] = 0; } - rawPacketLen = SUS::SIZE_READ_EXT_CONVERSIONS; + cmdBuffer[2] = 0x00; + // cmdBuffer[12] = 0x00; + rawPacketLen = 3; // SUS::SIZE_READ_EXT_CONVERSIONS; break; } case (SUS::READ_EXT_TIMED_TEMPS): { diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 8964bd4b..6e0194e3 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -169,7 +169,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { bool addSus5 = false; bool addSus6 = false; bool addSus7 = false; - bool addSus8 = true; + bool addSus8 = false; bool addSus9 = false; bool addSus10 = false; bool addSus11 = false; @@ -183,166 +183,168 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { */ if (addSus0) { /* Write setup */ - thisSequence->addSlot(objects::SUS_0, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_0, length * 0, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.83, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.86, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.9, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_0, length * 0.85, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.6, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.8, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_READ); -// /* Read ADC conversions */ -// // thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_0, length * 0.935, DeviceHandlerIF::GET_READ); + // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_READ); + // /* Read ADC conversions */ + // // thisSequence->addSlot(objects::SUS_0, length * 0.935, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_0, length * 0.935, + // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, + // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.935, + // DeviceHandlerIF::GET_READ); } if (addSus1) { /* Write setup */ thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_1, length * 0.9, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_1, length * 0.901, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_READ); } if (addSus2) { /* Write setup */ thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.903, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.905, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_READ); } if (addSus3) { /* Write setup */ thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.8, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.93, SusHandler::SEND_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, SusHandler::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_READ); } if (addSus4) { /* Write setup */ thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_READ); /* Write setup */ - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_4, length * 0.911, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_READ); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_READ); } if (addSus5) { /* Write setup */ thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_5, length * 0.912, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_5, length * 0.913, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_READ); - /* Write setup */ - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_5, length * 0.914, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_READ); + // /* Write setup */ + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, SusHandler::FIRST_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_READ); } if (addSus6) { /* Write setup */ thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_6, length * 0.915, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_READ); - /* Read ADC conversions from inernal FIFO */ - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_READ); + // /* Read ADC conversions from inernal FIFO */ + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_READ); } if (addSus7) { /* Write setup */ thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_7, length * 0.918, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_READ); - /* Read ADC conversions from inernal FIFO */ - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_READ); + // /* Read ADC conversions from inernal FIFO */ + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_READ); } if (addSus8) { @@ -355,16 +357,17 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::SUS_8, length * 0.96, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_READ); -// /* Read ADC conversions from internal FIFO */ -// // thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); -// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_WRITE); -// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_WRITE); -// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_READ); -// thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::GET_READ); + // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_WRITE); + // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_READ); + // /* Read ADC conversions from internal FIFO */ + // // thisSequence->addSlot(objects::SUS_8, length * 0.925, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_8, length * 0.925, + // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.925, + // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.925, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_8, length * 0.925, + // DeviceHandlerIF::GET_READ); } if (addSus9) { @@ -375,60 +378,66 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - // thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_9, length * 0.926, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // // thisSequence->addSlot(objects::SUS_9, length * 0.925, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.925, + // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, + // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.925, + // DeviceHandlerIF::GET_READ); + // /* Read ADC conversions */ + // // thisSequence->addSlot(objects::SUS_9, length * 0.926, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.926, + // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, + // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.926, + // DeviceHandlerIF::GET_READ); } if (addSus10) { /* Write setup */ thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_10, length * 0.927, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_10, length * 0.928, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_10, length * 0.929, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_10, length * 0.928, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_10, length * + // 0.928, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_10, length * + // 0.928, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_10, length * 0.928, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_10, length * 0.928, + // DeviceHandlerIF::GET_READ); + // /* Read ADC conversions */ + // thisSequence->addSlot(objects::SUS_10, length * 0.929, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_10, length * + // 0.929, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_10, length * + // 0.929, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_10, length * 0.929, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_10, length * 0.929, + // DeviceHandlerIF::GET_READ); } if (addSus11) { /* Write setup */ thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_11, length * 0.93, SusHandler::FIRST_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_11, length * 0.931, DeviceHandlerIF::GET_READ); - /* Read ADC conversions */ - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_11, length * 0.932, DeviceHandlerIF::GET_READ); + // /* Start ADC conversions */ + // thisSequence->addSlot(objects::SUS_11, length * 0.931, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_11, length * + // 0.931, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_11, length * + // 0.931, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_11, length * 0.931, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_11, length * 0.931, + // DeviceHandlerIF::GET_READ); + // /* Read ADC conversions */ + // thisSequence->addSlot(objects::SUS_11, length * 0.932, + // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_11, length * + // 0.932, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_11, length * + // 0.932, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_11, length * 0.932, + // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_11, length * 0.932, + // DeviceHandlerIF::GET_READ); } #endif /* OBSW_ADD_SUN_SENSORS == 1 */ @@ -470,27 +479,32 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::MGM_0_LIS3_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::MGM_0_LIS3_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); - thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0, - DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.25, - DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); - - thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0, - DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.3, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); - - thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0, - DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.35, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); + // thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0, + // DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.25, + // DeviceHandlerIF::SEND_WRITE); + // thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.6, + // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * + // 0.75, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, + // length * 0.85, DeviceHandlerIF::GET_READ); + // + // thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0, + // DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.3, + // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * + // 0.6, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, + // length * 0.75, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.85, + // DeviceHandlerIF::GET_READ); + // + // thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0, + // DeviceHandlerIF::PERFORM_OPERATION); + // thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.35, + // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * + // 0.6, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, + // length * 0.75, DeviceHandlerIF::SEND_READ); + // thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.85, + // DeviceHandlerIF::GET_READ); } if (enableBside) { diff --git a/mission/devices/max1227.cpp b/mission/devices/max1227.cpp index 0c709f0a..e8b33cbe 100644 --- a/mission/devices/max1227.cpp +++ b/mission/devices/max1227.cpp @@ -3,3 +3,7 @@ uint8_t max1227::buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; } + +uint8_t max1227::buildSetupByte(ClkSel clkSel, RefSel refSel, DiffSel diffSel) { + return (1 << 6) | (clkSel << 4) | (refSel << 2) | diffSel; +} diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index 28fba7a3..2a92c28b 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -12,7 +12,34 @@ enum ScanModes : uint8_t { N_ONCE = 0b11 }; +enum ClkSel : uint8_t { + INT_CONV_INT_TIMED_CNVST_AS_CNVST = 0b00, + INT_CONV_EXT_TIMED_CNVST = 0b01, + // Default mode upon power-up + INT_CONV_INT_TIMED_CNVST_AS_AIN = 0b10, + // Use external SPI clock for conversion and timing + EXT_CONV_EXT_TIMED = 0b11 +}; + +enum RefSel : uint8_t { + INT_REF_WITH_WAKEUP = 0b00, + // No wakeup delay needed + EXT_REF_SINGLE_ENDED = 0b01, + INT_REF_NO_WAKEUP = 0b10, + // No wakeup delay needed + EXT_REF_DIFFERENTIAL = 0b11 +}; + +enum DiffSel : uint8_t { + NONE_0 = 0b00, + NONE_1 = 0b01, + // One unipolar config byte follows the setup byte + UNIPOLAR_CFG = 0b10, + // One bipolar config byte follows the setup byte + BIPOLAR_CFG = 0b11 +}; uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp); +uint8_t buildSetupByte(ClkSel clkSel, RefSel refSel, DiffSel diffSel); } // namespace max1227 From c06ef5d6b597aad4bde10d5760fe0ae2ab6d1341 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 16 Feb 2022 18:56:38 +0100 Subject: [PATCH 042/309] added more max1227 tests --- bsp_q7s/boardconfig/busConf.h | 12 +- bsp_q7s/core/ObjectFactory.cpp | 7 +- common/config/devConf.h | 2 +- fsfw | 2 +- linux/boardtest/SpiTestClass.cpp | 183 ++++++++++++++++++++- linux/boardtest/SpiTestClass.h | 2 +- mission/devices/RadiationSensorHandler.cpp | 14 +- mission/devices/RadiationSensorHandler.h | 2 + mission/devices/max1227.cpp | 19 +++ mission/devices/max1227.h | 22 +++ 10 files changed, 242 insertions(+), 23 deletions(-) diff --git a/bsp_q7s/boardconfig/busConf.h b/bsp_q7s/boardconfig/busConf.h index 9c4b142b..324d741f 100644 --- a/bsp_q7s/boardconfig/busConf.h +++ b/bsp_q7s/boardconfig/busConf.h @@ -57,12 +57,12 @@ static constexpr char HEATER_6[] = "heater6"; static constexpr char HEATER_7[] = "heater7"; static constexpr char SA_DPL_PIN_0[] = "sa_dpl_0"; static constexpr char SA_DPL_PIN_1[] = "sa_dpl_1"; -static constexpr char SPI_MUX_BIT_0_PIN[] = "spi_mux_bit_1"; -static constexpr char SPI_MUX_BIT_1_PIN[] = "spi_mux_bit_2"; -static constexpr char SPI_MUX_BIT_2_PIN[] = "spi_mux_bit_3"; -static constexpr char SPI_MUX_BIT_3_PIN[] = "spi_mux_bit_4"; -static constexpr char SPI_MUX_BIT_4_PIN[] = "spi_mux_bit_5"; -static constexpr char SPI_MUX_BIT_5_PIN[] = "spi_mux_bit_6"; +static constexpr char SPI_MUX_BIT_0_PIN[] = "spi_mux_bit_0"; +static constexpr char SPI_MUX_BIT_1_PIN[] = "spi_mux_bit_1"; +static constexpr char SPI_MUX_BIT_2_PIN[] = "spi_mux_bit_2"; +static constexpr char SPI_MUX_BIT_3_PIN[] = "spi_mux_bit_3"; +static constexpr char SPI_MUX_BIT_4_PIN[] = "spi_mux_bit_4"; +static constexpr char SPI_MUX_BIT_5_PIN[] = "spi_mux_bit_5"; static constexpr char EN_RW_CS[] = "en_rw_cs"; static constexpr char EN_RW_1[] = "enable_rw_1"; static constexpr char EN_RW_2[] = "enable_rw_2"; diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index cac198af..290411c6 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -303,7 +303,12 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) { SpiCookie* spiCookieRadSensor = new SpiCookie( addresses::RAD_SENSOR, gpioIds::CS_RAD_SENSOR, std::string(q7s::SPI_DEFAULT_DEV), RAD_SENSOR::READ_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); - new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF, spiCookieRadSensor); + auto radSensor = + new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF, spiCookieRadSensor); +#if OBSW_TEST_RADIATION_SENSOR_HANDLER == 1 + radSensor->setStartUpImmediately(); + radSensor->setToGoToNormalModeImmediately(); +#endif } void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF) { diff --git a/common/config/devConf.h b/common/config/devConf.h index 7d489679..deea6aa2 100644 --- a/common/config/devConf.h +++ b/common/config/devConf.h @@ -27,7 +27,7 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3; * Some MAX1227 could not be reached with frequencies around 4 MHz. Maybe this is caused by * the decoder and buffer circuits. Thus frequency is here defined to 1 MHz. */ -static const uint32_t SUS_MAX1227_SPI_FREQ = 1'000'000; +static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000; static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000; static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3; diff --git a/fsfw b/fsfw index 0d6d44f7..9e92afbf 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 0d6d44f72fb28ba480482f5d8b2eee6f78d664ce +Subproject commit 9e92afbf076b57df843a1ee526bd63c3303995a5 diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 4d909d10..14c69577 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -24,7 +24,7 @@ SpiTestClass::SpiTestClass(object_id_t objectId, GpioIF *gpioIF) if (gpioIF == nullptr) { sif::error << "SpiTestClass::SpiTestClass: Invalid GPIO ComIF!" << std::endl; } - testMode = TestModes::MGM_LIS3MDL; + testMode = TestModes::SUS_0; spiTransferStruct[0].rx_buf = reinterpret_cast<__u64>(recvBuffer.data()); spiTransferStruct[0].tx_buf = reinterpret_cast<__u64>(sendBuffer.data()); } @@ -47,7 +47,7 @@ ReturnValue_t SpiTestClass::performOneShotAction() { break; } case (TestModes::SUS_0): { - performSusTest(); + performMax1227Test(); break; } } @@ -279,14 +279,19 @@ void SpiTestClass::performL3gTest(uint8_t l3gId) { sif::info << "Z: " << angVelocZ << std::endl; } -void SpiTestClass::performSusTest() { +void SpiTestClass::performMax1227Test() { + using namespace max1227; + bool testRadSensor = false; + bool extConversion = true; + bool intConversion = false; #ifdef XIPHOS_Q7S std::string deviceName = q7s::SPI_DEFAULT_DEV; #elif defined(RASPBERRY_PI) std::string deviceName = ""; #endif - int fileDescriptor = 0; - UnixFileGuard fileHelper(deviceName, &fileDescriptor, O_RDWR, "SpiComIF::initializeInterface"); + int fd = 0; + int retval = 0; + UnixFileGuard fileHelper(deviceName, &fd, O_RDWR, "SpiComIF::initializeInterface"); if (fileHelper.getOpenResult()) { sif::error << "SpiTestClass::performLis3Mdl3100Test: File descriptor could not be opened!" << std::endl; @@ -294,9 +299,152 @@ void SpiTestClass::performSusTest() { } uint32_t spiSpeed = 1'000'000; spi::SpiModes spiMode = spi::SpiModes::MODE_3; - setSpiSpeedAndMode(fileDescriptor, spiMode, spiSpeed); + setSpiSpeedAndMode(fd, spiMode, spiSpeed); + + if (testRadSensor) { + sendBuffer[0] = max1227::buildResetByte(true); + sendBuffer[1] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, + DiffSel::NONE_0); + spiTransferStruct[0].len = 2; + ReturnValue_t result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + + result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + max1227::prepareExternallyClockedSingleChannelRead(sendBuffer.data(), 0, + spiTransferStruct[0].len); + result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + arrayprinter::print(recvBuffer.data(), 3); + result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + + max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 5, spiTransferStruct[0].len); + result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + arrayprinter::print(recvBuffer.data(), 13., OutputType::DEC); + } + if (extConversion) { + sendBuffer[0] = max1227::buildResetByte(false); + spiTransferStruct[0].len = 1; + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + + usleep(65); + sendBuffer[0] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, + DiffSel::NONE_0); + spiTransferStruct[0].len = 1; + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + + // usleep(4); + // max1227::prepareExternallyClockedSingleChannelRead(sendBuffer.data(), 0, + // spiTransferStruct[0].len); + // retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + // if (retval < 0) { + // utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + // } + // arrayprinter::print(recvBuffer.data(), 3); + + max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 5, spiTransferStruct[0].len); + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + uint16_t adcRaw[6] = {}; + adcRaw[0] = (recvBuffer[1] << 8) | recvBuffer[2]; + adcRaw[1] = (recvBuffer[3] << 8) | recvBuffer[4]; + adcRaw[2] = (recvBuffer[5] << 8) | recvBuffer[6]; + adcRaw[3] = (recvBuffer[7] << 8) | recvBuffer[8]; + adcRaw[4] = (recvBuffer[9] << 8) | recvBuffer[10]; + adcRaw[5] = (recvBuffer[11] << 8) | recvBuffer[12]; + arrayprinter::print(recvBuffer.data(), 13, OutputType::HEX); + for (int idx = 0; idx < 6; idx++) { + sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; + } + } + if (intConversion) { + sendBuffer[0] = max1227::buildResetByte(false); + spiTransferStruct[0].len = 1; + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + + usleep(65); + // Now use internal conversion + sendBuffer[0] = max1227::buildSetupByte(ClkSel::INT_CONV_INT_TIMED_CNVST_AS_AIN, + RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); + spiTransferStruct[0].len = 1; + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + usleep(10); + sendBuffer[0] = buildConvByte(ScanModes::CHANNELS_0_TO_N, 5, true); + spiTransferStruct[0].len = 1; + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + + usleep(65); + spiTransferStruct[0].len = 14; + // Shift out zeros + spiTransferStruct[0].tx_buf = 0; + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + arrayprinter::print(recvBuffer.data(), 14); + } } +/* + * sendBuffer[0] = buildConvByte(ScanModes::N_ONCE, 0, false); + spiTransferStruct[0].len = 1; + uint8_t reply0 = 0x00; + uint8_t reply1 = 0x00; + spiTransferStruct[1].tx_buf = 0; + spiTransferStruct[1].rx_buf = reinterpret_cast<__u64>(&reply0); + spiTransferStruct[1].len = 1; + // Shift out zeros + spiTransferStruct[2].tx_buf = 0; + spiTransferStruct[2].rx_buf = reinterpret_cast<__u64>(&reply1); + spiTransferStruct[2].len = 1; + retval = ioctl(fd, SPI_IOC_MESSAGE(3), spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + recvBuffer[1] = reply0; + recvBuffer[2] = reply1; + arrayprinter::print(recvBuffer.data(), 3); + */ + void SpiTestClass::acsInit() { GpioCookie *gpioCookie = new GpioCookie(); @@ -372,8 +520,27 @@ void SpiTestClass::acsInit() { } void SpiTestClass::setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t speed) { - int mode_test = SPI_MODE_3; - int retval = ioctl(spiFd, SPI_IOC_WR_MODE, &mode_test); // reinterpret_cast(&mode)); + int modeUnix = 0; + switch (mode) { + case (spi::SpiModes::MODE_0): { + modeUnix = SPI_MODE_0; + break; + } + case (spi::SpiModes::MODE_1): { + modeUnix = SPI_MODE_1; + break; + } + case (spi::SpiModes::MODE_2): { + modeUnix = SPI_MODE_2; + break; + } + case (spi::SpiModes::MODE_3): { + modeUnix = SPI_MODE_3; + break; + } + } + + int retval = ioctl(spiFd, SPI_IOC_WR_MODE, &modeUnix); // reinterpret_cast(&mode)); if (retval != 0) { utility::handleIoctlError("SpiTestClass::performRm3100Test: Setting SPI mode failed!"); } diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h index f0274919..c8a96471 100644 --- a/linux/boardtest/SpiTestClass.h +++ b/linux/boardtest/SpiTestClass.h @@ -34,7 +34,7 @@ class SpiTestClass : public TestTask { void performRm3100Test(uint8_t mgmId); void performLis3MdlTest(uint8_t lis3Id); void performL3gTest(uint8_t l3gId); - void performSusTest(); + void performMax1227Test(); /* ACS board specific code which pulls all GPIOs high */ void acsInit(); diff --git a/mission/devices/RadiationSensorHandler.cpp b/mission/devices/RadiationSensorHandler.cpp index 83720b53..92d2c311 100644 --- a/mission/devices/RadiationSensorHandler.cpp +++ b/mission/devices/RadiationSensorHandler.cpp @@ -14,11 +14,13 @@ RadiationSensorHandler::~RadiationSensorHandler() {} void RadiationSensorHandler::doStartUp() { if (internalState == InternalState::CONFIGURED) { -#if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1 - setMode(MODE_NORMAL); -#else - setMode(_MODE_TO_ON); -#endif + if (goToNormalMode) { + setMode(MODE_NORMAL); + } + + else { + setMode(_MODE_TO_ON); + } } } @@ -175,3 +177,5 @@ ReturnValue_t RadiationSensorHandler::initializeLocalDataPool(localpool::DataPoo localDataPoolMap.emplace(RAD_SENSOR::AIN7, new PoolEntry({0})); return HasReturnvaluesIF::RETURN_OK; } + +void RadiationSensorHandler::setToGoToNormalModeImmediately() { this->goToNormalMode = true; } diff --git a/mission/devices/RadiationSensorHandler.h b/mission/devices/RadiationSensorHandler.h index fe4e4264..0fed2c83 100644 --- a/mission/devices/RadiationSensorHandler.h +++ b/mission/devices/RadiationSensorHandler.h @@ -16,6 +16,7 @@ class RadiationSensorHandler : public DeviceHandlerBase { public: RadiationSensorHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie); virtual ~RadiationSensorHandler(); + void setToGoToNormalModeImmediately(); protected: void doStartUp() override; @@ -42,6 +43,7 @@ class RadiationSensorHandler : public DeviceHandlerBase { static const uint8_t MAX_CMD_LEN = RAD_SENSOR::READ_SIZE; + bool goToNormalMode = false; uint8_t cmdBuffer[MAX_CMD_LEN]; InternalState internalState = InternalState::SETUP; CommunicationStep communicationStep = CommunicationStep::START_CONVERSION; diff --git a/mission/devices/max1227.cpp b/mission/devices/max1227.cpp index e8b33cbe..f00e532e 100644 --- a/mission/devices/max1227.cpp +++ b/mission/devices/max1227.cpp @@ -7,3 +7,22 @@ uint8_t max1227::buildConvByte(ScanModes scanMode, uint8_t channel, bool readTem uint8_t max1227::buildSetupByte(ClkSel clkSel, RefSel refSel, DiffSel diffSel) { return (1 << 6) | (clkSel << 4) | (refSel << 2) | diffSel; } + +void max1227::prepareExternallyClockedSingleChannelRead(uint8_t *spiBuf, uint8_t channel, + size_t &sz) { + spiBuf[0] = buildConvByte(ScanModes::N_ONCE, channel, false); + spiBuf[1] = 0x00; + spiBuf[2] = 0x00; + sz = 3; +} + +uint8_t max1227::buildResetByte(bool fifoOnly) { return (1 << 4) | (fifoOnly << 3); } + +void max1227::prepareExternallyClockedRead0ToN(uint8_t *spiBuf, uint8_t n, size_t &sz) { + for (uint8_t idx = 0; idx <= n; idx++) { + spiBuf[idx * 2] = buildConvByte(ScanModes::N_ONCE, idx, false); + spiBuf[idx * 2 + 1] = 0x00; + } + spiBuf[(n + 1) * 2] = 0x00; + sz = (n + 1) * 2 + 1; +} diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index 2a92c28b..35a49c45 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -1,6 +1,7 @@ #ifndef MISSION_DEVICES_MAX1227_H_ #define MISSION_DEVICES_MAX1227_H_ +#include #include namespace max1227 { @@ -38,9 +39,30 @@ enum DiffSel : uint8_t { // One bipolar config byte follows the setup byte BIPOLAR_CFG = 0b11 }; + +uint8_t buildResetByte(bool fifoOnly); uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp); uint8_t buildSetupByte(ClkSel clkSel, RefSel refSel, DiffSel diffSel); +/** + * If there is a wakeup delay, there needs to be a 65 us delay between sending + * the first byte (conversion byte) and the the rest of the SPI buffer. + * The raw ADC value will be located in the first and second reply byte. + * @param spiBuf + * @param n + * @param sz + */ +void prepareExternallyClockedSingleChannelRead(uint8_t* spiBuf, uint8_t channel, size_t& sz); + +/** + * If there is a wakeup delay, there needs to be a 65 us delay between sending + * the first byte (first conversion byte) the the rest of the SPI buffer. + * @param spiBuf + * @param n + * @param sz + */ +void prepareExternallyClockedRead0ToN(uint8_t* spiBuf, uint8_t n, size_t& sz); + } // namespace max1227 #endif /* MISSION_DEVICES_MAX1227_H_ */ From 25b4af1921341bd609913f20de6f93946de21163 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 16 Feb 2022 20:08:10 +0100 Subject: [PATCH 043/309] more test code --- common/config/devConf.h | 4 +- linux/boardtest/SpiTestClass.cpp | 117 +++++++++++++++++++++++++------ 2 files changed, 98 insertions(+), 23 deletions(-) diff --git a/common/config/devConf.h b/common/config/devConf.h index deea6aa2..b3848225 100644 --- a/common/config/devConf.h +++ b/common/config/devConf.h @@ -29,8 +29,8 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3; */ static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000; -static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000; -static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3; +static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 4'000'000; +static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_0; static constexpr uint32_t DEFAULT_ADIS16507_SPEED = 976'000; static constexpr spi::SpiModes DEFAULT_ADIS16507_MODE = spi::SpiModes::MODE_3; diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 14c69577..f35300fa 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -281,9 +281,10 @@ void SpiTestClass::performL3gTest(uint8_t l3gId) { void SpiTestClass::performMax1227Test() { using namespace max1227; - bool testRadSensor = false; - bool extConversion = true; - bool intConversion = false; + bool testRadSensorExtConv = false; + bool testRadSensorIntConv = false; + bool extConversion = false; + bool intConversion = true; #ifdef XIPHOS_Q7S std::string deviceName = q7s::SPI_DEFAULT_DEV; #elif defined(RASPBERRY_PI) @@ -301,7 +302,7 @@ void SpiTestClass::performMax1227Test() { spi::SpiModes spiMode = spi::SpiModes::MODE_3; setSpiSpeedAndMode(fd, spiMode, spiSpeed); - if (testRadSensor) { + if (testRadSensorExtConv) { sendBuffer[0] = max1227::buildResetByte(true); sendBuffer[1] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); @@ -314,11 +315,64 @@ void SpiTestClass::performMax1227Test() { utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); } - result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } - max1227::prepareExternallyClockedSingleChannelRead(sendBuffer.data(), 0, - spiTransferStruct[0].len); + max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 7, spiTransferStruct[0].len); + result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + arrayprinter::print(recvBuffer.data(), 13, OutputType::HEX); + uint16_t adcRaw[8] = {}; + adcRaw[0] = (recvBuffer[1] << 8) | recvBuffer[2]; + adcRaw[1] = (recvBuffer[3] << 8) | recvBuffer[4]; + adcRaw[2] = (recvBuffer[5] << 8) | recvBuffer[6]; + adcRaw[3] = (recvBuffer[7] << 8) | recvBuffer[8]; + adcRaw[4] = (recvBuffer[9] << 8) | recvBuffer[10]; + adcRaw[5] = (recvBuffer[11] << 8) | recvBuffer[12]; + adcRaw[6] = (recvBuffer[13] << 8) | recvBuffer[14]; + adcRaw[7] = (recvBuffer[15] << 8) | recvBuffer[16]; + arrayprinter::print(recvBuffer.data(), 17, OutputType::HEX); + for (int idx = 0; idx < 8; idx++) { + sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; + } + } + if (testRadSensorIntConv) { + sendBuffer[0] = max1227::buildResetByte(false); + spiTransferStruct[0].len = 1; + ReturnValue_t result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + usleep(65); + + // Now use internal conversion + sendBuffer[0] = max1227::buildSetupByte(ClkSel::INT_CONV_INT_TIMED_CNVST_AS_AIN, + RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); + spiTransferStruct[0].len = 1; + result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + } + result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + } + usleep(10); + sendBuffer[0] = buildConvByte(ScanModes::CHANNELS_0_TO_N, 7, true); + spiTransferStruct[0].len = 1; result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); if (result != HasReturnvaluesIF::RETURN_OK) { } @@ -326,12 +380,14 @@ void SpiTestClass::performMax1227Test() { if (retval < 0) { utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); } - arrayprinter::print(recvBuffer.data(), 3); result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); if (result != HasReturnvaluesIF::RETURN_OK) { } - max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 5, spiTransferStruct[0].len); + usleep(65); + spiTransferStruct[0].len = 18; + // Shift out zeros + spiTransferStruct[0].tx_buf = 0; result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); if (result != HasReturnvaluesIF::RETURN_OK) { } @@ -342,7 +398,23 @@ void SpiTestClass::performMax1227Test() { result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); if (result != HasReturnvaluesIF::RETURN_OK) { } - arrayprinter::print(recvBuffer.data(), 13., OutputType::DEC); + + arrayprinter::print(recvBuffer.data(), 14); + uint16_t adcRaw[8] = {}; + int16_t tempRaw = ((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]; + + sif::info << "Temperature: " << tempRaw * 0.125 << " C" << std::endl; + adcRaw[0] = (recvBuffer[2] << 8) | recvBuffer[3]; + adcRaw[1] = (recvBuffer[4] << 8) | recvBuffer[5]; + adcRaw[2] = (recvBuffer[6] << 8) | recvBuffer[7]; + adcRaw[3] = (recvBuffer[8] << 8) | recvBuffer[9]; + adcRaw[4] = (recvBuffer[10] << 8) | recvBuffer[11]; + adcRaw[5] = (recvBuffer[12] << 8) | recvBuffer[13]; + adcRaw[6] = (recvBuffer[14] << 8) | recvBuffer[15]; + adcRaw[7] = (recvBuffer[16] << 8) | recvBuffer[17]; + for (int idx = 0; idx < 8; idx++) { + sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; + } } if (extConversion) { sendBuffer[0] = max1227::buildResetByte(false); @@ -361,15 +433,6 @@ void SpiTestClass::performMax1227Test() { utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); } - // usleep(4); - // max1227::prepareExternallyClockedSingleChannelRead(sendBuffer.data(), 0, - // spiTransferStruct[0].len); - // retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - // if (retval < 0) { - // utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - // } - // arrayprinter::print(recvBuffer.data(), 3); - max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 5, spiTransferStruct[0].len); retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); if (retval < 0) { @@ -421,6 +484,18 @@ void SpiTestClass::performMax1227Test() { utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); } arrayprinter::print(recvBuffer.data(), 14); + float temp = static_cast(((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]) * 0.125; + sif::info << "Temperature: " << temp << " C" << std::endl; + uint16_t adcRaw[6] = {}; + adcRaw[0] = (recvBuffer[2] << 8) | recvBuffer[3]; + adcRaw[1] = (recvBuffer[4] << 8) | recvBuffer[5]; + adcRaw[2] = (recvBuffer[6] << 8) | recvBuffer[7]; + adcRaw[3] = (recvBuffer[8] << 8) | recvBuffer[9]; + adcRaw[4] = (recvBuffer[10] << 8) | recvBuffer[11]; + adcRaw[5] = (recvBuffer[12] << 8) | recvBuffer[13]; + for (int idx = 0; idx < 6; idx++) { + sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; + } } } From effe461380e9972680e3cdc1c778da3d6272e38c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Wed, 16 Feb 2022 21:29:37 +0100 Subject: [PATCH 044/309] nothing works --- bsp_q7s/core/ObjectFactory.cpp | 1 + common/config/devConf.h | 4 +- linux/devices/SusHandler.cpp | 15 ++-- linux/devices/SusHandler.h | 2 +- .../pollingSequenceFactory.cpp | 72 +++++++++++-------- 5 files changed, 54 insertions(+), 40 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 290411c6..eae4eb46 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -305,6 +305,7 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) { RAD_SENSOR::READ_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF, spiCookieRadSensor); + static_cast(radSensor); #if OBSW_TEST_RADIATION_SENSOR_HANDLER == 1 radSensor->setStartUpImmediately(); radSensor->setToGoToNormalModeImmediately(); diff --git a/common/config/devConf.h b/common/config/devConf.h index b3848225..deea6aa2 100644 --- a/common/config/devConf.h +++ b/common/config/devConf.h @@ -29,8 +29,8 @@ static constexpr spi::SpiModes DEFAULT_L3G_MODE = spi::SpiModes::MODE_3; */ static const uint32_t SUS_MAX1227_SPI_FREQ = 976'000; -static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 4'000'000; -static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_0; +static constexpr uint32_t DEFAULT_MAX_1227_SPEED = 976'000; +static constexpr spi::SpiModes DEFAULT_MAX_1227_MODE = spi::SpiModes::MODE_3; static constexpr uint32_t DEFAULT_ADIS16507_SPEED = 976'000; static constexpr spi::SpiModes DEFAULT_ADIS16507_MODE = spi::SpiModes::MODE_3; diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 8959cf1b..3b7d996d 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -102,9 +102,10 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman } case (SUS::START_INT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); + //cmdBuffer[0] = max1227::buildResetByte(true); cmdBuffer[0] = SUS::CONVERSION; rawPacket = cmdBuffer; - rawPacketLen = 2; + rawPacketLen = 1; break; } case (SUS::READ_INT_TIMED_CONVERSIONS): { @@ -116,13 +117,12 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman case (SUS::READ_EXT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); rawPacket = cmdBuffer; - for (uint8_t idx = 0; idx < 1; idx++) { + for (uint8_t idx = 0; idx < 6; idx++) { cmdBuffer[idx * 2] = buildConvByte(ScanModes::N_ONCE, idx, false); cmdBuffer[idx * 2 + 1] = 0; } - cmdBuffer[2] = 0x00; - // cmdBuffer[12] = 0x00; - rawPacketLen = 3; // SUS::SIZE_READ_EXT_CONVERSIONS; + cmdBuffer[12] = 0x00; + rawPacketLen = SUS::SIZE_READ_EXT_CONVERSIONS; break; } case (SUS::READ_EXT_TIMED_TEMPS): { @@ -168,7 +168,8 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 } case SUS::READ_INT_TIMED_CONVERSIONS: { PoolReadGuard readSet(&dataset); - dataset.temperatureCelcius = (*(packet) << 8 | *(packet + 1)) * 0.125; + + dataset.temperatureCelcius = static_cast((packet[0] << 8) | packet[1]) * 0.125; dataset.ain0 = (*(packet + 2) << 8 | *(packet + 3)); dataset.ain1 = (*(packet + 4) << 8 | *(packet + 5)); dataset.ain2 = (*(packet + 6) << 8 | *(packet + 7)); @@ -195,7 +196,7 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 } case (SUS::READ_EXT_TIMED_TEMPS): { PoolReadGuard readSet(&dataset); - dataset.temperatureCelcius = (packet[23] << 8) | packet[24]; + dataset.temperatureCelcius = static_cast(((packet[23] & 0x0f) << 8) | packet[24]) * 0.125; comState = ComStates::EXT_CLOCKED_CONVERSIONS; break; } diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index d2f5f9ce..04fd3032 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -77,7 +77,7 @@ class SusHandler : public DeviceHandlerBase { SUS::SusDataset dataset; // Read temperature in each alternating communication step when using // externally clocked mode - ClkModes clkMode = ClkModes::EXT_CLOCKED; + ClkModes clkMode = ClkModes::INT_CLOCKED; uint8_t cmdBuffer[SUS::MAX_CMD_SIZE]; ComStates comState = ComStates::IDLE; diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 6e0194e3..b43e8632 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -161,7 +161,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #if OBSW_ADD_SUN_SENSORS == 1 - bool addSus0 = true; + bool addSus0 = false; bool addSus1 = false; bool addSus2 = false; bool addSus3 = false; @@ -169,7 +169,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { bool addSus5 = false; bool addSus6 = false; bool addSus7 = false; - bool addSus8 = false; + bool addSus8 = true; bool addSus9 = false; bool addSus10 = false; bool addSus11 = false; @@ -186,9 +186,14 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::SUS_0, length * 0, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.6, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_0, length * 0.8, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_WRITE); @@ -225,11 +230,11 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { } if (addSus2) { /* Write setup */ - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_2, length * 0.903, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_2, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_2, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0.6, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_2, length * 0.8, DeviceHandlerIF::GET_READ); // /* Write setup */ // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); @@ -245,11 +250,11 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { } if (addSus3) { /* Write setup */ - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_3, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_3, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.6, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); // /* Write setup */ // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); @@ -265,12 +270,12 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { } if (addSus4) { /* Write setup */ - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_4, length * 0, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_4, length * 0.909, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_4, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.6, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_4, length * 0.8, DeviceHandlerIF::GET_READ); /* Write setup */ // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); @@ -349,12 +354,16 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus8) { /* Write setup */ - thisSequence->addSlot(objects::SUS_8, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.925, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.93, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.95, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.96, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_READ); /* Start ADC conversions */ // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::PERFORM_OPERATION); // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); @@ -372,12 +381,15 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus9) { /* Write setup */ - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_9, length * 0.924, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.925, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_9, length * 0.924, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_9, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_READ); // /* Start ADC conversions */ // // thisSequence->addSlot(objects::SUS_9, length * 0.925, // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.925, From ae4d1e6db3e3eed4c61da3ba48e543f16434b417 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 17 Feb 2022 10:17:46 +0100 Subject: [PATCH 045/309] update spi test task for PL PCDU --- linux/boardtest/SpiTestClass.cpp | 178 ++++++++++++------------------- linux/boardtest/SpiTestClass.h | 1 + mission/devices/max1227.h | 2 +- 3 files changed, 68 insertions(+), 113 deletions(-) diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index f35300fa..537baffb 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -283,15 +283,15 @@ void SpiTestClass::performMax1227Test() { using namespace max1227; bool testRadSensorExtConv = false; bool testRadSensorIntConv = false; - bool extConversion = false; - bool intConversion = true; + bool susExtConversion = false; + bool susIntConversion = false; + bool plPcduAdcExtConv = false; #ifdef XIPHOS_Q7S std::string deviceName = q7s::SPI_DEFAULT_DEV; #elif defined(RASPBERRY_PI) std::string deviceName = ""; #endif int fd = 0; - int retval = 0; UnixFileGuard fileHelper(deviceName, &fd, O_RDWR, "SpiComIF::initializeInterface"); if (fileHelper.getOpenResult()) { sif::error << "SpiTestClass::performLis3Mdl3100Test: File descriptor could not be opened!" @@ -307,25 +307,10 @@ void SpiTestClass::performMax1227Test() { sendBuffer[1] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); spiTransferStruct[0].len = 2; - ReturnValue_t result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } + transfer(fd, gpioIds::CS_RAD_SENSOR); max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 7, spiTransferStruct[0].len); - result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } - result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } + transfer(fd, gpioIds::CS_RAD_SENSOR); arrayprinter::print(recvBuffer.data(), 13, OutputType::HEX); uint16_t adcRaw[8] = {}; adcRaw[0] = (recvBuffer[1] << 8) | recvBuffer[2]; @@ -344,60 +329,24 @@ void SpiTestClass::performMax1227Test() { if (testRadSensorIntConv) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; - ReturnValue_t result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } - result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } + transfer(fd, gpioIds::CS_RAD_SENSOR); usleep(65); // Now use internal conversion sendBuffer[0] = max1227::buildSetupByte(ClkSel::INT_CONV_INT_TIMED_CNVST_AS_AIN, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); spiTransferStruct[0].len = 1; - result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } - result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } + transfer(fd, gpioIds::CS_RAD_SENSOR); usleep(10); sendBuffer[0] = buildConvByte(ScanModes::CHANNELS_0_TO_N, 7, true); spiTransferStruct[0].len = 1; - result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } - result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } + transfer(fd, gpioIds::CS_RAD_SENSOR); usleep(65); spiTransferStruct[0].len = 18; // Shift out zeros spiTransferStruct[0].tx_buf = 0; - result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } - result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); - if (result != HasReturnvaluesIF::RETURN_OK) { - } + transfer(fd, gpioIds::CS_RAD_SENSOR); arrayprinter::print(recvBuffer.data(), 14); uint16_t adcRaw[8] = {}; @@ -416,28 +365,19 @@ void SpiTestClass::performMax1227Test() { sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; } } - if (extConversion) { + if (susExtConversion) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } + transfer(fd, gpio::NO_GPIO); usleep(65); sendBuffer[0] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); spiTransferStruct[0].len = 1; - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } + transfer(fd, gpio::NO_GPIO); max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 5, spiTransferStruct[0].len); - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } + transfer(fd, gpio::NO_GPIO); uint16_t adcRaw[6] = {}; adcRaw[0] = (recvBuffer[1] << 8) | recvBuffer[2]; adcRaw[1] = (recvBuffer[3] << 8) | recvBuffer[4]; @@ -450,39 +390,26 @@ void SpiTestClass::performMax1227Test() { sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; } } - if (intConversion) { + if (susIntConversion) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } - + transfer(fd, gpio::NO_GPIO); usleep(65); // Now use internal conversion sendBuffer[0] = max1227::buildSetupByte(ClkSel::INT_CONV_INT_TIMED_CNVST_AS_AIN, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); spiTransferStruct[0].len = 1; - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } + transfer(fd, gpio::NO_GPIO); usleep(10); sendBuffer[0] = buildConvByte(ScanModes::CHANNELS_0_TO_N, 5, true); spiTransferStruct[0].len = 1; - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } + transfer(fd, gpio::NO_GPIO); usleep(65); spiTransferStruct[0].len = 14; // Shift out zeros spiTransferStruct[0].tx_buf = 0; - retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); - } + transfer(fd, gpio::NO_GPIO); arrayprinter::print(recvBuffer.data(), 14); float temp = static_cast(((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]) * 0.125; sif::info << "Temperature: " << temp << " C" << std::endl; @@ -497,28 +424,30 @@ void SpiTestClass::performMax1227Test() { sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; } } -} - -/* - * sendBuffer[0] = buildConvByte(ScanModes::N_ONCE, 0, false); - spiTransferStruct[0].len = 1; - uint8_t reply0 = 0x00; - uint8_t reply1 = 0x00; - spiTransferStruct[1].tx_buf = 0; - spiTransferStruct[1].rx_buf = reinterpret_cast<__u64>(&reply0); - spiTransferStruct[1].len = 1; - // Shift out zeros - spiTransferStruct[2].tx_buf = 0; - spiTransferStruct[2].rx_buf = reinterpret_cast<__u64>(&reply1); - spiTransferStruct[2].len = 1; - retval = ioctl(fd, SPI_IOC_MESSAGE(3), spiTransferStruct); - if (retval < 0) { - utility::handleIoctlError("SpiTestClass::writeRegister: Write failed"); + if (plPcduAdcExtConv) { + // This enables the ADC + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); + sendBuffer[0] = max1227::buildResetByte(true); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::PLPCDU_ADC_CS); + sendBuffer[0] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, + DiffSel::NONE_0); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::PLPCDU_ADC_CS); + uint8_t n = 11; + max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), n, spiTransferStruct[0].len); + transfer(fd, gpioIds::PLPCDU_ADC_CS); + uint16_t adcRaw[n + 1] = {}; + for(uint8_t idx = 0; idx < n + 1; idx++) { + adcRaw[idx] = (recvBuffer[idx * 2 + 1] << 8) | recvBuffer[idx * 2 + 2]; + } + arrayprinter::print(recvBuffer.data(), spiTransferStruct[0].len, OutputType::HEX); + for (int idx = 0; idx < n + 1; idx++) { + sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; + } } - recvBuffer[1] = reply0; - recvBuffer[2] = reply1; - arrayprinter::print(recvBuffer.data(), 3); - */ +} void SpiTestClass::acsInit() { GpioCookie *gpioCookie = new GpioCookie(); @@ -747,3 +676,28 @@ uint8_t SpiTestClass::readRegister(int fd, gpioId_t chipSelect, uint8_t reg) { } return recvBuffer[1]; } + +ReturnValue_t SpiTestClass::transfer(int fd, gpioId_t chipSelect = gpio::NO_GPIO) { + int retval = 0; + ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; + if(chipSelect != gpio::NO_GPIO) { + result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + } + + retval = ioctl(fd, SPI_IOC_MESSAGE(1), &spiTransferStruct); + if (retval < 0) { + utility::handleIoctlError("SpiTestClass::transfer: ioctl failed"); + return HasReturnvaluesIF::RETURN_FAILED; + } + + if(chipSelect != gpio::NO_GPIO) { + result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (result != HasReturnvaluesIF::RETURN_OK) { + return result; + } + } + return HasReturnvaluesIF::RETURN_OK; +} diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h index c8a96471..3c9c159e 100644 --- a/linux/boardtest/SpiTestClass.h +++ b/linux/boardtest/SpiTestClass.h @@ -74,6 +74,7 @@ class SpiTestClass : public TestTask { void writeMultipleRegisters(int fd, gpioId_t chipSelect, uint8_t reg, uint8_t* values, size_t len); void writeRegister(int fd, gpioId_t chipSelect, uint8_t reg, uint8_t value); + ReturnValue_t transfer(int fd, gpioId_t chipSelect); uint8_t readRm3100Register(int fd, gpioId_t chipSelect, uint8_t reg); uint8_t readStmRegister(int fd, gpioId_t chipSelect, uint8_t reg, bool autoIncrement); diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index 35a49c45..d081cf39 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -58,7 +58,7 @@ void prepareExternallyClockedSingleChannelRead(uint8_t* spiBuf, uint8_t channel, * If there is a wakeup delay, there needs to be a 65 us delay between sending * the first byte (first conversion byte) the the rest of the SPI buffer. * @param spiBuf - * @param n + * @param n Channel number. Example: If the ADC has 6 channels, n will be 5 * @param sz */ void prepareExternallyClockedRead0ToN(uint8_t* spiBuf, uint8_t n, size_t& sz); From 49decb8e9a9cd47878d26a47fef6ba2502ed73a1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 17 Feb 2022 20:42:53 +0100 Subject: [PATCH 046/309] added new max1227 helper functions --- mission/devices/max1227.cpp | 10 ++++++++++ mission/devices/max1227.h | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/mission/devices/max1227.cpp b/mission/devices/max1227.cpp index f00e532e..88cab185 100644 --- a/mission/devices/max1227.cpp +++ b/mission/devices/max1227.cpp @@ -1,5 +1,7 @@ #include "max1227.h" +#include + uint8_t max1227::buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; } @@ -26,3 +28,11 @@ void max1227::prepareExternallyClockedRead0ToN(uint8_t *spiBuf, uint8_t n, size_ spiBuf[(n + 1) * 2] = 0x00; sz = (n + 1) * 2 + 1; } + +void max1227::prepareExternallyClockedTemperatureRead(uint8_t *spiBuf, size_t &sz) { + spiBuf[0] = buildConvByte(ScanModes::N_ONCE, 0, true); + std::memset(spiBuf + 1, 0, 24); + sz = 25; +} + +float max1227::getTemperature(int16_t temp) { return static_cast(temp) * 0.125; } diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index d081cf39..bf76a81b 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -63,6 +63,16 @@ void prepareExternallyClockedSingleChannelRead(uint8_t* spiBuf, uint8_t channel, */ void prepareExternallyClockedRead0ToN(uint8_t* spiBuf, uint8_t n, size_t& sz); +/** + * Prepare an externally clocked temperature read. 25 bytes have to be sent + * and the raw temperature value will appear on the last 2 bytes of the reply. + * @param spiBuf + * @param sz + */ +void prepareExternallyClockedTemperatureRead(uint8_t* spiBuf, size_t& sz); + +float getTemperature(int16_t temp); + } // namespace max1227 #endif /* MISSION_DEVICES_MAX1227_H_ */ From 64b4ab324928fe4b9d1b0b48eb5ced53acacdb1b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 17 Feb 2022 20:51:20 +0100 Subject: [PATCH 047/309] added rad sensor enable, obj factory fixes --- bsp_q7s/boardconfig/busConf.h | 1 + bsp_q7s/core/ObjectFactory.cpp | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/bsp_q7s/boardconfig/busConf.h b/bsp_q7s/boardconfig/busConf.h index 324d741f..eba4fb36 100644 --- a/bsp_q7s/boardconfig/busConf.h +++ b/bsp_q7s/boardconfig/busConf.h @@ -70,6 +70,7 @@ static constexpr char EN_RW_3[] = "enable_rw_3"; static constexpr char EN_RW_4[] = "enable_rw_4"; static constexpr char RAD_SENSOR_CHIP_SELECT[] = "rad_sensor_chip_select"; +static constexpr char ENABLE_RADFET[] = "enable_radfet"; static constexpr char PAPB_BUSY_SIGNAL_VC0[] = "papb_busy_signal_vc0"; static constexpr char PAPB_EMPTY_SIGNAL_VC0[] = "papb_empty_signal_vc0"; static constexpr char PAPB_BUSY_SIGNAL_VC1[] = "papb_busy_signal_vc1"; diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index eae4eb46..b248dbb3 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -140,13 +140,11 @@ void ObjectFactory::produce(void* args) { createHeaterComponents(); createSolarArrayDeploymentComponents(); + createPlPcduComponents(gpioComIF, spiComIF); #if OBSW_ADD_SYRLINKS == 1 createSyrlinksComponents(); #endif /* OBSW_ADD_SYRLINKS == 1 */ - -#if OBSW_ADD_RTD_DEVICES == 1 createRtdComponents(gpioComIF); -#endif /* OBSW_ADD_RTD_DEVICES == 1 */ #if OBSW_ADD_MGT == 1 I2cCookie* imtqI2cCookie = @@ -254,9 +252,7 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, Ua new CspComIF(objects::CSP_COM_IF); *i2cComIF = new I2cComIF(objects::I2C_COM_IF); *uartComIF = new UartComIF(objects::UART_COM_IF); -#if OBSW_ADD_SPI_TEST_CODE == 0 *spiComIF = new SpiComIF(objects::SPI_COM_IF, *gpioComIF); -#endif /* Q7S_ADD_SPI_TEST_CODE == 0 */ #if BOARD_TE0720 == 0 /* Adding gpios for chip select decoding to the gpioComIf */ @@ -298,6 +294,9 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) { GpiodRegularByLineName* gpio = new GpiodRegularByLineName( q7s::gpioNames::RAD_SENSOR_CHIP_SELECT, consumer.str(), gpio::DIR_OUT, gpio::HIGH); gpioCookieRadSensor->addGpio(gpioIds::CS_RAD_SENSOR, gpio); + gpio = new GpiodRegularByLineName(q7s::gpioNames::ENABLE_RADFET, consumer.str(), gpio::DIR_OUT, + gpio::LOW); + gpioCookieRadSensor->addGpio(gpioIds::ENABLE_RADFET, gpio); gpioComIF->addGpios(gpioCookieRadSensor); SpiCookie* spiCookieRadSensor = new SpiCookie( @@ -355,6 +354,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI gpioComIF->addGpios(gpioCookieSus); +#if OBSW_ADD_SUN_SENSORS == 1 SpiCookie* spiCookie = new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); @@ -464,6 +464,8 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI susHandler10->setToGoToNormalMode(true); susHandler11->setToGoToNormalMode(true); #endif + +#endif /* OBSW_ADD_SUN_SENSORS == 1 */ } void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComIF* uartComIF) { @@ -793,6 +795,7 @@ void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) { gpioComIF->addGpios(rtdGpioCookie); +#if OBSW_ADD_RTD_DEVICES == 1 SpiCookie* spiRtdIc0 = new SpiCookie(addresses::RTD_IC_3, gpioIds::RTD_IC_3, q7s::SPI_DEFAULT_DEV, Max31865Definitions::MAX_REPLY_SIZE, spi::RTD_MODE, spi::RTD_SPEED); @@ -900,6 +903,7 @@ void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) { static_cast(rtdIc13); static_cast(rtdIc14); static_cast(rtdIc15); +#endif } void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) { @@ -941,6 +945,7 @@ void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) { gpioComIF->addGpios(gpioCookieRw); +#if OBSW_ADD_RW == 1 auto rw1SpiCookie = new SpiCookie(addresses::RW1, gpioIds::CS_RW1, q7s::SPI_RW_DEV, RwDefinitions::MAX_REPLY_SIZE, spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr); @@ -982,6 +987,8 @@ void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF) { rwHandler4->setStartUpImmediately(); #endif rw4SpiCookie->setCallbackArgs(rwHandler4); + +#endif /* OBSW_ADD_RW == 1 */ } void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) { @@ -1103,7 +1110,7 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* gpio::Levels::LOW); plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_VBAT0, gpio); consumer = "PLPCDU_ENB_VBAT_1"; - gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_VBAT0, consumer, gpio::DIR_OUT, + gpio = new GpiodRegularByLineName(q7s::gpioNames::PL_PCDU_ENABLE_VBAT1, consumer, gpio::DIR_OUT, gpio::Levels::LOW); plPcduGpios->addGpio(gpioIds::PLPCDU_ENB_VBAT1, gpio); consumer = "PLPCDU_ENB_DRO"; From ce57f0b0f7216a4736468d32580077255ab6d3b3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 17 Feb 2022 20:53:06 +0100 Subject: [PATCH 048/309] update spi test class --- linux/boardtest/SpiTestClass.cpp | 160 ++++++++++++++++++++++++------- linux/boardtest/SpiTestClass.h | 16 ++++ 2 files changed, 143 insertions(+), 33 deletions(-) diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 537baffb..3804bff9 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -26,7 +26,7 @@ SpiTestClass::SpiTestClass(object_id_t objectId, GpioIF *gpioIF) } testMode = TestModes::SUS_0; spiTransferStruct[0].rx_buf = reinterpret_cast<__u64>(recvBuffer.data()); - spiTransferStruct[0].tx_buf = reinterpret_cast<__u64>(sendBuffer.data()); + setSendBuffer(); } ReturnValue_t SpiTestClass::performOneShotAction() { @@ -281,11 +281,14 @@ void SpiTestClass::performL3gTest(uint8_t l3gId) { void SpiTestClass::performMax1227Test() { using namespace max1227; - bool testRadSensorExtConv = false; - bool testRadSensorIntConv = false; - bool susExtConversion = false; - bool susIntConversion = false; - bool plPcduAdcExtConv = false; + testRadSensorExtConvWithDelay = false; + testRadSensorIntConv = false; + + susExtConversion = false; + susIntConversion = false; + + plPcduAdcExtConv = false; + plPcduAdcIntConv = true; #ifdef XIPHOS_Q7S std::string deviceName = q7s::SPI_DEFAULT_DEV; #elif defined(RASPBERRY_PI) @@ -302,36 +305,60 @@ void SpiTestClass::performMax1227Test() { spi::SpiModes spiMode = spi::SpiModes::MODE_3; setSpiSpeedAndMode(fd, spiMode, spiSpeed); - if (testRadSensorExtConv) { - sendBuffer[0] = max1227::buildResetByte(true); - sendBuffer[1] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, - DiffSel::NONE_0); - spiTransferStruct[0].len = 2; - transfer(fd, gpioIds::CS_RAD_SENSOR); + max1227RadSensorTest(fd); + max1227SusTest(fd); + max1227PlPcduTest(fd); +} +void SpiTestClass::max1227RadSensorTest(int fd) { + using namespace max1227; + if (testRadSensorExtConvWithDelay) { + sendBuffer[0] = max1227::buildResetByte(true); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::CS_RAD_SENSOR); + usleep(200); + sendBuffer[0] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_WITH_WAKEUP, + DiffSel::NONE_0); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::CS_RAD_SENSOR); max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 7, spiTransferStruct[0].len); + size_t tmpLen = spiTransferStruct[0].len; + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::CS_RAD_SENSOR); + std::memcpy(sendBuffer.data(), sendBuffer.data() + 1, tmpLen - 1); + spiTransferStruct[0].len = tmpLen - 1; + usleep(65); transfer(fd, gpioIds::CS_RAD_SENSOR); arrayprinter::print(recvBuffer.data(), 13, OutputType::HEX); uint16_t adcRaw[8] = {}; - adcRaw[0] = (recvBuffer[1] << 8) | recvBuffer[2]; - adcRaw[1] = (recvBuffer[3] << 8) | recvBuffer[4]; - adcRaw[2] = (recvBuffer[5] << 8) | recvBuffer[6]; - adcRaw[3] = (recvBuffer[7] << 8) | recvBuffer[8]; - adcRaw[4] = (recvBuffer[9] << 8) | recvBuffer[10]; - adcRaw[5] = (recvBuffer[11] << 8) | recvBuffer[12]; - adcRaw[6] = (recvBuffer[13] << 8) | recvBuffer[14]; - adcRaw[7] = (recvBuffer[15] << 8) | recvBuffer[16]; + adcRaw[0] = (recvBuffer[0] << 8) | recvBuffer[1]; + adcRaw[1] = (recvBuffer[2] << 8) | recvBuffer[3]; + adcRaw[2] = (recvBuffer[4] << 8) | recvBuffer[5]; + adcRaw[3] = (recvBuffer[6] << 8) | recvBuffer[7]; + adcRaw[4] = (recvBuffer[8] << 8) | recvBuffer[9]; + adcRaw[5] = (recvBuffer[10] << 8) | recvBuffer[11]; + adcRaw[6] = (recvBuffer[12] << 8) | recvBuffer[13]; + adcRaw[7] = (recvBuffer[14] << 8) | recvBuffer[15]; arrayprinter::print(recvBuffer.data(), 17, OutputType::HEX); for (int idx = 0; idx < 8; idx++) { sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; } + max1227::prepareExternallyClockedTemperatureRead(sendBuffer.data(), spiTransferStruct[0].len); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::CS_RAD_SENSOR); + usleep(65); + spiTransferStruct[0].len = 24; + std::memcpy(sendBuffer.data(), sendBuffer.data() + 1, 24); + transfer(fd, gpioIds::CS_RAD_SENSOR); + int16_t tempRaw = ((recvBuffer[22] & 0x0f) << 8) | recvBuffer[23]; + float temp = max1227::getTemperature(tempRaw); + sif::info << "Temperature: " << temp << std::endl; } if (testRadSensorIntConv) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::CS_RAD_SENSOR); - usleep(65); - + usleep(5); // Now use internal conversion sendBuffer[0] = max1227::buildSetupByte(ClkSel::INT_CONV_INT_TIMED_CNVST_AS_AIN, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); @@ -345,13 +372,13 @@ void SpiTestClass::performMax1227Test() { usleep(65); spiTransferStruct[0].len = 18; // Shift out zeros - spiTransferStruct[0].tx_buf = 0; + shiftOutZeros(); transfer(fd, gpioIds::CS_RAD_SENSOR); + setSendBuffer(); arrayprinter::print(recvBuffer.data(), 14); uint16_t adcRaw[8] = {}; int16_t tempRaw = ((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]; - sif::info << "Temperature: " << tempRaw * 0.125 << " C" << std::endl; adcRaw[0] = (recvBuffer[2] << 8) | recvBuffer[3]; adcRaw[1] = (recvBuffer[4] << 8) | recvBuffer[5]; @@ -365,6 +392,10 @@ void SpiTestClass::performMax1227Test() { sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; } } +} + +void SpiTestClass::max1227SusTest(int fd) { + using namespace max1227; if (susExtConversion) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; @@ -408,8 +439,9 @@ void SpiTestClass::performMax1227Test() { usleep(65); spiTransferStruct[0].len = 14; // Shift out zeros - spiTransferStruct[0].tx_buf = 0; + shiftOutZeros(); transfer(fd, gpio::NO_GPIO); + setSendBuffer(); arrayprinter::print(recvBuffer.data(), 14); float temp = static_cast(((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]) * 0.125; sif::info << "Temperature: " << temp << " C" << std::endl; @@ -424,11 +456,22 @@ void SpiTestClass::performMax1227Test() { sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; } } +} + +void SpiTestClass::max1227PlPcduTest(int fd) { + using namespace max1227; if (plPcduAdcExtConv) { // This enables the ADC - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); - gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); - sendBuffer[0] = max1227::buildResetByte(true); + ReturnValue_t result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); + if (result != HasReturnvaluesIF::RETURN_OK) { + return; + } + result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); + if (result != HasReturnvaluesIF::RETURN_OK) { + return; + } + usleep(1000); + sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::PLPCDU_ADC_CS); sendBuffer[0] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, @@ -439,11 +482,56 @@ void SpiTestClass::performMax1227Test() { max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), n, spiTransferStruct[0].len); transfer(fd, gpioIds::PLPCDU_ADC_CS); uint16_t adcRaw[n + 1] = {}; - for(uint8_t idx = 0; idx < n + 1; idx++) { + for (uint8_t idx = 0; idx < n + 1; idx++) { adcRaw[idx] = (recvBuffer[idx * 2 + 1] << 8) | recvBuffer[idx * 2 + 2]; } arrayprinter::print(recvBuffer.data(), spiTransferStruct[0].len, OutputType::HEX); + sif::info << "PL PCDU ADC values:" << std::endl; for (int idx = 0; idx < n + 1; idx++) { + sif::info << "Raw Value " << idx << ": " << adcRaw[idx] << std::endl; + } + max1227::prepareExternallyClockedTemperatureRead(sendBuffer.data(), spiTransferStruct[0].len); + transfer(fd, gpioIds::PLPCDU_ADC_CS); + int16_t tempRaw = ((recvBuffer[23] & 0x0f) << 8) | recvBuffer[24]; + float temp = max1227::getTemperature(tempRaw); + sif::info << "Temperature: " << temp << std::endl; + } + if (plPcduAdcIntConv) { + // This enables the ADC + ReturnValue_t result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); + if (result != HasReturnvaluesIF::RETURN_OK) { + return; + } + result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); + if (result != HasReturnvaluesIF::RETURN_OK) { + return; + } + usleep(1000); + sendBuffer[0] = max1227::buildResetByte(false); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::PLPCDU_ADC_CS); + // Now use internal conversion + sendBuffer[0] = max1227::buildSetupByte(ClkSel::INT_CONV_INT_TIMED_CNVST_AS_AIN, + RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::PLPCDU_ADC_CS); + usleep(10); + uint8_t n = 11; + sendBuffer[0] = buildConvByte(ScanModes::CHANNELS_0_TO_N, n, true); + spiTransferStruct[0].len = 1; + transfer(fd, gpioIds::PLPCDU_ADC_CS); + + usleep(65); + spiTransferStruct[0].len = 26; + // Shift out zeros + shiftOutZeros(); + transfer(fd, gpioIds::PLPCDU_ADC_CS); + setSendBuffer(); + uint16_t adcRaw[n + 1] = {}; + int16_t tempRaw = ((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]; + sif::info << "Temperature: " << tempRaw * 0.125 << " C" << std::endl; + for (int idx = 0; idx < n + 1; idx++) { + adcRaw[idx] = (recvBuffer[idx * 2 + 2] << 8) | recvBuffer[idx * 2 + 3]; sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; } } @@ -624,6 +712,12 @@ void SpiTestClass::readMultipleStmRegisters(int fd, gpioId_t chipSelect, uint8_t readMultipleRegisters(fd, chipSelect, reg, reply, len); } +void SpiTestClass::shiftOutZeros() { spiTransferStruct[0].tx_buf = 0; } + +void SpiTestClass::setSendBuffer() { + spiTransferStruct[0].tx_buf = reinterpret_cast<__u64>(sendBuffer.data()); +} + void SpiTestClass::readMultipleRegisters(int fd, gpioId_t chipSelect, uint8_t reg, uint8_t *reply, size_t len) { if (reply == nullptr) { @@ -680,8 +774,8 @@ uint8_t SpiTestClass::readRegister(int fd, gpioId_t chipSelect, uint8_t reg) { ReturnValue_t SpiTestClass::transfer(int fd, gpioId_t chipSelect = gpio::NO_GPIO) { int retval = 0; ReturnValue_t result = HasReturnvaluesIF::RETURN_OK; - if(chipSelect != gpio::NO_GPIO) { - result = gpioIF->pullLow(gpioIds::CS_RAD_SENSOR); + if (chipSelect != gpio::NO_GPIO) { + result = gpioIF->pullLow(chipSelect); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } @@ -693,8 +787,8 @@ ReturnValue_t SpiTestClass::transfer(int fd, gpioId_t chipSelect = gpio::NO_GPIO return HasReturnvaluesIF::RETURN_FAILED; } - if(chipSelect != gpio::NO_GPIO) { - result = gpioIF->pullHigh(gpioIds::CS_RAD_SENSOR); + if (chipSelect != gpio::NO_GPIO) { + result = gpioIF->pullHigh(chipSelect); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h index 3c9c159e..adf94739 100644 --- a/linux/boardtest/SpiTestClass.h +++ b/linux/boardtest/SpiTestClass.h @@ -51,6 +51,15 @@ class SpiTestClass : public TestTask { uint8_t gyro2AdisChipSelect = gpio::GYRO_2_BCM_PIN; uint8_t gyro3L3gd20ChipSelect = gpio::GYRO_3_BCM_PIN; #else + bool testRadSensorExtConvWithDelay = false; + bool testRadSensorIntConv = false; + + bool susExtConversion = false; + bool susIntConversion = false; + + bool plPcduAdcExtConv = false; + bool plPcduAdcIntConv = false; + uint8_t mgm0Lis3mdlChipSelect = 0; uint8_t mgm1Rm3100ChipSelect = 0; uint8_t gyro0AdisResetLine = 0; @@ -65,6 +74,13 @@ class SpiTestClass : public TestTask { static constexpr uint8_t RM3100_READ_MASK = STM_READ_MASK; static constexpr uint8_t STM_AUTO_INCR_MASK = 0b0100'0000; + void shiftOutZeros(); + void setSendBuffer(); + + void max1227RadSensorTest(int fd); + void max1227SusTest(int fd); + void max1227PlPcduTest(int fd); + void setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t speed); void writeStmRegister(int fd, gpioId_t chipSelect, uint8_t reg, uint8_t value, From 029ed7de9b36808d4b6906350f5f201d2ae5f11f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 17 Feb 2022 20:53:28 +0100 Subject: [PATCH 049/309] small tweak --- mission/devices/RadiationSensorHandler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mission/devices/RadiationSensorHandler.cpp b/mission/devices/RadiationSensorHandler.cpp index 92d2c311..c5148c84 100644 --- a/mission/devices/RadiationSensorHandler.cpp +++ b/mission/devices/RadiationSensorHandler.cpp @@ -126,7 +126,8 @@ ReturnValue_t RadiationSensorHandler::interpretDeviceReply(DeviceCommandId_t id, case RAD_SENSOR::READ_CONVERSIONS: { uint8_t offset = 0; PoolReadGuard readSet(&dataset); - dataset.temperatureCelcius = (*(packet + offset) << 8 | *(packet + offset + 1)) * 0.125; + int16_t tempRaw = ((packet[offset] & 0x0f) << 8) | packet[offset + 1]; + dataset.temperatureCelcius = tempRaw * 0.125; offset += 2; dataset.ain0 = (*(packet + offset) << 8 | *(packet + offset + 1)); offset += 2; From ec7d624ccabb325498a1c44aaeb5ab4faa7b3f59 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 17 Feb 2022 20:53:45 +0100 Subject: [PATCH 050/309] added missing gpioID --- linux/fsfwconfig/devices/gpioIds.h | 1 + 1 file changed, 1 insertion(+) diff --git a/linux/fsfwconfig/devices/gpioIds.h b/linux/fsfwconfig/devices/gpioIds.h index 2863bb50..e6f42eb4 100644 --- a/linux/fsfwconfig/devices/gpioIds.h +++ b/linux/fsfwconfig/devices/gpioIds.h @@ -75,6 +75,7 @@ enum gpioId_t { SPI_MUX_BIT_5, CS_RAD_SENSOR, + ENABLE_RADFET, PAPB_BUSY_N, PAPB_EMPTY, From 151621b49a21e6c8960280759d847aac10146371 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 17 Feb 2022 21:17:40 +0100 Subject: [PATCH 051/309] added periodic test capability --- linux/boardtest/SpiTestClass.cpp | 38 +++++++++++++++++++++++++++----- linux/boardtest/SpiTestClass.h | 4 +++- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 3804bff9..1d48d01e 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -24,7 +24,7 @@ SpiTestClass::SpiTestClass(object_id_t objectId, GpioIF *gpioIF) if (gpioIF == nullptr) { sif::error << "SpiTestClass::SpiTestClass: Invalid GPIO ComIF!" << std::endl; } - testMode = TestModes::SUS_0; + testMode = TestModes::MAX1227; spiTransferStruct[0].rx_buf = reinterpret_cast<__u64>(recvBuffer.data()); setSendBuffer(); } @@ -46,15 +46,25 @@ ReturnValue_t SpiTestClass::performOneShotAction() { performL3gTest(gyro1L3gd20ChipSelect); break; } - case (TestModes::SUS_0): { - performMax1227Test(); + case (TestModes::MAX1227): { + performOneShotMax1227Test(); break; } } return HasReturnvaluesIF::RETURN_OK; } -ReturnValue_t SpiTestClass::performPeriodicAction() { return HasReturnvaluesIF::RETURN_OK; } +ReturnValue_t SpiTestClass::performPeriodicAction() { + switch (testMode) { + case (TestModes::MAX1227): { + performPeriodicMax1227Test(); + break; + } + default: + break; + } + return HasReturnvaluesIF::RETURN_OK; +} void SpiTestClass::performRm3100Test(uint8_t mgmId) { /* Configure all SPI chip selects and pull them high */ @@ -279,7 +289,7 @@ void SpiTestClass::performL3gTest(uint8_t l3gId) { sif::info << "Z: " << angVelocZ << std::endl; } -void SpiTestClass::performMax1227Test() { +void SpiTestClass::performOneShotMax1227Test() { using namespace max1227; testRadSensorExtConvWithDelay = false; testRadSensorIntConv = false; @@ -289,6 +299,23 @@ void SpiTestClass::performMax1227Test() { plPcduAdcExtConv = false; plPcduAdcIntConv = true; + performMax1227Test(); +} + +void SpiTestClass::performPeriodicMax1227Test() { + using namespace max1227; + testRadSensorExtConvWithDelay = false; + testRadSensorIntConv = false; + + susExtConversion = false; + susIntConversion = false; + + plPcduAdcExtConv = false; + plPcduAdcIntConv = true; + performMax1227Test(); +} + +void SpiTestClass::performMax1227Test() { #ifdef XIPHOS_Q7S std::string deviceName = q7s::SPI_DEFAULT_DEV; #elif defined(RASPBERRY_PI) @@ -527,6 +554,7 @@ void SpiTestClass::max1227PlPcduTest(int fd) { shiftOutZeros(); transfer(fd, gpioIds::PLPCDU_ADC_CS); setSendBuffer(); + arrayprinter::print(recvBuffer.data(), 26, OutputType::HEX); uint16_t adcRaw[n + 1] = {}; int16_t tempRaw = ((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]; sif::info << "Temperature: " << tempRaw * 0.125 << " C" << std::endl; diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h index adf94739..29df9a45 100644 --- a/linux/boardtest/SpiTestClass.h +++ b/linux/boardtest/SpiTestClass.h @@ -15,7 +15,7 @@ class SpiTestClass : public TestTask { public: - enum TestModes { NONE, MGM_LIS3MDL, MGM_RM3100, GYRO_L3GD20H, SUS_0 }; + enum TestModes { NONE, MGM_LIS3MDL, MGM_RM3100, GYRO_L3GD20H, MAX1227 }; TestModes testMode; @@ -34,6 +34,8 @@ class SpiTestClass : public TestTask { void performRm3100Test(uint8_t mgmId); void performLis3MdlTest(uint8_t lis3Id); void performL3gTest(uint8_t l3gId); + void performOneShotMax1227Test(); + void performPeriodicMax1227Test(); void performMax1227Test(); /* ACS board specific code which pulls all GPIOs high */ From 6326ac71ca6f976ac176ca25ff756691c0fe1c84 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 11:29:51 +0100 Subject: [PATCH 052/309] this delay seems to do the job --- linux/boardtest/SpiTestClass.cpp | 24 +++++++++--------------- linux/boardtest/SpiTestClass.h | 1 + 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 1d48d01e..4d35fa10 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -310,8 +310,8 @@ void SpiTestClass::performPeriodicMax1227Test() { susExtConversion = false; susIntConversion = false; - plPcduAdcExtConv = false; - plPcduAdcIntConv = true; + plPcduAdcExtConv = true; + plPcduAdcIntConv = false; performMax1227Test(); } @@ -487,7 +487,7 @@ void SpiTestClass::max1227SusTest(int fd) { void SpiTestClass::max1227PlPcduTest(int fd) { using namespace max1227; - if (plPcduAdcExtConv) { + if ((plPcduAdcExtConv or plPcduAdcIntConv) and vbatSwitch) { // This enables the ADC ReturnValue_t result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); if (result != HasReturnvaluesIF::RETURN_OK) { @@ -497,7 +497,11 @@ void SpiTestClass::max1227PlPcduTest(int fd) { if (result != HasReturnvaluesIF::RETURN_OK) { return; } - usleep(1000); + vbatSwitch = false; + // Takes a bit of time until the ADC is usable + TaskFactory::delayTask(50); + } + if (plPcduAdcExtConv) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::PLPCDU_ADC_CS); @@ -524,17 +528,7 @@ void SpiTestClass::max1227PlPcduTest(int fd) { sif::info << "Temperature: " << temp << std::endl; } if (plPcduAdcIntConv) { - // This enables the ADC - ReturnValue_t result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); - if (result != HasReturnvaluesIF::RETURN_OK) { - return; - } - result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); - if (result != HasReturnvaluesIF::RETURN_OK) { - return; - } - usleep(1000); - sendBuffer[0] = max1227::buildResetByte(false); + sendBuffer[0] = max1227::buildResetByte(true); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::PLPCDU_ADC_CS); // Now use internal conversion diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h index 29df9a45..adf63e6e 100644 --- a/linux/boardtest/SpiTestClass.h +++ b/linux/boardtest/SpiTestClass.h @@ -61,6 +61,7 @@ class SpiTestClass : public TestTask { bool plPcduAdcExtConv = false; bool plPcduAdcIntConv = false; + bool vbatSwitch = true; uint8_t mgm0Lis3mdlChipSelect = 0; uint8_t mgm1Rm3100ChipSelect = 0; From b6f3b838b7657aca9babf5cb78847d88c918acb1 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 12:46:28 +0100 Subject: [PATCH 053/309] sun sensors working in test class --- linux/boardtest/SpiTestClass.cpp | 117 +++++++++++++++++++++---------- linux/boardtest/SpiTestClass.h | 37 +++++++--- 2 files changed, 106 insertions(+), 48 deletions(-) diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 4d35fa10..60abbe67 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -16,7 +16,6 @@ #include #include "busConf.h" -#include "devices/gpioIds.h" #include "mission/devices/max1227.h" SpiTestClass::SpiTestClass(object_id_t objectId, GpioIF *gpioIF) @@ -291,27 +290,51 @@ void SpiTestClass::performL3gTest(uint8_t l3gId) { void SpiTestClass::performOneShotMax1227Test() { using namespace max1227; - testRadSensorExtConvWithDelay = false; - testRadSensorIntConv = false; + adcCfg.testRadSensorExtConvWithDelay = false; + adcCfg.testRadSensorIntConv = false; - susExtConversion = false; - susIntConversion = false; + adcCfg.testSus[0].doTest = true; + adcCfg.testSus[0].intConv = true; + adcCfg.testSus[6].doTest = true; + adcCfg.testSus[6].intConv = true; - plPcduAdcExtConv = false; - plPcduAdcIntConv = true; + adcCfg.testSus[1].doTest = true; + adcCfg.testSus[1].intConv = true; + adcCfg.testSus[7].doTest = true; + adcCfg.testSus[7].intConv = true; + + adcCfg.testSus[10].doTest = true; + adcCfg.testSus[10].intConv = true; + adcCfg.testSus[4].doTest = true; + adcCfg.testSus[4].intConv = true; + + adcCfg.testSus[1].doTest = true; + adcCfg.testSus[1].intConv = true; + adcCfg.testSus[5].doTest = true; + adcCfg.testSus[5].intConv = true; + + adcCfg.testSus[2].doTest = true; + adcCfg.testSus[2].intConv = true; + adcCfg.testSus[3].doTest = true; + adcCfg.testSus[3].intConv = true; + + adcCfg.testSus[8].doTest = true; + adcCfg.testSus[8].intConv = true; + adcCfg.testSus[9].doTest = true; + adcCfg.testSus[9].intConv = true; + + adcCfg.plPcduAdcExtConv = false; + adcCfg.plPcduAdcIntConv = true; performMax1227Test(); } void SpiTestClass::performPeriodicMax1227Test() { using namespace max1227; - testRadSensorExtConvWithDelay = false; - testRadSensorIntConv = false; + adcCfg.testRadSensorExtConvWithDelay = false; + adcCfg.testRadSensorIntConv = false; - susExtConversion = false; - susIntConversion = false; - - plPcduAdcExtConv = true; - plPcduAdcIntConv = false; + adcCfg.plPcduAdcExtConv = false; + adcCfg.plPcduAdcIntConv = false; performMax1227Test(); } @@ -333,13 +356,25 @@ void SpiTestClass::performMax1227Test() { setSpiSpeedAndMode(fd, spiMode, spiSpeed); max1227RadSensorTest(fd); - max1227SusTest(fd); + int idx = 0; + bool firstTest = true; + for (auto &susCfg : adcCfg.testSus) { + if (susCfg.doTest) { + if (firstTest) { + firstTest = false; + sif::info << "---------- SUS ADC Values -----------" << std::endl; + } + sif::info << "SUS " << std::setw(2) << idx << ": "; + max1227SusTest(fd, susCfg); + } + idx++; + } max1227PlPcduTest(fd); } void SpiTestClass::max1227RadSensorTest(int fd) { using namespace max1227; - if (testRadSensorExtConvWithDelay) { + if (adcCfg.testRadSensorExtConvWithDelay) { sendBuffer[0] = max1227::buildResetByte(true); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::CS_RAD_SENSOR); @@ -381,7 +416,7 @@ void SpiTestClass::max1227RadSensorTest(int fd) { float temp = max1227::getTemperature(tempRaw); sif::info << "Temperature: " << temp << std::endl; } - if (testRadSensorIntConv) { + if (adcCfg.testRadSensorIntConv) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::CS_RAD_SENSOR); @@ -421,21 +456,21 @@ void SpiTestClass::max1227RadSensorTest(int fd) { } } -void SpiTestClass::max1227SusTest(int fd) { +void SpiTestClass::max1227SusTest(int fd, SusTestCfg &cfg) { using namespace max1227; - if (susExtConversion) { + if (cfg.extConv) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; - transfer(fd, gpio::NO_GPIO); + transfer(fd, cfg.gpioId); usleep(65); sendBuffer[0] = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); spiTransferStruct[0].len = 1; - transfer(fd, gpio::NO_GPIO); + transfer(fd, cfg.gpioId); max1227::prepareExternallyClockedRead0ToN(sendBuffer.data(), 5, spiTransferStruct[0].len); - transfer(fd, gpio::NO_GPIO); + transfer(fd, cfg.gpioId); uint16_t adcRaw[6] = {}; adcRaw[0] = (recvBuffer[1] << 8) | recvBuffer[2]; adcRaw[1] = (recvBuffer[3] << 8) | recvBuffer[4]; @@ -443,35 +478,38 @@ void SpiTestClass::max1227SusTest(int fd) { adcRaw[3] = (recvBuffer[7] << 8) | recvBuffer[8]; adcRaw[4] = (recvBuffer[9] << 8) | recvBuffer[10]; adcRaw[5] = (recvBuffer[11] << 8) | recvBuffer[12]; - arrayprinter::print(recvBuffer.data(), 13, OutputType::HEX); - for (int idx = 0; idx < 6; idx++) { - sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; + sif::info << "Ext Conv [" << std::hex << std::setw(3); + for (int idx = 0; idx < 5; idx++) { + sif::info << adcRaw[idx]; + if (idx < 6) { + sif::info << ","; + } } + sif::info << std::dec << "]" << std::endl; // | Temperature: " << temp << " C" << std::endl; } - if (susIntConversion) { + if (cfg.intConv) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; - transfer(fd, gpio::NO_GPIO); + transfer(fd, cfg.gpioId); usleep(65); // Now use internal conversion sendBuffer[0] = max1227::buildSetupByte(ClkSel::INT_CONV_INT_TIMED_CNVST_AS_AIN, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); spiTransferStruct[0].len = 1; - transfer(fd, gpio::NO_GPIO); + transfer(fd, cfg.gpioId); usleep(10); sendBuffer[0] = buildConvByte(ScanModes::CHANNELS_0_TO_N, 5, true); spiTransferStruct[0].len = 1; - transfer(fd, gpio::NO_GPIO); + transfer(fd, cfg.gpioId); usleep(65); spiTransferStruct[0].len = 14; // Shift out zeros shiftOutZeros(); - transfer(fd, gpio::NO_GPIO); + transfer(fd, cfg.gpioId); setSendBuffer(); - arrayprinter::print(recvBuffer.data(), 14); + // arrayprinter::print(recvBuffer.data(), 14); float temp = static_cast(((recvBuffer[0] & 0x0f) << 8) | recvBuffer[1]) * 0.125; - sif::info << "Temperature: " << temp << " C" << std::endl; uint16_t adcRaw[6] = {}; adcRaw[0] = (recvBuffer[2] << 8) | recvBuffer[3]; adcRaw[1] = (recvBuffer[4] << 8) | recvBuffer[5]; @@ -479,15 +517,20 @@ void SpiTestClass::max1227SusTest(int fd) { adcRaw[3] = (recvBuffer[8] << 8) | recvBuffer[9]; adcRaw[4] = (recvBuffer[10] << 8) | recvBuffer[11]; adcRaw[5] = (recvBuffer[12] << 8) | recvBuffer[13]; + sif::info << "Int Conv [" << std::hex << std::setw(3); for (int idx = 0; idx < 6; idx++) { - sif::info << "ADC raw " << idx << ": " << adcRaw[idx] << std::endl; + sif::info << adcRaw[idx]; + if (idx < 5) { + sif::info << ","; + } } + sif::info << std::dec << "] | T[C] " << temp << std::endl; } } void SpiTestClass::max1227PlPcduTest(int fd) { using namespace max1227; - if ((plPcduAdcExtConv or plPcduAdcIntConv) and vbatSwitch) { + if ((adcCfg.plPcduAdcExtConv or adcCfg.plPcduAdcIntConv) and adcCfg.vbatSwitch) { // This enables the ADC ReturnValue_t result = gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); if (result != HasReturnvaluesIF::RETURN_OK) { @@ -497,11 +540,11 @@ void SpiTestClass::max1227PlPcduTest(int fd) { if (result != HasReturnvaluesIF::RETURN_OK) { return; } - vbatSwitch = false; + adcCfg.vbatSwitch = false; // Takes a bit of time until the ADC is usable TaskFactory::delayTask(50); } - if (plPcduAdcExtConv) { + if (adcCfg.plPcduAdcExtConv) { sendBuffer[0] = max1227::buildResetByte(false); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::PLPCDU_ADC_CS); @@ -527,7 +570,7 @@ void SpiTestClass::max1227PlPcduTest(int fd) { float temp = max1227::getTemperature(tempRaw); sif::info << "Temperature: " << temp << std::endl; } - if (plPcduAdcIntConv) { + if (adcCfg.plPcduAdcIntConv) { sendBuffer[0] = max1227::buildResetByte(true); spiTransferStruct[0].len = 1; transfer(fd, gpioIds::PLPCDU_ADC_CS); diff --git a/linux/boardtest/SpiTestClass.h b/linux/boardtest/SpiTestClass.h index adf63e6e..d48d6655 100644 --- a/linux/boardtest/SpiTestClass.h +++ b/linux/boardtest/SpiTestClass.h @@ -6,13 +6,36 @@ #if defined(XIPHOS_Q7S) #include "busConf.h" #endif - #include #include #include #include +#include "devices/gpioIds.h" + +struct SusTestCfg { + SusTestCfg(bool doTest, gpioId_t gpioId) : gpioId(gpioId) {} + bool doTest = false; + const gpioId_t gpioId; + bool intConv = true; + bool extConv = false; +}; + +struct Max1227TestCfg { + bool testRadSensorExtConvWithDelay = false; + bool testRadSensorIntConv = false; + bool plPcduAdcExtConv = false; + bool plPcduAdcIntConv = false; + bool vbatSwitch = true; + + SusTestCfg testSus[12] = { + {false, gpioIds::CS_SUS_0}, {false, gpioIds::CS_SUS_1}, {false, gpioIds::CS_SUS_2}, + {false, gpioIds::CS_SUS_3}, {false, gpioIds::CS_SUS_4}, {false, gpioIds::CS_SUS_5}, + {false, gpioIds::CS_SUS_6}, {false, gpioIds::CS_SUS_7}, {false, gpioIds::CS_SUS_8}, + {false, gpioIds::CS_SUS_9}, {false, gpioIds::CS_SUS_10}, {false, gpioIds::CS_SUS_11}, + }; +}; class SpiTestClass : public TestTask { public: enum TestModes { NONE, MGM_LIS3MDL, MGM_RM3100, GYRO_L3GD20H, MAX1227 }; @@ -26,6 +49,7 @@ class SpiTestClass : public TestTask { private: GpioIF* gpioIF; + Max1227TestCfg adcCfg = {}; std::array recvBuffer; std::array sendBuffer; @@ -53,15 +77,6 @@ class SpiTestClass : public TestTask { uint8_t gyro2AdisChipSelect = gpio::GYRO_2_BCM_PIN; uint8_t gyro3L3gd20ChipSelect = gpio::GYRO_3_BCM_PIN; #else - bool testRadSensorExtConvWithDelay = false; - bool testRadSensorIntConv = false; - - bool susExtConversion = false; - bool susIntConversion = false; - - bool plPcduAdcExtConv = false; - bool plPcduAdcIntConv = false; - bool vbatSwitch = true; uint8_t mgm0Lis3mdlChipSelect = 0; uint8_t mgm1Rm3100ChipSelect = 0; @@ -81,7 +96,7 @@ class SpiTestClass : public TestTask { void setSendBuffer(); void max1227RadSensorTest(int fd); - void max1227SusTest(int fd); + void max1227SusTest(int fd, SusTestCfg& cfg); void max1227PlPcduTest(int fd); void setSpiSpeedAndMode(int spiFd, spi::SpiModes mode, uint32_t speed); From 16680663fd4a9fb07030c370b41fcf193031dd4b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 12:46:58 +0100 Subject: [PATCH 054/309] sus handler update --- linux/devices/SusHandler.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 3b7d996d..bf33e4d7 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -102,10 +102,10 @@ ReturnValue_t SusHandler::buildCommandFromCommand(DeviceCommandId_t deviceComman } case (SUS::START_INT_TIMED_CONVERSIONS): { std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); - //cmdBuffer[0] = max1227::buildResetByte(true); - cmdBuffer[0] = SUS::CONVERSION; + cmdBuffer[0] = max1227::buildResetByte(true); + cmdBuffer[1] = SUS::CONVERSION; rawPacket = cmdBuffer; - rawPacketLen = 1; + rawPacketLen = 2; break; } case (SUS::READ_INT_TIMED_CONVERSIONS): { @@ -196,7 +196,8 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8 } case (SUS::READ_EXT_TIMED_TEMPS): { PoolReadGuard readSet(&dataset); - dataset.temperatureCelcius = static_cast(((packet[23] & 0x0f) << 8) | packet[24]) * 0.125; + dataset.temperatureCelcius = + static_cast(((packet[23] & 0x0f) << 8) | packet[24]) * 0.125; comState = ComStates::EXT_CLOCKED_CONVERSIONS; break; } From a01ddf6a5b5791e358ca0066aad9a6f1a64fdad3 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 13:10:06 +0100 Subject: [PATCH 055/309] updated PST --- .../pollingSequenceFactory.cpp | 350 ++++++------------ 1 file changed, 115 insertions(+), 235 deletions(-) diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index b43e8632..b43c403f 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -161,18 +161,18 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #if OBSW_ADD_SUN_SENSORS == 1 - bool addSus0 = false; - bool addSus1 = false; - bool addSus2 = false; - bool addSus3 = false; - bool addSus4 = false; - bool addSus5 = false; - bool addSus6 = false; - bool addSus7 = false; + bool addSus0 = true; + bool addSus1 = true; + bool addSus2 = true; + bool addSus3 = true; + bool addSus4 = true; + bool addSus5 = true; + bool addSus6 = true; + bool addSus7 = true; bool addSus8 = true; - bool addSus9 = false; - bool addSus10 = false; - bool addSus11 = false; + bool addSus9 = true; + bool addSus10 = true; + bool addSus11 = true; /** * The sun sensor will be shutdown as soon as the chip select is pulled high. Thus all * requests to a sun sensor must be performed consecutively. Another reason for calling multiple @@ -184,272 +184,152 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { if (addSus0) { /* Write setup */ thisSequence->addSlot(objects::SUS_0, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_0, length * 0.933, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_0, length * 0.2, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_0, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_0, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_0, length * 0, DeviceHandlerIF::GET_READ); thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.4, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_0, length * 0.934, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_0, length * 0.94, DeviceHandlerIF::GET_READ); - // /* Read ADC conversions */ - // // thisSequence->addSlot(objects::SUS_0, length * 0.935, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_0, length * 0.935, - // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, - // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_0, length * 0.935, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_0, length * 0.935, - // DeviceHandlerIF::GET_READ); } if (addSus1) { - /* Write setup */ - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_1, length * 0.9, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_1, length * 0.902, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_1, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_1, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_1, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_1, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_1, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_1, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus2) { - /* Write setup */ thisSequence->addSlot(objects::SUS_2, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_2, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_2, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_2, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_2, length * 0.4, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_2, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_2, length * 0.6, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_2, length * 0.8, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_2, length * 0.904, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_2, length * 0.905, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_2, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_2, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus3) { - /* Write setup */ - thisSequence->addSlot(objects::SUS_3, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_3, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_3, length * 0.6, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_3, length * 0.8, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_3, length * 0.91, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, SusHandler::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_3, length * 0.93, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_3, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_3, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_3, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_3, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_3, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_3, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus4) { - /* Write setup */ thisSequence->addSlot(objects::SUS_4, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_4, length * 0.909, SusHandler::FIRST_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_4, length * 0.6, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_4, length * 0.8, DeviceHandlerIF::GET_READ); - /* Write setup */ - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_4, length * 0.91, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_4, length * 0.911, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_4, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_4, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_4, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_4, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_4, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus5) { - /* Write setup */ - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_5, length * 0.912, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_5, length * 0.913, DeviceHandlerIF::GET_READ); - // /* Write setup */ - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, SusHandler::FIRST_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_5, length * 0.914, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_5, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_5, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_5, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_5, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_5, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_5, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus6) { - /* Write setup */ - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_6, length * 0.915, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_6, length * 0.916, DeviceHandlerIF::GET_READ); - // /* Read ADC conversions from inernal FIFO */ - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_6, length * 0.917, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_6, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_6, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_6, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_6, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_6, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_6, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus7) { - /* Write setup */ - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_7, length * 0.918, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_7, length * 0.919, DeviceHandlerIF::GET_READ); - // /* Read ADC conversions from inernal FIFO */ - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_7, length * 0.92, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_7, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_7, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_7, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_7, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_7, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_7, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus8) { - /* Write setup */ thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_8, length * 0.921, SusHandler::FIRST_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_READ); - /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_WRITE); - // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::SUS_8, length * 0.923, DeviceHandlerIF::GET_READ); - // /* Read ADC conversions from internal FIFO */ - // // thisSequence->addSlot(objects::SUS_8, length * 0.925, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_8, length * 0.925, - // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.925, - // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_8, length * 0.925, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_8, length * 0.925, - // DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_8, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_8, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_8, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus9) { - /* Write setup */ thisSequence->addSlot(objects::SUS_9, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0, DeviceHandlerIF::GET_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_8, length * 0.2, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // // thisSequence->addSlot(objects::SUS_9, length * 0.925, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.925, - // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, - // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.925, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.925, - // DeviceHandlerIF::GET_READ); - // /* Read ADC conversions */ - // // thisSequence->addSlot(objects::SUS_9, length * 0.926, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_9, length * 0.926, - // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, - // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_9, length * 0.926, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_9, length * 0.926, - // DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_9, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_9, length * 0, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_9, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_9, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_9, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus10) { - /* Write setup */ - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_10, length * 0.927, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_10, length * 0.928, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_10, length * - // 0.928, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_10, length * - // 0.928, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_10, length * 0.928, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_10, length * 0.928, - // DeviceHandlerIF::GET_READ); - // /* Read ADC conversions */ - // thisSequence->addSlot(objects::SUS_10, length * 0.929, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_10, length * - // 0.929, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_10, length * - // 0.929, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_10, length * 0.929, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_10, length * 0.929, - // DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_10, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_10, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_10, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_10, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_10, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_10, length * 0.4, DeviceHandlerIF::GET_READ); } if (addSus11) { - /* Write setup */ - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SUS_11, length * 0.93, DeviceHandlerIF::GET_READ); - // /* Start ADC conversions */ - // thisSequence->addSlot(objects::SUS_11, length * 0.931, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_11, length * - // 0.931, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_11, length * - // 0.931, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_11, length * 0.931, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_11, length * 0.931, - // DeviceHandlerIF::GET_READ); - // /* Read ADC conversions */ - // thisSequence->addSlot(objects::SUS_11, length * 0.932, - // DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_11, length * - // 0.932, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SUS_11, length * - // 0.932, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SUS_11, length * 0.932, - // DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SUS_11, length * 0.932, - // DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SUS_11, length * 0, DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::SUS_11, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_11, length * 0, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::SUS_11, length * 0.4, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::SUS_11, length * 0.4, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SUS_11, length * 0.4, DeviceHandlerIF::GET_READ); } #endif /* OBSW_ADD_SUN_SENSORS == 1 */ From 9cae806dd9b642fb6f668ba7afdb260f9f4e6b92 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 13:10:24 +0100 Subject: [PATCH 056/309] pass SUS idx to dev handler --- bsp_q7s/core/ObjectFactory.cpp | 44 +++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index b248dbb3..80e5d242 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -358,73 +358,73 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI SpiCookie* spiCookie = new SpiCookie(addresses::SUS_0, gpioIds::CS_SUS_0, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler0 = - new SusHandler(objects::SUS_0, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_0); + SusHandler* susHandler0 = new SusHandler(objects::SUS_0, 0, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_0); spiCookie = new SpiCookie(addresses::SUS_1, gpioIds::CS_SUS_1, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler1 = - new SusHandler(objects::SUS_1, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_1); + SusHandler* susHandler1 = new SusHandler(objects::SUS_1, 1, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_1); spiCookie = new SpiCookie(addresses::SUS_2, gpioIds::CS_SUS_2, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler2 = - new SusHandler(objects::SUS_2, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_2); + SusHandler* susHandler2 = new SusHandler(objects::SUS_2, 2, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_2); spiCookie = new SpiCookie(addresses::SUS_3, gpioIds::CS_SUS_3, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler3 = - new SusHandler(objects::SUS_3, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_3); + SusHandler* susHandler3 = new SusHandler(objects::SUS_3, 3, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_3); spiCookie = new SpiCookie(addresses::SUS_4, gpioIds::CS_SUS_4, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler4 = - new SusHandler(objects::SUS_4, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_4); + SusHandler* susHandler4 = new SusHandler(objects::SUS_4, 4, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_4); spiCookie = new SpiCookie(addresses::SUS_5, gpioIds::CS_SUS_5, std::string(q7s::SPI_DEFAULT_DEV), SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler5 = - new SusHandler(objects::SUS_5, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_5); + SusHandler* susHandler5 = new SusHandler(objects::SUS_5, 5, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_5); spiCookie = new SpiCookie(addresses::SUS_6, gpioIds::CS_SUS_6, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler6 = - new SusHandler(objects::SUS_6, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_6); + SusHandler* susHandler6 = new SusHandler(objects::SUS_6, 6, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_6); spiCookie = new SpiCookie(addresses::SUS_7, gpioIds::CS_SUS_7, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler7 = - new SusHandler(objects::SUS_7, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_7); + SusHandler* susHandler7 = new SusHandler(objects::SUS_7, 7, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_7); spiCookie = new SpiCookie(addresses::SUS_8, gpioIds::CS_SUS_8, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler8 = - new SusHandler(objects::SUS_8, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_8); + SusHandler* susHandler8 = new SusHandler(objects::SUS_8, 8, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_8); spiCookie = new SpiCookie(addresses::SUS_9, gpioIds::CS_SUS_9, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler9 = - new SusHandler(objects::SUS_9, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_9); + SusHandler* susHandler9 = new SusHandler(objects::SUS_9, 9, objects::SPI_COM_IF, spiCookie, + gpioComIF, gpioIds::CS_SUS_9); spiCookie = new SpiCookie(addresses::SUS_10, gpioIds::CS_SUS_10, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler10 = new SusHandler(objects::SUS_10, objects::SPI_COM_IF, spiCookie, + SusHandler* susHandler10 = new SusHandler(objects::SUS_10, 10, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_10); spiCookie = new SpiCookie(addresses::SUS_11, gpioIds::CS_SUS_11, q7s::SPI_DEFAULT_DEV, SUS::MAX_CMD_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::SUS_MAX1227_SPI_FREQ); - SusHandler* susHandler11 = new SusHandler(objects::SUS_11, objects::SPI_COM_IF, spiCookie, + SusHandler* susHandler11 = new SusHandler(objects::SUS_11, 11, objects::SPI_COM_IF, spiCookie, gpioComIF, gpioIds::CS_SUS_11); static_cast(susHandler0); static_cast(susHandler1); From bbb07dd459efc06d9a3338ad3f97b7269f002481 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 13:10:39 +0100 Subject: [PATCH 057/309] sus dev handler update --- fsfw | 2 +- linux/boardtest/SpiTestClass.cpp | 4 ++-- linux/devices/SusHandler.cpp | 21 +++++++++++---------- linux/devices/SusHandler.h | 3 ++- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/fsfw b/fsfw index 9e92afbf..bd05afbd 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 9e92afbf076b57df843a1ee526bd63c3303995a5 +Subproject commit bd05afbddd7e2da43b19b8ceafb6272e73d5464d diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 60abbe67..5d0fd229 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -308,8 +308,8 @@ void SpiTestClass::performOneShotMax1227Test() { adcCfg.testSus[4].doTest = true; adcCfg.testSus[4].intConv = true; - adcCfg.testSus[1].doTest = true; - adcCfg.testSus[1].intConv = true; + adcCfg.testSus[11].doTest = true; + adcCfg.testSus[11].intConv = true; adcCfg.testSus[5].doTest = true; adcCfg.testSus[5].intConv = true; diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index bf33e4d7..7303c356 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -6,9 +6,9 @@ #include "OBSWConfig.h" -SusHandler::SusHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, +SusHandler::SusHandler(object_id_t objectId, uint8_t susIdx, object_id_t comIF, CookieIF *comCookie, LinuxLibgpioIF *gpioComIF, gpioId_t chipSelectId) - : DeviceHandlerBase(objectId, comIF, comCookie), divider(5), dataset(this) {} + : DeviceHandlerBase(objectId, comIF, comCookie), divider(5), dataset(this), susIdx(susIdx) {} SusHandler::~SusHandler() {} @@ -228,14 +228,15 @@ void SusHandler::setToGoToNormalMode(bool enable) { this->goToNormalModeImmediat void SusHandler::printDataset() { #if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 if (divider.checkAndIncrement()) { - sif::info << "SUS Object ID 0x" << std::hex << this->getObjectId() << ":" << std::endl; - sif::info << "Temperature: " << dataset.temperatureCelcius << " C" << std::endl; - sif::info << "AIN0: " << std::dec << dataset.ain0 << std::endl; - sif::info << "AIN1: " << std::dec << dataset.ain1 << std::endl; - sif::info << "AIN2: " << std::dec << dataset.ain2 << std::endl; - sif::info << "AIN3: " << std::dec << dataset.ain3 << std::endl; - sif::info << "AIN4: " << std::dec << dataset.ain4 << std::endl; - sif::info << "AIN5: " << std::dec << dataset.ain5 << std::endl; + sif::info << "SUS " << std::setw(2) << std::dec << static_cast(susIdx) << " ID " << std::hex + << this->getObjectId() << " [" << std::hex << std::setw(3); + sif::info << dataset.ain0 << ","; + sif::info << dataset.ain1 << ","; + sif::info << dataset.ain2 << ","; + sif::info << dataset.ain3 << ","; + sif::info << dataset.ain4 << ","; + sif::info << dataset.ain5 << "] "; + sif::info << "T[C] " << dataset.temperatureCelcius << " C" << std::endl; } #endif } diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 04fd3032..4088bd0a 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -28,7 +28,7 @@ class SusHandler : public DeviceHandlerBase { static const uint8_t FIRST_WRITE = 7; - SusHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, + SusHandler(object_id_t objectId, uint8_t susIdx, object_id_t comIF, CookieIF* comCookie, LinuxLibgpioIF* gpioComIF, gpioId_t chipSelectId); virtual ~SusHandler(); @@ -79,6 +79,7 @@ class SusHandler : public DeviceHandlerBase { // externally clocked mode ClkModes clkMode = ClkModes::INT_CLOCKED; + uint8_t susIdx = 0; uint8_t cmdBuffer[SUS::MAX_CMD_SIZE]; ComStates comState = ComStates::IDLE; From a6f3b6fc830eb80b5e999f2953425523cba1d39b Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 13:40:20 +0100 Subject: [PATCH 058/309] print event listeners --- bsp_q7s/core/CoreController.cpp | 5 +++++ fsfw | 2 +- linux/devices/SusHandler.cpp | 2 +- mission/core/GenericFactory.cpp | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index bdbd51cc..a979548b 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -1,3 +1,4 @@ +#include #include "CoreController.h" #include "OBSWConfig.h" @@ -99,6 +100,10 @@ ReturnValue_t CoreController::initializeAfterTaskCreation() { setenv("PATH", updatedEnvPath.c_str(), true); updateProtInfo(); initPrint(); + auto eventManager = ObjectManager::instance()->get(objects::EVENT_MANAGER); + if(eventManager != nullptr) { + eventManager->printListeners(); + } return result; } diff --git a/fsfw b/fsfw index bd05afbd..a12e98d9 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit bd05afbddd7e2da43b19b8ceafb6272e73d5464d +Subproject commit a12e98d9481e224a30a1150e9dfd0a48501f410f diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index 7303c356..fc2b92a1 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -229,7 +229,7 @@ void SusHandler::printDataset() { #if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 if (divider.checkAndIncrement()) { sif::info << "SUS " << std::setw(2) << std::dec << static_cast(susIdx) << " ID " << std::hex - << this->getObjectId() << " [" << std::hex << std::setw(3); + << "0x" << this->getObjectId() << " [" << std::hex << std::setw(3); sif::info << dataset.ain0 << ","; sif::info << dataset.ain1 << ","; sif::info << dataset.ain2 << ","; diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index b17812e6..bc2eebad 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -79,7 +79,7 @@ void ObjectFactory::produceGenericObjects() { new Service3Housekeeping(objects::PUS_SERVICE_3_HOUSEKEEPING, apid::EIVE_OBSW, pus::PUS_SERVICE_3); new Service5EventReporting(objects::PUS_SERVICE_5_EVENT_REPORTING, apid::EIVE_OBSW, - pus::PUS_SERVICE_5, 50); + pus::PUS_SERVICE_5, 120); new Service8FunctionManagement(objects::PUS_SERVICE_8_FUNCTION_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_8, 3, 60); new Service9TimeManagement(objects::PUS_SERVICE_9_TIME_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_9); From 2bc717caa05f3ca597840d4ea6de345152d4e8bb Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 14:08:31 +0100 Subject: [PATCH 059/309] increase tm funnel queue depth --- fsfw | 2 +- mission/core/GenericFactory.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fsfw b/fsfw index a12e98d9..0d665696 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit a12e98d9481e224a30a1150e9dfd0a48501f410f +Subproject commit 0d66569687eac9fb5a1ae7eaad8a4c9fbe187b14 diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index bc2eebad..f2449271 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -69,7 +69,7 @@ void ObjectFactory::produceGenericObjects() { objects::CCSDS_PACKET_DISTRIBUTOR); // Every TM packet goes through this funnel - new TmFunnel(objects::TM_FUNNEL); + new TmFunnel(objects::TM_FUNNEL, 50); // PUS service stack new Service1TelecommandVerification(objects::PUS_SERVICE_1_VERIFICATION, apid::EIVE_OBSW, From 1e3311f63583c040cda8a8ac73a416f356b2ea41 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 14:52:40 +0100 Subject: [PATCH 060/309] first mq args test --- bsp_q7s/devices/startracker/StarTrackerHandler.cpp | 4 +++- fsfw | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp index 71df6b0b..ec762551 100644 --- a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp +++ b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp @@ -44,7 +44,9 @@ StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF, if (strHelper == nullptr) { sif::error << "StarTrackerHandler: Invalid str image loader" << std::endl; } - eventQueue = QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5); + auto mqArgs = MqArgs(this->getObjectId()); + eventQueue = QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5, + MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } StarTrackerHandler::~StarTrackerHandler() {} diff --git a/fsfw b/fsfw index 0d665696..508979d3 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 0d66569687eac9fb5a1ae7eaad8a4c9fbe187b14 +Subproject commit 508979d32d4e5910259bfb52b8fe16d1bb4f1cdb From 1400945d9979d6fb7f5ecb17f1367cb3c6174301 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 14:59:41 +0100 Subject: [PATCH 061/309] fix compilation for rpi --- CMakeLists.txt | 4 ++ bsp_linux_board/CMakeLists.txt | 2 +- bsp_linux_board/boardconfig/CMakeLists.txt | 4 +- bsp_linux_board/boardtest/CMakeLists.txt | 2 +- fsfw | 2 +- linux/boardtest/SpiTestClass.cpp | 2 + linux/devices/CMakeLists.txt | 6 ++ .../devices/GPSHyperionLinuxController.cpp | 0 .../devices/GPSHyperionLinuxController.h | 0 .../devicedefinitions/GPSDefinitions.h | 63 +++++++++++++++++++ mission/devices/CMakeLists.txt | 1 - 11 files changed, 80 insertions(+), 6 deletions(-) rename {mission => linux}/devices/GPSHyperionLinuxController.cpp (100%) rename {mission => linux}/devices/GPSHyperionLinuxController.h (100%) create mode 100644 linux/devices/devicedefinitions/GPSDefinitions.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a3dd1d7c..c75e2af3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ set(CMAKE_SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") option(EIVE_BUILD_UNITTESTS "Build Catch2 unittests" OFF) option(EIVE_ADD_ETL_LIB "Add ETL library" ON) option(EIVE_ADD_JSON_LIB "Add JSON library" ON) + option(EIVE_SYSROOT_MAGIC "Perform sysroot magic which might not be necessary" OFF) if(NOT FSFW_OSAL) @@ -24,6 +25,9 @@ endif() if(TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/beagleboneblack") option(LINUX_CROSS_COMPILE ON) + option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" OFF) +else() + option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" ON) endif() # Perform steps like loading toolchain files where applicable. diff --git a/bsp_linux_board/CMakeLists.txt b/bsp_linux_board/CMakeLists.txt index 5963d48c..0272f476 100644 --- a/bsp_linux_board/CMakeLists.txt +++ b/bsp_linux_board/CMakeLists.txt @@ -1,4 +1,4 @@ -target_sources(${TARGET_NAME} PUBLIC +target_sources(${OBSW_NAME} PUBLIC InitMission.cpp main.cpp ObjectFactory.cpp diff --git a/bsp_linux_board/boardconfig/CMakeLists.txt b/bsp_linux_board/boardconfig/CMakeLists.txt index 67fbaf88..f9136e3e 100644 --- a/bsp_linux_board/boardconfig/CMakeLists.txt +++ b/bsp_linux_board/boardconfig/CMakeLists.txt @@ -1,7 +1,7 @@ -target_sources(${TARGET_NAME} PRIVATE +target_sources(${OBSW_NAME} PRIVATE print.c ) -target_include_directories(${TARGET_NAME} PUBLIC +target_include_directories(${OBSW_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) diff --git a/bsp_linux_board/boardtest/CMakeLists.txt b/bsp_linux_board/boardtest/CMakeLists.txt index 0599b73f..fe4910f2 100644 --- a/bsp_linux_board/boardtest/CMakeLists.txt +++ b/bsp_linux_board/boardtest/CMakeLists.txt @@ -1,4 +1,4 @@ -target_sources(${TARGET_NAME} PRIVATE +target_sources(${OBSW_NAME} PRIVATE ) diff --git a/fsfw b/fsfw index 0d6d44f7..508979d3 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 0d6d44f72fb28ba480482f5d8b2eee6f78d664ce +Subproject commit 508979d32d4e5910259bfb52b8fe16d1bb4f1cdb diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 4d909d10..3e23e542 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -15,7 +15,9 @@ #include +#if defined(XIPHOS_Q7S) #include "busConf.h" +#endif #include "devices/gpioIds.h" #include "mission/devices/max1227.h" diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt index 6537d669..a2bfa035 100644 --- a/linux/devices/CMakeLists.txt +++ b/linux/devices/CMakeLists.txt @@ -3,3 +3,9 @@ target_sources(${OBSW_NAME} PRIVATE PayloadPcduHandler.cpp SusHandler.cpp ) + +if(EIVE_BUILD_GPSD_GPS_HANDLER) + target_sources(${OBSW_NAME} PRIVATE + GPSHyperionLinuxController.cpp + ) +endif() diff --git a/mission/devices/GPSHyperionLinuxController.cpp b/linux/devices/GPSHyperionLinuxController.cpp similarity index 100% rename from mission/devices/GPSHyperionLinuxController.cpp rename to linux/devices/GPSHyperionLinuxController.cpp diff --git a/mission/devices/GPSHyperionLinuxController.h b/linux/devices/GPSHyperionLinuxController.h similarity index 100% rename from mission/devices/GPSHyperionLinuxController.h rename to linux/devices/GPSHyperionLinuxController.h diff --git a/linux/devices/devicedefinitions/GPSDefinitions.h b/linux/devices/devicedefinitions/GPSDefinitions.h new file mode 100644 index 00000000..5a565fea --- /dev/null +++ b/linux/devices/devicedefinitions/GPSDefinitions.h @@ -0,0 +1,63 @@ +#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ +#define MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ + +#include "fsfw/datapoollocal/StaticLocalDataSet.h" +#include "fsfw/devicehandlers/DeviceHandlerIF.h" + +namespace GpsHyperion { + +static constexpr DeviceCommandId_t GPS_REPLY = 0; +static constexpr DeviceCommandId_t TRIGGER_RESET_PIN = 5; + +static constexpr uint32_t DATASET_ID = 0; + +enum GpsPoolIds : lp_id_t { + LATITUDE = 0, + LONGITUDE = 1, + ALTITUDE = 2, + SPEED = 3, + FIX_MODE = 4, + SATS_IN_USE = 5, + SATS_IN_VIEW = 6, + UNIX_SECONDS = 7, + YEAR = 8, + MONTH = 9, + DAY = 10, + HOURS = 11, + MINUTES = 12, + SECONDS = 13 +}; + +enum GpsFixModes : uint8_t { INVALID = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 }; + +} // namespace GpsHyperion + +class GpsPrimaryDataset : public StaticLocalDataSet<18> { + public: + GpsPrimaryDataset(object_id_t gpsId) : StaticLocalDataSet(sid_t(gpsId, GpsHyperion::DATASET_ID)) { + setAllVariablesReadOnly(); + } + + lp_var_t latitude = lp_var_t(sid.objectId, GpsHyperion::LATITUDE, this); + lp_var_t longitude = lp_var_t(sid.objectId, GpsHyperion::LONGITUDE, this); + lp_var_t altitude = lp_var_t(sid.objectId, GpsHyperion::ALTITUDE, this); + lp_var_t speed = lp_var_t(sid.objectId, GpsHyperion::SPEED, this); + lp_var_t fixMode = lp_var_t(sid.objectId, GpsHyperion::FIX_MODE, this); + lp_var_t satInUse = lp_var_t(sid.objectId, GpsHyperion::SATS_IN_USE, this); + lp_var_t satInView = lp_var_t(sid.objectId, GpsHyperion::SATS_IN_VIEW, this); + lp_var_t year = lp_var_t(sid.objectId, GpsHyperion::YEAR, this); + lp_var_t month = lp_var_t(sid.objectId, GpsHyperion::MONTH, this); + lp_var_t day = lp_var_t(sid.objectId, GpsHyperion::DAY, this); + lp_var_t hours = lp_var_t(sid.objectId, GpsHyperion::HOURS, this); + lp_var_t minutes = lp_var_t(sid.objectId, GpsHyperion::MINUTES, this); + lp_var_t seconds = lp_var_t(sid.objectId, GpsHyperion::SECONDS, this); + lp_var_t unixSeconds = + lp_var_t(sid.objectId, GpsHyperion::UNIX_SECONDS, this); + + private: + friend class GPSHyperionLinuxController; + GpsPrimaryDataset(HasLocalDataPoolIF* hkOwner) + : StaticLocalDataSet(hkOwner, GpsHyperion::DATASET_ID) {} +}; + +#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ */ diff --git a/mission/devices/CMakeLists.txt b/mission/devices/CMakeLists.txt index 886f0a32..2e956c0e 100644 --- a/mission/devices/CMakeLists.txt +++ b/mission/devices/CMakeLists.txt @@ -1,5 +1,4 @@ target_sources(${LIB_EIVE_MISSION} PRIVATE - GPSHyperionLinuxController.cpp GomspaceDeviceHandler.cpp BpxBatteryHandler.cpp Tmp1075Handler.cpp From fc3fb7002599740d6b0198ebf84832f6dc8ecfec Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 18 Feb 2022 18:21:42 +0100 Subject: [PATCH 062/309] some more rtd tests --- bsp_q7s/core/CoreController.cpp | 5 +- bsp_q7s/core/ObjectFactory.cpp | 31 +++++++++++- bsp_q7s/devices/PlocMemoryDumper.cpp | 4 +- bsp_q7s/devices/PlocUpdater.cpp | 4 +- .../startracker/StarTrackerHandler.cpp | 4 +- linux/devices/SusHandler.cpp | 4 +- linux/fsfwconfig/OBSWConfig.h.in | 1 + .../pollingSequenceFactory.cpp | 47 +++++++++---------- 8 files changed, 64 insertions(+), 36 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index a979548b..f386b444 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -1,6 +1,7 @@ -#include #include "CoreController.h" +#include + #include "OBSWConfig.h" #include "OBSWVersion.h" #include "fsfw/FSFWVersion.h" @@ -101,7 +102,7 @@ ReturnValue_t CoreController::initializeAfterTaskCreation() { updateProtInfo(); initPrint(); auto eventManager = ObjectManager::instance()->get(objects::EVENT_MANAGER); - if(eventManager != nullptr) { + if (eventManager != nullptr) { eventManager->printListeners(); } return result; diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 80e5d242..8dc03285 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -43,6 +43,7 @@ #include "linux/boardtest/SpiTestClass.h" #include "linux/csp/CspComIF.h" #include "linux/csp/CspCookie.h" +#include "linux/devices/GPSHyperionLinuxController.h" #include "linux/devices/PayloadPcduHandler.h" #include "linux/devices/SolarArrayDeploymentHandler.h" #include "linux/devices/SusHandler.h" @@ -51,7 +52,6 @@ #include "mission/core/GenericFactory.h" #include "mission/devices/ACUHandler.h" #include "mission/devices/BpxBatteryHandler.h" -#include "mission/devices/GPSHyperionLinuxController.h" #include "mission/devices/GyroADIS1650XHandler.h" #include "mission/devices/HeaterHandler.h" #include "mission/devices/IMTQHandler.h" @@ -878,13 +878,40 @@ void ObjectFactory::createRtdComponents(LinuxLibgpioIF* gpioComIF) { Max31865PT1000Handler* rtdIc15 = new Max31865PT1000Handler(objects::RTD_IC_18, objects::SPI_COM_IF, spiRtdIc15); +#if OBSW_TEST_RTD == 1 rtdIc0->setStartUpImmediately(); rtdIc1->setStartUpImmediately(); rtdIc2->setStartUpImmediately(); -#if OBSW_DEBUG_RTD == 1 + rtdIc3->setStartUpImmediately(); + rtdIc4->setStartUpImmediately(); + rtdIc5->setStartUpImmediately(); + rtdIc6->setStartUpImmediately(); + rtdIc7->setStartUpImmediately(); + rtdIc8->setStartUpImmediately(); + rtdIc9->setStartUpImmediately(); + rtdIc10->setStartUpImmediately(); + rtdIc11->setStartUpImmediately(); + rtdIc12->setStartUpImmediately(); + rtdIc13->setStartUpImmediately(); + rtdIc14->setStartUpImmediately(); + rtdIc15->setStartUpImmediately(); + rtdIc0->setInstantNormal(true); rtdIc1->setInstantNormal(true); rtdIc2->setInstantNormal(true); + rtdIc3->setInstantNormal(true); + rtdIc4->setInstantNormal(true); + rtdIc5->setInstantNormal(true); + rtdIc6->setInstantNormal(true); + rtdIc7->setInstantNormal(true); + rtdIc8->setInstantNormal(true); + rtdIc9->setInstantNormal(true); + rtdIc10->setInstantNormal(true); + rtdIc11->setInstantNormal(true); + rtdIc12->setInstantNormal(true); + rtdIc13->setInstantNormal(true); + rtdIc14->setInstantNormal(true); + rtdIc15->setInstantNormal(true); #endif static_cast(rtdIc0); diff --git a/bsp_q7s/devices/PlocMemoryDumper.cpp b/bsp_q7s/devices/PlocMemoryDumper.cpp index c7ba58bd..1d5dce85 100644 --- a/bsp_q7s/devices/PlocMemoryDumper.cpp +++ b/bsp_q7s/devices/PlocMemoryDumper.cpp @@ -10,7 +10,9 @@ PlocMemoryDumper::PlocMemoryDumper(object_id_t objectId) : SystemObject(objectId), commandActionHelper(this), actionHelper(this, nullptr) { - commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE); + auto mqArgs = MqArgs(this->getObjectId()); + commandQueue = QueueFactory::instance()->createMessageQueue( + QUEUE_SIZE, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } PlocMemoryDumper::~PlocMemoryDumper() {} diff --git a/bsp_q7s/devices/PlocUpdater.cpp b/bsp_q7s/devices/PlocUpdater.cpp index 1478fbb8..b1d7f0c9 100644 --- a/bsp_q7s/devices/PlocUpdater.cpp +++ b/bsp_q7s/devices/PlocUpdater.cpp @@ -8,7 +8,9 @@ PlocUpdater::PlocUpdater(object_id_t objectId) : SystemObject(objectId), commandActionHelper(this), actionHelper(this, nullptr) { - commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE); + auto mqArgs = MqArgs(this->getObjectId()); + commandQueue = QueueFactory::instance()->createMessageQueue( + QUEUE_SIZE, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } PlocUpdater::~PlocUpdater() {} diff --git a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp index ec762551..e5601ac0 100644 --- a/bsp_q7s/devices/startracker/StarTrackerHandler.cpp +++ b/bsp_q7s/devices/startracker/StarTrackerHandler.cpp @@ -45,8 +45,8 @@ StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF, sif::error << "StarTrackerHandler: Invalid str image loader" << std::endl; } auto mqArgs = MqArgs(this->getObjectId()); - eventQueue = QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 5, - MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); + eventQueue = QueueFactory::instance()->createMessageQueue( + EventMessage::EVENT_MESSAGE_SIZE * 5, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } StarTrackerHandler::~StarTrackerHandler() {} diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index fc2b92a1..e36460a3 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -228,8 +228,8 @@ void SusHandler::setToGoToNormalMode(bool enable) { this->goToNormalModeImmediat void SusHandler::printDataset() { #if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 if (divider.checkAndIncrement()) { - sif::info << "SUS " << std::setw(2) << std::dec << static_cast(susIdx) << " ID " << std::hex - << "0x" << this->getObjectId() << " [" << std::hex << std::setw(3); + sif::info << "SUS " << std::setw(2) << std::dec << static_cast(susIdx) << " ID " + << std::hex << "0x" << this->getObjectId() << " [" << std::hex << std::setw(3); sif::info << dataset.ain0 << ","; sif::info << dataset.ain1 << ","; sif::info << dataset.ain2 << ","; diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index 217c4914..75b633e4 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -82,6 +82,7 @@ debugging. */ #define OBSW_TEST_SUS_HANDLER 0 #define OBSW_TEST_PLOC_HANDLER 0 #define OBSW_TEST_BPX_BATT 0 +#define OBSW_TEST_RTD 0 #define OBSW_TEST_CCSDS_BRIDGE 0 #define OBSW_TEST_CCSDS_PTME 0 #define OBSW_TEST_TE7020_HEATER 0 diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index b43c403f..d0b5efd0 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -371,32 +371,27 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::MGM_0_LIS3_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::MGM_0_LIS3_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); - // thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0, - // DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.25, - // DeviceHandlerIF::SEND_WRITE); - // thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.6, - // DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * - // 0.75, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, - // length * 0.85, DeviceHandlerIF::GET_READ); - // - // thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0, - // DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.3, - // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * - // 0.6, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, - // length * 0.75, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.85, - // DeviceHandlerIF::GET_READ); - // - // thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0, - // DeviceHandlerIF::PERFORM_OPERATION); - // thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.35, - // DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * - // 0.6, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, - // length * 0.75, DeviceHandlerIF::SEND_READ); - // thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.85, - // DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0, + DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.25, + DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0, + DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.3, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); + + thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0, + DeviceHandlerIF::PERFORM_OPERATION); + thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.35, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); } if (enableBside) { From 4fce0fd0e032f904f968bb9fe3055c565406a020 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 19 Feb 2022 16:42:22 +0100 Subject: [PATCH 063/309] cleaned up config flags a bit --- bsp_q7s/core/CoreController.cpp | 4 -- bsp_q7s/core/ObjectFactory.cpp | 53 +++++++++++++------ bsp_q7s/memory/FileSystemHandler.cpp | 4 +- fsfw | 2 +- linux/devices/SolarArrayDeploymentHandler.cpp | 3 +- linux/fsfwconfig/OBSWConfig.h.in | 17 +++--- .../pollingSequenceFactory.cpp | 26 ++++----- linux/obc/PdecHandler.cpp | 4 +- mission/devices/GyroADIS1650XHandler.cpp | 41 +++++++------- mission/devices/GyroADIS1650XHandler.h | 7 +-- mission/devices/HeaterHandler.cpp | 3 +- mission/devices/PCDUHandler.cpp | 3 +- mission/tmtc/CCSDSHandler.cpp | 4 +- mission/tmtc/CCSDSHandler.h | 2 +- mission/tmtc/VirtualChannel.cpp | 8 +-- mission/tmtc/VirtualChannel.h | 2 +- mission/utility/TmFunnel.cpp | 7 +-- 17 files changed, 113 insertions(+), 77 deletions(-) diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index f386b444..3d279487 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -101,10 +101,6 @@ ReturnValue_t CoreController::initializeAfterTaskCreation() { setenv("PATH", updatedEnvPath.c_str(), true); updateProtInfo(); initPrint(); - auto eventManager = ObjectManager::instance()->get(objects::EVENT_MANAGER); - if (eventManager != nullptr) { - eventManager->printListeners(); - } return result; } diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 8dc03285..8ce3b422 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -305,7 +305,7 @@ void ObjectFactory::createRadSensorComponent(LinuxLibgpioIF* gpioComIF) { auto radSensor = new RadiationSensorHandler(objects::RAD_SENSOR, objects::SPI_COM_IF, spiCookieRadSensor); static_cast(radSensor); -#if OBSW_TEST_RADIATION_SENSOR_HANDLER == 1 +#if OBSW_TEST_RAD_SENSOR == 1 radSensor->setStartUpImmediately(); radSensor->setToGoToNormalModeImmediately(); #endif @@ -438,7 +438,7 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI static_cast(susHandler9); static_cast(susHandler10); static_cast(susHandler11); -#if OBSW_TEST_SUS_HANDLER == 1 +#if OBSW_TEST_SUS == 1 susHandler0->setStartUpImmediately(); susHandler1->setStartUpImmediately(); susHandler2->setStartUpImmediately(); @@ -574,9 +574,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED); auto mgmLis3Handler = new MgmLIS3MDLHandler(objects::MGM_0_LIS3_HANDLER, objects::SPI_COM_IF, spiCookie, spi::LIS3_TRANSITION_DELAY); +#if OBSW_TEST_ACS == 1 mgmLis3Handler->setStartUpImmediately(); -#if FSFW_HAL_LIS3MDL_MGM_DEBUG == 1 mgmLis3Handler->setToGoToNormalMode(true); +#if OBSW_DEBUG_ACS == 1 + mgmLis3Handler->enablePeriodicPrintouts(true, 10); +#endif #endif spiCookie = @@ -584,9 +587,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED); auto mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_1_RM3100_HANDLER, objects::SPI_COM_IF, spiCookie, spi::RM3100_TRANSITION_DELAY); +#if OBSW_TEST_ACS == 1 mgmRm3100Handler->setStartUpImmediately(); -#if FSFW_HAL_RM3100_MGM_DEBUG == 1 mgmRm3100Handler->setToGoToNormalMode(true); +#if OBSW_DEBUG_ACS == 1 + mgmRm3100Handler->enablePeriodicPrintouts(true, 10); +#endif #endif spiCookie = @@ -594,9 +600,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI MGMLIS3MDL::MAX_BUFFER_SIZE, spi::DEFAULT_LIS3_MODE, spi::DEFAULT_LIS3_SPEED); auto mgmLis3Handler2 = new MgmLIS3MDLHandler(objects::MGM_2_LIS3_HANDLER, objects::SPI_COM_IF, spiCookie, spi::LIS3_TRANSITION_DELAY); +#if OBSW_TEST_ACS == 1 mgmLis3Handler2->setStartUpImmediately(); -#if FSFW_HAL_LIS3MDL_MGM_DEBUG == 1 mgmLis3Handler2->setToGoToNormalMode(true); +#if OBSW_DEBUG_ACS == 1 + mgmLis3Handler2->enablePeriodicPrintouts(true, 10); +#endif #endif spiCookie = @@ -604,9 +613,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI RM3100::MAX_BUFFER_SIZE, spi::DEFAULT_RM3100_MODE, spi::DEFAULT_RM3100_SPEED); mgmRm3100Handler = new MgmRM3100Handler(objects::MGM_3_RM3100_HANDLER, objects::SPI_COM_IF, spiCookie, spi::RM3100_TRANSITION_DELAY); +#if OBSW_TEST_ACS == 1 mgmRm3100Handler->setStartUpImmediately(); -#if FSFW_HAL_RM3100_MGM_DEBUG == 1 mgmRm3100Handler->setToGoToNormalMode(true); +#if OBSW_DEBUG_ACS == 1 + mgmRm3100Handler->enablePeriodicPrintouts(true, 10); +#endif #endif // Commented until ACS board V2 in in clean room again @@ -616,9 +628,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI spi::DEFAULT_ADIS16507_SPEED); auto adisHandler = new GyroADIS1650XHandler(objects::GYRO_0_ADIS_HANDLER, objects::SPI_COM_IF, spiCookie, ADIS1650X::Type::ADIS16505); +#if OBSW_TEST_ACS == 1 adisHandler->setStartUpImmediately(); -#if FSFW_HAL_ADIS1650X_GYRO_DEBUG == 1 adisHandler->setToGoToNormalModeImmediately(); +#if OBSW_DEBUG_ACS == 1 + adisHandler->enablePeriodicPrintouts(true, 10); +#endif #endif // Gyro 1 Side A @@ -627,9 +642,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED); auto gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_1_L3G_HANDLER, objects::SPI_COM_IF, spiCookie, spi::L3G_TRANSITION_DELAY); +#if OBSW_TEST_ACS == 1 gyroL3gHandler->setStartUpImmediately(); -#if FSFW_HAL_L3GD20_GYRO_DEBUG == 1 gyroL3gHandler->setToGoToNormalMode(true); +#if OBSW_DEBUG_ACS == 1 + gyroL3gHandler->enablePeriodicPrintouts(true, 10); +#endif #endif // Gyro 2 Side B spiCookie = new SpiCookie(addresses::GYRO_2_ADIS, gpioIds::GYRO_2_ADIS_CS, spiDev, @@ -637,8 +655,8 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI spi::DEFAULT_ADIS16507_SPEED); adisHandler = new GyroADIS1650XHandler(objects::GYRO_2_ADIS_HANDLER, objects::SPI_COM_IF, spiCookie, ADIS1650X::Type::ADIS16505); +#if OBSW_TEST_ACS == 1 adisHandler->setStartUpImmediately(); -#if FSFW_HAL_ADIS1650X_GYRO_DEBUG == 1 adisHandler->setToGoToNormalModeImmediately(); #endif // Gyro 3 Side B @@ -647,9 +665,12 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI spi::DEFAULT_L3G_MODE, spi::DEFAULT_L3G_SPEED); gyroL3gHandler = new GyroHandlerL3GD20H(objects::GYRO_3_L3G_HANDLER, objects::SPI_COM_IF, spiCookie, spi::L3G_TRANSITION_DELAY); +#if OBSW_TEST_ACS == 1 gyroL3gHandler->setStartUpImmediately(); -#if FSFW_HAL_L3GD20_GYRO_DEBUG == 1 gyroL3gHandler->setToGoToNormalMode(true); +#if OBSW_DEBUG_ACS == 1 + gyroL3gHandler->enablePeriodicPrintouts(true, 10); +#endif #endif bool debugGps = false; @@ -1083,13 +1104,13 @@ void ObjectFactory::createCcsdsComponents(LinuxLibgpioIF* gpioComIF) { gpioComIF, gpioIds::RS485_EN_TX_CLOCK, gpioIds::RS485_EN_TX_DATA); VirtualChannel* vc = nullptr; - vc = new VirtualChannel(ccsds::VC0, common::VC0_QUEUE_SIZE); + vc = new VirtualChannel(ccsds::VC0, common::VC0_QUEUE_SIZE, objects::CCSDS_HANDLER); ccsdsHandler->addVirtualChannel(ccsds::VC0, vc); - vc = new VirtualChannel(ccsds::VC1, common::VC1_QUEUE_SIZE); + vc = new VirtualChannel(ccsds::VC1, common::VC1_QUEUE_SIZE, objects::CCSDS_HANDLER); ccsdsHandler->addVirtualChannel(ccsds::VC1, vc); - vc = new VirtualChannel(ccsds::VC2, common::VC2_QUEUE_SIZE); + vc = new VirtualChannel(ccsds::VC2, common::VC2_QUEUE_SIZE, objects::CCSDS_HANDLER); ccsdsHandler->addVirtualChannel(ccsds::VC2, vc); - vc = new VirtualChannel(ccsds::VC3, common::VC3_QUEUE_SIZE); + vc = new VirtualChannel(ccsds::VC3, common::VC3_QUEUE_SIZE, objects::CCSDS_HANDLER); ccsdsHandler->addVirtualChannel(ccsds::VC3, vc); GpioCookie* gpioCookiePdec = new GpioCookie; @@ -1197,7 +1218,7 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { new LibgpiodTest(objects::LIBGPIOD_TEST, objects::GPIO_IF, gpioCookie); #endif -#if BOARD_TE0720 == 1 && OBSW_TEST_SUS_HANDLER == 1 +#if BOARD_TE0720 == 1 && OBSW_TEST_SUS == 1 GpioCookie* gpioCookieSus = new GpioCookie; GpiodRegular* chipSelectSus = new GpiodRegular( std::string("gpiochip1"), 9, std::string("Chip Select Sus Sensor"), gpio::DIR_OUT, 1); @@ -1226,7 +1247,7 @@ void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { gpioIds::PAPB_BUSY_N, gpioIds::PAPB_EMPTY); #endif -#if BOARD_TE0720 == 1 && OBSW_TEST_RADIATION_SENSOR_HANDLER == 1 +#if BOARD_TE0720 == 1 && OBSW_TEST_RAD_SENSOR == 1 GpioCookie* gpioCookieRadSensor = new GpioCookie; GpiodRegular* chipSelectRadSensor = new GpiodRegular( std::string("gpiochip1"), 0, std::string("Chip select radiation sensor"), gpio::DIR_OUT, 1); diff --git a/bsp_q7s/memory/FileSystemHandler.cpp b/bsp_q7s/memory/FileSystemHandler.cpp index 8b5f85c2..7a4a791c 100644 --- a/bsp_q7s/memory/FileSystemHandler.cpp +++ b/bsp_q7s/memory/FileSystemHandler.cpp @@ -11,7 +11,9 @@ FileSystemHandler::FileSystemHandler(object_id_t fileSystemHandler) : SystemObject(fileSystemHandler) { - mq = QueueFactory::instance()->createMessageQueue(FS_MAX_QUEUE_SIZE); + auto mqArgs = MqArgs(this->getObjectId()); + mq = QueueFactory::instance()->createMessageQueue(FS_MAX_QUEUE_SIZE, + MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } FileSystemHandler::~FileSystemHandler() { QueueFactory::instance()->deleteMessageQueue(mq); } diff --git a/fsfw b/fsfw index 508979d3..d74a373f 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 508979d32d4e5910259bfb52b8fe16d1bb4f1cdb +Subproject commit d74a373f1d6bc341c11d7ad89f369da5ff957928 diff --git a/linux/devices/SolarArrayDeploymentHandler.cpp b/linux/devices/SolarArrayDeploymentHandler.cpp index fed3992b..13b46171 100644 --- a/linux/devices/SolarArrayDeploymentHandler.cpp +++ b/linux/devices/SolarArrayDeploymentHandler.cpp @@ -21,8 +21,9 @@ SolarArrayDeploymentHandler::SolarArrayDeploymentHandler(object_id_t setObjectId deplSA2(deplSA2), burnTimeMs(burnTimeMs), actionHelper(this, nullptr) { + auto mqArgs = MqArgs(setObjectId_, static_cast(this)); commandQueue = QueueFactory::instance()->createMessageQueue( - cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE); + cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } SolarArrayDeploymentHandler::~SolarArrayDeploymentHandler() {} diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index 75b633e4..569818f0 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -63,7 +63,7 @@ debugging. */ /** All of the following flags should be disabled for mission code */ /*******************************************************************/ -//! /* Can be used to switch device to NORMAL mode immediately */ +// Can be used to switch device to NORMAL mode immediately #define OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP 1 #define OBSW_PRINT_MISSED_DEADLINES 1 @@ -77,18 +77,22 @@ debugging. */ #define OBSW_ADD_I2C_TEST_CODE 0 #define OBSW_ADD_UART_TEST_CODE 0 +#define OBSW_TEST_ACS 0 +#define OBSW_DEBUG_ACS 0 +#define OBSW_TEST_SUS 0 +#define OBSW_DEBUG_SUS 0 +#define OBSW_TEST_RTD 0 +#define OBSW_DEBUG_RTD 0 +#define OBSW_TEST_RAD_SENSOR 0 +#define OBSW_DEBUG_RAD_SENSOR 0 #define OBSW_TEST_LIBGPIOD 0 -#define OBSW_TEST_RADIATION_SENSOR_HANDLER 0 -#define OBSW_TEST_SUS_HANDLER 0 #define OBSW_TEST_PLOC_HANDLER 0 #define OBSW_TEST_BPX_BATT 0 -#define OBSW_TEST_RTD 0 #define OBSW_TEST_CCSDS_BRIDGE 0 #define OBSW_TEST_CCSDS_PTME 0 #define OBSW_TEST_TE7020_HEATER 0 #define OBSW_TEST_GPIO_OPEN_BY_LABEL 0 #define OBSW_TEST_GPIO_OPEN_BY_LINE_NAME 0 - #define OBSW_DEBUG_P60DOCK 0 #define OBSW_DEBUG_BPX_BATT 0 #define OBSW_DEBUG_PDU1 0 @@ -97,9 +101,6 @@ debugging. */ #define OBSW_DEBUG_ACU 0 #define OBSW_DEBUG_SYRLINKS 0 #define OBSW_DEBUG_IMTQ 0 -#define OBSW_DEBUG_RAD_SENSOR 0 -#define OBSW_DEBUG_SUS 0 -#define OBSW_DEBUG_RTD 0 #define OBSW_DEBUG_RW 0 #define OBSW_DEBUG_STARTRACKER 0 #define OBSW_DEBUG_PLOC_MPSOC 0 diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index d0b5efd0..0c7fcd9c 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -376,21 +376,21 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.25, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::MGM_1_RM3100_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.3, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.25, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::GYRO_0_ADIS_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.35, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.25, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::GYRO_1_L3G_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); } @@ -398,7 +398,7 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { // B side thisSequence->addSlot(objects::MGM_2_LIS3_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::MGM_2_LIS3_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::MGM_2_LIS3_HANDLER, length * 0.25, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::MGM_2_LIS3_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::MGM_2_LIS3_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::MGM_2_LIS3_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); @@ -408,21 +408,21 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::MGM_3_RM3100_HANDLER, length * 0.25, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::MGM_3_RM3100_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::MGM_3_RM3100_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::MGM_3_RM3100_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::MGM_3_RM3100_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); thisSequence->addSlot(objects::GYRO_2_ADIS_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::GYRO_2_ADIS_HANDLER, length * 0.3, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::GYRO_2_ADIS_HANDLER, length * 0.25, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_2_ADIS_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::GYRO_2_ADIS_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::GYRO_2_ADIS_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::GYRO_2_ADIS_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.35, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.25, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.6, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::GYRO_3_L3G_HANDLER, length * 0.85, DeviceHandlerIF::GET_READ); } #endif /* OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 */ @@ -609,7 +609,7 @@ ReturnValue_t pst::pollingSequenceTE0720(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::PLOC_MPSOC_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ); #endif -#if OBSW_TEST_RADIATION_SENSOR_HANDLER == 1 +#if OBSW_TEST_RAD_SENSOR == 1 thisSequence->addSlot(objects::RAD_SENSOR, length * 0, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::RAD_SENSOR, length * 0.2, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::RAD_SENSOR, length * 0.4, DeviceHandlerIF::GET_WRITE); @@ -617,7 +617,7 @@ ReturnValue_t pst::pollingSequenceTE0720(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::RAD_SENSOR, length * 0.8, DeviceHandlerIF::GET_READ); #endif -#if OBSW_TEST_SUS_HANDLER == 1 +#if OBSW_TEST_SUS == 1 /* Write setup */ thisSequence->addSlot(objects::SUS_1, length * 0.901, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::SUS_1, length * 0.902, SusHandler::FIRST_WRITE); diff --git a/linux/obc/PdecHandler.cpp b/linux/obc/PdecHandler.cpp index f97c3965..b302d99e 100644 --- a/linux/obc/PdecHandler.cpp +++ b/linux/obc/PdecHandler.cpp @@ -24,7 +24,9 @@ PdecHandler::PdecHandler(object_id_t objectId, object_id_t tcDestinationId, uioRamMemory(uioRamMemory), uioRegisters(uioRegisters), actionHelper(this, nullptr) { - commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE); + auto mqArgs = MqArgs(objectId, static_cast(this)); + commandQueue = QueueFactory::instance()->createMessageQueue( + QUEUE_SIZE, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } PdecHandler::~PdecHandler() {} diff --git a/mission/devices/GyroADIS1650XHandler.cpp b/mission/devices/GyroADIS1650XHandler.cpp index 0965e265..e3e418f7 100644 --- a/mission/devices/GyroADIS1650XHandler.cpp +++ b/mission/devices/GyroADIS1650XHandler.cpp @@ -20,10 +20,6 @@ GyroADIS1650XHandler::GyroADIS1650XHandler(object_id_t objectId, object_id_t dev primaryDataset(this), configDataset(this), breakCountdown() { -#if FSFW_HAL_ADIS1650X_GYRO_DEBUG == 1 - debugDivider = new PeriodicOperationDivider(5); -#endif - #if OBSW_ADIS1650X_LINUX_COM_IF == 1 SpiCookie *cookie = dynamic_cast(comCookie); if (cookie != nullptr) { @@ -101,7 +97,7 @@ ReturnValue_t GyroADIS1650XHandler::buildCommandFromCommand(DeviceCommandId_t de switch (deviceCommand) { case (ADIS1650X::READ_OUT_CONFIG): { this->rawPacketLen = ADIS1650X::CONFIG_READOUT_SIZE; - uint8_t regList[5]; + uint8_t regList[5] = {}; regList[0] = ADIS1650X::DIAG_STAT_REG; regList[1] = ADIS1650X::FILTER_CTRL_REG; regList[2] = ADIS1650X::MSC_CTRL_REG; @@ -305,18 +301,18 @@ ReturnValue_t GyroADIS1650XHandler::handleSensorData(const uint8_t *packet) { primaryDataset.setValidity(true, true); } -#if FSFW_HAL_ADIS1650X_GYRO_DEBUG == 1 - if (debugDivider->checkAndIncrement()) { - sif::info << "GyroADIS1650XHandler: Angular velocities in deg / s" << std::endl; - sif::info << "X: " << primaryDataset.angVelocX.value << std::endl; - sif::info << "Y: " << primaryDataset.angVelocY.value << std::endl; - sif::info << "Z: " << primaryDataset.angVelocZ.value << std::endl; - sif::info << "GyroADIS1650XHandler: Accelerations in m / s^2: " << std::endl; - sif::info << "X: " << primaryDataset.accelX.value << std::endl; - sif::info << "Y: " << primaryDataset.accelY.value << std::endl; - sif::info << "Z: " << primaryDataset.accelZ.value << std::endl; + if (periodicPrintout) { + if (debugDivider.checkAndIncrement()) { + sif::info << "GyroADIS1650XHandler: Angular velocities in deg / s" << std::endl; + sif::info << "X: " << primaryDataset.angVelocX.value << std::endl; + sif::info << "Y: " << primaryDataset.angVelocY.value << std::endl; + sif::info << "Z: " << primaryDataset.angVelocZ.value << std::endl; + sif::info << "GyroADIS1650XHandler: Accelerations in m / s^2: " << std::endl; + sif::info << "X: " << primaryDataset.accelX.value << std::endl; + sif::info << "Y: " << primaryDataset.accelY.value << std::endl; + sif::info << "Z: " << primaryDataset.accelZ.value << std::endl; + } } -#endif break; } @@ -446,6 +442,9 @@ ReturnValue_t GyroADIS1650XHandler::spiSendCallback(SpiComIF *comIf, SpiCookie * } size_t idx = 0; + spi_ioc_transfer *transferStruct = cookie->getTransferStructHandle(); + uint64_t origTx = transferStruct->tx_buf; + uint64_t origRx = transferStruct->rx_buf; while (idx < sendLen) { // Pull SPI CS low. For now, no support for active high given if (gpioId != gpio::NO_GPIO) { @@ -471,11 +470,12 @@ ReturnValue_t GyroADIS1650XHandler::spiSendCallback(SpiComIF *comIf, SpiCookie * if (idx < sendLen) { usleep(ADIS1650X::STALL_TIME_MICROSECONDS); } - spi_ioc_transfer *transferStruct = cookie->getTransferStructHandle(); + transferStruct->tx_buf += 2; transferStruct->rx_buf += 2; } - + transferStruct->tx_buf = origTx; + transferStruct->rx_buf = origRx; if (gpioId != gpio::NO_GPIO) { mutex->unlockMutex(); } @@ -486,4 +486,9 @@ ReturnValue_t GyroADIS1650XHandler::spiSendCallback(SpiComIF *comIf, SpiCookie * void GyroADIS1650XHandler::setToGoToNormalModeImmediately() { goToNormalMode = true; } +void GyroADIS1650XHandler::enablePeriodicPrintouts(bool enable, uint8_t divider) { + periodicPrintout = enable; + debugDivider.setDivider(divider); +} + #endif /* OBSW_ADIS1650X_LINUX_COM_IF == 1 */ diff --git a/mission/devices/GyroADIS1650XHandler.h b/mission/devices/GyroADIS1650XHandler.h index 1db0f3a8..55de1477 100644 --- a/mission/devices/GyroADIS1650XHandler.h +++ b/mission/devices/GyroADIS1650XHandler.h @@ -23,6 +23,7 @@ class GyroADIS1650XHandler : public DeviceHandlerBase { GyroADIS1650XHandler(object_id_t objectId, object_id_t deviceCommunication, CookieIF *comCookie, ADIS1650X::Type type); + void enablePeriodicPrintouts(bool enable, uint8_t divider); void setToGoToNormalModeImmediately(); // DeviceHandlerBase abstract function implementation @@ -69,13 +70,13 @@ class GyroADIS1650XHandler : public DeviceHandlerBase { size_t sendLen, void *args); #endif -#if FSFW_HAL_ADIS1650X_GYRO_DEBUG == 1 - PeriodicOperationDivider *debugDivider; -#endif Countdown breakCountdown; void prepareWriteCommand(uint8_t startReg, uint8_t valueOne, uint8_t valueTwo); ReturnValue_t handleSensorData(const uint8_t *packet); + + bool periodicPrintout = false; + PeriodicOperationDivider debugDivider = PeriodicOperationDivider(3); }; #endif /* MISSION_DEVICES_GYROADIS16507HANDLER_H_ */ diff --git a/mission/devices/HeaterHandler.cpp b/mission/devices/HeaterHandler.cpp index 572810bd..255ba6ec 100644 --- a/mission/devices/HeaterHandler.cpp +++ b/mission/devices/HeaterHandler.cpp @@ -16,8 +16,9 @@ HeaterHandler::HeaterHandler(object_id_t setObjectId_, object_id_t gpioDriverId_ mainLineSwitcherObjectId(mainLineSwitcherObjectId_), mainLineSwitch(mainLineSwitch_), actionHelper(this, nullptr) { + auto mqArgs = MqArgs(setObjectId_, static_cast(this)); commandQueue = QueueFactory::instance()->createMessageQueue( - cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE); + cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } HeaterHandler::~HeaterHandler() {} diff --git a/mission/devices/PCDUHandler.cpp b/mission/devices/PCDUHandler.cpp index 13bed074..408bbb95 100644 --- a/mission/devices/PCDUHandler.cpp +++ b/mission/devices/PCDUHandler.cpp @@ -12,8 +12,9 @@ PCDUHandler::PCDUHandler(object_id_t setObjectId, size_t cmdQueueSize) pdu2HkTableDataset(this), pdu1HkTableDataset(this), cmdQueueSize(cmdQueueSize) { + auto mqArgs = MqArgs(setObjectId, static_cast(this)); commandQueue = QueueFactory::instance()->createMessageQueue( - cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE); + cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } PCDUHandler::~PCDUHandler() {} diff --git a/mission/tmtc/CCSDSHandler.cpp b/mission/tmtc/CCSDSHandler.cpp index 35978627..d6c2367b 100644 --- a/mission/tmtc/CCSDSHandler.cpp +++ b/mission/tmtc/CCSDSHandler.cpp @@ -23,7 +23,9 @@ CCSDSHandler::CCSDSHandler(object_id_t objectId, object_id_t ptmeId, object_id_t enTxClock(enTxClock), enTxData(enTxData) { commandQueue = QueueFactory::instance()->createMessageQueue(QUEUE_SIZE); - eventQueue = QueueFactory::instance()->createMessageQueue(EventMessage::EVENT_MESSAGE_SIZE * 2); + auto mqArgs = MqArgs(objectId, static_cast(this)); + eventQueue = + QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs); } CCSDSHandler::~CCSDSHandler() {} diff --git a/mission/tmtc/CCSDSHandler.h b/mission/tmtc/CCSDSHandler.h index 4f62102c..284cbcba 100644 --- a/mission/tmtc/CCSDSHandler.h +++ b/mission/tmtc/CCSDSHandler.h @@ -132,7 +132,7 @@ class CCSDSHandler : public SystemObject, ActionHelper actionHelper; - MessageQueueId_t tcDistributorQueueId; + MessageQueueId_t tcDistributorQueueId = MessageQueueIF::NO_QUEUE; PtmeConfig* ptmeConfig = nullptr; diff --git a/mission/tmtc/VirtualChannel.cpp b/mission/tmtc/VirtualChannel.cpp index 5b9387fd..9d413ca7 100644 --- a/mission/tmtc/VirtualChannel.cpp +++ b/mission/tmtc/VirtualChannel.cpp @@ -7,9 +7,11 @@ #include "fsfw/serviceinterface/ServiceInterfaceStream.h" #include "fsfw/tmtcservices/TmTcMessage.h" -VirtualChannel::VirtualChannel(uint8_t vcId, uint32_t tmQueueDepth) : vcId(vcId) { - tmQueue = QueueFactory::instance()->createMessageQueue(tmQueueDepth, - MessageQueueMessage::MAX_MESSAGE_SIZE); +VirtualChannel::VirtualChannel(uint8_t vcId, uint32_t tmQueueDepth, object_id_t ownerId) + : vcId(vcId) { + auto mqArgs = MqArgs(ownerId, reinterpret_cast(vcId)); + tmQueue = QueueFactory::instance()->createMessageQueue( + tmQueueDepth, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } ReturnValue_t VirtualChannel::initialize() { diff --git a/mission/tmtc/VirtualChannel.h b/mission/tmtc/VirtualChannel.h index 48cc74a4..c661c4c5 100644 --- a/mission/tmtc/VirtualChannel.h +++ b/mission/tmtc/VirtualChannel.h @@ -24,7 +24,7 @@ class VirtualChannel : public AcceptsTelemetryIF, public HasReturnvaluesIF { * @param vcId The virtual channel id assigned to this object * @param tmQueueDepth Queue depth of queue receiving telemetry from other objects */ - VirtualChannel(uint8_t vcId, uint32_t tmQueueDepth); + VirtualChannel(uint8_t vcId, uint32_t tmQueueDepth, object_id_t ownerId); ReturnValue_t initialize(); MessageQueueId_t getReportReceptionQueue(uint8_t virtualChannel = 0) override; diff --git a/mission/utility/TmFunnel.cpp b/mission/utility/TmFunnel.cpp index 5577f5fa..e22eabdf 100644 --- a/mission/utility/TmFunnel.cpp +++ b/mission/utility/TmFunnel.cpp @@ -11,10 +11,11 @@ object_id_t TmFunnel::storageDestination = objects::NO_OBJECT; TmFunnel::TmFunnel(object_id_t objectId, uint32_t messageDepth) : SystemObject(objectId), messageDepth(messageDepth) { - tmQueue = QueueFactory::instance()->createMessageQueue(messageDepth, - MessageQueueMessage::MAX_MESSAGE_SIZE); + auto mqArgs = MqArgs(objectId, static_cast(this)); + tmQueue = QueueFactory::instance()->createMessageQueue( + messageDepth, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); storageQueue = QueueFactory::instance()->createMessageQueue( - messageDepth, MessageQueueMessage::MAX_MESSAGE_SIZE); + messageDepth, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } TmFunnel::~TmFunnel() {} From f95abfe032109a60ed9e8a452787e87e540d4977 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 19 Feb 2022 17:07:11 +0100 Subject: [PATCH 064/309] avoid code duplication --- linux/devices/GPSHyperionLinuxController.cpp | 1 - linux/devices/GPSHyperionLinuxController.h | 2 +- .../devicedefinitions/GPSDefinitions.h | 63 ------------------- 3 files changed, 1 insertion(+), 65 deletions(-) delete mode 100644 linux/devices/devicedefinitions/GPSDefinitions.h diff --git a/linux/devices/GPSHyperionLinuxController.cpp b/linux/devices/GPSHyperionLinuxController.cpp index c47414a8..982d82be 100644 --- a/linux/devices/GPSHyperionLinuxController.cpp +++ b/linux/devices/GPSHyperionLinuxController.cpp @@ -2,7 +2,6 @@ #include -#include "devicedefinitions/GPSDefinitions.h" #include "fsfw/datapool/PoolReadGuard.h" #include "fsfw/timemanager/Clock.h" diff --git a/linux/devices/GPSHyperionLinuxController.h b/linux/devices/GPSHyperionLinuxController.h index 57da40e6..a39ee9ac 100644 --- a/linux/devices/GPSHyperionLinuxController.h +++ b/linux/devices/GPSHyperionLinuxController.h @@ -1,7 +1,7 @@ #ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_ #define MISSION_DEVICES_GPSHYPERIONHANDLER_H_ -#include "devicedefinitions/GPSDefinitions.h" +#include "mission/devices/devicedefinitions/GPSDefinitions.h" #include "fsfw/FSFW.h" #include "fsfw/controller/ExtendedControllerBase.h" #include "fsfw/devicehandlers/DeviceHandlerBase.h" diff --git a/linux/devices/devicedefinitions/GPSDefinitions.h b/linux/devices/devicedefinitions/GPSDefinitions.h deleted file mode 100644 index 5a565fea..00000000 --- a/linux/devices/devicedefinitions/GPSDefinitions.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ - -#include "fsfw/datapoollocal/StaticLocalDataSet.h" -#include "fsfw/devicehandlers/DeviceHandlerIF.h" - -namespace GpsHyperion { - -static constexpr DeviceCommandId_t GPS_REPLY = 0; -static constexpr DeviceCommandId_t TRIGGER_RESET_PIN = 5; - -static constexpr uint32_t DATASET_ID = 0; - -enum GpsPoolIds : lp_id_t { - LATITUDE = 0, - LONGITUDE = 1, - ALTITUDE = 2, - SPEED = 3, - FIX_MODE = 4, - SATS_IN_USE = 5, - SATS_IN_VIEW = 6, - UNIX_SECONDS = 7, - YEAR = 8, - MONTH = 9, - DAY = 10, - HOURS = 11, - MINUTES = 12, - SECONDS = 13 -}; - -enum GpsFixModes : uint8_t { INVALID = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 }; - -} // namespace GpsHyperion - -class GpsPrimaryDataset : public StaticLocalDataSet<18> { - public: - GpsPrimaryDataset(object_id_t gpsId) : StaticLocalDataSet(sid_t(gpsId, GpsHyperion::DATASET_ID)) { - setAllVariablesReadOnly(); - } - - lp_var_t latitude = lp_var_t(sid.objectId, GpsHyperion::LATITUDE, this); - lp_var_t longitude = lp_var_t(sid.objectId, GpsHyperion::LONGITUDE, this); - lp_var_t altitude = lp_var_t(sid.objectId, GpsHyperion::ALTITUDE, this); - lp_var_t speed = lp_var_t(sid.objectId, GpsHyperion::SPEED, this); - lp_var_t fixMode = lp_var_t(sid.objectId, GpsHyperion::FIX_MODE, this); - lp_var_t satInUse = lp_var_t(sid.objectId, GpsHyperion::SATS_IN_USE, this); - lp_var_t satInView = lp_var_t(sid.objectId, GpsHyperion::SATS_IN_VIEW, this); - lp_var_t year = lp_var_t(sid.objectId, GpsHyperion::YEAR, this); - lp_var_t month = lp_var_t(sid.objectId, GpsHyperion::MONTH, this); - lp_var_t day = lp_var_t(sid.objectId, GpsHyperion::DAY, this); - lp_var_t hours = lp_var_t(sid.objectId, GpsHyperion::HOURS, this); - lp_var_t minutes = lp_var_t(sid.objectId, GpsHyperion::MINUTES, this); - lp_var_t seconds = lp_var_t(sid.objectId, GpsHyperion::SECONDS, this); - lp_var_t unixSeconds = - lp_var_t(sid.objectId, GpsHyperion::UNIX_SECONDS, this); - - private: - friend class GPSHyperionLinuxController; - GpsPrimaryDataset(HasLocalDataPoolIF* hkOwner) - : StaticLocalDataSet(hkOwner, GpsHyperion::DATASET_ID) {} -}; - -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ */ From 68e1208b7f39379abb37ee7e04d82d0a54d7f275 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 19 Feb 2022 17:15:38 +0100 Subject: [PATCH 065/309] sus printout runtime configurable --- bsp_q7s/core/ObjectFactory.cpp | 14 ++++++++++++++ linux/devices/SusHandler.cpp | 29 +++++++++++++++++------------ linux/devices/SusHandler.h | 6 ++---- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 8ce3b422..d4be4c33 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -463,6 +463,20 @@ void ObjectFactory::createSunSensorComponents(LinuxLibgpioIF* gpioComIF, SpiComI susHandler9->setToGoToNormalMode(true); susHandler10->setToGoToNormalMode(true); susHandler11->setToGoToNormalMode(true); +#if OBSW_DEBUG_SUS == 1 + susHandler0->enablePeriodicPrintout(true, 3); + susHandler1->enablePeriodicPrintout(true, 3); + susHandler2->enablePeriodicPrintout(true, 3); + susHandler3->enablePeriodicPrintout(true, 3); + susHandler4->enablePeriodicPrintout(true, 3); + susHandler5->enablePeriodicPrintout(true, 3); + susHandler6->enablePeriodicPrintout(true, 3); + susHandler7->enablePeriodicPrintout(true, 3); + susHandler8->enablePeriodicPrintout(true, 3); + susHandler9->enablePeriodicPrintout(true, 3); + susHandler10->enablePeriodicPrintout(true, 3); + susHandler11->enablePeriodicPrintout(true, 3); +#endif #endif #endif /* OBSW_ADD_SUN_SENSORS == 1 */ diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index e36460a3..bfd5516b 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -226,17 +226,22 @@ ReturnValue_t SusHandler::initializeLocalDataPool(localpool::DataPool &localData void SusHandler::setToGoToNormalMode(bool enable) { this->goToNormalModeImmediately = enable; } void SusHandler::printDataset() { -#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_SUS == 1 - if (divider.checkAndIncrement()) { - sif::info << "SUS " << std::setw(2) << std::dec << static_cast(susIdx) << " ID " - << std::hex << "0x" << this->getObjectId() << " [" << std::hex << std::setw(3); - sif::info << dataset.ain0 << ","; - sif::info << dataset.ain1 << ","; - sif::info << dataset.ain2 << ","; - sif::info << dataset.ain3 << ","; - sif::info << dataset.ain4 << ","; - sif::info << dataset.ain5 << "] "; - sif::info << "T[C] " << dataset.temperatureCelcius << " C" << std::endl; + if(periodicPrintout) { + if (divider.checkAndIncrement()) { + sif::info << "SUS " << std::setw(2) << std::dec << static_cast(susIdx) << " ID " + << std::hex << "0x" << this->getObjectId() << " [" << std::hex << std::setw(3); + sif::info << dataset.ain0 << ","; + sif::info << dataset.ain1 << ","; + sif::info << dataset.ain2 << ","; + sif::info << dataset.ain3 << ","; + sif::info << dataset.ain4 << ","; + sif::info << dataset.ain5 << "] "; + sif::info << "T[C] " << dataset.temperatureCelcius << " C" << std::endl; + } } -#endif +} + +void SusHandler::enablePeriodicPrintout(bool enable, uint8_t divider) { + this->periodicPrintout = enable; + this->divider.setDivider(divider); } diff --git a/linux/devices/SusHandler.h b/linux/devices/SusHandler.h index 4088bd0a..f7826acf 100644 --- a/linux/devices/SusHandler.h +++ b/linux/devices/SusHandler.h @@ -32,7 +32,7 @@ class SusHandler : public DeviceHandlerBase { LinuxLibgpioIF* gpioComIF, gpioId_t chipSelectId); virtual ~SusHandler(); - // virtual ReturnValue_t performOperation(uint8_t counter) override; + void enablePeriodicPrintout(bool enable, uint8_t divider); virtual ReturnValue_t initialize() override; void setToGoToNormalMode(bool enable); @@ -48,7 +48,6 @@ class SusHandler : public DeviceHandlerBase { ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override; - // void setNormalDatapoolEntriesInvalid() override; uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; @@ -68,9 +67,8 @@ class SusHandler : public DeviceHandlerBase { READ_INT_CLOCKED_CONVERSIONS }; + bool periodicPrintout = false; PeriodicOperationDivider divider; - // LinuxLibgpioIF* gpioComIF = nullptr; - // gpioId_t chipSelectId = gpio::NO_GPIO; bool goToNormalModeImmediately = false; bool commandExecuted = false; From 4b7a4ebe3aed3922922d0e4acae0cfab9809718d Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 19 Feb 2022 17:16:27 +0100 Subject: [PATCH 066/309] set ID fix --- linux/devices/devicedefinitions/SusDefinitions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/devices/devicedefinitions/SusDefinitions.h b/linux/devices/devicedefinitions/SusDefinitions.h index 260bfdc7..0bd2ffe7 100644 --- a/linux/devices/devicedefinitions/SusDefinitions.h +++ b/linux/devices/devicedefinitions/SusDefinitions.h @@ -50,7 +50,7 @@ static constexpr uint8_t SETUP_EXT_CLOCKED = 0b01111000; */ static const uint8_t CONVERSION = 0b10101001; -static const uint8_t SUS_DATA_SET_ID = READ_EXT_TIMED_CONVERSIONS; +static const uint8_t SUS_DATA_SET_ID = READ_INT_TIMED_CONVERSIONS; /** Size of data replies. Temperature and 6 channel convesions (AIN0 - AIN5) */ static const uint8_t SIZE_READ_INT_CONVERSIONS = 14; From aee3f7b0757ea4964a559f739727f15167e1e0bf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 19 Feb 2022 17:17:27 +0100 Subject: [PATCH 067/309] reverted some changes --- mission/core/GenericFactory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index f2449271..184af306 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -79,7 +79,7 @@ void ObjectFactory::produceGenericObjects() { new Service3Housekeeping(objects::PUS_SERVICE_3_HOUSEKEEPING, apid::EIVE_OBSW, pus::PUS_SERVICE_3); new Service5EventReporting(objects::PUS_SERVICE_5_EVENT_REPORTING, apid::EIVE_OBSW, - pus::PUS_SERVICE_5, 120); + pus::PUS_SERVICE_5, 50); new Service8FunctionManagement(objects::PUS_SERVICE_8_FUNCTION_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_8, 3, 60); new Service9TimeManagement(objects::PUS_SERVICE_9_TIME_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_9); From cd2097850e90bbcce73fd2a093907b56354edd44 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 21 Feb 2022 14:42:05 +0100 Subject: [PATCH 068/309] continuing pl pcdu --- fsfw | 2 +- linux/devices/CMakeLists.txt | 1 - .../payloadPcduDefinitions.h | 12 --- mission/devices/CMakeLists.txt | 1 + .../devices/PayloadPcduHandler.cpp | 93 ++++++++++++++++++- .../devices/PayloadPcduHandler.h | 23 ++++- .../payloadPcduDefinitions.h | 69 ++++++++++++++ mission/devices/max1227.cpp | 14 +-- mission/devices/max1227.h | 14 ++- 9 files changed, 194 insertions(+), 35 deletions(-) delete mode 100644 linux/devices/devicedefinitions/payloadPcduDefinitions.h rename {linux => mission}/devices/PayloadPcduHandler.cpp (63%) rename {linux => mission}/devices/PayloadPcduHandler.h (74%) create mode 100644 mission/devices/devicedefinitions/payloadPcduDefinitions.h diff --git a/fsfw b/fsfw index d74a373f..c4a05598 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit d74a373f1d6bc341c11d7ad89f369da5ff957928 +Subproject commit c4a055986c30526d15dbb227e00bb131f22a7365 diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt index a2bfa035..5a367b28 100644 --- a/linux/devices/CMakeLists.txt +++ b/linux/devices/CMakeLists.txt @@ -1,6 +1,5 @@ target_sources(${OBSW_NAME} PRIVATE SolarArrayDeploymentHandler.cpp - PayloadPcduHandler.cpp SusHandler.cpp ) diff --git a/linux/devices/devicedefinitions/payloadPcduDefinitions.h b/linux/devices/devicedefinitions/payloadPcduDefinitions.h deleted file mode 100644 index a2c362a0..00000000 --- a/linux/devices/devicedefinitions/payloadPcduDefinitions.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ -#define LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ - -#include - -namespace plpcdu { - -static constexpr size_t MAX_ADC_REPLY_SIZE = 32; - -} - -#endif /* LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ */ diff --git a/mission/devices/CMakeLists.txt b/mission/devices/CMakeLists.txt index 2e956c0e..2f434d09 100644 --- a/mission/devices/CMakeLists.txt +++ b/mission/devices/CMakeLists.txt @@ -9,6 +9,7 @@ target_sources(${LIB_EIVE_MISSION} PRIVATE ACUHandler.cpp SyrlinksHkHandler.cpp Max31865PT1000Handler.cpp + PayloadPcduHandler.cpp IMTQHandler.cpp HeaterHandler.cpp PlocMPSoCHandler.cpp diff --git a/linux/devices/PayloadPcduHandler.cpp b/mission/devices/PayloadPcduHandler.cpp similarity index 63% rename from linux/devices/PayloadPcduHandler.cpp rename to mission/devices/PayloadPcduHandler.cpp index 08ebd6a5..35551eba 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/mission/devices/PayloadPcduHandler.cpp @@ -1,10 +1,9 @@ #include "PayloadPcduHandler.h" - #include "devices/gpioIds.h" PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF) - : DeviceHandlerBase(objectId, comIF, cookie), gpioIF(gpioIF) {} + : DeviceHandlerBase(objectId, comIF, cookie), adcSet(this), gpioIF(gpioIF) {} void PayloadPcduHandler::doStartUp() { if ((state != States::PCDU_OFF) and (state != States::ON_TRANS_SSR)) { @@ -24,6 +23,7 @@ void PayloadPcduHandler::doStartUp() { transitionOk = false; // We are now in ON mode setMode(MODE_ON); + adcState = AdcStates::BOOT_DELAY; // The ADC can now be read. If the values are not close to zero, we should not allow // transition monMode = MonitoringMode::CLOSE_TO_ZERO; @@ -33,6 +33,18 @@ void PayloadPcduHandler::doStartUp() { void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { if (mode == _MODE_TO_NORMAL) { + if(adcState == AdcStates::BOOT_DELAY) { + if (adcCountdown.hasTimedOut()) { + adcState = AdcStates::SEND_SETUP; + adcCmdExecuted = false; + } + } + if(adcState == AdcStates::SEND_SETUP) { + if(adcCmdExecuted) { + adcState = AdcStates::NORMAL; + adcCmdExecuted = false; + } + } if (state == States::ON_TRANS_ADC_CLOSE_ZERO) { if (not commandExecuted) { countdown.resetTimer(); @@ -125,28 +137,86 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { void PayloadPcduHandler::doShutDown() {} ReturnValue_t PayloadPcduHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { - return HasReturnvaluesIF::RETURN_OK; + switch(adcState) { + case(AdcStates::SEND_SETUP): { + *id = plpcdu::SETUP_CMD; + buildCommandFromCommand(*id, nullptr, 0); + break; + } + case(AdcStates::NORMAL): { + *id = plpcdu::READ_WITH_TEMP; + buildCommandFromCommand(*id, nullptr, 0); + break; + } + default: { + break; + } + } + return NOTHING_TO_SEND; } ReturnValue_t PayloadPcduHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { + if(adcState == AdcStates::SEND_SETUP) { + *id = plpcdu::SETUP_CMD; + buildCommandFromCommand(*id, nullptr, 0); + } return HasReturnvaluesIF::RETURN_OK; } -void PayloadPcduHandler::fillCommandAndReplyMap() {} +void PayloadPcduHandler::fillCommandAndReplyMap() { + insertInCommandAndReplyMap(plpcdu::READ_CMD, 2, &adcSet); + insertInCommandAndReplyMap(plpcdu::READ_TEMP, 1, &adcSet); + insertInCommandAndReplyMap(plpcdu::READ_WITH_TEMP, 1, &adcSet); + insertInCommandAndReplyMap(plpcdu::SETUP_CMD, 1); +} ReturnValue_t PayloadPcduHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData, size_t commandDataLen) { - return HasReturnvaluesIF::RETURN_OK; + switch(deviceCommand) { + case(plpcdu::SETUP_CMD): { + cmdBuf[0] = plpcdu::SETUP_BYTE; + rawPacket = cmdBuf.data(); + rawPacketLen = 1; + break; + } + case(plpcdu::READ_CMD): { + max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, rawPacketLen); + rawPacket = cmdBuf.data(); + break; + } + case(plpcdu::READ_TEMP): { + max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data(), rawPacketLen); + rawPacket = cmdBuf.data(); + break; + } + case(plpcdu::READ_WITH_TEMP): { + size_t sz = 0; + max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, sz); + max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data() + sz, sz); + rawPacketLen = sz; + rawPacket = cmdBuf.data(); + } + } + return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } ReturnValue_t PayloadPcduHandler::scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) { + // SPI is full duplex + *foundId = getPendingCommand(); + *foundLen = remainingSize; return HasReturnvaluesIF::RETURN_OK; } ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { + using namespace plpcdu; + switch(id) { + case(SETUP_CMD): { + break; + } + } return HasReturnvaluesIF::RETURN_OK; } @@ -157,5 +227,18 @@ uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_0, &ain0); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_1, &ain1); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_2, &ain2); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_3, &ain3); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_4, &ain4); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_5, &ain5); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_6, &ain6); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_7, &ain7); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_8, &ain8); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_9, &ain9); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_10, &ain10); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_11, &ain11); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::TEMP, &tempC); return HasReturnvaluesIF::RETURN_OK; } diff --git a/linux/devices/PayloadPcduHandler.h b/mission/devices/PayloadPcduHandler.h similarity index 74% rename from linux/devices/PayloadPcduHandler.h rename to mission/devices/PayloadPcduHandler.h index 53a96a5e..4f99cc1a 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/mission/devices/PayloadPcduHandler.h @@ -3,7 +3,7 @@ #include #include - +#include "devicedefinitions/payloadPcduDefinitions.h" #include "fsfw_hal/common/gpio/GpioIF.h" /** @@ -48,13 +48,34 @@ class PayloadPcduHandler : DeviceHandlerBase { enum class MonitoringMode { NONE, CLOSE_TO_ZERO, NEGATIVE } monMode = MonitoringMode::NONE; + enum class AdcStates { OFF, BOOT_DELAY, SEND_SETUP, NORMAL } adcState = AdcStates::OFF; + + plpcdu::PlPcduAdcSet adcSet; + std::array cmdBuf = {}; // This variable is tied to DRO +6 V voltage. Voltages, currents are monitored and the experiment // is shut down immediately if there is a negative voltage. bool transitionOk = false; bool commandExecuted = false; + bool adcCmdExecuted = false; + uint8_t tempReadDivisor = 1; Countdown countdown = Countdown(5000); + Countdown adcCountdown = Countdown(50); GpioIF* gpioIF; + PoolEntry ain0 = PoolEntry({0}); + PoolEntry ain1 = PoolEntry({0}); + PoolEntry ain2 = PoolEntry({0}); + PoolEntry ain3 = PoolEntry({0}); + PoolEntry ain4 = PoolEntry({0}); + PoolEntry ain5 = PoolEntry({0}); + PoolEntry ain6 = PoolEntry({0}); + PoolEntry ain7 = PoolEntry({0}); + PoolEntry ain8 = PoolEntry({0}); + PoolEntry ain9 = PoolEntry({0}); + PoolEntry ain10 = PoolEntry({0}); + PoolEntry ain11 = PoolEntry({0}); + PoolEntry tempC = PoolEntry({0.0}); + void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override; void doStartUp() override; void doShutDown() override; diff --git a/mission/devices/devicedefinitions/payloadPcduDefinitions.h b/mission/devices/devicedefinitions/payloadPcduDefinitions.h new file mode 100644 index 00000000..22e7b504 --- /dev/null +++ b/mission/devices/devicedefinitions/payloadPcduDefinitions.h @@ -0,0 +1,69 @@ +#ifndef LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ +#define LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ + +#include +#include +#include "mission/devices/max1227.h" +#include + +namespace plpcdu { + +using namespace max1227; + +enum PlPcduPoolIds: uint32_t { + AIN_0 = 0, + AIN_1 = 1, + AIN_2 = 2, + AIN_3 = 3, + AIN_4 = 4, + AIN_5 = 5, + AIN_6 = 6, + AIN_7 = 7, + AIN_8 = 8, + AIN_9 = 9, + AIN_10 = 10, + AIN_11 = 11, + TEMP = 12 +}; + +static constexpr size_t MAX_ADC_REPLY_SIZE = 64; + +static constexpr DeviceCommandId_t READ_CMD = 0; +static constexpr DeviceCommandId_t SETUP_CMD = 1; +static constexpr DeviceCommandId_t READ_TEMP = 2; +static constexpr DeviceCommandId_t READ_WITH_TEMP = 3; + +static constexpr uint8_t SETUP_BYTE = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, + RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); + +static constexpr uint32_t ADC_SET_ID = READ_CMD; +static constexpr uint8_t CHANNELS_NUM = 12; +static constexpr uint8_t CHANNEL_N = CHANNELS_NUM - 1; +// Store temperature as well +static constexpr size_t DATASET_ENTRIES = CHANNELS_NUM + 1; + +class PlPcduAdcSet : public StaticLocalDataSet { + public: + PlPcduAdcSet(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, ADC_SET_ID) {} + + PlPcduAdcSet(object_id_t objectId) + : StaticLocalDataSet(sid_t(objectId, ADC_SET_ID)) {} + + lp_var_t ain0 = lp_var_t(sid.objectId, AIN_0, this); + lp_var_t ain1 = lp_var_t(sid.objectId, AIN_1, this); + lp_var_t ain2= lp_var_t(sid.objectId, AIN_2, this); + lp_var_t ain3 = lp_var_t(sid.objectId, AIN_3, this); + lp_var_t ain4 = lp_var_t(sid.objectId, AIN_4, this); + lp_var_t ain5 = lp_var_t(sid.objectId, AIN_5, this); + lp_var_t ain6 = lp_var_t(sid.objectId, AIN_6, this); + lp_var_t ain7 = lp_var_t(sid.objectId, AIN_7, this); + lp_var_t ain8 = lp_var_t(sid.objectId, AIN_8, this); + lp_var_t ain9 = lp_var_t(sid.objectId, AIN_9, this); + lp_var_t ain10 = lp_var_t(sid.objectId, AIN_10, this); + lp_var_t ain11 = lp_var_t(sid.objectId, AIN_11, this); + lp_var_t tempC = lp_var_t(sid.objectId, TEMP, this); +}; + +} + +#endif /* LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ */ diff --git a/mission/devices/max1227.cpp b/mission/devices/max1227.cpp index 88cab185..f89e161e 100644 --- a/mission/devices/max1227.cpp +++ b/mission/devices/max1227.cpp @@ -2,14 +2,6 @@ #include -uint8_t max1227::buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { - return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; -} - -uint8_t max1227::buildSetupByte(ClkSel clkSel, RefSel refSel, DiffSel diffSel) { - return (1 << 6) | (clkSel << 4) | (refSel << 2) | diffSel; -} - void max1227::prepareExternallyClockedSingleChannelRead(uint8_t *spiBuf, uint8_t channel, size_t &sz) { spiBuf[0] = buildConvByte(ScanModes::N_ONCE, channel, false); @@ -18,21 +10,19 @@ void max1227::prepareExternallyClockedSingleChannelRead(uint8_t *spiBuf, uint8_t sz = 3; } -uint8_t max1227::buildResetByte(bool fifoOnly) { return (1 << 4) | (fifoOnly << 3); } - void max1227::prepareExternallyClockedRead0ToN(uint8_t *spiBuf, uint8_t n, size_t &sz) { for (uint8_t idx = 0; idx <= n; idx++) { spiBuf[idx * 2] = buildConvByte(ScanModes::N_ONCE, idx, false); spiBuf[idx * 2 + 1] = 0x00; } spiBuf[(n + 1) * 2] = 0x00; - sz = (n + 1) * 2 + 1; + sz += (n + 1) * 2 + 1; } void max1227::prepareExternallyClockedTemperatureRead(uint8_t *spiBuf, size_t &sz) { spiBuf[0] = buildConvByte(ScanModes::N_ONCE, 0, true); std::memset(spiBuf + 1, 0, 24); - sz = 25; + sz += 25; } float max1227::getTemperature(int16_t temp) { return static_cast(temp) * 0.125; } diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index bf76a81b..9d29b38c 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -40,9 +40,17 @@ enum DiffSel : uint8_t { BIPOLAR_CFG = 0b11 }; -uint8_t buildResetByte(bool fifoOnly); -uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp); -uint8_t buildSetupByte(ClkSel clkSel, RefSel refSel, DiffSel diffSel); +constexpr uint8_t buildResetByte(bool fifoOnly) { + return (1 << 4) | (fifoOnly << 3); +} + +constexpr uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { + return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; +} + +constexpr uint8_t buildSetupByte(ClkSel clkSel, RefSel refSel, DiffSel diffSel) { + return (1 << 6) | (clkSel << 4) | (refSel << 2) | diffSel; +} /** * If there is a wakeup delay, there needs to be a 65 us delay between sending From 8953f6f60d90411319c8d26499954d560d3f2e33 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 21 Feb 2022 15:28:33 +0100 Subject: [PATCH 069/309] added adc and temp handling --- mission/devices/PayloadPcduHandler.cpp | 26 ++++++++------- mission/devices/PayloadPcduHandler.h | 13 +------- .../payloadPcduDefinitions.h | 33 +++++-------------- 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/mission/devices/PayloadPcduHandler.cpp b/mission/devices/PayloadPcduHandler.cpp index 35551eba..980439d1 100644 --- a/mission/devices/PayloadPcduHandler.cpp +++ b/mission/devices/PayloadPcduHandler.cpp @@ -1,3 +1,4 @@ +#include #include "PayloadPcduHandler.h" #include "devices/gpioIds.h" @@ -216,6 +217,18 @@ ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, case(SETUP_CMD): { break; } + case(READ_WITH_TEMP): { + PoolReadGuard pg(&adcSet); + if(pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { + return pg.getReadResult(); + } + for(uint8_t idx = 0; idx < 12; idx ++) { + adcSet.channels[idx] = packet[idx * 2 + 1] << 8 | packet[idx * 2 + 2]; + } + uint8_t tempStartIdx = ADC_REPLY_SIZE + TEMP_REPLY_SIZE - 2; + adcSet.tempC.value = max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); + } + } return HasReturnvaluesIF::RETURN_OK; } @@ -227,18 +240,7 @@ uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_0, &ain0); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_1, &ain1); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_2, &ain2); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_3, &ain3); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_4, &ain4); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_5, &ain5); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_6, &ain6); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_7, &ain7); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_8, &ain8); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_9, &ain9); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_10, &ain10); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::AIN_11, &ain11); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::CHANNEL_VEC, &channelValues); localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::TEMP, &tempC); return HasReturnvaluesIF::RETURN_OK; } diff --git a/mission/devices/PayloadPcduHandler.h b/mission/devices/PayloadPcduHandler.h index 4f99cc1a..64b71be4 100644 --- a/mission/devices/PayloadPcduHandler.h +++ b/mission/devices/PayloadPcduHandler.h @@ -62,18 +62,7 @@ class PayloadPcduHandler : DeviceHandlerBase { Countdown adcCountdown = Countdown(50); GpioIF* gpioIF; - PoolEntry ain0 = PoolEntry({0}); - PoolEntry ain1 = PoolEntry({0}); - PoolEntry ain2 = PoolEntry({0}); - PoolEntry ain3 = PoolEntry({0}); - PoolEntry ain4 = PoolEntry({0}); - PoolEntry ain5 = PoolEntry({0}); - PoolEntry ain6 = PoolEntry({0}); - PoolEntry ain7 = PoolEntry({0}); - PoolEntry ain8 = PoolEntry({0}); - PoolEntry ain9 = PoolEntry({0}); - PoolEntry ain10 = PoolEntry({0}); - PoolEntry ain11 = PoolEntry({0}); + PoolEntry channelValues = PoolEntry({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); PoolEntry tempC = PoolEntry({0.0}); void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override; diff --git a/mission/devices/devicedefinitions/payloadPcduDefinitions.h b/mission/devices/devicedefinitions/payloadPcduDefinitions.h index 22e7b504..9029fad7 100644 --- a/mission/devices/devicedefinitions/payloadPcduDefinitions.h +++ b/mission/devices/devicedefinitions/payloadPcduDefinitions.h @@ -11,19 +11,8 @@ namespace plpcdu { using namespace max1227; enum PlPcduPoolIds: uint32_t { - AIN_0 = 0, - AIN_1 = 1, - AIN_2 = 2, - AIN_3 = 3, - AIN_4 = 4, - AIN_5 = 5, - AIN_6 = 6, - AIN_7 = 7, - AIN_8 = 8, - AIN_9 = 9, - AIN_10 = 10, - AIN_11 = 11, - TEMP = 12 + CHANNEL_VEC = 0, + TEMP = 1 }; static constexpr size_t MAX_ADC_REPLY_SIZE = 64; @@ -33,6 +22,11 @@ static constexpr DeviceCommandId_t SETUP_CMD = 1; static constexpr DeviceCommandId_t READ_TEMP = 2; static constexpr DeviceCommandId_t READ_WITH_TEMP = 3; +// 12 ADC values * 2 + trailing zero +static constexpr size_t ADC_REPLY_SIZE = 25; +// Conversion byte + 24 * zero +static constexpr size_t TEMP_REPLY_SIZE = 25; + static constexpr uint8_t SETUP_BYTE = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); @@ -49,18 +43,7 @@ class PlPcduAdcSet : public StaticLocalDataSet { PlPcduAdcSet(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, ADC_SET_ID)) {} - lp_var_t ain0 = lp_var_t(sid.objectId, AIN_0, this); - lp_var_t ain1 = lp_var_t(sid.objectId, AIN_1, this); - lp_var_t ain2= lp_var_t(sid.objectId, AIN_2, this); - lp_var_t ain3 = lp_var_t(sid.objectId, AIN_3, this); - lp_var_t ain4 = lp_var_t(sid.objectId, AIN_4, this); - lp_var_t ain5 = lp_var_t(sid.objectId, AIN_5, this); - lp_var_t ain6 = lp_var_t(sid.objectId, AIN_6, this); - lp_var_t ain7 = lp_var_t(sid.objectId, AIN_7, this); - lp_var_t ain8 = lp_var_t(sid.objectId, AIN_8, this); - lp_var_t ain9 = lp_var_t(sid.objectId, AIN_9, this); - lp_var_t ain10 = lp_var_t(sid.objectId, AIN_10, this); - lp_var_t ain11 = lp_var_t(sid.objectId, AIN_11, this); + lp_vec_t channels = lp_vec_t(sid.objectId, CHANNEL_VEC, this); lp_var_t tempC = lp_var_t(sid.objectId, TEMP, this); }; From c683097635f5162b9de540734d1cc0ab939a3ca2 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 21 Feb 2022 16:57:16 +0100 Subject: [PATCH 070/309] continued pl pcdu handler --- bsp_q7s/core/ObjectFactory.cpp | 4 +- linux/boardtest/SpiTestClass.cpp | 52 +++---- linux/devices/GPSHyperionLinuxController.h | 2 +- linux/devices/SusHandler.cpp | 2 +- linux/fsfwconfig/OBSWConfig.h.in | 2 + .../pollingSequenceFactory.cpp | 4 +- mission/devices/PayloadPcduHandler.cpp | 140 +++++++++++------- mission/devices/PayloadPcduHandler.h | 4 + .../payloadPcduDefinitions.h | 18 +-- mission/devices/max1227.h | 4 +- 10 files changed, 127 insertions(+), 105 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index d4be4c33..8abf2b2b 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -44,11 +44,9 @@ #include "linux/csp/CspComIF.h" #include "linux/csp/CspCookie.h" #include "linux/devices/GPSHyperionLinuxController.h" -#include "linux/devices/PayloadPcduHandler.h" #include "linux/devices/SolarArrayDeploymentHandler.h" #include "linux/devices/SusHandler.h" #include "linux/devices/devicedefinitions/SusDefinitions.h" -#include "linux/devices/devicedefinitions/payloadPcduDefinitions.h" #include "mission/core/GenericFactory.h" #include "mission/devices/ACUHandler.h" #include "mission/devices/BpxBatteryHandler.h" @@ -60,6 +58,7 @@ #include "mission/devices/PCDUHandler.h" #include "mission/devices/PDU1Handler.h" #include "mission/devices/PDU2Handler.h" +#include "mission/devices/PayloadPcduHandler.h" #include "mission/devices/PlocMPSoCHandler.h" #include "mission/devices/RadiationSensorHandler.h" #include "mission/devices/RwHandler.h" @@ -71,6 +70,7 @@ #include "mission/devices/devicedefinitions/RadSensorDefinitions.h" #include "mission/devices/devicedefinitions/RwDefinitions.h" #include "mission/devices/devicedefinitions/SyrlinksDefinitions.h" +#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h" #include "mission/tmtc/CCSDSHandler.h" #include "mission/tmtc/VirtualChannel.h" #include "mission/utility/TmFunnel.h" diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index e1af31e6..d5aee5bf 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -296,35 +296,29 @@ void SpiTestClass::performOneShotMax1227Test() { adcCfg.testRadSensorExtConvWithDelay = false; adcCfg.testRadSensorIntConv = false; - adcCfg.testSus[0].doTest = true; - adcCfg.testSus[0].intConv = true; - adcCfg.testSus[6].doTest = true; - adcCfg.testSus[6].intConv = true; + bool setAllSusOn = false; + bool susIntConv = false; + bool susExtConv = false; + if (setAllSusOn) { + for (uint8_t idx = 0; idx < 12; idx++) { + adcCfg.testSus[idx].doTest = true; + } + } else { + for (uint8_t idx = 0; idx < 12; idx++) { + adcCfg.testSus[idx].doTest = false; + } + } - adcCfg.testSus[1].doTest = true; - adcCfg.testSus[1].intConv = true; - adcCfg.testSus[7].doTest = true; - adcCfg.testSus[7].intConv = true; - - adcCfg.testSus[10].doTest = true; - adcCfg.testSus[10].intConv = true; - adcCfg.testSus[4].doTest = true; - adcCfg.testSus[4].intConv = true; - - adcCfg.testSus[11].doTest = true; - adcCfg.testSus[11].intConv = true; - adcCfg.testSus[5].doTest = true; - adcCfg.testSus[5].intConv = true; - - adcCfg.testSus[2].doTest = true; - adcCfg.testSus[2].intConv = true; - adcCfg.testSus[3].doTest = true; - adcCfg.testSus[3].intConv = true; - - adcCfg.testSus[8].doTest = true; - adcCfg.testSus[8].intConv = true; - adcCfg.testSus[9].doTest = true; - adcCfg.testSus[9].intConv = true; + if (susIntConv) { + for (uint8_t idx = 0; idx < 12; idx++) { + adcCfg.testSus[idx].intConv = true; + } + } + if (susExtConv) { + for (uint8_t idx = 0; idx < 12; idx++) { + adcCfg.testSus[idx].extConv = true; + } + } adcCfg.plPcduAdcExtConv = false; adcCfg.plPcduAdcIntConv = true; @@ -334,7 +328,7 @@ void SpiTestClass::performOneShotMax1227Test() { void SpiTestClass::performPeriodicMax1227Test() { using namespace max1227; adcCfg.testRadSensorExtConvWithDelay = false; - adcCfg.testRadSensorIntConv = false; + adcCfg.testRadSensorIntConv = true; adcCfg.plPcduAdcExtConv = false; adcCfg.plPcduAdcIntConv = false; diff --git a/linux/devices/GPSHyperionLinuxController.h b/linux/devices/GPSHyperionLinuxController.h index a39ee9ac..3615cebd 100644 --- a/linux/devices/GPSHyperionLinuxController.h +++ b/linux/devices/GPSHyperionLinuxController.h @@ -1,10 +1,10 @@ #ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_ #define MISSION_DEVICES_GPSHYPERIONHANDLER_H_ -#include "mission/devices/devicedefinitions/GPSDefinitions.h" #include "fsfw/FSFW.h" #include "fsfw/controller/ExtendedControllerBase.h" #include "fsfw/devicehandlers/DeviceHandlerBase.h" +#include "mission/devices/devicedefinitions/GPSDefinitions.h" #ifdef FSFW_OSAL_LINUX #include diff --git a/linux/devices/SusHandler.cpp b/linux/devices/SusHandler.cpp index bfd5516b..2dc41cdd 100644 --- a/linux/devices/SusHandler.cpp +++ b/linux/devices/SusHandler.cpp @@ -226,7 +226,7 @@ ReturnValue_t SusHandler::initializeLocalDataPool(localpool::DataPool &localData void SusHandler::setToGoToNormalMode(bool enable) { this->goToNormalModeImmediately = enable; } void SusHandler::printDataset() { - if(periodicPrintout) { + if (periodicPrintout) { if (divider.checkAndIncrement()) { sif::info << "SUS " << std::setw(2) << std::dec << static_cast(susIdx) << " ID " << std::hex << "0x" << this->getObjectId() << " [" << std::hex << std::setw(3); diff --git a/linux/fsfwconfig/OBSWConfig.h.in b/linux/fsfwconfig/OBSWConfig.h.in index 569818f0..75334d45 100644 --- a/linux/fsfwconfig/OBSWConfig.h.in +++ b/linux/fsfwconfig/OBSWConfig.h.in @@ -85,6 +85,8 @@ debugging. */ #define OBSW_DEBUG_RTD 0 #define OBSW_TEST_RAD_SENSOR 0 #define OBSW_DEBUG_RAD_SENSOR 0 +#define OBSW_TEST_PL_PCDU 0 +#define OBSW_DEBUG_PL_PCDU 0 #define OBSW_TEST_LIBGPIOD 0 #define OBSW_TEST_PLOC_HANDLER 0 #define OBSW_TEST_BPX_BATT 0 diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp index 0c7fcd9c..83c26ecc 100644 --- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp +++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp @@ -360,8 +360,8 @@ ReturnValue_t pst::pstSpi(FixedTimeslotTaskIF *thisSequence) { #endif #if OBSW_ADD_ACS_BOARD == 1 && OBSW_ADD_ACS_HANDLERS == 1 - bool enableAside = true; - bool enableBside = false; + bool enableAside = false; + bool enableBside = true; if (enableAside) { // A side thisSequence->addSlot(objects::MGM_0_LIS3_HANDLER, length * 0, diff --git a/mission/devices/PayloadPcduHandler.cpp b/mission/devices/PayloadPcduHandler.cpp index 980439d1..627f9efd 100644 --- a/mission/devices/PayloadPcduHandler.cpp +++ b/mission/devices/PayloadPcduHandler.cpp @@ -1,5 +1,7 @@ -#include #include "PayloadPcduHandler.h" + +#include + #include "devices/gpioIds.h" PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, @@ -34,14 +36,14 @@ void PayloadPcduHandler::doStartUp() { void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { if (mode == _MODE_TO_NORMAL) { - if(adcState == AdcStates::BOOT_DELAY) { + if (adcState == AdcStates::BOOT_DELAY) { if (adcCountdown.hasTimedOut()) { adcState = AdcStates::SEND_SETUP; adcCmdExecuted = false; } } - if(adcState == AdcStates::SEND_SETUP) { - if(adcCmdExecuted) { + if (adcState == AdcStates::SEND_SETUP) { + if (adcCmdExecuted) { adcState = AdcStates::NORMAL; adcCmdExecuted = false; } @@ -138,26 +140,26 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { void PayloadPcduHandler::doShutDown() {} ReturnValue_t PayloadPcduHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { - switch(adcState) { - case(AdcStates::SEND_SETUP): { - *id = plpcdu::SETUP_CMD; - buildCommandFromCommand(*id, nullptr, 0); - break; - } - case(AdcStates::NORMAL): { - *id = plpcdu::READ_WITH_TEMP; - buildCommandFromCommand(*id, nullptr, 0); - break; - } - default: { - break; - } + switch (adcState) { + case (AdcStates::SEND_SETUP): { + *id = plpcdu::SETUP_CMD; + buildCommandFromCommand(*id, nullptr, 0); + break; + } + case (AdcStates::NORMAL): { + *id = plpcdu::READ_WITH_TEMP; + buildCommandFromCommand(*id, nullptr, 0); + break; + } + default: { + break; + } } return NOTHING_TO_SEND; } ReturnValue_t PayloadPcduHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { - if(adcState == AdcStates::SEND_SETUP) { + if (adcState == AdcStates::SEND_SETUP) { *id = plpcdu::SETUP_CMD; buildCommandFromCommand(*id, nullptr, 0); } @@ -174,30 +176,30 @@ void PayloadPcduHandler::fillCommandAndReplyMap() { ReturnValue_t PayloadPcduHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData, size_t commandDataLen) { - switch(deviceCommand) { - case(plpcdu::SETUP_CMD): { - cmdBuf[0] = plpcdu::SETUP_BYTE; - rawPacket = cmdBuf.data(); - rawPacketLen = 1; - break; - } - case(plpcdu::READ_CMD): { - max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, rawPacketLen); - rawPacket = cmdBuf.data(); - break; - } - case(plpcdu::READ_TEMP): { - max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data(), rawPacketLen); - rawPacket = cmdBuf.data(); - break; - } - case(plpcdu::READ_WITH_TEMP): { - size_t sz = 0; - max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, sz); - max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data() + sz, sz); - rawPacketLen = sz; - rawPacket = cmdBuf.data(); - } + switch (deviceCommand) { + case (plpcdu::SETUP_CMD): { + cmdBuf[0] = plpcdu::SETUP_BYTE; + rawPacket = cmdBuf.data(); + rawPacketLen = 1; + break; + } + case (plpcdu::READ_CMD): { + max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, rawPacketLen); + rawPacket = cmdBuf.data(); + break; + } + case (plpcdu::READ_TEMP): { + max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data(), rawPacketLen); + rawPacket = cmdBuf.data(); + break; + } + case (plpcdu::READ_WITH_TEMP): { + size_t sz = 0; + max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, sz); + max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data() + sz, sz); + rawPacketLen = sz; + rawPacket = cmdBuf.data(); + } } return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } @@ -213,22 +215,42 @@ ReturnValue_t PayloadPcduHandler::scanForReply(const uint8_t* start, size_t rema ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { using namespace plpcdu; - switch(id) { - case(SETUP_CMD): { - break; - } - case(READ_WITH_TEMP): { - PoolReadGuard pg(&adcSet); - if(pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { - return pg.getReadResult(); + switch (id) { + case (SETUP_CMD): { + break; } - for(uint8_t idx = 0; idx < 12; idx ++) { - adcSet.channels[idx] = packet[idx * 2 + 1] << 8 | packet[idx * 2 + 2]; + case (READ_TEMP): { + uint8_t tempStartIdx = TEMP_REPLY_SIZE - 2; + adcSet.tempC.value = + max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); + break; + } + case (READ_CMD): { + PoolReadGuard pg(&adcSet); + if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { + return pg.getReadResult(); + } + for (uint8_t idx = 0; idx < 12; idx++) { + adcSet.channels[idx] = packet[idx * 2 + 1] << 8 | packet[idx * 2 + 2]; + } + break; + } + case (READ_WITH_TEMP): { + PoolReadGuard pg(&adcSet); + if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { + return pg.getReadResult(); + } + for (uint8_t idx = 0; idx < 12; idx++) { + adcSet.channels[idx] = packet[idx * 2 + 1] << 8 | packet[idx * 2 + 2]; + } + uint8_t tempStartIdx = ADC_REPLY_SIZE + TEMP_REPLY_SIZE - 2; + adcSet.tempC.value = + max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); + break; + } + default: { + break; } - uint8_t tempStartIdx = ADC_REPLY_SIZE + TEMP_REPLY_SIZE - 2; - adcSet.tempC.value = max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); - } - } return HasReturnvaluesIF::RETURN_OK; } @@ -244,3 +266,7 @@ ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& l localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::TEMP, &tempC); return HasReturnvaluesIF::RETURN_OK; } + +void PayloadPcduHandler::setToGoToNormalModeImmediately(bool enable) { + this->goToNormalMode = enable; +} diff --git a/mission/devices/PayloadPcduHandler.h b/mission/devices/PayloadPcduHandler.h index 64b71be4..919df391 100644 --- a/mission/devices/PayloadPcduHandler.h +++ b/mission/devices/PayloadPcduHandler.h @@ -3,6 +3,7 @@ #include #include + #include "devicedefinitions/payloadPcduDefinitions.h" #include "fsfw_hal/common/gpio/GpioIF.h" @@ -24,6 +25,8 @@ class PayloadPcduHandler : DeviceHandlerBase { public: PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF); + void setToGoToNormalModeImmediately(bool enable); + private: enum class States { PCDU_OFF, @@ -50,6 +53,7 @@ class PayloadPcduHandler : DeviceHandlerBase { enum class AdcStates { OFF, BOOT_DELAY, SEND_SETUP, NORMAL } adcState = AdcStates::OFF; + bool goToNormalMode = false; plpcdu::PlPcduAdcSet adcSet; std::array cmdBuf = {}; // This variable is tied to DRO +6 V voltage. Voltages, currents are monitored and the experiment diff --git a/mission/devices/devicedefinitions/payloadPcduDefinitions.h b/mission/devices/devicedefinitions/payloadPcduDefinitions.h index 9029fad7..a5de3a12 100644 --- a/mission/devices/devicedefinitions/payloadPcduDefinitions.h +++ b/mission/devices/devicedefinitions/payloadPcduDefinitions.h @@ -3,17 +3,16 @@ #include #include -#include "mission/devices/max1227.h" + #include +#include "mission/devices/max1227.h" + namespace plpcdu { using namespace max1227; -enum PlPcduPoolIds: uint32_t { - CHANNEL_VEC = 0, - TEMP = 1 -}; +enum PlPcduPoolIds : uint32_t { CHANNEL_VEC = 0, TEMP = 1 }; static constexpr size_t MAX_ADC_REPLY_SIZE = 64; @@ -27,8 +26,8 @@ static constexpr size_t ADC_REPLY_SIZE = 25; // Conversion byte + 24 * zero static constexpr size_t TEMP_REPLY_SIZE = 25; -static constexpr uint8_t SETUP_BYTE = max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, - RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); +static constexpr uint8_t SETUP_BYTE = + max1227::buildSetupByte(ClkSel::EXT_CONV_EXT_TIMED, RefSel::INT_REF_NO_WAKEUP, DiffSel::NONE_0); static constexpr uint32_t ADC_SET_ID = READ_CMD; static constexpr uint8_t CHANNELS_NUM = 12; @@ -40,13 +39,12 @@ class PlPcduAdcSet : public StaticLocalDataSet { public: PlPcduAdcSet(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, ADC_SET_ID) {} - PlPcduAdcSet(object_id_t objectId) - : StaticLocalDataSet(sid_t(objectId, ADC_SET_ID)) {} + PlPcduAdcSet(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, ADC_SET_ID)) {} lp_vec_t channels = lp_vec_t(sid.objectId, CHANNEL_VEC, this); lp_var_t tempC = lp_var_t(sid.objectId, TEMP, this); }; -} +} // namespace plpcdu #endif /* LINUX_DEVICES_DEVICEDEFINITIONS_PAYLOADPCDUDEFINITIONS_H_ */ diff --git a/mission/devices/max1227.h b/mission/devices/max1227.h index 9d29b38c..1a6082fb 100644 --- a/mission/devices/max1227.h +++ b/mission/devices/max1227.h @@ -40,9 +40,7 @@ enum DiffSel : uint8_t { BIPOLAR_CFG = 0b11 }; -constexpr uint8_t buildResetByte(bool fifoOnly) { - return (1 << 4) | (fifoOnly << 3); -} +constexpr uint8_t buildResetByte(bool fifoOnly) { return (1 << 4) | (fifoOnly << 3); } constexpr uint8_t buildConvByte(ScanModes scanMode, uint8_t channel, bool readTemp) { return (1 << 7) | (channel << 3) | (scanMode << 1) | readTemp; From bd0df3493f304882a6863576c1e2261db1457fb5 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 21 Feb 2022 17:31:56 +0100 Subject: [PATCH 071/309] update object list --- bsp_q7s/core/ObjectFactory.cpp | 11 +- generators/bsp_q7s_objects.csv | 27 +- generators/objects/translateObjects.cpp | 39 +- linux/fsfwconfig/objects/translateObjects.cpp | 463 +++++++++--------- mission/devices/PayloadPcduHandler.cpp | 330 +++++++------ mission/devices/PayloadPcduHandler.h | 13 +- .../payloadPcduDefinitions.h | 3 + 7 files changed, 473 insertions(+), 413 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 8abf2b2b..a1e7ce14 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -1207,8 +1207,15 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); // Create device handler components - auto plPcduHandler = - PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, gpioComIF); + auto plPcduHandler = new PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, + spiCookie, gpioComIF, false); +#if OBSW_TEST_PL_PCDU == 1 + plPcduHandler->setStartUpImmediately(); +#if OBSW_DEBUG_PL_PCDU == 1 + plPcduHandler->setToGoToNormalModeImmediately(true); + plPcduHandler->enablePeriodicPrintout(true, 5); +#endif +#endif } void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv index c686ec40..6e6a4b78 100644 --- a/generators/bsp_q7s_objects.csv +++ b/generators/bsp_q7s_objects.csv @@ -4,19 +4,18 @@ 0x43400001;THERMAL_CONTROLLER 0x44120006;MGM_0_LIS3_HANDLER 0x44120010;GYRO_0_ADIS_HANDLER -0x44120032;SUS_1 -0x44120033;SUS_2 -0x44120034;SUS_3 -0x44120035;SUS_4 -0x44120036;SUS_5 -0x44120037;SUS_6 -0x44120038;SUS_7 -0x44120039;SUS_8 -0x44120040;SUS_9 -0x44120041;SUS_10 -0x44120042;SUS_11 -0x44120043;SUS_12 -0x44120044;SUS_13 +0x44120032;SUS_0 +0x44120033;SUS_1 +0x44120034;SUS_2 +0x44120035;SUS_3 +0x44120036;SUS_4 +0x44120037;SUS_5 +0x44120038;SUS_6 +0x44120039;SUS_7 +0x44120040;SUS_8 +0x44120041;SUS_9 +0x44120042;SUS_10 +0x44120043;SUS_11 0x44120047;RW1 0x44120107;MGM_1_RM3100_HANDLER 0x44120111;GYRO_1_L3G_HANDLER @@ -36,6 +35,7 @@ 0x44250002;PDU2_HANDLER 0x44250003;ACU_HANDLER 0x44260000;BPX_BATT_HANDLER +0x44300000;PLPCDU_HANDLER 0x443200A5;RAD_SENSOR 0x44330000;PLOC_UPDATER 0x44330001;PLOC_MEMORY_DUMPER @@ -101,6 +101,7 @@ 0x53ffffff;FSFW_OBJECTS_END 0x54000010;SPI_TEST 0x54000020;UART_TEST +0x54000030;I2C_TEST 0x5400AFFE;DUMMY_HANDLER 0x5400CAFE;DUMMY_INTERFACE 0x54123456;LIBGPIOD_TEST diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 44b74490..f20febe2 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 110 translations. - * Generated on: 2022-02-03 12:01:36 + * Contains 111 translations. + * Generated on: 2022-02-21 17:31:37 */ #include "translateObjects.h" @@ -12,6 +12,7 @@ const char *ACS_CONTROLLER_STRING = "ACS_CONTROLLER"; const char *THERMAL_CONTROLLER_STRING = "THERMAL_CONTROLLER"; const char *MGM_0_LIS3_HANDLER_STRING = "MGM_0_LIS3_HANDLER"; const char *GYRO_0_ADIS_HANDLER_STRING = "GYRO_0_ADIS_HANDLER"; +const char *SUS_0_STRING = "SUS_0"; const char *SUS_1_STRING = "SUS_1"; const char *SUS_2_STRING = "SUS_2"; const char *SUS_3_STRING = "SUS_3"; @@ -23,8 +24,6 @@ const char *SUS_8_STRING = "SUS_8"; const char *SUS_9_STRING = "SUS_9"; const char *SUS_10_STRING = "SUS_10"; const char *SUS_11_STRING = "SUS_11"; -const char *SUS_12_STRING = "SUS_12"; -const char *SUS_13_STRING = "SUS_13"; const char *RW1_STRING = "RW1"; const char *MGM_1_RM3100_HANDLER_STRING = "MGM_1_RM3100_HANDLER"; const char *GYRO_1_L3G_HANDLER_STRING = "GYRO_1_L3G_HANDLER"; @@ -44,6 +43,7 @@ const char *PDU1_HANDLER_STRING = "PDU1_HANDLER"; const char *PDU2_HANDLER_STRING = "PDU2_HANDLER"; const char *ACU_HANDLER_STRING = "ACU_HANDLER"; const char *BPX_BATT_HANDLER_STRING = "BPX_BATT_HANDLER"; +const char *PLPCDU_HANDLER_STRING = "PLPCDU_HANDLER"; const char *RAD_SENSOR_STRING = "RAD_SENSOR"; const char *PLOC_UPDATER_STRING = "PLOC_UPDATER"; const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER"; @@ -109,6 +109,7 @@ const char *TIME_STAMPER_STRING = "TIME_STAMPER"; const char *FSFW_OBJECTS_END_STRING = "FSFW_OBJECTS_END"; const char *SPI_TEST_STRING = "SPI_TEST"; const char *UART_TEST_STRING = "UART_TEST"; +const char *I2C_TEST_STRING = "I2C_TEST"; const char *DUMMY_HANDLER_STRING = "DUMMY_HANDLER"; const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE"; const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST"; @@ -132,31 +133,29 @@ const char* translateObject(object_id_t object) { case 0x44120010: return GYRO_0_ADIS_HANDLER_STRING; case 0x44120032: - return SUS_1_STRING; + return SUS_0_STRING; case 0x44120033: - return SUS_2_STRING; + return SUS_1_STRING; case 0x44120034: - return SUS_3_STRING; + return SUS_2_STRING; case 0x44120035: - return SUS_4_STRING; + return SUS_3_STRING; case 0x44120036: - return SUS_5_STRING; + return SUS_4_STRING; case 0x44120037: - return SUS_6_STRING; + return SUS_5_STRING; case 0x44120038: - return SUS_7_STRING; + return SUS_6_STRING; case 0x44120039: - return SUS_8_STRING; + return SUS_7_STRING; case 0x44120040: - return SUS_9_STRING; + return SUS_8_STRING; case 0x44120041: - return SUS_10_STRING; + return SUS_9_STRING; case 0x44120042: - return SUS_11_STRING; + return SUS_10_STRING; case 0x44120043: - return SUS_12_STRING; - case 0x44120044: - return SUS_13_STRING; + return SUS_11_STRING; case 0x44120047: return RW1_STRING; case 0x44120107: @@ -195,6 +194,8 @@ const char* translateObject(object_id_t object) { return ACU_HANDLER_STRING; case 0x44260000: return BPX_BATT_HANDLER_STRING; + case 0x44300000: + return PLPCDU_HANDLER_STRING; case 0x443200A5: return RAD_SENSOR_STRING; case 0x44330000: @@ -325,6 +326,8 @@ const char* translateObject(object_id_t object) { return SPI_TEST_STRING; case 0x54000020: return UART_TEST_STRING; + case 0x54000030: + return I2C_TEST_STRING; case 0x5400AFFE: return DUMMY_HANDLER_STRING; case 0x5400CAFE: diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 08e6e126..f20febe2 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 110 translations. - * Generated on: 2022-02-03 12:01:36 + * Contains 111 translations. + * Generated on: 2022-02-21 17:31:37 */ #include "translateObjects.h" @@ -12,6 +12,7 @@ const char *ACS_CONTROLLER_STRING = "ACS_CONTROLLER"; const char *THERMAL_CONTROLLER_STRING = "THERMAL_CONTROLLER"; const char *MGM_0_LIS3_HANDLER_STRING = "MGM_0_LIS3_HANDLER"; const char *GYRO_0_ADIS_HANDLER_STRING = "GYRO_0_ADIS_HANDLER"; +const char *SUS_0_STRING = "SUS_0"; const char *SUS_1_STRING = "SUS_1"; const char *SUS_2_STRING = "SUS_2"; const char *SUS_3_STRING = "SUS_3"; @@ -23,8 +24,6 @@ const char *SUS_8_STRING = "SUS_8"; const char *SUS_9_STRING = "SUS_9"; const char *SUS_10_STRING = "SUS_10"; const char *SUS_11_STRING = "SUS_11"; -const char *SUS_12_STRING = "SUS_12"; -const char *SUS_13_STRING = "SUS_13"; const char *RW1_STRING = "RW1"; const char *MGM_1_RM3100_HANDLER_STRING = "MGM_1_RM3100_HANDLER"; const char *GYRO_1_L3G_HANDLER_STRING = "GYRO_1_L3G_HANDLER"; @@ -44,6 +43,7 @@ const char *PDU1_HANDLER_STRING = "PDU1_HANDLER"; const char *PDU2_HANDLER_STRING = "PDU2_HANDLER"; const char *ACU_HANDLER_STRING = "ACU_HANDLER"; const char *BPX_BATT_HANDLER_STRING = "BPX_BATT_HANDLER"; +const char *PLPCDU_HANDLER_STRING = "PLPCDU_HANDLER"; const char *RAD_SENSOR_STRING = "RAD_SENSOR"; const char *PLOC_UPDATER_STRING = "PLOC_UPDATER"; const char *PLOC_MEMORY_DUMPER_STRING = "PLOC_MEMORY_DUMPER"; @@ -109,6 +109,7 @@ const char *TIME_STAMPER_STRING = "TIME_STAMPER"; const char *FSFW_OBJECTS_END_STRING = "FSFW_OBJECTS_END"; const char *SPI_TEST_STRING = "SPI_TEST"; const char *UART_TEST_STRING = "UART_TEST"; +const char *I2C_TEST_STRING = "I2C_TEST"; const char *DUMMY_HANDLER_STRING = "DUMMY_HANDLER"; const char *DUMMY_INTERFACE_STRING = "DUMMY_INTERFACE"; const char *LIBGPIOD_TEST_STRING = "LIBGPIOD_TEST"; @@ -117,230 +118,232 @@ const char *TM_FUNNEL_STRING = "TM_FUNNEL"; const char *CCSDS_IP_CORE_BRIDGE_STRING = "CCSDS_IP_CORE_BRIDGE"; const char *NO_OBJECT_STRING = "NO_OBJECT"; -const char *translateObject(object_id_t object) { - switch ((object & 0xFFFFFFFF)) { - case 0x00005060: - return P60DOCK_TEST_TASK_STRING; - case 0x43000003: - return CORE_CONTROLLER_STRING; - case 0x43100002: - return ACS_CONTROLLER_STRING; - case 0x43400001: - return THERMAL_CONTROLLER_STRING; - case 0x44120006: - return MGM_0_LIS3_HANDLER_STRING; - case 0x44120010: - return GYRO_0_ADIS_HANDLER_STRING; - case 0x44120032: - return SUS_1_STRING; - case 0x44120033: - return SUS_2_STRING; - case 0x44120034: - return SUS_3_STRING; - case 0x44120035: - return SUS_4_STRING; - case 0x44120036: - return SUS_5_STRING; - case 0x44120037: - return SUS_6_STRING; - case 0x44120038: - return SUS_7_STRING; - case 0x44120039: - return SUS_8_STRING; - case 0x44120040: - return SUS_9_STRING; - case 0x44120041: - return SUS_10_STRING; - case 0x44120042: - return SUS_11_STRING; - case 0x44120043: - return SUS_12_STRING; - case 0x44120044: - return SUS_13_STRING; - case 0x44120047: - return RW1_STRING; - case 0x44120107: - return MGM_1_RM3100_HANDLER_STRING; - case 0x44120111: - return GYRO_1_L3G_HANDLER_STRING; - case 0x44120148: - return RW2_STRING; - case 0x44120208: - return MGM_2_LIS3_HANDLER_STRING; - case 0x44120212: - return GYRO_2_ADIS_HANDLER_STRING; - case 0x44120249: - return RW3_STRING; - case 0x44120309: - return MGM_3_RM3100_HANDLER_STRING; - case 0x44120313: - return GYRO_3_L3G_HANDLER_STRING; - case 0x44120350: - return RW4_STRING; - case 0x44130001: - return STAR_TRACKER_STRING; - case 0x44130045: - return GPS_CONTROLLER_STRING; - case 0x44140014: - return IMTQ_HANDLER_STRING; - case 0x442000A1: - return PCDU_HANDLER_STRING; - case 0x44250000: - return P60DOCK_HANDLER_STRING; - case 0x44250001: - return PDU1_HANDLER_STRING; - case 0x44250002: - return PDU2_HANDLER_STRING; - case 0x44250003: - return ACU_HANDLER_STRING; - case 0x44260000: - return BPX_BATT_HANDLER_STRING; - case 0x443200A5: - return RAD_SENSOR_STRING; - case 0x44330000: - return PLOC_UPDATER_STRING; - case 0x44330001: - return PLOC_MEMORY_DUMPER_STRING; - case 0x44330002: - return STR_HELPER_STRING; - case 0x44330015: - return PLOC_MPSOC_HANDLER_STRING; - case 0x44330016: - return PLOC_SUPERVISOR_HANDLER_STRING; - case 0x444100A2: - return SOLAR_ARRAY_DEPL_HANDLER_STRING; - case 0x444100A4: - return HEATER_HANDLER_STRING; - case 0x44420004: - return TMP1075_HANDLER_1_STRING; - case 0x44420005: - return TMP1075_HANDLER_2_STRING; - case 0x44420016: - return RTD_IC_3_STRING; - case 0x44420017: - return RTD_IC_4_STRING; - case 0x44420018: - return RTD_IC_5_STRING; - case 0x44420019: - return RTD_IC_6_STRING; - case 0x44420020: - return RTD_IC_7_STRING; - case 0x44420021: - return RTD_IC_8_STRING; - case 0x44420022: - return RTD_IC_9_STRING; - case 0x44420023: - return RTD_IC_10_STRING; - case 0x44420024: - return RTD_IC_11_STRING; - case 0x44420025: - return RTD_IC_12_STRING; - case 0x44420026: - return RTD_IC_13_STRING; - case 0x44420027: - return RTD_IC_14_STRING; - case 0x44420028: - return RTD_IC_15_STRING; - case 0x44420029: - return RTD_IC_16_STRING; - case 0x44420030: - return RTD_IC_17_STRING; - case 0x44420031: - return RTD_IC_18_STRING; - case 0x445300A3: - return SYRLINKS_HK_HANDLER_STRING; - case 0x49000000: - return ARDUINO_COM_IF_STRING; - case 0x49010005: - return GPIO_IF_STRING; - case 0x49020004: - return SPI_COM_IF_STRING; - case 0x49030003: - return UART_COM_IF_STRING; - case 0x49040002: - return I2C_COM_IF_STRING; - case 0x49050001: - return CSP_COM_IF_STRING; - case 0x50000100: - return CCSDS_PACKET_DISTRIBUTOR_STRING; - case 0x50000200: - return PUS_PACKET_DISTRIBUTOR_STRING; - case 0x50000300: - return TMTC_BRIDGE_STRING; - case 0x50000400: - return TMTC_POLLING_TASK_STRING; - case 0x50000500: - return FILE_SYSTEM_HANDLER_STRING; - case 0x50000600: - return PTME_STRING; - case 0x50000700: - return PDEC_HANDLER_STRING; - case 0x50000800: - return CCSDS_HANDLER_STRING; - case 0x51000500: - return PUS_SERVICE_6_STRING; - case 0x53000000: - return FSFW_OBJECTS_START_STRING; - case 0x53000001: - return PUS_SERVICE_1_VERIFICATION_STRING; - case 0x53000002: - return PUS_SERVICE_2_DEVICE_ACCESS_STRING; - case 0x53000003: - return PUS_SERVICE_3_HOUSEKEEPING_STRING; - case 0x53000005: - return PUS_SERVICE_5_EVENT_REPORTING_STRING; - case 0x53000008: - return PUS_SERVICE_8_FUNCTION_MGMT_STRING; - case 0x53000009: - return PUS_SERVICE_9_TIME_MGMT_STRING; - case 0x53000017: - return PUS_SERVICE_17_TEST_STRING; - case 0x53000020: - return PUS_SERVICE_20_PARAMETERS_STRING; - case 0x53000200: - return PUS_SERVICE_200_MODE_MGMT_STRING; - case 0x53000201: - return PUS_SERVICE_201_HEALTH_STRING; - case 0x53001000: - return CFDP_PACKET_DISTRIBUTOR_STRING; - case 0x53010000: - return HEALTH_TABLE_STRING; - case 0x53010100: - return MODE_STORE_STRING; - case 0x53030000: - return EVENT_MANAGER_STRING; - case 0x53040000: - return INTERNAL_ERROR_REPORTER_STRING; - case 0x534f0100: - return TC_STORE_STRING; - case 0x534f0200: - return TM_STORE_STRING; - case 0x534f0300: - return IPC_STORE_STRING; - case 0x53500010: - return TIME_STAMPER_STRING; - case 0x53ffffff: - return FSFW_OBJECTS_END_STRING; - case 0x54000010: - return SPI_TEST_STRING; - case 0x54000020: - return UART_TEST_STRING; - case 0x5400AFFE: - return DUMMY_HANDLER_STRING; - case 0x5400CAFE: - return DUMMY_INTERFACE_STRING; - case 0x54123456: - return LIBGPIOD_TEST_STRING; - case 0x54694269: - return TEST_TASK_STRING; - case 0x73000100: - return TM_FUNNEL_STRING; - case 0x73500000: - return CCSDS_IP_CORE_BRIDGE_STRING; - case 0xFFFFFFFF: - return NO_OBJECT_STRING; - default: - return "UNKNOWN_OBJECT"; - } - return 0; +const char* translateObject(object_id_t object) { + switch( (object & 0xFFFFFFFF) ) { + case 0x00005060: + return P60DOCK_TEST_TASK_STRING; + case 0x43000003: + return CORE_CONTROLLER_STRING; + case 0x43100002: + return ACS_CONTROLLER_STRING; + case 0x43400001: + return THERMAL_CONTROLLER_STRING; + case 0x44120006: + return MGM_0_LIS3_HANDLER_STRING; + case 0x44120010: + return GYRO_0_ADIS_HANDLER_STRING; + case 0x44120032: + return SUS_0_STRING; + case 0x44120033: + return SUS_1_STRING; + case 0x44120034: + return SUS_2_STRING; + case 0x44120035: + return SUS_3_STRING; + case 0x44120036: + return SUS_4_STRING; + case 0x44120037: + return SUS_5_STRING; + case 0x44120038: + return SUS_6_STRING; + case 0x44120039: + return SUS_7_STRING; + case 0x44120040: + return SUS_8_STRING; + case 0x44120041: + return SUS_9_STRING; + case 0x44120042: + return SUS_10_STRING; + case 0x44120043: + return SUS_11_STRING; + case 0x44120047: + return RW1_STRING; + case 0x44120107: + return MGM_1_RM3100_HANDLER_STRING; + case 0x44120111: + return GYRO_1_L3G_HANDLER_STRING; + case 0x44120148: + return RW2_STRING; + case 0x44120208: + return MGM_2_LIS3_HANDLER_STRING; + case 0x44120212: + return GYRO_2_ADIS_HANDLER_STRING; + case 0x44120249: + return RW3_STRING; + case 0x44120309: + return MGM_3_RM3100_HANDLER_STRING; + case 0x44120313: + return GYRO_3_L3G_HANDLER_STRING; + case 0x44120350: + return RW4_STRING; + case 0x44130001: + return STAR_TRACKER_STRING; + case 0x44130045: + return GPS_CONTROLLER_STRING; + case 0x44140014: + return IMTQ_HANDLER_STRING; + case 0x442000A1: + return PCDU_HANDLER_STRING; + case 0x44250000: + return P60DOCK_HANDLER_STRING; + case 0x44250001: + return PDU1_HANDLER_STRING; + case 0x44250002: + return PDU2_HANDLER_STRING; + case 0x44250003: + return ACU_HANDLER_STRING; + case 0x44260000: + return BPX_BATT_HANDLER_STRING; + case 0x44300000: + return PLPCDU_HANDLER_STRING; + case 0x443200A5: + return RAD_SENSOR_STRING; + case 0x44330000: + return PLOC_UPDATER_STRING; + case 0x44330001: + return PLOC_MEMORY_DUMPER_STRING; + case 0x44330002: + return STR_HELPER_STRING; + case 0x44330015: + return PLOC_MPSOC_HANDLER_STRING; + case 0x44330016: + return PLOC_SUPERVISOR_HANDLER_STRING; + case 0x444100A2: + return SOLAR_ARRAY_DEPL_HANDLER_STRING; + case 0x444100A4: + return HEATER_HANDLER_STRING; + case 0x44420004: + return TMP1075_HANDLER_1_STRING; + case 0x44420005: + return TMP1075_HANDLER_2_STRING; + case 0x44420016: + return RTD_IC_3_STRING; + case 0x44420017: + return RTD_IC_4_STRING; + case 0x44420018: + return RTD_IC_5_STRING; + case 0x44420019: + return RTD_IC_6_STRING; + case 0x44420020: + return RTD_IC_7_STRING; + case 0x44420021: + return RTD_IC_8_STRING; + case 0x44420022: + return RTD_IC_9_STRING; + case 0x44420023: + return RTD_IC_10_STRING; + case 0x44420024: + return RTD_IC_11_STRING; + case 0x44420025: + return RTD_IC_12_STRING; + case 0x44420026: + return RTD_IC_13_STRING; + case 0x44420027: + return RTD_IC_14_STRING; + case 0x44420028: + return RTD_IC_15_STRING; + case 0x44420029: + return RTD_IC_16_STRING; + case 0x44420030: + return RTD_IC_17_STRING; + case 0x44420031: + return RTD_IC_18_STRING; + case 0x445300A3: + return SYRLINKS_HK_HANDLER_STRING; + case 0x49000000: + return ARDUINO_COM_IF_STRING; + case 0x49010005: + return GPIO_IF_STRING; + case 0x49020004: + return SPI_COM_IF_STRING; + case 0x49030003: + return UART_COM_IF_STRING; + case 0x49040002: + return I2C_COM_IF_STRING; + case 0x49050001: + return CSP_COM_IF_STRING; + case 0x50000100: + return CCSDS_PACKET_DISTRIBUTOR_STRING; + case 0x50000200: + return PUS_PACKET_DISTRIBUTOR_STRING; + case 0x50000300: + return TMTC_BRIDGE_STRING; + case 0x50000400: + return TMTC_POLLING_TASK_STRING; + case 0x50000500: + return FILE_SYSTEM_HANDLER_STRING; + case 0x50000600: + return PTME_STRING; + case 0x50000700: + return PDEC_HANDLER_STRING; + case 0x50000800: + return CCSDS_HANDLER_STRING; + case 0x51000500: + return PUS_SERVICE_6_STRING; + case 0x53000000: + return FSFW_OBJECTS_START_STRING; + case 0x53000001: + return PUS_SERVICE_1_VERIFICATION_STRING; + case 0x53000002: + return PUS_SERVICE_2_DEVICE_ACCESS_STRING; + case 0x53000003: + return PUS_SERVICE_3_HOUSEKEEPING_STRING; + case 0x53000005: + return PUS_SERVICE_5_EVENT_REPORTING_STRING; + case 0x53000008: + return PUS_SERVICE_8_FUNCTION_MGMT_STRING; + case 0x53000009: + return PUS_SERVICE_9_TIME_MGMT_STRING; + case 0x53000017: + return PUS_SERVICE_17_TEST_STRING; + case 0x53000020: + return PUS_SERVICE_20_PARAMETERS_STRING; + case 0x53000200: + return PUS_SERVICE_200_MODE_MGMT_STRING; + case 0x53000201: + return PUS_SERVICE_201_HEALTH_STRING; + case 0x53001000: + return CFDP_PACKET_DISTRIBUTOR_STRING; + case 0x53010000: + return HEALTH_TABLE_STRING; + case 0x53010100: + return MODE_STORE_STRING; + case 0x53030000: + return EVENT_MANAGER_STRING; + case 0x53040000: + return INTERNAL_ERROR_REPORTER_STRING; + case 0x534f0100: + return TC_STORE_STRING; + case 0x534f0200: + return TM_STORE_STRING; + case 0x534f0300: + return IPC_STORE_STRING; + case 0x53500010: + return TIME_STAMPER_STRING; + case 0x53ffffff: + return FSFW_OBJECTS_END_STRING; + case 0x54000010: + return SPI_TEST_STRING; + case 0x54000020: + return UART_TEST_STRING; + case 0x54000030: + return I2C_TEST_STRING; + case 0x5400AFFE: + return DUMMY_HANDLER_STRING; + case 0x5400CAFE: + return DUMMY_INTERFACE_STRING; + case 0x54123456: + return LIBGPIOD_TEST_STRING; + case 0x54694269: + return TEST_TASK_STRING; + case 0x73000100: + return TM_FUNNEL_STRING; + case 0x73500000: + return CCSDS_IP_CORE_BRIDGE_STRING; + case 0xFFFFFFFF: + return NO_OBJECT_STRING; + default: + return "UNKNOWN_OBJECT"; + } + return 0; } diff --git a/mission/devices/PayloadPcduHandler.cpp b/mission/devices/PayloadPcduHandler.cpp index 627f9efd..5795d104 100644 --- a/mission/devices/PayloadPcduHandler.cpp +++ b/mission/devices/PayloadPcduHandler.cpp @@ -5,8 +5,11 @@ #include "devices/gpioIds.h" PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, - GpioIF* gpioIF) - : DeviceHandlerBase(objectId, comIF, cookie), adcSet(this), gpioIF(gpioIF) {} + GpioIF* gpioIF, bool periodicPrintout) + : DeviceHandlerBase(objectId, comIF, cookie), + adcSet(this), + periodicPrintout(periodicPrintout), + gpioIF(gpioIF) {} void PayloadPcduHandler::doStartUp() { if ((state != States::PCDU_OFF) and (state != States::ON_TRANS_SSR)) { @@ -25,7 +28,7 @@ void PayloadPcduHandler::doStartUp() { if (transitionOk) { transitionOk = false; // We are now in ON mode - setMode(MODE_ON); + startTransition(MODE_NORMAL, 0); adcState = AdcStates::BOOT_DELAY; // The ADC can now be read. If the values are not close to zero, we should not allow // transition @@ -36,18 +39,183 @@ void PayloadPcduHandler::doStartUp() { void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { if (mode == _MODE_TO_NORMAL) { - if (adcState == AdcStates::BOOT_DELAY) { - if (adcCountdown.hasTimedOut()) { - adcState = AdcStates::SEND_SETUP; - adcCmdExecuted = false; - } + stateMachineToNormal(); + } +} + +void PayloadPcduHandler::doShutDown() {} + +ReturnValue_t PayloadPcduHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { + switch (adcState) { + case (AdcStates::SEND_SETUP): { + *id = plpcdu::SETUP_CMD; + buildCommandFromCommand(*id, nullptr, 0); + break; } - if (adcState == AdcStates::SEND_SETUP) { - if (adcCmdExecuted) { - adcState = AdcStates::NORMAL; - adcCmdExecuted = false; - } + case (AdcStates::NORMAL): { + *id = plpcdu::READ_WITH_TEMP; + buildCommandFromCommand(*id, nullptr, 0); + break; } + default: { + break; + } + } + return NOTHING_TO_SEND; +} + +ReturnValue_t PayloadPcduHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { + if (adcState == AdcStates::SEND_SETUP) { + *id = plpcdu::SETUP_CMD; + buildCommandFromCommand(*id, nullptr, 0); + } + return NOTHING_TO_SEND; +} + +void PayloadPcduHandler::fillCommandAndReplyMap() { + insertInCommandAndReplyMap(plpcdu::READ_CMD, 2, &adcSet); + insertInCommandAndReplyMap(plpcdu::READ_TEMP, 1, &adcSet); + insertInCommandAndReplyMap(plpcdu::READ_WITH_TEMP, 1, &adcSet); + insertInCommandAndReplyMap(plpcdu::SETUP_CMD, 1); +} + +ReturnValue_t PayloadPcduHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, + const uint8_t* commandData, + size_t commandDataLen) { + switch (deviceCommand) { + case (plpcdu::SETUP_CMD): { + cmdBuf[0] = plpcdu::SETUP_BYTE; + rawPacket = cmdBuf.data(); + rawPacketLen = 1; + break; + } + case (plpcdu::READ_CMD): { + max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, rawPacketLen); + rawPacket = cmdBuf.data(); + break; + } + case (plpcdu::READ_TEMP): { + max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data(), rawPacketLen); + rawPacket = cmdBuf.data(); + break; + } + case (plpcdu::READ_WITH_TEMP): { + size_t sz = 0; + max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, sz); + max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data() + sz, sz); + rawPacketLen = sz; + rawPacket = cmdBuf.data(); + } + } + return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; +} + +ReturnValue_t PayloadPcduHandler::scanForReply(const uint8_t* start, size_t remainingSize, + DeviceCommandId_t* foundId, size_t* foundLen) { + // SPI is full duplex + *foundId = getPendingCommand(); + *foundLen = remainingSize; + return HasReturnvaluesIF::RETURN_OK; +} + +ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, + const uint8_t* packet) { + using namespace plpcdu; + switch (id) { + case (SETUP_CMD): { + break; + } + case (READ_TEMP): { + uint8_t tempStartIdx = TEMP_REPLY_SIZE - 2; + adcSet.tempC.value = + max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); + break; + } + case (READ_CMD): { + PoolReadGuard pg(&adcSet); + if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { + return pg.getReadResult(); + } + handleExtConvRead(packet); + handlePrintout(); + break; + } + case (READ_WITH_TEMP): { + PoolReadGuard pg(&adcSet); + if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { + return pg.getReadResult(); + } + handleExtConvRead(packet); + uint8_t tempStartIdx = ADC_REPLY_SIZE + TEMP_REPLY_SIZE - 2; + adcSet.tempC.value = + max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); + handlePrintout(); + break; + } + default: { + break; + } + } + return HasReturnvaluesIF::RETURN_OK; +} + +uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { + // 20 minutes transition delay is allowed + return 20 * 60 * 60; +} + +ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, + LocalDataPoolManager& poolManager) { + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::CHANNEL_VEC, &channelValues); + localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::TEMP, &tempC); + return HasReturnvaluesIF::RETURN_OK; +} + +void PayloadPcduHandler::setToGoToNormalModeImmediately(bool enable) { + this->goToNormalMode = enable; +} + +void PayloadPcduHandler::handleExtConvRead(const uint8_t* bufStart) { + for (uint8_t idx = 0; idx < 12; idx++) { + adcSet.channels[idx] = bufStart[idx * 2 + 1] << 8 | bufStart[idx * 2 + 2]; + } +} + +void PayloadPcduHandler::handlePrintout() { + if (periodicPrintout) { + if (opDivider.checkAndIncrement()) { + sif::info << "PL PCDU ADC hex [" << std::hex << std::setw(4); + for (uint8_t idx = 0; idx < 12; idx++) { + sif::info << std::setfill('0') << adcSet.channels[idx]; + if (idx < 11) { + sif::info << ","; + } + } + sif::info << "] | T[C] " << std::dec << adcSet.tempC.value; + } + } +} + +void PayloadPcduHandler::enablePeriodicPrintout(bool enable, uint8_t divider) { + this->periodicPrintout = enable; + opDivider.setDivider(divider); +} + +void PayloadPcduHandler::stateMachineToNormal() { + if (adcState == AdcStates::BOOT_DELAY) { + if (adcCountdown.hasTimedOut()) { + adcState = AdcStates::SEND_SETUP; + adcCmdExecuted = false; + } + } + if (adcState == AdcStates::SEND_SETUP) { + if (adcCmdExecuted) { + adcState = AdcStates::NORMAL; + setMode(MODE_NORMAL, plpcdu::NORMAL_ADC_ONLY); + adcCmdExecuted = false; + } + } + if (submode == plpcdu::NORMAL_ALL_ON) { if (state == States::ON_TRANS_ADC_CLOSE_ZERO) { if (not commandExecuted) { countdown.resetTimer(); @@ -128,7 +296,7 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { // ADC values are ok, 5 seconds have elapsed if (transitionOk and countdown.hasTimedOut()) { state = States::PCDU_ON; - setMode(MODE_NORMAL); + setMode(MODE_NORMAL, plpcdu::NORMAL_ALL_ON); countdown.resetTimer(); commandExecuted = false; transitionOk = false; @@ -136,137 +304,3 @@ void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { } } } - -void PayloadPcduHandler::doShutDown() {} - -ReturnValue_t PayloadPcduHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { - switch (adcState) { - case (AdcStates::SEND_SETUP): { - *id = plpcdu::SETUP_CMD; - buildCommandFromCommand(*id, nullptr, 0); - break; - } - case (AdcStates::NORMAL): { - *id = plpcdu::READ_WITH_TEMP; - buildCommandFromCommand(*id, nullptr, 0); - break; - } - default: { - break; - } - } - return NOTHING_TO_SEND; -} - -ReturnValue_t PayloadPcduHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { - if (adcState == AdcStates::SEND_SETUP) { - *id = plpcdu::SETUP_CMD; - buildCommandFromCommand(*id, nullptr, 0); - } - return HasReturnvaluesIF::RETURN_OK; -} - -void PayloadPcduHandler::fillCommandAndReplyMap() { - insertInCommandAndReplyMap(plpcdu::READ_CMD, 2, &adcSet); - insertInCommandAndReplyMap(plpcdu::READ_TEMP, 1, &adcSet); - insertInCommandAndReplyMap(plpcdu::READ_WITH_TEMP, 1, &adcSet); - insertInCommandAndReplyMap(plpcdu::SETUP_CMD, 1); -} - -ReturnValue_t PayloadPcduHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, - const uint8_t* commandData, - size_t commandDataLen) { - switch (deviceCommand) { - case (plpcdu::SETUP_CMD): { - cmdBuf[0] = plpcdu::SETUP_BYTE; - rawPacket = cmdBuf.data(); - rawPacketLen = 1; - break; - } - case (plpcdu::READ_CMD): { - max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, rawPacketLen); - rawPacket = cmdBuf.data(); - break; - } - case (plpcdu::READ_TEMP): { - max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data(), rawPacketLen); - rawPacket = cmdBuf.data(); - break; - } - case (plpcdu::READ_WITH_TEMP): { - size_t sz = 0; - max1227::prepareExternallyClockedRead0ToN(cmdBuf.data(), plpcdu::CHANNEL_N, sz); - max1227::prepareExternallyClockedTemperatureRead(cmdBuf.data() + sz, sz); - rawPacketLen = sz; - rawPacket = cmdBuf.data(); - } - } - return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; -} - -ReturnValue_t PayloadPcduHandler::scanForReply(const uint8_t* start, size_t remainingSize, - DeviceCommandId_t* foundId, size_t* foundLen) { - // SPI is full duplex - *foundId = getPendingCommand(); - *foundLen = remainingSize; - return HasReturnvaluesIF::RETURN_OK; -} - -ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, - const uint8_t* packet) { - using namespace plpcdu; - switch (id) { - case (SETUP_CMD): { - break; - } - case (READ_TEMP): { - uint8_t tempStartIdx = TEMP_REPLY_SIZE - 2; - adcSet.tempC.value = - max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); - break; - } - case (READ_CMD): { - PoolReadGuard pg(&adcSet); - if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { - return pg.getReadResult(); - } - for (uint8_t idx = 0; idx < 12; idx++) { - adcSet.channels[idx] = packet[idx * 2 + 1] << 8 | packet[idx * 2 + 2]; - } - break; - } - case (READ_WITH_TEMP): { - PoolReadGuard pg(&adcSet); - if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { - return pg.getReadResult(); - } - for (uint8_t idx = 0; idx < 12; idx++) { - adcSet.channels[idx] = packet[idx * 2 + 1] << 8 | packet[idx * 2 + 2]; - } - uint8_t tempStartIdx = ADC_REPLY_SIZE + TEMP_REPLY_SIZE - 2; - adcSet.tempC.value = - max1227::getTemperature(packet[tempStartIdx] << 8 | packet[tempStartIdx + 2]); - break; - } - default: { - break; - } - } - return HasReturnvaluesIF::RETURN_OK; -} - -uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { - // 20 minutes transition delay is allowed - return 20 * 60 * 60; -} - -ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, - LocalDataPoolManager& poolManager) { - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::CHANNEL_VEC, &channelValues); - localDataPoolMap.emplace(plpcdu::PlPcduPoolIds::TEMP, &tempC); - return HasReturnvaluesIF::RETURN_OK; -} - -void PayloadPcduHandler::setToGoToNormalModeImmediately(bool enable) { - this->goToNormalMode = enable; -} diff --git a/mission/devices/PayloadPcduHandler.h b/mission/devices/PayloadPcduHandler.h index 919df391..31579154 100644 --- a/mission/devices/PayloadPcduHandler.h +++ b/mission/devices/PayloadPcduHandler.h @@ -2,6 +2,7 @@ #define LINUX_DEVICES_PLPCDUHANDLER_H_ #include +#include #include #include "devicedefinitions/payloadPcduDefinitions.h" @@ -21,11 +22,13 @@ * - MPA - Medium Power Amplifier * - HPA - High Power Amplifier */ -class PayloadPcduHandler : DeviceHandlerBase { +class PayloadPcduHandler : public DeviceHandlerBase { public: - PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF); + PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF, + bool periodicPrintout); void setToGoToNormalModeImmediately(bool enable); + void enablePeriodicPrintout(bool enable, uint8_t divider); private: enum class States { @@ -61,6 +64,8 @@ class PayloadPcduHandler : DeviceHandlerBase { bool transitionOk = false; bool commandExecuted = false; bool adcCmdExecuted = false; + bool periodicPrintout = false; + PeriodicOperationDivider opDivider = PeriodicOperationDivider(5); uint8_t tempReadDivisor = 1; Countdown countdown = Countdown(5000); Countdown adcCountdown = Countdown(50); @@ -83,6 +88,10 @@ class PayloadPcduHandler : DeviceHandlerBase { uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; + + void handleExtConvRead(const uint8_t* bufStart); + void handlePrintout(); + void stateMachineToNormal(); }; #endif /* LINUX_DEVICES_PLPCDUHANDLER_H_ */ diff --git a/mission/devices/devicedefinitions/payloadPcduDefinitions.h b/mission/devices/devicedefinitions/payloadPcduDefinitions.h index a5de3a12..3ac8ce1b 100644 --- a/mission/devices/devicedefinitions/payloadPcduDefinitions.h +++ b/mission/devices/devicedefinitions/payloadPcduDefinitions.h @@ -21,6 +21,9 @@ static constexpr DeviceCommandId_t SETUP_CMD = 1; static constexpr DeviceCommandId_t READ_TEMP = 2; static constexpr DeviceCommandId_t READ_WITH_TEMP = 3; +static constexpr Submode_t NORMAL_ADC_ONLY = 0; +static constexpr Submode_t NORMAL_ALL_ON = 1; + // 12 ADC values * 2 + trailing zero static constexpr size_t ADC_REPLY_SIZE = 25; // Conversion byte + 24 * zero From aaefe9e1caebb77976e60380fa9bc2b746330824 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 22 Feb 2022 00:17:07 +0100 Subject: [PATCH 072/309] update .cproject file and README for watchdog --- README.md | 2 +- misc/eclipse/.cproject | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 254b3d62..8268ea24 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,7 @@ To build the EIVE watchdog, the corresponding target must be specified in the bu The configure steps do not need to be repeated if the folder has already been configured. ```sh -mkdir build-Debug-Q7S && cd build-Debug-Q7S +mkdir build-Debug-Watchdog && cd build-Debug-Watchdog cmake -DTGT_BSP=arm/q7s -DCMAKE_BUILD_TYPE=Debug .. cmake --build . --target eive-watchdog -j ``` diff --git a/misc/eclipse/.cproject b/misc/eclipse/.cproject index e2984ed8..15b0195b 100644 --- a/misc/eclipse/.cproject +++ b/misc/eclipse/.cproject @@ -1177,7 +1177,7 @@