26#define DEBUG_PRINT(...)
34LinuxUartDriver ::LinuxUartDriver(
const char*
const compName)
34LinuxUartDriver ::LinuxUartDriver(
const char*
const compName) {
…}
50 this->m_allocationSize = allocationSize;
52 this->m_device = device;
62 fd =
::open(device, O_RDWR | O_NOCTTY);
65 DEBUG_PRINT(
"open UART device %s failed.\n", device);
71 DEBUG_PRINT(
"Successfully opened UART device %s fd %d\n", device, fd);
79 stat = tcgetattr(fd, &cfg);
81 DEBUG_PRINT(
"tcgetattr failed: (%d): %s\n", stat, strerror(errno));
107 cfg.c_cc[VTIME] = 10;
109 stat = tcsetattr(fd, TCSANOW, &cfg);
111 DEBUG_PRINT(
"tcsetattr failed: (%d): %s\n", stat, strerror(errno));
125 stat = tcgetattr(fd, &t);
136 t.c_cflag |= CRTSCTS;
138 stat = tcsetattr(fd, TCSANOW, &t);
169#if defined TGT_OS_TYPE_LINUX
177 relayRate = B1000000;
180 relayRate = B1152000;
183 relayRate = B1500000;
186 relayRate = B2000000;
190 relayRate = B2500000;
195 relayRate = B3000000;
200 relayRate = B3500000;
205 relayRate = B4000000;
214 struct termios newtio;
216 stat = tcgetattr(fd, &newtio);
241 newtio.c_cflag |= CS8 | CLOCAL | CREAD;
245 newtio.c_cflag |= (PARENB | PARODD);
248 newtio.c_cflag |= PARENB;
251 newtio.c_cflag &= ~PARENB;
259 stat = cfsetispeed(&newtio, relayRate);
268 stat = cfsetospeed(&newtio, relayRate);
284 newtio.c_iflag = INPCK;
287 (void)tcflush(fd, TCIFLUSH);
290 stat = tcsetattr(fd, TCSANOW, &newtio);
309LinuxUartDriver ::~LinuxUartDriver() {
310 if (this->m_fd != -1) {
311 DEBUG_PRINT(
"Closing UART device %d\n", this->m_fd);
313 (void)close(this->m_fd);
309LinuxUartDriver ::~LinuxUartDriver() {
…}
323 if (this->m_fd == -1 || serBuffer.
getData() ==
nullptr || serBuffer.
getSize() == 0) {
326 unsigned char *data = serBuffer.
getData();
331 if (-1 == stat || stat != xferSize) {
333 this->log_WARNING_HI_WriteError(_arg, stat);
338 if (isConnected_deallocate_OutputPort(0)) {
339 deallocate_out(0, serBuffer);
344void LinuxUartDriver ::serialReadTaskEntry(
void* ptr) {
347 LinuxUartDriver* comp =
reinterpret_cast<LinuxUartDriver*
>(ptr);
348 while (!comp->m_quitReadThread) {
349 Fw::Buffer buff = comp->allocate_out(0, comp->m_allocationSize);
352 if (buff.
getData() ==
nullptr) {
354 comp->log_WARNING_HI_NoBuffers(_arg);
356 comp->recv_out(0, buff, status);
370 while ((stat == 0) && !comp->m_quitReadThread) {
380 comp->log_WARNING_HI_ReadError(_arg, stat);
382 }
else if (stat > 0) {
388 comp->recv_out(0, buff, status);
397 this->m_readTask.start(task, serialReadTaskEntry,
this, priority, stackSize, cpuAffinity);
401void LinuxUartDriver ::quitReadThread() {
402 this->m_quitReadThread =
true;
401void LinuxUartDriver ::quitReadThread() {
…}
406 return m_readTask.join(value_ptr);
PlatformIntType NATIVE_INT_TYPE
PlatformUIntType NATIVE_UINT_TYPE
C++ header for working with basic fprime types.
Auto-generated base for LinuxUartDriver component.
void log_ACTIVITY_HI_PortOpened(const Fw::LogStringArg &device)
void log_WARNING_HI_OpenError(const Fw::LogStringArg &device, I32 error, const Fw::LogStringArg &name)
void ready_out(NATIVE_INT_TYPE portNum)
Invoke output port ready.
bool isConnected_ready_OutputPort(NATIVE_INT_TYPE portNum)
bool open(const char *const device, UartBaudRate baud, UartFlowControl fc, UartParity parity, NATIVE_INT_TYPE allocationSize)
UartBaudRate
Configure UART parameters.
Status associated with the received data.
@ RECV_OK
Receive worked as expected.
@ RECV_ERROR
Receive error occurred retrying may succeed.
Status returned by the send call.
@ SEND_ERROR
Send error occurred retrying may succeed.
@ SEND_OK
Send worked as expected.
void init()
Object initializer.
static TaskStatus delay(NATIVE_UINT_TYPE msecs)
delay the task
@ TASK_OK
message sent/received okay