#ifndef LINUX_DEVICES_ACSBOARDPOLLING_H_ #define LINUX_DEVICES_ACSBOARDPOLLING_H_ #include #include #include #include #include #include #include class AcsBoardPolling : public SystemObject, public ExecutableObjectIF, public DeviceCommunicationIF { public: AcsBoardPolling(object_id_t objectId, SpiComIF& lowLevelComIF, GpioIF& gpioIF); ReturnValue_t performOperation(uint8_t operationCode) override; ReturnValue_t initialize() override; private: enum class InternalState { IDLE, BUSY } state = InternalState::IDLE; MutexIF* ipcLock; SemaphoreIF* semaphore; std::array cmdBuf; std::array replyBuf; bool mgm0L3IsOn = false; SpiCookie* mgm0L3Cookie = nullptr; bool mgm1Rm3100IsOn = false; SpiCookie* mgm1Rm3100Cookie = nullptr; bool mgm2L3IsOn = false; SpiCookie* mgm2L3Cookie = nullptr; bool mgm3Rm3100IsOn = false; SpiCookie* mgm3Rm3100Cookie = nullptr; struct GyroAdis { adis1650x::Type type; bool isOn = false; bool performStartup = false; SpiCookie* cookie = nullptr; Countdown countdown; acs::SimpleSensorMode mode = acs::SimpleSensorMode::OFF; ReturnValue_t replyResult; acs::Adis1650XReply ownReply; acs::Adis1650XReply readerReply; }; GyroAdis gyro0Adis{}; GyroAdis gyro2Adis{}; struct GyroL3g { bool performStartup = false; SpiCookie* cookie = nullptr; acs::SimpleSensorMode mode = acs::SimpleSensorMode::OFF; uint8_t sensorCfg[5]; ReturnValue_t replyResult; acs::GyroL3gReply ownReply; acs::GyroL3gReply readerReply; }; GyroL3g gyro1L3g{}; GyroL3g gyro3L3g{}; uint8_t* rawReply = nullptr; size_t dummy = 0; SpiComIF& spiComIF; GpioIF& gpioIF; 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; void gyroL3gHandler(GyroL3g& l3g); void gyroAdisHandler(GyroAdis& gyro); // Special readout: 16us stall time between small 2 byte transfers. ReturnValue_t readAdisCfg(SpiCookie& spiCookie, size_t transferLen); }; #endif /* LINUX_DEVICES_ACSBOARDPOLLING_H_ */