79 lines
2.0 KiB
C++
79 lines
2.0 KiB
C++
/*
|
|
* 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();
|
|
}
|
|
}
|