79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef UART_CLAY_UART_FUNC_H
 | 
						|
#define UART_CLAY_UART_FUNC_H
 | 
						|
 | 
						|
#include <errno.h>
 | 
						|
#include <fcntl.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <termios.h>
 | 
						|
#include <unistd.h>
 | 
						|
 | 
						|
#include "clay.h"
 | 
						|
 | 
						|
bool UART_modal_show = false;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    int serial_port;
 | 
						|
    Clay_String buffer;
 | 
						|
} uart_data;
 | 
						|
 | 
						|
static void trim_message(const Clay_String message, const size_t length) {
 | 
						|
    memset((void *)message.chars + length - 2, 0, message.length - length + 2);
 | 
						|
}
 | 
						|
 | 
						|
int open_uart_port(const char *file_path) {
 | 
						|
    const int serial_port = open(file_path, O_RDWR);
 | 
						|
    if (serial_port < 0) {
 | 
						|
        printf("Error %i from open: %s\n", errno, strerror(errno));
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    struct termios tty;
 | 
						|
    if (tcgetattr(serial_port, &tty) < 0) {
 | 
						|
        printf("Error %i from tcgetattr: %s\n", errno, strerror(errno));
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity
 | 
						|
    tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication
 | 
						|
    tty.c_cflag &= ~CSIZE; // Clear all the size bits
 | 
						|
    tty.c_cflag |= CS8; // 8 bits per byte
 | 
						|
    tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control
 | 
						|
    tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1)
 | 
						|
 | 
						|
    tty.c_lflag &= ~ICANON; // Non-canonical mode
 | 
						|
    tty.c_lflag &= ~ECHO; // Disable echo
 | 
						|
    tty.c_lflag &= ~ECHOE; // Disable erasure
 | 
						|
    tty.c_lflag &= ~ECHONL; // Disable new-line echo
 | 
						|
    tty.c_lflag &= ~ISIG; // Disable interpretation of INTR, QUIT and SUSP
 | 
						|
 | 
						|
    tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
 | 
						|
    tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL);
 | 
						|
    // Disable any special handling of received bytes
 | 
						|
 | 
						|
    tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars)
 | 
						|
    tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed
 | 
						|
 | 
						|
    tty.c_cc[VTIME] = 0;
 | 
						|
    tty.c_cc[VMIN] = 1;
 | 
						|
 | 
						|
    // Set baud rate to be 9600
 | 
						|
    cfsetspeed(&tty, B9600);
 | 
						|
 | 
						|
    // Save tty settings, also checking for error
 | 
						|
    if (tcsetattr(serial_port, TCSANOW, &tty) != 0) {
 | 
						|
        printf("Can't set fd state. Error %d, %s", errno, strerror(errno));
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
 | 
						|
    return serial_port;
 | 
						|
}
 | 
						|
 | 
						|
void handle_uart(const uart_data *data, const char msg, const int response_length) {
 | 
						|
    write(data->serial_port, &msg, 1);
 | 
						|
 | 
						|
    memset((void *)data->buffer.chars, 0, data->buffer.length);
 | 
						|
    read(data->serial_port, (void *)data->buffer.chars, response_length);
 | 
						|
}
 | 
						|
 | 
						|
#endif //UART_CLAY_UART_FUNC_H
 |