diff --git a/.idea/cmake.xml b/.idea/cmake.xml
new file mode 100644
index 00000000..e8d9d9dd
--- /dev/null
+++ b/.idea/cmake.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9c1319d3..891a4d76 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,19 +19,46 @@ change warranting a new major release:
## Changed
+- Add `-Wshadow=local` shadowing warnings and fixed all of them
+
+## Added
+
+- git post checkout hook which initializes and updates the submodules
+ automatically.
+
+# [v1.28.0] 2023-02-17
+
+eive-tmtc: v2.12.7
+
+## Added
+
+- In case the ACS Controller does recognize more than one RW to be invalid and therefore not
+ available, it does not perform pointing control but aborts shortly after `sensorProcessing`. If the
+ problem persits for 5 ACS cycles, the `MULTIPLE_RW_INVALID` event is triggered, which invokes the
+ transition of the `AcsSubsystem` to safe mode.
+
+## Changed
+
- Igrf13 model vector now outputs as uT instead of nT
-- Changed timings for `AcsPst`
+- Changed timings for `AcsPst`, more time for sun sensors.
- Added values for MGM sensor fusion
+- Refactored RW Software: Polling runs in separate thread, all RWs are now polled in under 60 ms.
+ PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/381
+- Bumped FSFW to allow initializing child modes in `SubsystemBase` derived objects.
## Fixed
+
- Fixed values for GYR sensor fusion
+- Fixed speed types for `rwHandlingParameter`
+- Pseudo inverse used for allocating torque to RWs and RW antistiction now actually consider the
+ state of the RWs
# [v1.27.2] 2023-02-14
Reaction Wheel handling was determined to be (quasi) broken and needs to be fixed in future release
to be usable by ACS controller.
-eive-tmtc: v2.15.6
+eive-tmtc: v2.12.6
## Added
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4f62c199..895034c8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,8 +10,8 @@
cmake_minimum_required(VERSION 3.13)
set(OBSW_VERSION_MAJOR 1)
-set(OBSW_VERSION_MINOR 27)
-set(OBSW_VERSION_REVISION 2)
+set(OBSW_VERSION_MINOR 28)
+set(OBSW_VERSION_REVISION 0)
# set(CMAKE_VERBOSE TRUE)
@@ -358,6 +358,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
"-Wimplicit-fallthrough=1"
"-Wno-unused-parameter"
"-Wno-psabi"
+ "-Wshadow=local"
"-Wduplicated-cond" # check for duplicate conditions
"-Wduplicated-branches" # check for duplicate branches
"-Wlogical-op" # Search for bitwise operations instead of logical
diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp
index 42156029..794ae1d7 100644
--- a/bsp_hosted/fsfwconfig/events/translateEvents.cpp
+++ b/bsp_hosted/fsfwconfig/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
- * @brief Auto-generated event translation file. Contains 256 translations.
+ * @brief Auto-generated event translation file. Contains 257 translations.
* @details
- * Generated on: 2023-02-13 10:07:30
+ * Generated on: 2023-02-17 13:15:51
*/
#include "translateEvents.h"
@@ -92,6 +92,7 @@ const char *MSG_QUEUE_ERROR_STRING = "MSG_QUEUE_ERROR";
const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
+const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
@@ -129,8 +130,8 @@ const char *SELF_TEST_COIL_CURRENT_FAILURE_STRING = "SELF_TEST_COIL_CURRENT_FAIL
const char *INVALID_ERROR_BYTE_STRING = "INVALID_ERROR_BYTE";
const char *ERROR_STATE_STRING = "ERROR_STATE";
const char *RESET_OCCURED_STRING = "RESET_OCCURED";
-const char *BOOTING_FIRMWARE_FAILED_STRING = "BOOTING_FIRMWARE_FAILED";
-const char *BOOTING_BOOTLOADER_FAILED_STRING = "BOOTING_BOOTLOADER_FAILED";
+const char *BOOTING_FIRMWARE_FAILED_EVENT_STRING = "BOOTING_FIRMWARE_FAILED_EVENT";
+const char *BOOTING_BOOTLOADER_FAILED_EVENT_STRING = "BOOTING_BOOTLOADER_FAILED_EVENT";
const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_FAILURE";
const char *SUPV_UNKNOWN_TM_STRING = "SUPV_UNKNOWN_TM";
const char *SUPV_UNINIMPLEMENTED_TM_STRING = "SUPV_UNINIMPLEMENTED_TM";
@@ -433,6 +434,8 @@ const char *translateEvents(Event event) {
return SAFE_RATE_VIOLATION_STRING;
case (11201):
return SAFE_RATE_RECOVERY_STRING;
+ case (11202):
+ return MULTIPLE_RW_INVALID_STRING;
case (11300):
return SWITCH_CMD_SENT_STRING;
case (11301):
@@ -508,9 +511,9 @@ const char *translateEvents(Event event) {
case (11802):
return RESET_OCCURED_STRING;
case (11901):
- return BOOTING_FIRMWARE_FAILED_STRING;
+ return BOOTING_FIRMWARE_FAILED_EVENT_STRING;
case (11902):
- return BOOTING_BOOTLOADER_FAILED_STRING;
+ return BOOTING_BOOTLOADER_FAILED_EVENT_STRING;
case (12001):
return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
case (12002):
diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp
index 8f23a6d4..ccd02791 100644
--- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp
+++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp
@@ -2,7 +2,7 @@
* @brief Auto-generated object translation file.
* @details
* Contains 147 translations.
- * Generated on: 2023-02-13 10:07:30
+ * Generated on: 2023-02-17 13:15:51
*/
#include "translateObjects.h"
diff --git a/bsp_q7s/callbacks/rwSpiCallback.cpp b/bsp_q7s/callbacks/rwSpiCallback.cpp
index 74ede602..fa36744e 100644
--- a/bsp_q7s/callbacks/rwSpiCallback.cpp
+++ b/bsp_q7s/callbacks/rwSpiCallback.cpp
@@ -76,7 +76,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast(writeSize)) {
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- return RwHandler::SPI_WRITE_FAILURE;
+ return rws::SPI_WRITE_FAILURE;
}
/** Encoding and sending command */
@@ -101,7 +101,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast(writeSize)) {
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- return RwHandler::SPI_WRITE_FAILURE;
+ return rws::SPI_WRITE_FAILURE;
}
idx++;
}
@@ -113,7 +113,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
if (write(fileDescriptor, writeBuffer, writeSize) != static_cast(writeSize)) {
sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- return RwHandler::SPI_WRITE_FAILURE;
+ return rws::SPI_WRITE_FAILURE;
}
uint8_t* rxBuf = nullptr;
@@ -128,7 +128,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
// There must be a delay of at least 20 ms after sending the command.
// Delay for 70 ms here and release the SPI bus for that duration.
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- usleep(RwDefinitions::SPI_REPLY_DELAY);
+ usleep(rws::SPI_REPLY_DELAY);
result = openSpi(dev, O_RDWR, &gpioIF, gpioId, mutex, timeoutType, timeoutMs, fileDescriptor);
if (result != returnvalue::OK) {
return result;
@@ -139,17 +139,17 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
* However, receiving more than 5 empty frames will be interpreted as an error.
*/
uint8_t byteRead = 0;
- for (int idx = 0; idx < 10; idx++) {
+ for (idx = 0; idx < 10; idx++) {
if (read(fileDescriptor, &byteRead, 1) != 1) {
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- return RwHandler::SPI_READ_FAILURE;
+ return rws::SPI_READ_FAILURE;
}
if (idx == 0) {
if (byteRead != FLAG_BYTE) {
sif::error << "Invalid data, expected start marker" << std::endl;
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- return RwHandler::NO_START_MARKER;
+ return rws::NO_START_MARKER;
}
}
@@ -160,7 +160,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
if (idx == 9) {
sif::error << "rwSpiCallback::spiCallback: Empty frame timeout" << std::endl;
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- return RwHandler::NO_REPLY;
+ return rws::NO_REPLY;
}
}
@@ -175,7 +175,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
byteRead = 0;
if (read(fileDescriptor, &byteRead, 1) != 1) {
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
- result = RwHandler::SPI_READ_FAILURE;
+ result = rws::SPI_READ_FAILURE;
break;
}
}
@@ -186,7 +186,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
} else if (byteRead == 0x7D) {
if (read(fileDescriptor, &byteRead, 1) != 1) {
sif::error << "rwSpiCallback::spiCallback: Read failed" << std::endl;
- result = RwHandler::SPI_READ_FAILURE;
+ result = rws::SPI_READ_FAILURE;
break;
}
if (byteRead == 0x5E) {
@@ -200,7 +200,7 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
} else {
sif::error << "rwSpiCallback::spiCallback: Invalid substitute" << std::endl;
closeSpi(fileDescriptor, gpioId, &gpioIF, mutex);
- result = RwHandler::INVALID_SUBSTITUTE;
+ result = rws::INVALID_SUBSTITUTE;
break;
}
} else {
@@ -217,14 +217,14 @@ ReturnValue_t spiCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sen
if (decodedFrameLen == replyBufferSize) {
if (read(fileDescriptor, &byteRead, 1) != 1) {
sif::error << "rwSpiCallback::spiCallback: Failed to read last byte" << std::endl;
- result = RwHandler::SPI_READ_FAILURE;
+ result = rws::SPI_READ_FAILURE;
break;
}
if (byteRead != FLAG_BYTE) {
sif::error << "rwSpiCallback::spiCallback: Missing end sign " << static_cast(FLAG_BYTE)
<< std::endl;
decodedFrameLen--;
- result = RwHandler::MISSING_END_SIGN;
+ result = rws::MISSING_END_SIGN;
break;
}
}
diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp
index 4ff4965f..d3264b73 100644
--- a/bsp_q7s/core/CoreController.cpp
+++ b/bsp_q7s/core/CoreController.cpp
@@ -160,7 +160,7 @@ ReturnValue_t CoreController::initializeAfterTaskCreation() {
sdcMan->setActiveSdCard(sdInfo.active);
currMntPrefix = sdcMan->getCurrentMountPrefix();
if (BLOCKING_SD_INIT) {
- ReturnValue_t result = initSdCardBlocking();
+ result = initSdCardBlocking();
if (result != returnvalue::OK and result != SdCardManager::ALREADY_MOUNTED) {
sif::warning << "CoreController::CoreController: SD card init failed" << std::endl;
}
@@ -1163,7 +1163,7 @@ ReturnValue_t CoreController::updateProtInfo(bool regenerateChipStateFile) {
uint8_t lineCounter = 0;
string word;
while (getline(chipStateFile, nextLine)) {
- ReturnValue_t result = handleProtInfoUpdateLine(nextLine);
+ result = handleProtInfoUpdateLine(nextLine);
if (result != returnvalue::OK) {
sif::warning << "CoreController::updateProtInfo: Protection info update failed!" << std::endl;
return result;
diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp
index 4d634a95..4965b1eb 100644
--- a/bsp_q7s/core/ObjectFactory.cpp
+++ b/bsp_q7s/core/ObjectFactory.cpp
@@ -1,6 +1,7 @@
#include "ObjectFactory.h"
#include
+#include
#include
#include "OBSWConfig.h"
@@ -58,6 +59,7 @@
#include
#include
#include
+#include
#include
@@ -94,7 +96,6 @@
#include "mission/devices/devicedefinitions/GomspaceDefinitions.h"
#include "mission/devices/devicedefinitions/Max31865Definitions.h"
#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/system/objects/AcsBoardAssembly.h"
@@ -150,9 +151,8 @@ void ObjectFactory::createTmpComponents() {
void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF,
SerialComIF** uartComIF, SpiComIF** spiMainComIF,
- I2cComIF** i2cComIF, SpiComIF** spiRWComIF) {
- if (gpioComIF == nullptr or uartComIF == nullptr or spiMainComIF == nullptr or
- spiRWComIF == nullptr) {
+ I2cComIF** i2cComIF) {
+ if (gpioComIF == nullptr or uartComIF == nullptr or spiMainComIF == nullptr) {
sif::error << "ObjectFactory::createCommunicationInterfaces: Invalid passed ComIF pointer"
<< std::endl;
}
@@ -163,7 +163,7 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF,
*i2cComIF = new I2cComIF(objects::I2C_COM_IF);
*uartComIF = new SerialComIF(objects::UART_COM_IF);
*spiMainComIF = new SpiComIF(objects::SPI_MAIN_COM_IF, q7s::SPI_DEFAULT_DEV, **gpioComIF);
- *spiRWComIF = new SpiComIF(objects::SPI_RW_COM_IF, q7s::SPI_RW_DEV, **gpioComIF);
+ //*spiRWComIF = new SpiComIF(objects::SPI_RW_COM_IF, q7s::SPI_RW_DEV, **gpioComIF);
}
void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher) {
@@ -678,13 +678,12 @@ void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF,
std::array rwGpioIds = {gpioIds::EN_RW1, gpioIds::EN_RW2, gpioIds::EN_RW3,
gpioIds::EN_RW4};
std::array rws = {};
+ new RwPollingTask(objects::RW_POLLING_TASK, q7s::SPI_RW_DEV, *gpioComIF);
for (uint8_t idx = 0; idx < rwCookies.size(); idx++) {
- rwCookies[idx] = new SpiCookie(rwCookieParams[idx].first, rwCookieParams[idx].second,
- RwDefinitions::MAX_REPLY_SIZE, spi::RW_MODE, spi::RW_SPEED,
- &rwSpiCallback::spiCallback, nullptr);
- auto* rwHandler = new RwHandler(rwIds[idx], objects::SPI_RW_COM_IF, rwCookies[idx], gpioComIF,
+ rwCookies[idx] = new RwCookie(idx, rwCookieParams[idx].first, rwCookieParams[idx].second,
+ rws::MAX_REPLY_SIZE, spi::RW_MODE, spi::RW_SPEED);
+ auto* rwHandler = new RwHandler(rwIds[idx], objects::RW_POLLING_TASK, rwCookies[idx], gpioComIF,
rwGpioIds[idx], idx);
- rwCookies[idx]->setCallbackArgs(rwHandler);
#if OBSW_TEST_RW == 1
rws[idx]->setStartUpImmediately();
#endif
diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h
index 9d0e4ea3..2118e3d7 100644
--- a/bsp_q7s/core/ObjectFactory.h
+++ b/bsp_q7s/core/ObjectFactory.h
@@ -25,8 +25,7 @@ void setStatics();
void produce(void* args);
void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, SerialComIF** uartComIF,
- SpiComIF** spiMainComIF, I2cComIF** i2cComIF,
- SpiComIF** spiRwComIF);
+ SpiComIF** spiMainComIF, I2cComIF** i2cComIF);
void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher);
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
PowerSwitchIF* pwrSwitcher, Stack5VHandler& stackHandler);
diff --git a/bsp_q7s/core/scheduling.cpp b/bsp_q7s/core/scheduling.cpp
index 2fa8f015..9d96184b 100644
--- a/bsp_q7s/core/scheduling.cpp
+++ b/bsp_q7s/core/scheduling.cpp
@@ -196,6 +196,15 @@ void scheduling::initTasks() {
}
#endif /* OBSW_ADD_GPS_CTRL */
+#if OBSW_ADD_RW == 1
+ PeriodicTaskIF* rwPolling = factory->createPeriodicTask(
+ "RW_POLLING_TASK", 70, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
+ result = rwPolling->addComponent(objects::RW_POLLING_TASK);
+ if (result != returnvalue::OK) {
+ scheduling::printAddObjectError("RW_POLLING_TASK", objects::RW_POLLING_TASK);
+ }
+#endif
+
PeriodicTaskIF* acsSysTask = factory->createPeriodicTask(
"ACS_SYS_TASK", 55, PeriodicTaskIF::MINIMUM_STACK_SIZE * 2, 0.4, missedDeadlineFunc);
static_cast(acsSysTask);
@@ -355,6 +364,9 @@ void scheduling::initTasks() {
strHelperTask->startTask();
#endif /* OBSW_ADD_STAR_TRACKER == 1 */
+#if OBSW_ADD_RW == 1
+ rwPolling->startTask();
+#endif
#if OBSW_ADD_GPS_CTRL == 1
gpsTask->startTask();
#endif
diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp
index f04766eb..d640ac35 100644
--- a/bsp_q7s/fmObjectFactory.cpp
+++ b/bsp_q7s/fmObjectFactory.cpp
@@ -25,8 +25,7 @@ void ObjectFactory::produce(void* args) {
SpiComIF* spiMainComIF = nullptr;
I2cComIF* i2cComIF = nullptr;
PowerSwitchIF* pwrSwitcher = nullptr;
- SpiComIF* spiRwComIF = nullptr;
- createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF, &spiRwComIF);
+ createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF);
/* Adding gpios for chip select decoding to the gpioComIf */
q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF);
gpioCallbacks::disableAllDecoder(gpioComIF);
diff --git a/bsp_q7s/obsw.cpp b/bsp_q7s/obsw.cpp
index 6df92158..cfd28565 100644
--- a/bsp_q7s/obsw.cpp
+++ b/bsp_q7s/obsw.cpp
@@ -74,16 +74,23 @@ int obsw::obsw() {
scheduling::initMission();
-#if OBSW_COMMAND_SAFE_MODE_AT_STARTUP == 1
// Command the EIVE system to safe mode
auto sysQueueId = satsystem::EIVE_SYSTEM.getCommandQueue();
CommandMessage msg;
+#if OBSW_COMMAND_SAFE_MODE_AT_STARTUP == 1
ModeMessage::setCmdModeMessage(msg, acs::AcsMode::SAFE, 0);
ReturnValue_t result =
MessageQueueSenderIF::sendMessage(sysQueueId, &msg, MessageQueueIF::NO_QUEUE, false);
if (result != returnvalue::OK) {
sif::error << "Sending safe mode command to EIVE system failed" << std::endl;
}
+#else
+ ModeMessage::setModeAnnounceMessage(msg, true);
+ ReturnValue_t result =
+ MessageQueueSenderIF::sendMessage(sysQueueId, &msg, MessageQueueIF::NO_QUEUE, false);
+ if (result != returnvalue::OK) {
+ sif::error << "Sending safe mode command to EIVE system failed" << std::endl;
+ }
#endif
for (;;) {
diff --git a/clone-submodules-no-privlibs.sh b/clone-submodules-no-privlibs.sh
index ae08a9ce..48d34bc2 100755
--- a/clone-submodules-no-privlibs.sh
+++ b/clone-submodules-no-privlibs.sh
@@ -1,3 +1,6 @@
#!/bin/bash
+root="$(pwd)"
+ln -s "$root/hooks" "$root/.git/hooks"
+
git submodule update --init fsfw thirdparty/rapidcsv thirdparty/lwgps thirdparty/json
diff --git a/common/config/eive/definitions.h b/common/config/eive/definitions.h
index 9e67176a..202bd89d 100644
--- a/common/config/eive/definitions.h
+++ b/common/config/eive/definitions.h
@@ -61,6 +61,7 @@ static constexpr uint32_t SCHED_BLOCK_1_SUS_READ_MS = 15;
static constexpr uint32_t SCHED_BLOCK_2_SENSOR_READ_MS = 30;
static constexpr uint32_t SCHED_BLOCK_3_ACS_CTRL_MS = 45;
static constexpr uint32_t SCHED_BLOCK_4_ACTUATOR_MS = 50;
+static constexpr uint32_t SCHED_BLOCK_5_RW_READ_MS = 300;
// 15 ms for FM
static constexpr float SCHED_BLOCK_1_PERIOD = static_cast(SCHED_BLOCK_1_SUS_READ_MS) / 400.0;
@@ -68,6 +69,7 @@ static constexpr float SCHED_BLOCK_2_PERIOD =
static_cast(SCHED_BLOCK_2_SENSOR_READ_MS) / 400.0;
static constexpr float SCHED_BLOCK_3_PERIOD = static_cast(SCHED_BLOCK_3_ACS_CTRL_MS) / 400.0;
static constexpr float SCHED_BLOCK_4_PERIOD = static_cast(SCHED_BLOCK_4_ACTUATOR_MS) / 400.0;
+static constexpr float SCHED_BLOCK_5_PERIOD = static_cast(SCHED_BLOCK_5_RW_READ_MS) / 400.0;
} // namespace acs
diff --git a/dummies/RwDummy.cpp b/dummies/RwDummy.cpp
index a21e7ab7..54e7ac83 100644
--- a/dummies/RwDummy.cpp
+++ b/dummies/RwDummy.cpp
@@ -1,6 +1,6 @@
#include "RwDummy.h"
-#include
+#include
RwDummy::RwDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
: DeviceHandlerBase(objectId, comif, comCookie) {}
@@ -37,39 +37,39 @@ uint32_t RwDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return
ReturnValue_t RwDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
LocalDataPoolManager &poolManager) {
- localDataPoolMap.emplace(RwDefinitions::TEMPERATURE_C, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::TEMPERATURE_C, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::CURR_SPEED, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::REFERENCE_SPEED, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::CLC_MODE, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::CURR_SPEED, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::REFERENCE_SPEED, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::STATE, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::CLC_MODE, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::LAST_RESET_STATUS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::CURRRENT_RESET_STATUS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::LAST_RESET_STATUS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::CURRRENT_RESET_STATUS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::TM_LAST_RESET_STATUS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::TM_MCU_TEMPERATURE, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::PRESSURE_SENSOR_TEMPERATURE, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::PRESSURE, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::TM_RW_STATE, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::TM_CLC_MODE, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::TM_RW_CURR_SPEED, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::TM_RW_REF_SPEED, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::INVALID_CRC_PACKETS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::INVALID_LEN_PACKETS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::INVALID_CMD_PACKETS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::EXECUTED_REPLIES, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::COMMAND_REPLIES, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::UART_BYTES_WRITTEN, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::UART_BYTES_READ, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::UART_PARITY_ERRORS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::UART_NOISE_ERRORS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::UART_FRAME_ERRORS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::UART_REG_OVERRUN_ERRORS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::UART_TOTAL_ERRORS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::SPI_BYTES_WRITTEN, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::SPI_BYTES_READ, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::SPI_REG_OVERRUN_ERRORS, new PoolEntry({0}));
- localDataPoolMap.emplace(RwDefinitions::SPI_TOTAL_ERRORS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::TM_LAST_RESET_STATUS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::TM_MCU_TEMPERATURE, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::PRESSURE_SENSOR_TEMPERATURE, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::PRESSURE, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::TM_RW_STATE, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::TM_CLC_MODE, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::TM_RW_CURR_SPEED, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::TM_RW_REF_SPEED, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::INVALID_CRC_PACKETS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::INVALID_LEN_PACKETS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::INVALID_CMD_PACKETS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::EXECUTED_REPLIES, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::COMMAND_REPLIES, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::UART_BYTES_WRITTEN, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::UART_BYTES_READ, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::UART_PARITY_ERRORS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::UART_NOISE_ERRORS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::UART_FRAME_ERRORS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::UART_REG_OVERRUN_ERRORS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::UART_TOTAL_ERRORS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::SPI_BYTES_WRITTEN, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::SPI_BYTES_READ, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::SPI_REG_OVERRUN_ERRORS, new PoolEntry({0}));
+ localDataPoolMap.emplace(rws::SPI_TOTAL_ERRORS, new PoolEntry({0}));
return returnvalue::OK;
}
diff --git a/fsfw b/fsfw
index 9de6c4b3..c8469ca6 160000
--- a/fsfw
+++ b/fsfw
@@ -1 +1 @@
-Subproject commit 9de6c4b3aa20ee63c28051d486be8a12df147f22
+Subproject commit c8469ca6473f64676e007e2e2f1c733fe6252053
diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv
index 23d51222..4d1488e3 100644
--- a/generators/bsp_hosted_events.csv
+++ b/generators/bsp_hosted_events.csv
@@ -86,6 +86,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
10802;0x2a32;SERIALIZATION_ERROR;LOW;;fsfw/src/fsfw/cfdp/handler/defs.h
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;;mission/acsDefs.h
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;;mission/acsDefs.h
+11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;;mission/acsDefs.h
11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
@@ -121,10 +122,10 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
11706;0x2dba;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;mission/devices/ImtqHandler.h
11707;0x2dbb;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;mission/devices/ImtqHandler.h
11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/ImtqHandler.h
-11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/RwDefinitions.h
-11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/RwDefinitions.h
-11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
-11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
+11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/rwHelpers.h
+11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/rwHelpers.h
+11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
+11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/devices/ploc/PlocSupervisorHandler.h
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;;linux/devices/ploc/PlocSupervisorHandler.h
diff --git a/generators/bsp_hosted_returnvalues.csv b/generators/bsp_hosted_returnvalues.csv
index b707b0be..6502365b 100644
--- a/generators/bsp_hosted_returnvalues.csv
+++ b/generators/bsp_hosted_returnvalues.csv
@@ -2,24 +2,26 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x0000;OK;System-wide code for ok.;0;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.h
0x0001;Failed;Unspecified system-wide code for failed.;1;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.h
0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/tmtc/CcsdsIpCoreHandler.h
+0x52b0;RWHA_SpiWriteFailure;;176;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b7;RWHA_SpiReadTimeout;Timeout when reading reply;183;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
0x5d00;GOMS_PacketTooLong;;0;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d01;GOMS_InvalidTableId;;1;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d02;GOMS_InvalidAddress;;2;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d03;GOMS_InvalidParamSize;;3;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d04;GOMS_InvalidPayloadSize;;4;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d05;GOMS_UnknownReplyId;;5;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
-0x52b0;RWHA_SpiWriteFailure;;176;RW_HANDLER;mission/devices/RwHandler.h
-0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/devices/RwHandler.h
-0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/devices/RwHandler.h
-0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/devices/RwHandler.h
-0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/devices/RwHandler.h
-0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/devices/RwHandler.h
-0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/devices/RwHandler.h
-0x52a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;RW_HANDLER;mission/devices/RwHandler.h
-0x52a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;161;RW_HANDLER;mission/devices/RwHandler.h
-0x52a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;RW_HANDLER;mission/devices/RwHandler.h
-0x52a3;RWHA_ExecutionFailed;Command execution failed;163;RW_HANDLER;mission/devices/RwHandler.h
-0x52a4;RWHA_CrcError;Reaction wheel reply has invalid crc;164;RW_HANDLER;mission/devices/RwHandler.h
+0x5da0;GOMS_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da1;GOMS_InvalidRampTime;Action Message with invalid ramp time was received.;161;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da2;GOMS_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da3;GOMS_ExecutionFailed;Command execution failed;163;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da4;GOMS_CrcError;Reaction wheel reply has invalid crc;164;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da5;GOMS_ValueNotRead;;165;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
0x4fa1;HEATER_CommandNotSupported;;161;HEATER_HANDLER;mission/devices/HeaterHandler.h
0x4fa2;HEATER_InitFailed;;162;HEATER_HANDLER;mission/devices/HeaterHandler.h
0x4fa3;HEATER_InvalidSwitchNr;;163;HEATER_HANDLER;mission/devices/HeaterHandler.h
diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv
index 23d51222..4d1488e3 100644
--- a/generators/bsp_q7s_events.csv
+++ b/generators/bsp_q7s_events.csv
@@ -86,6 +86,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
10802;0x2a32;SERIALIZATION_ERROR;LOW;;fsfw/src/fsfw/cfdp/handler/defs.h
11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;;mission/acsDefs.h
11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;;mission/acsDefs.h
+11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;;mission/acsDefs.h
11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h
11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;;mission/devices/devicedefinitions/powerDefinitions.h
@@ -121,10 +122,10 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
11706;0x2dba;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;mission/devices/ImtqHandler.h
11707;0x2dbb;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;mission/devices/ImtqHandler.h
11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/ImtqHandler.h
-11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/RwDefinitions.h
-11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/RwDefinitions.h
-11901;0x2e7d;BOOTING_FIRMWARE_FAILED;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
-11902;0x2e7e;BOOTING_BOOTLOADER_FAILED;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
+11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/rwHelpers.h
+11802;0x2e1a;RESET_OCCURED;LOW;;mission/devices/devicedefinitions/rwHelpers.h
+11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h
+11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h
12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h
12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/devices/ploc/PlocSupervisorHandler.h
12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;;linux/devices/ploc/PlocSupervisorHandler.h
diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv
index 08c09a47..56dbacef 100644
--- a/generators/bsp_q7s_objects.csv
+++ b/generators/bsp_q7s_objects.csv
@@ -76,7 +76,7 @@
0x49010005;GPIO_IF
0x49010006;SCEX_UART_READER
0x49020004;SPI_MAIN_COM_IF
-0x49020005;SPI_RW_COM_IF
+0x49020005;RW_POLLING_TASK
0x49020006;SPI_RTD_COM_IF
0x49030003;UART_COM_IF
0x49040002;I2C_COM_IF
diff --git a/generators/bsp_q7s_returnvalues.csv b/generators/bsp_q7s_returnvalues.csv
index 2741ae71..73667b51 100644
--- a/generators/bsp_q7s_returnvalues.csv
+++ b/generators/bsp_q7s_returnvalues.csv
@@ -2,24 +2,26 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x0000;OK;System-wide code for ok.;0;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.h
0x0001;Failed;Unspecified system-wide code for failed.;1;HasReturnvaluesIF;fsfw/returnvalues/returnvalue.h
0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/tmtc/CcsdsIpCoreHandler.h
+0x52b0;RWHA_SpiWriteFailure;;176;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
+0x52b7;RWHA_SpiReadTimeout;Timeout when reading reply;183;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h
0x5d00;GOMS_PacketTooLong;;0;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d01;GOMS_InvalidTableId;;1;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d02;GOMS_InvalidAddress;;2;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d03;GOMS_InvalidParamSize;;3;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d04;GOMS_InvalidPayloadSize;;4;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
0x5d05;GOMS_UnknownReplyId;;5;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h
-0x52b0;RWHA_SpiWriteFailure;;176;RW_HANDLER;mission/devices/RwHandler.h
-0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/devices/RwHandler.h
-0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/devices/RwHandler.h
-0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/devices/RwHandler.h
-0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/devices/RwHandler.h
-0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/devices/RwHandler.h
-0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/devices/RwHandler.h
-0x52a0;RWHA_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;RW_HANDLER;mission/devices/RwHandler.h
-0x52a1;RWHA_InvalidRampTime;Action Message with invalid ramp time was received.;161;RW_HANDLER;mission/devices/RwHandler.h
-0x52a2;RWHA_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;RW_HANDLER;mission/devices/RwHandler.h
-0x52a3;RWHA_ExecutionFailed;Command execution failed;163;RW_HANDLER;mission/devices/RwHandler.h
-0x52a4;RWHA_CrcError;Reaction wheel reply has invalid crc;164;RW_HANDLER;mission/devices/RwHandler.h
+0x5da0;GOMS_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da1;GOMS_InvalidRampTime;Action Message with invalid ramp time was received.;161;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da2;GOMS_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da3;GOMS_ExecutionFailed;Command execution failed;163;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da4;GOMS_CrcError;Reaction wheel reply has invalid crc;164;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
+0x5da5;GOMS_ValueNotRead;;165;GOM_SPACE_HANDLER;mission/devices/RwHandler.h
0x4fa1;HEATER_CommandNotSupported;;161;HEATER_HANDLER;mission/devices/HeaterHandler.h
0x4fa2;HEATER_InitFailed;;162;HEATER_HANDLER;mission/devices/HeaterHandler.h
0x4fa3;HEATER_InvalidSwitchNr;;163;HEATER_HANDLER;mission/devices/HeaterHandler.h
@@ -573,20 +575,20 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path
0x5402;DWLPWRON_InvalidCrc;;2;DWLPWRON_CMD;linux/devices/ScexHelper.h
0x59a0;IPCI_PapbBusy;;160;CCSDS_IP_CORE_BRIDGE;linux/ipcore/PapbVcInterface.h
0x5aa0;PTME_UnknownVcId;;160;PTME;linux/ipcore/Ptme.h
-0x5fa0;PDEC_AbandonedCltu;;160;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fa1;PDEC_FrameDirty;;161;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa0;PDEC_AbandonedCltuRetval;;160;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa1;PDEC_FrameDirtyRetval;;161;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa2;PDEC_FrameIllegalMultipleReasons;;162;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fa3;PDEC_AdDiscardedLockout;;163;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fa4;PDEC_AdDiscardedWait;;164;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa3;PDEC_AdDiscardedLockoutRetval;;163;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa4;PDEC_AdDiscardedWaitRetval;;164;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fa5;PDEC_AdDiscardedNsVs;;165;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fb0;PDEC_CommandNotImplemented;Received action message with unknown action id;176;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fa6;PDEC_NoReport;;166;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fa7;PDEC_ErrorVersionNumber;;167;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fa8;PDEC_IllegalCombination;;168;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fa9;PDEC_InvalidScId;;169;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5faa;PDEC_InvalidVcIdMsb;;170;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fab;PDEC_InvalidVcIdLsb;;171;PDEC_HANDLER;linux/ipcore/PdecHandler.h
-0x5fac;PDEC_NsNotZero;;172;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa6;PDEC_NoReportRetval;;166;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa7;PDEC_ErrorVersionNumberRetval;;167;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa8;PDEC_IllegalCombinationRetval;;168;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fa9;PDEC_InvalidScIdRetval;;169;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5faa;PDEC_InvalidVcIdMsbRetval;;170;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fab;PDEC_InvalidVcIdLsbRetval;;171;PDEC_HANDLER;linux/ipcore/PdecHandler.h
+0x5fac;PDEC_NsNotZeroRetval;;172;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x5fae;PDEC_InvalidBcCc;;174;PDEC_HANDLER;linux/ipcore/PdecHandler.h
0x61a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;160;RATE_SETTER;linux/ipcore/PtmeConfig.h
0x61a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);161;RATE_SETTER;linux/ipcore/PtmeConfig.h
diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp
index 42156029..794ae1d7 100644
--- a/generators/events/translateEvents.cpp
+++ b/generators/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
- * @brief Auto-generated event translation file. Contains 256 translations.
+ * @brief Auto-generated event translation file. Contains 257 translations.
* @details
- * Generated on: 2023-02-13 10:07:30
+ * Generated on: 2023-02-17 13:15:51
*/
#include "translateEvents.h"
@@ -92,6 +92,7 @@ const char *MSG_QUEUE_ERROR_STRING = "MSG_QUEUE_ERROR";
const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
+const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
@@ -129,8 +130,8 @@ const char *SELF_TEST_COIL_CURRENT_FAILURE_STRING = "SELF_TEST_COIL_CURRENT_FAIL
const char *INVALID_ERROR_BYTE_STRING = "INVALID_ERROR_BYTE";
const char *ERROR_STATE_STRING = "ERROR_STATE";
const char *RESET_OCCURED_STRING = "RESET_OCCURED";
-const char *BOOTING_FIRMWARE_FAILED_STRING = "BOOTING_FIRMWARE_FAILED";
-const char *BOOTING_BOOTLOADER_FAILED_STRING = "BOOTING_BOOTLOADER_FAILED";
+const char *BOOTING_FIRMWARE_FAILED_EVENT_STRING = "BOOTING_FIRMWARE_FAILED_EVENT";
+const char *BOOTING_BOOTLOADER_FAILED_EVENT_STRING = "BOOTING_BOOTLOADER_FAILED_EVENT";
const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_FAILURE";
const char *SUPV_UNKNOWN_TM_STRING = "SUPV_UNKNOWN_TM";
const char *SUPV_UNINIMPLEMENTED_TM_STRING = "SUPV_UNINIMPLEMENTED_TM";
@@ -433,6 +434,8 @@ const char *translateEvents(Event event) {
return SAFE_RATE_VIOLATION_STRING;
case (11201):
return SAFE_RATE_RECOVERY_STRING;
+ case (11202):
+ return MULTIPLE_RW_INVALID_STRING;
case (11300):
return SWITCH_CMD_SENT_STRING;
case (11301):
@@ -508,9 +511,9 @@ const char *translateEvents(Event event) {
case (11802):
return RESET_OCCURED_STRING;
case (11901):
- return BOOTING_FIRMWARE_FAILED_STRING;
+ return BOOTING_FIRMWARE_FAILED_EVENT_STRING;
case (11902):
- return BOOTING_BOOTLOADER_FAILED_STRING;
+ return BOOTING_BOOTLOADER_FAILED_EVENT_STRING;
case (12001):
return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
case (12002):
diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp
index 9eba7b06..9e461be6 100644
--- a/generators/objects/translateObjects.cpp
+++ b/generators/objects/translateObjects.cpp
@@ -2,7 +2,7 @@
* @brief Auto-generated object translation file.
* @details
* Contains 152 translations.
- * Generated on: 2023-02-13 10:07:30
+ * Generated on: 2023-02-17 13:15:51
*/
#include "translateObjects.h"
@@ -84,7 +84,7 @@ const char *ARDUINO_COM_IF_STRING = "ARDUINO_COM_IF";
const char *GPIO_IF_STRING = "GPIO_IF";
const char *SCEX_UART_READER_STRING = "SCEX_UART_READER";
const char *SPI_MAIN_COM_IF_STRING = "SPI_MAIN_COM_IF";
-const char *SPI_RW_COM_IF_STRING = "SPI_RW_COM_IF";
+const char *RW_POLLING_TASK_STRING = "RW_POLLING_TASK";
const char *SPI_RTD_COM_IF_STRING = "SPI_RTD_COM_IF";
const char *UART_COM_IF_STRING = "UART_COM_IF";
const char *I2C_COM_IF_STRING = "I2C_COM_IF";
@@ -318,7 +318,7 @@ const char *translateObject(object_id_t object) {
case 0x49020004:
return SPI_MAIN_COM_IF_STRING;
case 0x49020005:
- return SPI_RW_COM_IF_STRING;
+ return RW_POLLING_TASK_STRING;
case 0x49020006:
return SPI_RTD_COM_IF_STRING;
case 0x49030003:
diff --git a/hooks/post-checkout b/hooks/post-checkout
new file mode 100755
index 00000000..bfddad44
--- /dev/null
+++ b/hooks/post-checkout
@@ -0,0 +1,6 @@
+#!/bin/bash
+#
+# update submodules after checkout
+
+git submodule init
+git submodule update
diff --git a/linux/boardtest/I2cTestClass.cpp b/linux/boardtest/I2cTestClass.cpp
index 40a66125..4d4e6267 100644
--- a/linux/boardtest/I2cTestClass.cpp
+++ b/linux/boardtest/I2cTestClass.cpp
@@ -29,7 +29,7 @@ ReturnValue_t I2cTestClass::performPeriodicAction() {
void I2cTestClass::battInit() {
sif::info << "I2cTestClass: BPX Initialization" << std::endl;
- UnixFileGuard fileHelper(i2cdev, &bpxInfo.fd, O_RDWR, "I2cTestClass::sendMessage");
+ UnixFileGuard fileHelper(i2cdev, bpxInfo.fd, O_RDWR, "I2cTestClass::sendMessage");
if (fileHelper.getOpenResult() != returnvalue::OK) {
sif::error << "Opening I2C device" << i2cdev << " failed" << std::endl;
return;
@@ -58,7 +58,7 @@ void I2cTestClass::battInit() {
}
void I2cTestClass::battPeriodic() {
- UnixFileGuard fileHelper(i2cdev, &bpxInfo.fd, O_RDWR, "I2cTestClass::sendMessage");
+ UnixFileGuard fileHelper(i2cdev, bpxInfo.fd, O_RDWR, "I2cTestClass::sendMessage");
if (fileHelper.getOpenResult() != returnvalue::OK) {
sif::error << "Opening I2C device" << i2cdev << " failed" << std::endl;
return;
diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp
index 91e8893c..2521c9a8 100644
--- a/linux/boardtest/SpiTestClass.cpp
+++ b/linux/boardtest/SpiTestClass.cpp
@@ -94,7 +94,7 @@ void SpiTestClass::performRm3100Test(uint8_t mgmId) {
#endif
int fileDescriptor = 0;
- UnixFileGuard fileHelper(deviceName, &fileDescriptor, O_RDWR, "SpiComIF::initializeInterface");
+ UnixFileGuard fileHelper(deviceName, fileDescriptor, O_RDWR, "SpiComIF::initializeInterface");
if (fileHelper.getOpenResult()) {
sif::error << "SpiTestClass::performRm3100Test: File descriptor could not be opened!"
<< std::endl;
@@ -137,7 +137,7 @@ void SpiTestClass::performRm3100Test(uint8_t mgmId) {
if ((statusReg & 0b1000'0000) == 0) {
sif::warning << "SpiTestClass::performRm3100Test: Data not ready!" << std::endl;
TaskFactory::delayTask(10);
- uint8_t statusReg = readRm3100Register(fileDescriptor, currentGpioId, 0x34);
+ statusReg = readRm3100Register(fileDescriptor, currentGpioId, 0x34);
if ((statusReg & 0b1000'0000) == 0) {
return;
}
@@ -191,7 +191,7 @@ void SpiTestClass::performLis3MdlTest(uint8_t lis3Id) {
#endif
int fileDescriptor = 0;
- UnixFileGuard fileHelper(deviceName, &fileDescriptor, O_RDWR, "SpiComIF::initializeInterface");
+ UnixFileGuard fileHelper(deviceName, fileDescriptor, O_RDWR, "SpiComIF::initializeInterface");
if (fileHelper.getOpenResult()) {
sif::error << "SpiTestClass::performLis3Mdl3100Test: File descriptor could not be opened!"
<< std::endl;
@@ -231,7 +231,7 @@ void SpiTestClass::performL3gTest(uint8_t l3gId) {
#endif
int fileDescriptor = 0;
- UnixFileGuard fileHelper(deviceName, &fileDescriptor, O_RDWR, "SpiComIF::initializeInterface");
+ UnixFileGuard fileHelper(deviceName, fileDescriptor, O_RDWR, "SpiComIF::initializeInterface");
if (fileHelper.getOpenResult()) {
sif::error << "SpiTestClass::performLis3Mdl3100Test: File descriptor could not be opened!"
<< std::endl;
@@ -341,7 +341,7 @@ void SpiTestClass::performMax1227Test() {
#elif defined(TE0720_1CFA)
#endif
int fd = 0;
- UnixFileGuard fileHelper(deviceName, &fd, O_RDWR, "SpiComIF::initializeInterface");
+ UnixFileGuard fileHelper(deviceName, fd, O_RDWR, "SpiComIF::initializeInterface");
if (fileHelper.getOpenResult()) {
sif::error << "SpiTestClass::performLis3Mdl3100Test: File descriptor could not be opened!"
<< std::endl;
diff --git a/linux/csp/CspComIF.cpp b/linux/csp/CspComIF.cpp
index ea508a31..23359c0a 100644
--- a/linux/csp/CspComIF.cpp
+++ b/linux/csp/CspComIF.cpp
@@ -141,8 +141,8 @@ ReturnValue_t CspComIF::sendMessage(CookieIF* cookie, const uint8_t* sendData, s
requestStruct.mem_id = P60PDU_PARAM;
requestStruct.count = p60pdu_config_count;
requestStruct.size = P60PDU_PARAM_SIZE;
- int result = rparam_get_full_table(&requestStruct, cspAddress, P60_PORT_RPARAM,
- requestStruct.mem_id, cspCookie->getTimeout());
+ result = rparam_get_full_table(&requestStruct, cspAddress, P60_PORT_RPARAM,
+ requestStruct.mem_id, cspCookie->getTimeout());
if (result != 0) {
return returnvalue::FAILED;
}
@@ -151,8 +151,8 @@ ReturnValue_t CspComIF::sendMessage(CookieIF* cookie, const uint8_t* sendData, s
requestStruct.mem_id = P60ACU_PARAM;
requestStruct.count = p60acu_config_count;
requestStruct.size = P60ACU_PARAM_SIZE;
- int result = rparam_get_full_table(&requestStruct, cspAddress, P60_PORT_RPARAM,
- requestStruct.mem_id, cspCookie->getTimeout());
+ result = rparam_get_full_table(&requestStruct, cspAddress, P60_PORT_RPARAM,
+ requestStruct.mem_id, cspCookie->getTimeout());
if (result != 0) {
return returnvalue::FAILED;
}
@@ -161,8 +161,8 @@ ReturnValue_t CspComIF::sendMessage(CookieIF* cookie, const uint8_t* sendData, s
requestStruct.mem_id = P60DOCK_PARAM;
requestStruct.count = p60dock_config_count;
requestStruct.size = P60DOCK_PARAM_SIZE;
- int result = rparam_get_full_table(&requestStruct, cspAddress, P60_PORT_RPARAM,
- requestStruct.mem_id, cspCookie->getTimeout());
+ result = rparam_get_full_table(&requestStruct, cspAddress, P60_PORT_RPARAM,
+ requestStruct.mem_id, cspCookie->getTimeout());
if (result != 0) {
return returnvalue::FAILED;
}
@@ -171,8 +171,8 @@ ReturnValue_t CspComIF::sendMessage(CookieIF* cookie, const uint8_t* sendData, s
return returnvalue::FAILED;
}
const TableInfo* tableInfo = reinterpret_cast(sendData);
- int result = gs_rparam_save(cspAddress, cspCookie->getTimeout(), tableInfo->sourceTable,
- tableInfo->targetTable);
+ result = gs_rparam_save(cspAddress, cspCookie->getTimeout(), tableInfo->sourceTable,
+ tableInfo->targetTable);
if (result != 0) {
return returnvalue::FAILED;
}
@@ -181,8 +181,8 @@ ReturnValue_t CspComIF::sendMessage(CookieIF* cookie, const uint8_t* sendData, s
return returnvalue::FAILED;
}
const TableInfo* tableInfo = reinterpret_cast(sendData);
- int result = gs_rparam_load(cspAddress, cspCookie->getTimeout(), tableInfo->sourceTable,
- tableInfo->targetTable);
+ result = gs_rparam_load(cspAddress, cspCookie->getTimeout(), tableInfo->sourceTable,
+ tableInfo->targetTable);
if (result != 0) {
return returnvalue::FAILED;
}
diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt
index 4864e01f..7251b802 100644
--- a/linux/devices/CMakeLists.txt
+++ b/linux/devices/CMakeLists.txt
@@ -4,7 +4,7 @@ endif()
target_sources(
${OBSW_NAME} PRIVATE Max31865RtdLowlevelHandler.cpp ScexUartReader.cpp
- ScexDleParser.cpp ScexHelper.cpp)
+ ScexDleParser.cpp ScexHelper.cpp RwPollingTask.cpp)
add_subdirectory(ploc)
diff --git a/linux/devices/Max31865RtdLowlevelHandler.cpp b/linux/devices/Max31865RtdLowlevelHandler.cpp
index 52a107dc..0af22bfa 100644
--- a/linux/devices/Max31865RtdLowlevelHandler.cpp
+++ b/linux/devices/Max31865RtdLowlevelHandler.cpp
@@ -232,7 +232,7 @@ ReturnValue_t Max31865RtdReader::sendMessage(CookieIF* cookie, const uint8_t* se
return returnvalue::FAILED;
}
- auto thresholdHandler = [](Max31865ReaderCookie* rtdCookie, const uint8_t* sendData) {
+ auto thresholdHandler = [&]() {
rtdCookie->lowThreshold = (sendData[1] << 8) | sendData[2];
rtdCookie->highThreshold = (sendData[3] << 8) | sendData[4];
rtdCookie->writeLowThreshold = true;
@@ -249,7 +249,7 @@ ReturnValue_t Max31865RtdReader::sendMessage(CookieIF* cookie, const uint8_t* se
rtdCookie->db.active = false;
rtdCookie->db.configured = false;
if (sendLen == 5) {
- thresholdHandler(rtdCookie, sendData);
+ thresholdHandler();
}
}
break;
@@ -265,7 +265,7 @@ ReturnValue_t Max31865RtdReader::sendMessage(CookieIF* cookie, const uint8_t* se
rtdCookie->db.active = true;
}
if (sendLen == 5) {
- thresholdHandler(rtdCookie, sendData);
+ thresholdHandler();
}
break;
}
diff --git a/linux/devices/RwPollingTask.cpp b/linux/devices/RwPollingTask.cpp
new file mode 100644
index 00000000..1c209ed3
--- /dev/null
+++ b/linux/devices/RwPollingTask.cpp
@@ -0,0 +1,532 @@
+#include "RwPollingTask.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "devConf.h"
+#include "mission/devices/devicedefinitions/rwHelpers.h"
+
+RwPollingTask::RwPollingTask(object_id_t objectId, const char* spiDev, GpioIF& gpioIF)
+ : SystemObject(objectId), spiDev(spiDev), gpioIF(gpioIF) {
+ semaphore = SemaphoreFactory::instance()->createBinarySemaphore();
+ semaphore->acquire();
+ ipcLock = MutexFactory::instance()->createMutex();
+ spiLock = MutexFactory::instance()->createMutex();
+}
+
+ReturnValue_t RwPollingTask::performOperation(uint8_t operationCode) {
+ for (unsigned i = 0; i < 4; i++) {
+ if (rwCookies[i] == nullptr) {
+ sif::error << "Invalid RW cookie at index" << i << std::endl;
+ return returnvalue::FAILED;
+ }
+ }
+ while (true) {
+ ipcLock->lockMutex();
+ state = InternalState::IDLE;
+ ipcLock->unlockMutex();
+ semaphore->acquire();
+ // This loop takes 50 ms on a debug build.
+ // Stopwatch watch;
+ TaskFactory::delayTask(5);
+ int fd = 0;
+ for (auto& skip : skipCommandingForRw) {
+ skip = false;
+ }
+ setAllReadFlagsFalse();
+ ReturnValue_t result = openSpi(O_RDWR, fd);
+ if (result != returnvalue::OK) {
+ continue;
+ }
+ for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
+ if (rwCookies[idx]->specialRequest == rws::SpecialRwRequest::RESET_MCU) {
+ prepareSimpleCommand(rws::RESET_MCU);
+ // No point in commanding that specific RW for the cycle.
+ skipCommandingForRw[idx] = true;
+ writeOneRwCmd(idx, fd);
+ } else if (rwCookies[idx]->setSpeed) {
+ prepareSetSpeedCmd(idx);
+ if (writeOneRwCmd(idx, fd) != returnvalue::OK) {
+ continue;
+ }
+ }
+ }
+ closeSpi(fd);
+ if (readAllRws(rws::SET_SPEED) != returnvalue::OK) {
+ continue;
+ }
+ prepareSimpleCommand(rws::GET_LAST_RESET_STATUS);
+ if (writeAndReadAllRws(rws::GET_LAST_RESET_STATUS) != returnvalue::OK) {
+ continue;
+ }
+ prepareSimpleCommand(rws::GET_RW_STATUS);
+ if (writeAndReadAllRws(rws::GET_RW_STATUS) != returnvalue::OK) {
+ continue;
+ }
+ prepareSimpleCommand(rws::GET_TEMPERATURE);
+ if (writeAndReadAllRws(rws::GET_TEMPERATURE) != returnvalue::OK) {
+ continue;
+ }
+ prepareSimpleCommand(rws::CLEAR_LAST_RESET_STATUS);
+ if (writeAndReadAllRws(rws::CLEAR_LAST_RESET_STATUS) != returnvalue::OK) {
+ continue;
+ }
+ handleSpecialRequests();
+ }
+
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::initialize() { return returnvalue::OK; }
+
+ReturnValue_t RwPollingTask::initializeInterface(CookieIF* cookie) {
+ // We don't need to set the speed because a SPI core is used, but the mode has to be set once
+ // correctly for all RWs
+ if (not modeAndSpeedWasSet) {
+ int fd = open(spiDev, O_RDWR);
+ if (fd < 0) {
+ sif::error << "could not open RW SPI bus" << std::endl;
+ return returnvalue::FAILED;
+ }
+ spi::SpiModes mode = spi::RW_MODE;
+ int retval = ioctl(fd, SPI_IOC_WR_MODE, reinterpret_cast(&mode));
+ if (retval != 0) {
+ utility::handleIoctlError("SpiComIF::setSpiSpeedAndMode: Setting SPI mode failed");
+ }
+
+ retval = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi::RW_SPEED);
+ if (retval != 0) {
+ utility::handleIoctlError("SpiComIF::setSpiSpeedAndMode: Setting SPI speed failed");
+ }
+ close(fd);
+ modeAndSpeedWasSet = true;
+ }
+
+ auto* rwCookie = dynamic_cast(cookie);
+ if (rwCookie == nullptr) {
+ sif::error << "RwPollingTask::initializeInterface: Wrong cookie" << std::endl;
+ return returnvalue::FAILED;
+ }
+ rwCookies[rwCookie->rwIdx] = rwCookie;
+
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::sendMessage(CookieIF* cookie, const uint8_t* sendData,
+ size_t sendLen) {
+ if (sendData == nullptr or sendLen < 8) {
+ return DeviceHandlerIF::INVALID_DATA;
+ }
+ int32_t speed = 0;
+ uint16_t rampTime = 0;
+ const uint8_t* currentBuf = sendData;
+ bool setSpeed = currentBuf[0];
+ currentBuf += 1;
+ sendLen -= 1;
+ SerializeAdapter::deSerialize(&speed, ¤tBuf, &sendLen, SerializeIF::Endianness::MACHINE);
+ SerializeAdapter::deSerialize(&rampTime, ¤tBuf, &sendLen, SerializeIF::Endianness::MACHINE);
+ rws::SpecialRwRequest specialRequest = rws::SpecialRwRequest::REQUEST_NONE;
+ if (sendLen == 8 and sendData[7] < static_cast(rws::SpecialRwRequest::NUM_REQUESTS)) {
+ specialRequest = static_cast(sendData[7]);
+ }
+ RwCookie* rwCookie = dynamic_cast(cookie);
+ if (rwCookie == nullptr) {
+ return returnvalue::FAILED;
+ }
+ {
+ MutexGuard mg(ipcLock);
+ rwCookie->setSpeed = setSpeed;
+ rwCookie->currentRwSpeed = speed;
+ rwCookie->currentRampTime = rampTime;
+ rwCookie->specialRequest = specialRequest;
+ if (state == InternalState::IDLE) {
+ state = InternalState::BUSY;
+ semaphore->release();
+ }
+ }
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::getSendSuccess(CookieIF* cookie) { return returnvalue::OK; }
+
+ReturnValue_t RwPollingTask::requestReceiveMessage(CookieIF* cookie, size_t requestLen) {
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::readReceivedMessage(CookieIF* cookie, uint8_t** buffer, size_t* size) {
+ RwCookie* rwCookie = dynamic_cast(cookie);
+ {
+ MutexGuard mg(ipcLock);
+ *buffer = rwCookie->replyBuf.data();
+ *size = rwCookie->replyBuf.size();
+ }
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::writeAndReadAllRws(DeviceCommandId_t id) {
+ // Stopwatch watch;
+ ReturnValue_t result = returnvalue::OK;
+
+ int fd = 0;
+ result = openSpi(O_RDWR, fd);
+ if (result != returnvalue::OK) {
+ return result;
+ }
+ for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
+ if (skipCommandingForRw[idx]) {
+ continue;
+ }
+ result = sendOneMessage(fd, *rwCookies[idx]);
+ if (result != returnvalue::OK) {
+ closeSpi(fd);
+ return returnvalue::FAILED;
+ }
+ }
+
+ closeSpi(fd);
+ return readAllRws(id);
+}
+
+ReturnValue_t RwPollingTask::openSpi(int flags, int& fd) {
+ fd = open(spiDev, flags);
+ if (fd < 0) {
+ sif::error << "RwPollingTask::openSpi: Failed to open device file" << std::endl;
+ return SpiComIF::OPENING_FILE_FAILED;
+ }
+
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::readNextReply(RwCookie& rwCookie, uint8_t* replyBuf,
+ size_t maxReplyLen) {
+ ReturnValue_t result = returnvalue::OK;
+ int fd = 0;
+ gpioId_t gpioId = rwCookie.getChipSelectPin();
+ uint8_t byteRead = 0;
+ result = openSpi(O_RDWR, fd);
+ if (result != returnvalue::OK) {
+ return result;
+ }
+ pullCsLow(gpioId, gpioIF);
+ bool lastByteWasFrameMarker = false;
+ Countdown cd(3000);
+ size_t readIdx = 0;
+
+ while (true) {
+ lastByteWasFrameMarker = false;
+ if (read(fd, &byteRead, 1) != 1) {
+ sif::error << "RwPollingTask: Read failed. " << strerror(errno) << std::endl;
+ pullCsHigh(gpioId, gpioIF);
+ closeSpi(fd);
+ return rws::SPI_READ_FAILURE;
+ }
+ if (byteRead == rws::FRAME_DELIMITER) {
+ lastByteWasFrameMarker = true;
+ }
+ // Start of frame detected.
+ if (byteRead != rws::FRAME_DELIMITER and not lastByteWasFrameMarker) {
+ break;
+ }
+
+ if (readIdx % 100 == 0 && cd.hasTimedOut()) {
+ pullCsHigh(gpioId, gpioIF);
+ closeSpi(fd);
+ return rws::SPI_READ_FAILURE;
+ }
+ readIdx++;
+ }
+
+#if FSFW_HAL_SPI_WIRETAPPING == 1
+ sif::info << "RW start marker detected" << std::endl;
+#endif
+
+ size_t decodedFrameLen = 0;
+
+ while (decodedFrameLen < maxReplyLen) {
+ // First byte already read in
+ if (decodedFrameLen != 0) {
+ byteRead = 0;
+ if (read(fd, &byteRead, 1) != 1) {
+ sif::error << "RwPollingTask: Read failed" << std::endl;
+ result = rws::SPI_READ_FAILURE;
+ break;
+ }
+ }
+
+ if (byteRead == rws::FRAME_DELIMITER) {
+ // Reached end of frame
+ break;
+ } else if (byteRead == 0x7D) {
+ if (read(fd, &byteRead, 1) != 1) {
+ sif::error << "RwPollingTask: Read failed" << std::endl;
+ result = rws::SPI_READ_FAILURE;
+ break;
+ }
+ if (byteRead == 0x5E) {
+ *(replyBuf + decodedFrameLen) = 0x7E;
+ decodedFrameLen++;
+ continue;
+ } else if (byteRead == 0x5D) {
+ *(replyBuf + decodedFrameLen) = 0x7D;
+ decodedFrameLen++;
+ continue;
+ } else {
+ sif::error << "RwPollingTask: Invalid substitute" << std::endl;
+ result = rws::INVALID_SUBSTITUTE;
+ break;
+ }
+ } else {
+ *(replyBuf + decodedFrameLen) = byteRead;
+ decodedFrameLen++;
+ continue;
+ }
+
+ // Check end marker.
+ /**
+ * There might be the unlikely case that each byte in a get-telemetry reply has been
+ * replaced by its substitute. Then the next byte must correspond to the end sign 0x7E.
+ * Otherwise there might be something wrong.
+ */
+ if (decodedFrameLen == maxReplyLen) {
+ if (read(fd, &byteRead, 1) != 1) {
+ sif::error << "rwSpiCallback::spiCallback: Failed to read last byte" << std::endl;
+ result = rws::SPI_READ_FAILURE;
+ break;
+ }
+ if (byteRead != rws::FRAME_DELIMITER) {
+ sif::error << "rwSpiCallback::spiCallback: Missing end sign "
+ << static_cast(rws::FRAME_DELIMITER) << std::endl;
+ decodedFrameLen--;
+ result = rws::MISSING_END_SIGN;
+ break;
+ }
+ }
+ result = returnvalue::OK;
+ }
+
+ pullCsHigh(gpioId, gpioIF);
+ closeSpi(fd);
+ return result;
+}
+
+ReturnValue_t RwPollingTask::writeOneRwCmd(uint8_t rwIdx, int fd) {
+ ReturnValue_t result = sendOneMessage(fd, *rwCookies[rwIdx]);
+ if (result != returnvalue::OK) {
+ return returnvalue::FAILED;
+ }
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::readAllRws(DeviceCommandId_t id) {
+ // SPI dev will be opened in readNextReply on demand.
+ for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
+ if (((id == rws::SET_SPEED) and !rwCookies[idx]->setSpeed) or skipCommandingForRw[idx]) {
+ continue;
+ }
+ uint8_t* replyBuf;
+ size_t maxReadLen = idAndIdxToReadBuffer(id, idx, &replyBuf);
+ ReturnValue_t result = readNextReply(*rwCookies[idx], replyBuf + 1, maxReadLen);
+ if (result == returnvalue::OK) {
+ // The first byte is always a flag which shows whether the value was read
+ // properly at least once.
+ replyBuf[0] = true;
+ }
+ }
+ // SPI is closed in readNextReply as well.
+ return returnvalue::OK;
+}
+
+size_t RwPollingTask::idAndIdxToReadBuffer(DeviceCommandId_t id, uint8_t rwIdx, uint8_t** ptr) {
+ uint8_t* rawStart = rwCookies[rwIdx]->replyBuf.data();
+ RwReplies replies(rawStart);
+ switch (id) {
+ case (rws::GET_RW_STATUS): {
+ *ptr = replies.rwStatusReply;
+ break;
+ }
+ case (rws::SET_SPEED): {
+ *ptr = replies.setSpeedReply;
+ break;
+ }
+ case (rws::CLEAR_LAST_RESET_STATUS): {
+ *ptr = replies.clearLastResetStatusReply;
+ break;
+ }
+ case (rws::GET_LAST_RESET_STATUS): {
+ *ptr = replies.getLastResetStatusReply;
+ break;
+ }
+ case (rws::GET_TEMPERATURE): {
+ *ptr = replies.readTemperatureReply;
+ break;
+ }
+ case (rws::GET_TM): {
+ *ptr = replies.hkDataReply;
+ break;
+ }
+ case (rws::INIT_RW_CONTROLLER): {
+ *ptr = replies.initRwControllerReply;
+ break;
+ }
+ default: {
+ sif::error << "no reply buffer for rw command " << id << std::endl;
+ *ptr = replies.dummyPointer;
+ return 0;
+ }
+ }
+ return rws::idToPacketLen(id);
+}
+
+void RwPollingTask::fillSpecialRequestArray() {
+ for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
+ if (skipCommandingForRw[idx]) {
+ specialRequestIds[idx] = DeviceHandlerIF::NO_COMMAND_ID;
+ continue;
+ }
+ switch (rwCookies[idx]->specialRequest) {
+ case (rws::SpecialRwRequest::GET_TM): {
+ specialRequestIds[idx] = rws::GET_TM;
+ break;
+ }
+ case (rws::SpecialRwRequest::INIT_RW_CONTROLLER): {
+ specialRequestIds[idx] = rws::INIT_RW_CONTROLLER;
+ break;
+ }
+ default: {
+ specialRequestIds[idx] = DeviceHandlerIF::NO_COMMAND_ID;
+ }
+ }
+ }
+}
+
+void RwPollingTask::handleSpecialRequests() {
+ int fd = 0;
+ fillSpecialRequestArray();
+ ReturnValue_t result = openSpi(O_RDWR, fd);
+ if (result != returnvalue::OK) {
+ return;
+ }
+ for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
+ if (specialRequestIds[idx] == DeviceHandlerIF::NO_COMMAND_ID) {
+ continue;
+ }
+ prepareSimpleCommand(specialRequestIds[idx]);
+ writeOneRwCmd(idx, fd);
+ }
+ closeSpi(fd);
+ usleep(rws::SPI_REPLY_DELAY);
+ for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
+ if (specialRequestIds[idx] == DeviceHandlerIF::NO_COMMAND_ID) {
+ continue;
+ }
+ uint8_t* replyBuf;
+ size_t maxReadLen = idAndIdxToReadBuffer(specialRequestIds[idx], idx, &replyBuf);
+ readNextReply(*rwCookies[idx], replyBuf, maxReadLen);
+ }
+}
+
+void RwPollingTask::setAllReadFlagsFalse() {
+ for (auto& rwCookie : rwCookies) {
+ RwReplies replies(rwCookie->replyBuf.data());
+ replies.getLastResetStatusReply[0] = false;
+ replies.clearLastResetStatusReply[0] = false;
+ replies.hkDataReply[0] = false;
+ replies.readTemperatureReply[0] = false;
+ replies.rwStatusReply[0] = false;
+ replies.setSpeedReply[0] = false;
+ replies.initRwControllerReply[0] = false;
+ }
+}
+
+// This closes the SPI
+void RwPollingTask::closeSpi(int fd) {
+ // This will perform the function to close the SPI
+ close(fd);
+ // The SPI is now closed.
+}
+
+ReturnValue_t RwPollingTask::sendOneMessage(int fd, RwCookie& rwCookie) {
+ gpioId_t gpioId = rwCookie.getChipSelectPin();
+ if (spiLock == nullptr) {
+ sif::debug << "rwSpiCallback::spiCallback: Mutex or GPIO interface invalid" << std::endl;
+ return returnvalue::FAILED;
+ }
+ // Add datalinklayer like specified in the datasheet.
+ size_t lenToSend = 0;
+ rws::encodeHdlc(writeBuffer.data(), writeLen, encodedBuffer.data(), lenToSend);
+ pullCsLow(gpioId, gpioIF);
+ if (write(fd, encodedBuffer.data(), lenToSend) != static_cast(lenToSend)) {
+ sif::error << "rwSpiCallback::spiCallback: Write failed!" << std::endl;
+ pullCsHigh(gpioId, gpioIF);
+ return rws::SPI_WRITE_FAILURE;
+ }
+ pullCsHigh(gpioId, gpioIF);
+ return returnvalue::OK;
+}
+
+ReturnValue_t RwPollingTask::pullCsLow(gpioId_t gpioId, GpioIF& gpioIF) {
+ ReturnValue_t result = spiLock->lockMutex(TIMEOUT_TYPE, TIMEOUT_MS);
+ if (result != returnvalue::OK) {
+ sif::debug << "RwPollingTask::pullCsLow: Failed to lock mutex" << std::endl;
+ return result;
+ }
+ // Pull SPI CS low. For now, no support for active high given
+ if (gpioId != gpio::NO_GPIO) {
+ result = gpioIF.pullLow(gpioId);
+ if (result != returnvalue::OK) {
+ sif::error << "RwPollingTask::pullCsLow: Failed to pull chip select low" << std::endl;
+ return result;
+ }
+ }
+ return returnvalue::OK;
+}
+
+void RwPollingTask::pullCsHigh(gpioId_t gpioId, GpioIF& gpioIF) {
+ if (gpioId != gpio::NO_GPIO) {
+ if (gpioIF.pullHigh(gpioId) != returnvalue::OK) {
+ sif::error << "closeSpi: Failed to pull chip select high" << std::endl;
+ }
+ }
+ if (spiLock->unlockMutex() != returnvalue::OK) {
+ sif::error << "RwPollingTask::pullCsHigh: Failed to unlock mutex" << std::endl;
+ ;
+ }
+}
+
+void RwPollingTask::prepareSimpleCommand(DeviceCommandId_t id) {
+ writeBuffer[0] = static_cast(id);
+ uint16_t crc = CRC::crc16ccitt(writeBuffer.data(), 1, 0xFFFF);
+ writeBuffer[1] = static_cast(crc & 0xFF);
+ writeBuffer[2] = static_cast(crc >> 8 & 0xFF);
+ writeLen = 3;
+}
+
+ReturnValue_t RwPollingTask::prepareSetSpeedCmd(uint8_t rwIdx) {
+ writeBuffer[0] = static_cast(rws::SET_SPEED);
+ uint8_t* serPtr = writeBuffer.data() + 1;
+ int32_t speedToSet = 0;
+ uint16_t rampTimeToSet = 10;
+ {
+ MutexGuard mg(ipcLock);
+ speedToSet = rwCookies[rwIdx]->currentRwSpeed;
+ rampTimeToSet = rwCookies[rwIdx]->currentRampTime;
+ }
+ size_t serLen = 1;
+ SerializeAdapter::serialize(&speedToSet, &serPtr, &serLen, writeBuffer.size(),
+ SerializeIF::Endianness::LITTLE);
+ SerializeAdapter::serialize(&rampTimeToSet, &serPtr, &serLen, writeBuffer.size(),
+ SerializeIF::Endianness::LITTLE);
+
+ uint16_t crc = CRC::crc16ccitt(writeBuffer.data(), 7, 0xFFFF);
+ writeBuffer[7] = static_cast(crc & 0xFF);
+ writeBuffer[8] = static_cast((crc >> 8) & 0xFF);
+ writeLen = 9;
+ return returnvalue::OK;
+}
diff --git a/linux/devices/RwPollingTask.h b/linux/devices/RwPollingTask.h
new file mode 100644
index 00000000..ae4bbeb1
--- /dev/null
+++ b/linux/devices/RwPollingTask.h
@@ -0,0 +1,89 @@
+#ifndef LINUX_DEVICES_RWPOLLINGTASK_H_
+#define LINUX_DEVICES_RWPOLLINGTASK_H_
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "mission/devices/devicedefinitions/rwHelpers.h"
+
+class RwCookie : public SpiCookie {
+ friend class RwPollingTask;
+
+ public:
+ static constexpr size_t REPLY_BUF_LEN = 524;
+ RwCookie(uint8_t rwIdx, address_t spiAddress, gpioId_t chipSelect, const size_t maxSize,
+ spi::SpiModes spiMode, uint32_t spiSpeed)
+ : SpiCookie(spiAddress, chipSelect, maxSize, spiMode, spiSpeed), rwIdx(rwIdx) {}
+
+ private:
+ std::array replyBuf{};
+ bool setSpeed = true;
+ int32_t currentRwSpeed = 0;
+ uint16_t currentRampTime = 0;
+ rws::SpecialRwRequest specialRequest = rws::SpecialRwRequest::REQUEST_NONE;
+ uint8_t rwIdx;
+};
+
+class RwPollingTask : public SystemObject, public ExecutableObjectIF, public DeviceCommunicationIF {
+ public:
+ RwPollingTask(object_id_t objectId, const char* spiDev, GpioIF& gpioIF);
+
+ ReturnValue_t performOperation(uint8_t operationCode) override;
+ ReturnValue_t initialize() override;
+
+ private:
+ enum class InternalState { IDLE, BUSY } state = InternalState::IDLE;
+ SemaphoreIF* semaphore;
+ bool debugMode = false;
+ bool modeAndSpeedWasSet = false;
+ MutexIF* ipcLock;
+ MutexIF* spiLock;
+ const char* spiDev;
+ GpioIF& gpioIF;
+ std::array skipCommandingForRw;
+ std::array specialRequestIds;
+ std::array rwCookies;
+ std::array writeBuffer;
+ std::array encodedBuffer;
+
+ size_t writeLen = 0;
+ static constexpr MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING;
+ static constexpr uint32_t TIMEOUT_MS = 20;
+ static constexpr uint8_t MAX_RETRIES_REPLY = 5;
+
+ ReturnValue_t writeAndReadAllRws(DeviceCommandId_t id);
+ ReturnValue_t writeOneRwCmd(uint8_t rwIdx, int fd);
+ ReturnValue_t readAllRws(DeviceCommandId_t id);
+
+ ReturnValue_t sendOneMessage(int fd, RwCookie& rwCookie);
+ ReturnValue_t readNextReply(RwCookie& rwCookie, uint8_t* replyBuf, size_t maxReplyLen);
+ void handleSpecialRequests();
+
+ ReturnValue_t initializeInterface(CookieIF* cookie) override;
+
+ ReturnValue_t sendMessage(CookieIF* cookie, const uint8_t* sendData, size_t sendLen) override;
+
+ ReturnValue_t getSendSuccess(CookieIF* cookie) override;
+
+ ReturnValue_t requestReceiveMessage(CookieIF* cookie, size_t requestLen) override;
+
+ ReturnValue_t readReceivedMessage(CookieIF* cookie, uint8_t** buffer, size_t* size) override;
+ ReturnValue_t openSpi(int flags, int& fd);
+ ReturnValue_t pullCsLow(gpioId_t gpioId, GpioIF& gpioIF);
+ void prepareSimpleCommand(DeviceCommandId_t id);
+ ReturnValue_t prepareSetSpeedCmd(uint8_t rwIdx);
+
+ size_t idAndIdxToReadBuffer(DeviceCommandId_t id, uint8_t rwIdx, uint8_t** readPtr);
+ void fillSpecialRequestArray();
+ void setAllReadFlagsFalse();
+
+ void pullCsHigh(gpioId_t gpioId, GpioIF& gpioIF);
+ void closeSpi(int);
+};
+
+#endif /* LINUX_DEVICES_RWPOLLINGTASK_H_ */
diff --git a/linux/devices/ploc/PlocSupervisorHandler.cpp b/linux/devices/ploc/PlocSupervisorHandler.cpp
index 8537d011..086ef661 100644
--- a/linux/devices/ploc/PlocSupervisorHandler.cpp
+++ b/linux/devices/ploc/PlocSupervisorHandler.cpp
@@ -119,7 +119,7 @@ ReturnValue_t PlocSupervisorHandler::executeAction(ActionId_t actionId,
case MEMORY_CHECK_WITH_FILE: {
shutdownCmdSent = false;
UpdateParams params;
- ReturnValue_t result = extractBaseParams(&data, size, params);
+ result = extractBaseParams(&data, size, params);
if (result != returnvalue::OK) {
return result;
}
diff --git a/linux/devices/startracker/StarTrackerHandler.cpp b/linux/devices/startracker/StarTrackerHandler.cpp
index 21f7174e..a868a22b 100644
--- a/linux/devices/startracker/StarTrackerHandler.cpp
+++ b/linux/devices/startracker/StarTrackerHandler.cpp
@@ -1909,7 +1909,7 @@ ReturnValue_t StarTrackerHandler::checkProgram() {
if (internalState == InternalState::VERIFY_BOOT) {
sif::warning << "StarTrackerHandler::checkProgram: Failed to boot firmware" << std::endl;
// Device handler will run into timeout and fall back to transition source mode
- triggerEvent(BOOTING_FIRMWARE_FAILED);
+ triggerEvent(BOOTING_FIRMWARE_FAILED_EVENT);
internalState = InternalState::FAILED_FIRMWARE_BOOT;
} else if (internalState == InternalState::BOOTLOADER_CHECK) {
internalState = InternalState::DONE;
@@ -1922,7 +1922,7 @@ ReturnValue_t StarTrackerHandler::checkProgram() {
if (internalState == InternalState::VERIFY_BOOT) {
internalState = InternalState::LOGLEVEL;
} else if (internalState == InternalState::BOOTLOADER_CHECK) {
- triggerEvent(BOOTING_BOOTLOADER_FAILED);
+ triggerEvent(BOOTING_BOOTLOADER_FAILED_EVENT);
internalState = InternalState::BOOTING_BOOTLOADER_FAILED;
}
break;
diff --git a/linux/devices/startracker/StarTrackerHandler.h b/linux/devices/startracker/StarTrackerHandler.h
index 029b2bde..3ed81047 100644
--- a/linux/devices/startracker/StarTrackerHandler.h
+++ b/linux/devices/startracker/StarTrackerHandler.h
@@ -140,9 +140,9 @@ class StarTrackerHandler : public DeviceHandlerBase {
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::STR_HANDLER;
//! [EXPORT] : [COMMENT] Failed to boot firmware
- static const Event BOOTING_FIRMWARE_FAILED = MAKE_EVENT(1, severity::LOW);
+ static const Event BOOTING_FIRMWARE_FAILED_EVENT = MAKE_EVENT(1, severity::LOW);
//! [EXPORT] : [COMMENT] Failed to boot star tracker into bootloader mode
- static const Event BOOTING_BOOTLOADER_FAILED = MAKE_EVENT(2, severity::LOW);
+ static const Event BOOTING_BOOTLOADER_FAILED_EVENT = MAKE_EVENT(2, severity::LOW);
static const size_t MAX_PATH_SIZE = 50;
static const size_t MAX_FILE_NAME = 30;
diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp
index 42156029..794ae1d7 100644
--- a/linux/fsfwconfig/events/translateEvents.cpp
+++ b/linux/fsfwconfig/events/translateEvents.cpp
@@ -1,7 +1,7 @@
/**
- * @brief Auto-generated event translation file. Contains 256 translations.
+ * @brief Auto-generated event translation file. Contains 257 translations.
* @details
- * Generated on: 2023-02-13 10:07:30
+ * Generated on: 2023-02-17 13:15:51
*/
#include "translateEvents.h"
@@ -92,6 +92,7 @@ const char *MSG_QUEUE_ERROR_STRING = "MSG_QUEUE_ERROR";
const char *SERIALIZATION_ERROR_STRING = "SERIALIZATION_ERROR";
const char *SAFE_RATE_VIOLATION_STRING = "SAFE_RATE_VIOLATION";
const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY";
+const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID";
const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT";
const char *SWITCH_HAS_CHANGED_STRING = "SWITCH_HAS_CHANGED";
const char *SWITCHING_Q7S_DENIED_STRING = "SWITCHING_Q7S_DENIED";
@@ -129,8 +130,8 @@ const char *SELF_TEST_COIL_CURRENT_FAILURE_STRING = "SELF_TEST_COIL_CURRENT_FAIL
const char *INVALID_ERROR_BYTE_STRING = "INVALID_ERROR_BYTE";
const char *ERROR_STATE_STRING = "ERROR_STATE";
const char *RESET_OCCURED_STRING = "RESET_OCCURED";
-const char *BOOTING_FIRMWARE_FAILED_STRING = "BOOTING_FIRMWARE_FAILED";
-const char *BOOTING_BOOTLOADER_FAILED_STRING = "BOOTING_BOOTLOADER_FAILED";
+const char *BOOTING_FIRMWARE_FAILED_EVENT_STRING = "BOOTING_FIRMWARE_FAILED_EVENT";
+const char *BOOTING_BOOTLOADER_FAILED_EVENT_STRING = "BOOTING_BOOTLOADER_FAILED_EVENT";
const char *SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING = "SUPV_MEMORY_READ_RPT_CRC_FAILURE";
const char *SUPV_UNKNOWN_TM_STRING = "SUPV_UNKNOWN_TM";
const char *SUPV_UNINIMPLEMENTED_TM_STRING = "SUPV_UNINIMPLEMENTED_TM";
@@ -433,6 +434,8 @@ const char *translateEvents(Event event) {
return SAFE_RATE_VIOLATION_STRING;
case (11201):
return SAFE_RATE_RECOVERY_STRING;
+ case (11202):
+ return MULTIPLE_RW_INVALID_STRING;
case (11300):
return SWITCH_CMD_SENT_STRING;
case (11301):
@@ -508,9 +511,9 @@ const char *translateEvents(Event event) {
case (11802):
return RESET_OCCURED_STRING;
case (11901):
- return BOOTING_FIRMWARE_FAILED_STRING;
+ return BOOTING_FIRMWARE_FAILED_EVENT_STRING;
case (11902):
- return BOOTING_BOOTLOADER_FAILED_STRING;
+ return BOOTING_BOOTLOADER_FAILED_EVENT_STRING;
case (12001):
return SUPV_MEMORY_READ_RPT_CRC_FAILURE_STRING;
case (12002):
diff --git a/linux/fsfwconfig/objects/systemObjectList.h b/linux/fsfwconfig/objects/systemObjectList.h
index 7624cd5f..6cb70a06 100644
--- a/linux/fsfwconfig/objects/systemObjectList.h
+++ b/linux/fsfwconfig/objects/systemObjectList.h
@@ -47,7 +47,7 @@ enum sourceObjects : uint32_t {
GPIO_IF = 0x49010005,
/* Custom device handler */
- SPI_RW_COM_IF = 0x49020005,
+ RW_POLLING_TASK = 0x49020005,
/* 0x54 ('T') for test handlers */
TEST_TASK = 0x54694269,
diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp
index 9eba7b06..9e461be6 100644
--- a/linux/fsfwconfig/objects/translateObjects.cpp
+++ b/linux/fsfwconfig/objects/translateObjects.cpp
@@ -2,7 +2,7 @@
* @brief Auto-generated object translation file.
* @details
* Contains 152 translations.
- * Generated on: 2023-02-13 10:07:30
+ * Generated on: 2023-02-17 13:15:51
*/
#include "translateObjects.h"
@@ -84,7 +84,7 @@ const char *ARDUINO_COM_IF_STRING = "ARDUINO_COM_IF";
const char *GPIO_IF_STRING = "GPIO_IF";
const char *SCEX_UART_READER_STRING = "SCEX_UART_READER";
const char *SPI_MAIN_COM_IF_STRING = "SPI_MAIN_COM_IF";
-const char *SPI_RW_COM_IF_STRING = "SPI_RW_COM_IF";
+const char *RW_POLLING_TASK_STRING = "RW_POLLING_TASK";
const char *SPI_RTD_COM_IF_STRING = "SPI_RTD_COM_IF";
const char *UART_COM_IF_STRING = "UART_COM_IF";
const char *I2C_COM_IF_STRING = "I2C_COM_IF";
@@ -318,7 +318,7 @@ const char *translateObject(object_id_t object) {
case 0x49020004:
return SPI_MAIN_COM_IF_STRING;
case 0x49020005:
- return SPI_RW_COM_IF_STRING;
+ return RW_POLLING_TASK_STRING;
case 0x49020006:
return SPI_RTD_COM_IF_STRING;
case 0x49030003:
diff --git a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
index e017021e..fc30f053 100644
--- a/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
+++ b/linux/fsfwconfig/pollingsequence/pollingSequenceFactory.cpp
@@ -632,83 +632,6 @@ ReturnValue_t pst::pstTcsAndAcs(FixedTimeslotTaskIF *thisSequence, AcsPstCfg cfg
DeviceHandlerIF::GET_READ);
}
- if (cfg.scheduleRws) {
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::SEND_WRITE);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::GET_WRITE);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::SEND_READ);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::GET_READ);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::SEND_WRITE);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::GET_WRITE);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::SEND_READ);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::GET_READ);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::PERFORM_OPERATION);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::SEND_WRITE);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::SEND_WRITE);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::GET_WRITE);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::GET_WRITE);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::SEND_READ);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::SEND_READ);
- //
- // thisSequence->addSlot(objects::RW1, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW2, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW3, length * 0, DeviceHandlerIF::GET_READ);
- // thisSequence->addSlot(objects::RW4, length * 0, DeviceHandlerIF::GET_READ);
- }
-
if (cfg.scheduleRws) {
// this is the torquing cycle
thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
@@ -738,67 +661,22 @@ ReturnValue_t pst::pstTcsAndAcs(FixedTimeslotTaskIF *thisSequence, AcsPstCfg cfg
thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::GET_READ);
- thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::GET_READ);
- thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::GET_READ);
- thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_READ);
-
- thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::PERFORM_OPERATION);
- thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::PERFORM_OPERATION);
- thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::PERFORM_OPERATION);
- thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::PERFORM_OPERATION);
-
- thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_WRITE);
- thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_WRITE);
- thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_WRITE);
- thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_WRITE);
-
- thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_WRITE);
- thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_WRITE);
-
- thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_READ);
- thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::SEND_READ);
-
- thisSequence->addSlot(objects::RW1, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_READ);
- thisSequence->addSlot(objects::RW2, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_READ);
- thisSequence->addSlot(objects::RW3, length * config::acs::SCHED_BLOCK_4_PERIOD,
- DeviceHandlerIF::GET_READ);
- thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_4_PERIOD,
+ thisSequence->addSlot(objects::RW4, length * config::acs::SCHED_BLOCK_5_PERIOD,
DeviceHandlerIF::GET_READ);
}
diff --git a/linux/ipcore/PdecHandler.cpp b/linux/ipcore/PdecHandler.cpp
index b59dc904..8acbce16 100644
--- a/linux/ipcore/PdecHandler.cpp
+++ b/linux/ipcore/PdecHandler.cpp
@@ -331,12 +331,12 @@ bool PdecHandler::checkFrameAna(uint32_t pdecFar) {
FrameAna_t frameAna = static_cast((pdecFar & FRAME_ANA_MASK) >> FRAME_ANA_POSITION);
switch (frameAna) {
case (FrameAna_t::ABANDONED_CLTU): {
- triggerEvent(INVALID_TC_FRAME, ABANDONED_CLTU);
+ triggerEvent(INVALID_TC_FRAME, ABANDONED_CLTU_RETVAL);
sif::warning << "PdecHandler::checkFrameAna: Abondoned CLTU" << std::endl;
break;
}
case (FrameAna_t::FRAME_DIRTY): {
- triggerEvent(INVALID_TC_FRAME, FRAME_DIRTY);
+ triggerEvent(INVALID_TC_FRAME, FRAME_DIRTY_RETVAL);
sif::warning << "PdecHandler::checkFrameAna: Frame dirty" << std::endl;
break;
}
@@ -351,13 +351,13 @@ bool PdecHandler::checkFrameAna(uint32_t pdecFar) {
break;
}
case (FrameAna_t::AD_DISCARDED_LOCKOUT): {
- triggerEvent(INVALID_TC_FRAME, AD_DISCARDED_LOCKOUT);
+ triggerEvent(INVALID_TC_FRAME, AD_DISCARDED_LOCKOUT_RETVAL);
sif::warning << "PdecHandler::checkFrameAna: AD frame discarded because of lockout"
<< std::endl;
break;
}
case (FrameAna_t::AD_DISCARDED_WAIT): {
- triggerEvent(INVALID_TC_FRAME, AD_DISCARDED_LOCKOUT);
+ triggerEvent(INVALID_TC_FRAME, AD_DISCARDED_LOCKOUT_RETVAL);
sif::warning << "PdecHandler::checkFrameAna: AD frame discarded because of wait" << std::endl;
break;
}
@@ -386,40 +386,40 @@ void PdecHandler::handleIReason(uint32_t pdecFar, ReturnValue_t parameter1) {
IReason_t ireason = static_cast((pdecFar & IREASON_MASK) >> IREASON_POSITION);
switch (ireason) {
case (IReason_t::NO_REPORT): {
- triggerEvent(INVALID_TC_FRAME, parameter1, NO_REPORT);
+ triggerEvent(INVALID_TC_FRAME, parameter1, NO_REPORT_RETVAL);
sif::info << "PdecHandler::handleIReason: No illegal report" << std::endl;
break;
}
case (IReason_t::ERROR_VERSION_NUMBER): {
- triggerEvent(INVALID_TC_FRAME, parameter1, ERROR_VERSION_NUMBER);
+ triggerEvent(INVALID_TC_FRAME, parameter1, ERROR_VERSION_NUMBER_RETVAL);
sif::info << "PdecHandler::handleIReason: Error in version number and reserved A and B "
<< "fields" << std::endl;
break;
}
case (IReason_t::ILLEGAL_COMBINATION): {
- triggerEvent(INVALID_TC_FRAME, parameter1, ILLEGAL_COMBINATION);
+ triggerEvent(INVALID_TC_FRAME, parameter1, ILLEGAL_COMBINATION_RETVAL);
sif::info << "PdecHandler::handleIReason: Illegal combination (AC) of bypass and control "
<< "command flags" << std::endl;
break;
}
case (IReason_t::INVALID_SC_ID): {
- triggerEvent(INVALID_TC_FRAME, parameter1, INVALID_SC_ID);
+ triggerEvent(INVALID_TC_FRAME, parameter1, INVALID_SC_ID_RETVAL);
sif::info << "PdecHandler::handleIReason: Invalid spacecraft identifier " << std::endl;
break;
}
case (IReason_t::INVALID_VC_ID_MSB): {
- triggerEvent(INVALID_TC_FRAME, parameter1, INVALID_VC_ID_MSB);
+ triggerEvent(INVALID_TC_FRAME, parameter1, INVALID_VC_ID_MSB_RETVAL);
sif::info << "PdecHandler::handleIReason: VC identifier bit 0 to 4 did not match "
<< std::endl;
break;
}
case (IReason_t::INVALID_VC_ID_LSB): {
- triggerEvent(INVALID_TC_FRAME, parameter1, INVALID_VC_ID_LSB);
+ triggerEvent(INVALID_TC_FRAME, parameter1, INVALID_VC_ID_LSB_RETVAL);
sif::info << "PdecHandler::handleIReason: VC identifier bit 5 did not match " << std::endl;
break;
}
case (IReason_t::NS_NOT_ZERO): {
- triggerEvent(INVALID_TC_FRAME, parameter1, NS_NOT_ZERO);
+ triggerEvent(INVALID_TC_FRAME, parameter1, NS_NOT_ZERO_RETVAL);
sif::info << "PdecHandler::handleIReason: N(S) of BC or BD frame not set to all zeros"
<< std::endl;
break;
diff --git a/linux/ipcore/PdecHandler.h b/linux/ipcore/PdecHandler.h
index 32692dd8..b514f501 100644
--- a/linux/ipcore/PdecHandler.h
+++ b/linux/ipcore/PdecHandler.h
@@ -97,30 +97,30 @@ class PdecHandler : public SystemObject, public ExecutableObjectIF, public HasAc
static constexpr Modes OP_MODE = Modes::IRQ;
- static const ReturnValue_t ABANDONED_CLTU = MAKE_RETURN_CODE(0xA0);
- static const ReturnValue_t FRAME_DIRTY = MAKE_RETURN_CODE(0xA1);
+ static const ReturnValue_t ABANDONED_CLTU_RETVAL = MAKE_RETURN_CODE(0xA0);
+ static const ReturnValue_t FRAME_DIRTY_RETVAL = MAKE_RETURN_CODE(0xA1);
static const ReturnValue_t FRAME_ILLEGAL_ONE_REASON = MAKE_RETURN_CODE(0xA2);
static const ReturnValue_t FRAME_ILLEGAL_MULTIPLE_REASONS = MAKE_RETURN_CODE(0xA2);
- static const ReturnValue_t AD_DISCARDED_LOCKOUT = MAKE_RETURN_CODE(0xA3);
- static const ReturnValue_t AD_DISCARDED_WAIT = MAKE_RETURN_CODE(0xA4);
+ static const ReturnValue_t AD_DISCARDED_LOCKOUT_RETVAL = MAKE_RETURN_CODE(0xA3);
+ static const ReturnValue_t AD_DISCARDED_WAIT_RETVAL = MAKE_RETURN_CODE(0xA4);
static const ReturnValue_t AD_DISCARDED_NS_VS = MAKE_RETURN_CODE(0xA5);
//! [EXPORT] : [COMMENT] Received action message with unknown action id
static const ReturnValue_t COMMAND_NOT_IMPLEMENTED = MAKE_RETURN_CODE(0xB0);
- static const ReturnValue_t NO_REPORT = MAKE_RETURN_CODE(0xA6);
+ static const ReturnValue_t NO_REPORT_RETVAL = MAKE_RETURN_CODE(0xA6);
//! Error in version number and reserved A and B fields
- static const ReturnValue_t ERROR_VERSION_NUMBER = MAKE_RETURN_CODE(0xA7);
+ static const ReturnValue_t ERROR_VERSION_NUMBER_RETVAL = MAKE_RETURN_CODE(0xA7);
//! Illegal combination of bypass and control command flag
- static const ReturnValue_t ILLEGAL_COMBINATION = MAKE_RETURN_CODE(0xA8);
+ static const ReturnValue_t ILLEGAL_COMBINATION_RETVAL = MAKE_RETURN_CODE(0xA8);
//! Spacecraft identifier did not match
- static const ReturnValue_t INVALID_SC_ID = MAKE_RETURN_CODE(0xA9);
+ static const ReturnValue_t INVALID_SC_ID_RETVAL = MAKE_RETURN_CODE(0xA9);
//! VC identifier bits 0 to 4 did not match
- static const ReturnValue_t INVALID_VC_ID_MSB = MAKE_RETURN_CODE(0xAA);
+ static const ReturnValue_t INVALID_VC_ID_MSB_RETVAL = MAKE_RETURN_CODE(0xAA);
//! VC identifier bit 5 did not match
- static const ReturnValue_t INVALID_VC_ID_LSB = MAKE_RETURN_CODE(0xAB);
+ static const ReturnValue_t INVALID_VC_ID_LSB_RETVAL = MAKE_RETURN_CODE(0xAB);
//! N(S) of BC or BD frame not set to all zeros
- static const ReturnValue_t NS_NOT_ZERO = MAKE_RETURN_CODE(0xAC);
+ static const ReturnValue_t NS_NOT_ZERO_RETVAL = MAKE_RETURN_CODE(0xAC);
//! Invalid BC control command
static const ReturnValue_t INVALID_BC_CC = MAKE_RETURN_CODE(0xAE);
diff --git a/misc/eclipse/.cproject b/misc/eclipse/.cproject
index 0dfd812a..4cfe3fa1 100644
--- a/misc/eclipse/.cproject
+++ b/misc/eclipse/.cproject
@@ -57,7 +57,7 @@
-
+
@@ -119,7 +119,7 @@
-
+
@@ -187,7 +187,7 @@
-
+
@@ -255,7 +255,7 @@
-
+
@@ -418,7 +418,7 @@
-
+
@@ -580,7 +580,7 @@
-
+
@@ -680,7 +680,7 @@
-
+