// // Created by nano on 4/26/25. // #include "communication.h" #include #include #include 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; } }