fsfw/src/fsfw_hal/linux/serial/helper.cpp

168 lines
4.5 KiB
C++
Raw Normal View History

#include <fsfw_hal/linux/serial/helper.h>
2022-10-06 11:14:00 +02:00
#include <sys/ioctl.h>
2022-10-27 14:01:35 +02:00
#include "fsfw/serviceinterface.h"
2022-10-06 11:14:00 +02:00
void uart::setMode(struct termios& options, UartModes mode) {
if (mode == UartModes::NON_CANONICAL) {
/* Disable canonical mode */
options.c_lflag &= ~ICANON;
} else if (mode == UartModes::CANONICAL) {
options.c_lflag |= ICANON;
}
}
void uart::setBaudrate(struct termios& options, UartBaudRate baud) {
switch (baud) {
case UartBaudRate::RATE_50:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B50);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_75:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B75);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_110:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B110);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_134:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B134);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_150:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B150);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_200:
2022-11-03 10:12:05 +01:00
cfsetspeed(&options, B200);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_300:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B300);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_600:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B600);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_1200:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B1200);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_1800:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B1800);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_2400:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B2400);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_4800:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B4800);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_9600:
2022-11-03 10:12:05 +01:00
cfsetspeed(&options, B9600);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_19200:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B19200);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_38400:
2022-10-26 18:26:48 +02:00
cfsetspeed(&options, B38400);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_57600:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B57600);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_115200:
2022-10-26 18:26:48 +02:00
cfsetspeed(&options, B115200);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_230400:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B230400);
2022-10-06 11:14:00 +02:00
break;
#ifndef __APPLE__
case UartBaudRate::RATE_460800:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B460800);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_500000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B500000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_576000:
2022-11-03 10:12:05 +01:00
cfsetspeed(&options, B576000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_921600:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B921600);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_1000000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B1000000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_1152000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B1152000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_1500000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B1500000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_2000000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B2000000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_2500000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B2500000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_3000000:
2022-11-03 10:12:05 +01:00
cfsetspeed(&options, B3000000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_3500000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B3500000);
2022-10-06 11:14:00 +02:00
break;
case UartBaudRate::RATE_4000000:
2022-11-03 10:10:36 +01:00
cfsetspeed(&options, B4000000);
2022-10-06 11:14:00 +02:00
break;
#endif // ! __APPLE__
default:
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::warning << "UartComIF::configureBaudrate: Baudrate not supported" << std::endl;
#endif
break;
}
}
2022-11-04 11:08:23 +01:00
void uart::setBitsPerWord(struct termios& options, BitsPerWord bits) {
options.c_cflag &= ~CSIZE; // Clear all the size bits
if (bits == BitsPerWord::BITS_5) {
options.c_cflag |= CS5;
} else if (bits == BitsPerWord::BITS_6) {
options.c_cflag |= CS6;
} else if (bits == BitsPerWord::BITS_7) {
options.c_cflag |= CS7;
} else if (bits == BitsPerWord::BITS_8) {
options.c_cflag |= CS8;
}
}
void uart::enableRead(struct termios& options) { options.c_cflag |= CREAD; }
void uart::ignoreCtrlLines(struct termios& options) { options.c_cflag |= CLOCAL; }
void uart::setParity(struct termios& options, Parity parity) {
/* Clear parity bit */
options.c_cflag &= ~PARENB;
switch (parity) {
case Parity::EVEN:
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
break;
case Parity::ODD:
options.c_cflag |= PARENB;
options.c_cflag |= PARODD;
break;
default:
break;
}
}
2022-10-06 11:14:00 +02:00
int uart::readCountersAndErrors(int serialPort, serial_icounter_struct& icounter) {
2022-10-27 14:01:35 +02:00
return ioctl(serialPort, TIOCGICOUNT, &icounter);
2022-10-06 11:14:00 +02:00
}
2022-11-04 11:08:23 +01:00
void uart::setStopbits(struct termios& options, StopBits bits) {
if (bits == StopBits::TWO_STOP_BITS) {
// Use two stop bits
options.c_cflag |= CSTOPB;
} else {
// Clear stop field, only one stop bit used in communication
options.c_cflag &= ~CSTOPB;
}
}
2023-03-21 20:20:13 +01:00
void uart::flushRxBuf(int fd) { tcflush(fd, TCIFLUSH); }
void uart::flushTxRxBuf(int fd) { tcflush(fd, TCIOFLUSH); }