/* * ModbusAdapter.hpp * * Created on: 17 Aug 2022 * Author: malyarenko */ #ifndef UMLIBRARY_DRIVER_MODBUSADAPTER_HPP_ #define UMLIBRARY_DRIVER_MODBUSADAPTER_HPP_ #include #include "../systemic/IValueAsync.hpp" #include "../systemic/IFunctor.hh" #include "../peripheral/IUartPort.hh" #include "../peripheral/IGpio.hh" namespace driver { class ModbusAdapter : public peripheral::IUartPort { public: typedef systemic::IFunctor TranceiverHandler; typedef systemic::IValueTypeSet Callback; ModbusAdapter( peripheral::IUartPort * uart, Callback * uart_callback, peripheral::IGpio * de_pin, bool de_active_level, peripheral::IGpio * re_pin, bool re_active_level ); bool send( const char * data, std::size_t data_bytes ) override; bool receive( char * buffer, std::size_t data_bytes ) override; bool isDataSent() const override; bool isRecieptionError() const override; void reset() override; std::size_t transmitBuffCapacity() const override; std::size_t receiveBuffCapacity() const override; private: struct TranceiverControl : public TranceiverHandler { ModbusAdapter & super; void operator ()(bool tx_nrx) override; TranceiverControl( ModbusAdapter & super ) : super(super) {}; }; peripheral::IUartPort & uart; TranceiverControl txrx_control; peripheral::IGpio & de_pin; bool de_active_level; peripheral::IGpio & re_pin; bool re_active_level; inline void setTxMode(); inline void setRxMode(); }; } /* namespace driver */ #endif /* UMLIBRARY_DRIVER_MODBUSADAPTER_HPP_ */