/* * PinIOOverride.h * * Created on: 18 èþë. 2019 ã. * Author: titov */ #ifndef SOURCE_DRIVER_PINIOOVERRIDE_H_ #define SOURCE_DRIVER_PINIOOVERRIDE_H_ #include "../peripheral/IGpioOverride.hh" namespace driver { template class PinIOOverride : public peripheral::IGpioOverride { public: typedef unsigned short Id; struct Input { PortType data; }; struct Output { PortType priority; PortType overriding; PortType data; }; PinIOOverride( Id id, bool priority, const volatile Input & input, volatile Output & output ); bool getOverrideStatus() const override; void setupOverride() override; void setOverrideValue(TOutValue value) override; bool getHidenValue() const override; void resetOverride() override; private: const volatile Input & input; volatile Output & output; const PortType mask; }; } template inline driver::PinIOOverride::PinIOOverride( Id id, bool priority, const volatile Input & input, volatile Output & output ) : input(input), output(output), mask( static_cast(1) << id ) { if( priority ) output.priority |= mask; } template inline bool driver::PinIOOverride::getOverrideStatus() const { return output.overriding & mask; } template inline void driver::PinIOOverride::setupOverride() { output.data = input.data; output.overriding |= mask; } template inline void driver::PinIOOverride::setOverrideValue(TOutValue value) { switch(value) { case hi_z: { output.data = input.data; } break; case high: { output.data |= mask; } break; case low: { output.data &= ~mask; } break; } } template inline bool driver::PinIOOverride::getHidenValue() const { return input.data & mask; } template inline void driver::PinIOOverride::resetOverride() { output.overriding &= ~mask; } #endif /* SOURCE_DRIVER_PINIOOVERRIDE_H_ */