diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 1f920f6d..0f154542 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" @@ -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,10 +678,10 @@ 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::SPI_RW_COM_IF, q7s::SPI_RW_DEV, *gpioComIF); for (uint8_t idx = 0; idx < rwCookies.size(); idx++) { - rwCookies[idx] = - new SpiCookie(rwCookieParams[idx].first, rwCookieParams[idx].second, rws::MAX_REPLY_SIZE, - spi::RW_MODE, spi::RW_SPEED, &rwSpiCallback::spiCallback, nullptr); + rwCookies[idx] = new SpiCookie(rwCookieParams[idx].first, rwCookieParams[idx].second, + rws::MAX_REPLY_SIZE, spi::RW_MODE, spi::RW_SPEED); auto* rwHandler = new RwHandler(rwIds[idx], objects::SPI_RW_COM_IF, rwCookies[idx], gpioComIF, rwGpioIds[idx], idx); rwCookies[idx]->setCallbackArgs(rwHandler); 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..ff38d642 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::SPI_RW_COM_IF); + if (result != returnvalue::OK) { + scheduling::printAddObjectError("RW_POLLING_TASK", objects::SPI_RW_COM_IF); + } +#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/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/linux/devices/RwPollingTask.cpp b/linux/devices/RwPollingTask.cpp index 66add2d0..643c7608 100644 --- a/linux/devices/RwPollingTask.cpp +++ b/linux/devices/RwPollingTask.cpp @@ -5,18 +5,19 @@ #include #include #include +#include +#include #include #include "devConf.h" #include "mission/devices/devicedefinitions/rwHelpers.h" -RwPollingTask::RwPollingTask(object_id_t objectId, SpiComIF* spiIF) - : SystemObject(objectId), spiIF(spiIF) { +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 = spiIF->getCsMutex(); - spiDev = spiIF->getSpiDev().c_str(); + spiLock = MutexFactory::instance()->createMutex(); } ReturnValue_t RwPollingTask::performOperation(uint8_t operationCode) { @@ -79,13 +80,7 @@ ReturnValue_t RwPollingTask::performOperation(uint8_t operationCode) { return returnvalue::OK; } -ReturnValue_t RwPollingTask::initialize() { - if (spiDev == nullptr) { - sif::error << "SPI device is invalid" << std::endl; - return returnvalue::FAILED; - } - 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 @@ -96,7 +91,16 @@ ReturnValue_t RwPollingTask::initializeInterface(CookieIF* cookie) { sif::error << "could not open RW SPI bus" << std::endl; return returnvalue::FAILED; } - spiIF->setSpiSpeedAndMode(fd, spi::RW_MODE, spi::RW_SPEED); + 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; } @@ -201,7 +205,6 @@ ReturnValue_t RwPollingTask::readNextReply(RwCookie& rwCookie, uint8_t* replyBuf ReturnValue_t result = returnvalue::OK; int fd = 0; gpioId_t gpioId = rwCookie.getChipSelectPin(); - GpioIF& gpioIF = spiIF->getGpioInterface(); pullCsLow(gpioId, spiLock, gpioIF); uint8_t byteRead = 0; for (unsigned idx = 0; idx < MAX_RETRIES_REPLY; idx++) { @@ -439,7 +442,6 @@ void RwPollingTask::closeSpi(int fd) { ReturnValue_t RwPollingTask::sendOneMessage(int fd, RwCookie& rwCookie) { gpioId_t gpioId = rwCookie.getChipSelectPin(); - GpioIF& gpioIF = spiIF->getGpioInterface(); if (spiLock == nullptr) { sif::debug << "rwSpiCallback::spiCallback: Mutex or GPIO interface invalid" << std::endl; return returnvalue::FAILED; diff --git a/linux/devices/RwPollingTask.h b/linux/devices/RwPollingTask.h index 12757635..1ccb7a6c 100644 --- a/linux/devices/RwPollingTask.h +++ b/linux/devices/RwPollingTask.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -30,7 +31,7 @@ class RwCookie : public SpiCookie { class RwPollingTask : public SystemObject, public ExecutableObjectIF, public DeviceCommunicationIF { public: - RwPollingTask(object_id_t objectId, SpiComIF* spiIF); + RwPollingTask(object_id_t objectId, const char* spiDev, GpioIF& gpioIF); ReturnValue_t performOperation(uint8_t operationCode) override; ReturnValue_t initialize() override; @@ -43,7 +44,7 @@ class RwPollingTask : public SystemObject, public ExecutableObjectIF, public Dev MutexIF* ipcLock; MutexIF* spiLock; const char* spiDev; - SpiComIF* spiIF; + GpioIF& gpioIF; std::array skipCommandingForRw; std::array specialRequestIds; std::array rwCookies; 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); }