73 lines
1.7 KiB
C++
73 lines
1.7 KiB
C++
|
|
/*
|
||
|
|
* ModbusAdapter.hpp
|
||
|
|
*
|
||
|
|
* Created on: 17 Aug 2022
|
||
|
|
* Author: malyarenko
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef UMLIBRARY_DRIVER_MODBUSADAPTER_HPP_
|
||
|
|
#define UMLIBRARY_DRIVER_MODBUSADAPTER_HPP_
|
||
|
|
|
||
|
|
#include <cstddef>
|
||
|
|
|
||
|
|
#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<void, bool> TranceiverHandler;
|
||
|
|
typedef systemic::IValueTypeSet<TranceiverHandler *> 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_ */
|