serial/communication.c

118 lines
2.7 KiB
C

//
// Created by nano on 4/26/25.
//
#include "communication.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct sp_port ** port_list;
struct sp_port * port;
struct sp_event_set *event_set;
void comm_init_communication() {
/*
* Initializes the serial communication for the usb -> uart board
*/
port_list=comm_get_port_list();
int portnr=0;
comm_list_serial_ports(port_list);
printf("Chose a port: ");
scanf("%d",&portnr);
sp_copy_port(port_list[portnr], &port);
sp_free_port_list(port_list);
comm_open_port(port);
}
void comm_end_communication(struct sp_port *port) {
/*
* Ends the serial communication for the usb -> uart board
*/
check(sp_close(port));
sp_free_port(port);
//sp_free_port_list(port_list);
}
int comm_await() {
// Await data from the robot
return (sp_wait(event_set, 50) == SP_OK);
}
int comm_read_byte(byte *data) {
//read available data
//TODO: IMPLEMENT
return 0;
}
int comm_write_byte(byte data) {
// we are writing 8 bit bytes to the fpga anyways and pc -> fpga only needs to tell what do to next, can be fit in 8 bits
//TODO: IMPLEMENT
return 0;
}
struct sp_port **comm_get_port_list() {
struct sp_port **port_list;
enum sp_return result = sp_list_ports(&port_list);
if (result != SP_OK) {
printf("Error listing serial ports\n");
exit(-1);
}
return port_list;
}
void comm_list_serial_ports(struct sp_port **port_list) {
printf("Port list:\n");
for (int i=0;port_list[i]!= NULL; i++) {
char *port_name = sp_get_port_name(port_list[i]);
printf("Port %d: %s\n", i, port_name);
}
}
void comm_open_port(struct sp_port *port) {
/*
* Opens communication to the selected serial port and sets the correct parameters for the zigbee carrier board.
* Also add event to see when data arrives.
*/
check(sp_open(port,SP_MODE_READ_WRITE));
check(sp_set_baudrate(port,19200));
check(sp_set_bits(port,8));
check(sp_set_parity(port,SP_PARITY_NONE));
check(sp_set_stopbits(port,1));
check(sp_new_event_set(&event_set));
sp_add_port_events(event_set, port, SP_EVENT_RX_READY);
}
/** Helper function for error handling. Taken from libserialport examples */
int check(enum sp_return result)
{
/* For this example we'll just exit on any error by calling abort(). */
char *error_message;
switch (result) {
case SP_ERR_ARG:
printf("Error: Invalid argument.\n");
abort();
case SP_ERR_FAIL:
error_message = sp_last_error_message();
printf("Error: Failed: %s\n", error_message);
sp_free_error_message(error_message);
abort();
case SP_ERR_SUPP:
printf("Error: Not supported.\n");
abort();
case SP_ERR_MEM:
printf("Error: Couldn't allocate memory.\n");
abort();
case SP_OK:
default:
return result;
}
}