/* * ModbusAdapterInitializer.cpp * * Created on: 17 Aug 2022 * Author: malyarenko */ #include "ModbusAdapter.hpp" driver::ModbusAdapter::ModbusAdapter( peripheral::IUartPort * uart, Callback * uart_callback, peripheral::IGpio * de_pin, bool de_active_level, peripheral::IGpio * re_pin, bool re_active_level ) : uart(*uart), txrx_control(*this), de_pin(*de_pin), de_active_level(de_active_level), re_pin(*re_pin), re_active_level(re_active_level) { /* Set initial Rx mode */ setRxMode(); uart_callback->set(&txrx_control); } bool driver::ModbusAdapter::send( const char * data, std::size_t data_bytes ) { if (!uart.isDataSent()) { return false; } setTxMode(); /* After frame is sent transceiver is reset to receive mode */ return uart.send(data, data_bytes); } bool driver::ModbusAdapter::receive( char * buffer, std::size_t data_bytes ) { return uart.receive(buffer, data_bytes); } bool driver::ModbusAdapter::isDataSent() const { return uart.isDataSent(); } bool driver::ModbusAdapter::isRecieptionError() const { return uart.isRecieptionError(); } void driver::ModbusAdapter::reset() { setRxMode(); uart.reset(); } std::size_t driver::ModbusAdapter::transmitBuffCapacity() const { return uart.transmitBuffCapacity(); } std::size_t driver::ModbusAdapter::receiveBuffCapacity() const { return uart.receiveBuffCapacity(); } inline void driver::ModbusAdapter::setTxMode() { de_pin.write(de_active_level); re_pin.write(!re_active_level); } inline void driver::ModbusAdapter::setRxMode() { de_pin.write(!de_active_level); re_pin.write(re_active_level); } void driver::ModbusAdapter::TranceiverControl::operator ()(bool tx_nrx) { if (tx_nrx) { /* Transmitter callback */ super.setRxMode(); } }