mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 02:55:07 +08:00
Port CRSF RC driver to new Serial UART API (#22917)
* Added implementations of Rx Tx swap and single wire for new UART API needed by CRSF driver * Added inverted mode to Serial interface API
This commit is contained in:
@@ -64,6 +64,8 @@ public:
|
||||
|
||||
ssize_t write(const void *buffer, size_t buffer_size);
|
||||
|
||||
void flush();
|
||||
|
||||
const char *getPort() const;
|
||||
static bool validatePort(const char *port);
|
||||
bool setPort(const char *port);
|
||||
@@ -83,6 +85,15 @@ public:
|
||||
FlowControl getFlowcontrol() const;
|
||||
bool setFlowcontrol(FlowControl flowcontrol);
|
||||
|
||||
bool getSingleWireMode() const;
|
||||
bool setSingleWireMode();
|
||||
|
||||
bool getSwapRxTxMode() const;
|
||||
bool setSwapRxTxMode();
|
||||
|
||||
bool getInvertedMode() const;
|
||||
bool setInvertedMode(bool enable);
|
||||
|
||||
private:
|
||||
|
||||
int _serial_fd{-1};
|
||||
@@ -100,6 +111,10 @@ private:
|
||||
|
||||
bool validateBaudrate(uint32_t baudrate);
|
||||
bool configure();
|
||||
|
||||
bool _single_wire_mode{false};
|
||||
bool _swap_rx_tx_mode{false};
|
||||
bool _inverted_mode{false};
|
||||
};
|
||||
|
||||
} // namespace device
|
||||
|
||||
@@ -212,6 +212,16 @@ bool SerialImpl::open()
|
||||
|
||||
_open = true;
|
||||
|
||||
if (_single_wire_mode) {
|
||||
setSingleWireMode();
|
||||
}
|
||||
|
||||
if (_swap_rx_tx_mode) {
|
||||
setSwapRxTxMode();
|
||||
}
|
||||
|
||||
setInvertedMode(_inverted_mode);
|
||||
|
||||
return _open;
|
||||
}
|
||||
|
||||
@@ -316,6 +326,13 @@ ssize_t SerialImpl::write(const void *buffer, size_t buffer_size)
|
||||
return written;
|
||||
}
|
||||
|
||||
void SerialImpl::flush()
|
||||
{
|
||||
if (_open) {
|
||||
tcflush(_serial_fd, TCIOFLUSH);
|
||||
}
|
||||
}
|
||||
|
||||
const char *SerialImpl::getPort() const
|
||||
{
|
||||
return _port;
|
||||
@@ -409,4 +426,69 @@ bool SerialImpl::setFlowcontrol(FlowControl flowcontrol)
|
||||
return flowcontrol == FlowControl::Disabled;
|
||||
}
|
||||
|
||||
bool SerialImpl::getSingleWireMode() const
|
||||
{
|
||||
return _single_wire_mode;
|
||||
}
|
||||
|
||||
bool SerialImpl::setSingleWireMode()
|
||||
{
|
||||
#if defined(TIOCSSINGLEWIRE)
|
||||
|
||||
if (_open) {
|
||||
ioctl(_serial_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED);
|
||||
}
|
||||
|
||||
_single_wire_mode = true;
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif // TIOCSSINGLEWIRE
|
||||
}
|
||||
|
||||
bool SerialImpl::getSwapRxTxMode() const
|
||||
{
|
||||
return _swap_rx_tx_mode;
|
||||
}
|
||||
|
||||
bool SerialImpl::setSwapRxTxMode()
|
||||
{
|
||||
#if defined(TIOCSSWAP)
|
||||
|
||||
if (_open) {
|
||||
ioctl(_serial_fd, TIOCSSWAP, SER_SWAP_ENABLED);
|
||||
}
|
||||
|
||||
_swap_rx_tx_mode = true;
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif // TIOCSSWAP
|
||||
}
|
||||
|
||||
bool SerialImpl::getInvertedMode() const
|
||||
{
|
||||
return _inverted_mode;
|
||||
}
|
||||
|
||||
bool SerialImpl::setInvertedMode(bool enable)
|
||||
{
|
||||
#if defined(TIOCSINVERT)
|
||||
|
||||
if (_open) {
|
||||
if (enable) {
|
||||
ioctl(_serial_fd, TIOCSINVERT, SER_INVERT_ENABLED_RX | SER_INVERT_ENABLED_TX);
|
||||
|
||||
} else {
|
||||
ioctl(_serial_fd, TIOCSINVERT, 0);
|
||||
}
|
||||
}
|
||||
|
||||
_inverted_mode = enable;
|
||||
return true;
|
||||
#else
|
||||
return _inverted_mode == enable;
|
||||
#endif // TIOCSINVERT
|
||||
}
|
||||
|
||||
} // namespace device
|
||||
|
||||
Reference in New Issue
Block a user