#ifndef __FLEXRAYCONTROLLER_H_ #define __FLEXRAYCONTROLLER_H_ #include #include #include #include #include "icsneo/communication/message/flexray/control/flexraycontrolmessage.h" #include "icsneo/device/extensions/flexray/erayregister.h" #include "icsneo/device/extensions/flexray/poccommand.h" namespace icsneo { class Device; namespace FlexRay { class Controller { public: Controller(Device& device, uint8_t index) : device(device), index(index) {} std::shared_ptr getStatus() const; void _setStatus(std::shared_ptr msg); bool getAllowColdstart() const { return allowColdstart; } void setAllowColdstart(bool enable) { allowColdstart = enable; } bool getWakeupBeforeStart() const { return wakeupBeforeStart; } void setWakeupBeforeStart(bool enable) { wakeupBeforeStart = enable; } void getReady(); void start(); private: bool isPOCBusy() const { return readRegisterOr(ERAYRegister::SUCC1, 0x00000080) & 0x00000080; } std::pair getCurrentPOCCommand(std::chrono::milliseconds timeout = std::chrono::milliseconds(50)) const; bool setCurrentPOCCommand( FlexRay::POCCommand cmd, bool checkForSuccess = true, std::chrono::milliseconds timeout = std::chrono::milliseconds(50)); bool wasCommandSuccessful(std::chrono::milliseconds timeout = std::chrono::milliseconds(50)) const; std::pair readRegister( ERAYRegister reg, std::chrono::milliseconds timeout = std::chrono::milliseconds(50)) const; uint32_t readRegisterOr( ERAYRegister reg, uint32_t defaultValue = 0, std::chrono::milliseconds timeout = std::chrono::milliseconds(50)) const; bool writeRegister( ERAYRegister reg, uint32_t value, uint32_t mask, bool waitForPOCReady = true, std::chrono::milliseconds timeout = std::chrono::milliseconds(50)); bool writeRegister( ERAYRegister reg, uint32_t value, bool waitForPOCReady = true, std::chrono::milliseconds timeout = std::chrono::milliseconds(50)); Device& device; uint8_t index; mutable std::mutex statusLock; mutable std::mutex readRegisterLock; std::shared_ptr status; bool allowColdstart = false; bool wakeupBeforeStart = false; }; } // namespace FlexRay } // namespace icsneo #endif // __FLEXRAYCONTROLLER_H_