pretty much done

needs documentation update and testing

# Conflicts:
#	README.MD
This commit is contained in:
Nicholas Stănescu 2025-04-28 16:53:35 +02:00 committed by Nanokloon
parent d968ce22be
commit 0eb5ac6de9
6 changed files with 146 additions and 75 deletions

View File

@ -1,6 +1,8 @@
# serial for ip2
TODO:
- [ ] create read function
- [ ] create write function
- [x] create read function
- [x] create write function
- [x] how to be aware of data arriving
- [ ] other
- [ ] test read and write functions

View File

@ -9,84 +9,128 @@
#include <string.h>
struct sp_port ** port_list;
//TODO: Add descriptive enum for the different return values
//TODO: ADD DOCUMENTATION
struct sp_port * port;
struct sp_event_set *event_set;
struct sp_event_set *event_data_ready;
struct sp_event_set *event_ready_for_tx;
void comm_init_communication() {
/*
/**
* Initializes the serial communication for the usb -> uart board
*/
port_list=comm_get_port_list();
void comm_init_communication() {
struct sp_port **port_list;
comm_get_port_list(&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);
comm_open_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);
void 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++) {
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) {
void comm_open_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_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);
check(sp_new_event_set(&event_data_ready));
check(sp_new_event_set(&event_ready_for_tx));
sp_add_port_events(event_data_ready, port, SP_EVENT_RX_READY);
sp_add_port_events(event_ready_for_tx, port, SP_EVENT_TX_READY);
}
/**
* Ends the serial communication for the usb -> uart board
*/
void comm_end_communication() {
check(sp_close(port));
sp_free_port(port);
}
int comm_await_data_ready(int timeout) {
// Await data from the robot
return (sp_wait(event_data_ready, timeout) == SP_OK);
}
int comm_await_ready_for_tx(int timeout) {
return (sp_wait(event_ready_for_tx, timeout) == SP_OK);
}
int comm_nonblocking_read(byte *data, int amount_of_bytes) {
//read available data
//TODO: TEST ACTUAL READ LOGIC
int recv_bytes = sp_nonblocking_read(port, data, amount_of_bytes);
if (recv_bytes == amount_of_bytes) {
return 1;
}
if (recv_bytes >= 0) {
return 0;
}
return -1;
}
int comm_blocking_read(byte *data, int amount_of_bytes, int timeout) {
//read available data
//TODO: TEST ACTUAL READ LOGIC
int recv_bytes = sp_blocking_read(port, data, amount_of_bytes, timeout);
if (recv_bytes == amount_of_bytes) {
return 1;
}
if (recv_bytes >= 0) {
return 0;
}
return -1;
}
int comm_blocking_write(byte *data, int amount_of_bytes,int timeout) {
// 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: TEST ACTUAL WRITE LOGIC
int sent_bytes = sp_blocking_write(port, data, amount_of_bytes, timeout);
if (sent_bytes == amount_of_bytes) {
return 1;
}
if (sent_bytes >= 0) {
return 0;
}
return -1;
}
int comm_nonblocking_write(byte *data, int amount_of_bytes) {
// 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: TEST ACTUAL WRITE LOGIC
int sent_bytes = sp_nonblocking_write(port, data, amount_of_bytes);
if (sent_bytes == amount_of_bytes) {
return 1;
}
if (sent_bytes >=0) {
return 0;
}
return -1;
}
/** Helper function for error handling. Taken from libserialport examples */

View File

@ -1,7 +1,6 @@
//
// Created by nano on 4/26/25.
//
#ifndef COMMS_H
#define COMMS_H
#include <libserialport.h>
@ -14,22 +13,33 @@ typedef u_int8_t byte;
*/
void comm_init_communication();
/**
* Ends the serial communication for the usb -> uart board
*/
void comm_end_communication(struct sp_port *port);
struct sp_port **comm_get_port_list();
void comm_get_port_list(struct sp_port ***port_list);
void comm_list_serial_ports(struct sp_port **port_list);
/**
* Opens communication to the selected serial port and sets the correct parameters for the zigbee carrier board.
*/
void comm_open_port(struct sp_port *port);
void comm_open_port();
/**
* Ends the serial communication for the usb -> uart board
*/
void comm_end_communication();
int comm_await();
int comm_blocking_read(byte *data, int amount_of_bytes, int timeout);
int comm_await_data_ready(int timeout);
int comm_await_ready_for_tx(int timeout);
int comm_nonblocking_read(byte *data, int amount_of_bytes);
int comm_blocking_read(byte *data, int amount_of_bytes, int timeout);
int comm_nonblocking_write(byte *data, int amount_of_bytes);
int comm_blocking_write(byte *data, int amount_of_bytes, int timeout);
int check(enum sp_return result);

View File

@ -1,3 +1,9 @@
## Compiling libserialport caused a false positive* by windows defender
###### *at least so i think
# !!! THIS IS OUTDATED
# Serial Communication Module Documentation
## Overview

35
main.c
View File

@ -7,29 +7,34 @@
#include "utils.h"
#include "communication.h"
extern struct sp_port *port;
int main(int argc, char *argv[]) {
comm_init_communication();
comm_init_communication(); //initialize communication with zigbee board
while (1) {
if (comm_await()) {
byte *buffer = malloc(sizeof(byte));
if (sp_nonblocking_read(port, buffer, 1) == 1) {
byte *bits = malloc(sizeof(byte) * 8);
byte_to_bit_array(bits, *buffer);
printf("Data received: ");
if (comm_await_data_ready(50)) {
//await in 50ms increments for data to be ready
byte *buffer = malloc(sizeof(byte)); //allocate enough space to store incoming data
if (comm_blocking_read(buffer, 1, 50) == 1) {
// read data from buffer and continue only if the correct nr of bytes is received
byte *bits = malloc(sizeof(byte) * 8); //
byte_to_bit_array(bits, *buffer); // convert the incoming data to
printf("Data received: "); // an array of bits and print said bits
for (int i = 7; i; i--) {
printf("%d", bits[i]);
}
printf("\n");
//
printf("%d", bits[i]); // THIS IS JUST TESTING CODE
} //
printf("\n"); //
free(buffer);
if (bits[7] == 1) {
free(bits);
break;
free(bits); //exit if the MSB is 1, so that we don't loop infinitely
break; // again, test code
}
}
}
}
comm_end_communication(port);
comm_end_communication();
return 0;
}

View File

@ -3,6 +3,9 @@
//
#include "utils.h"
#include <stdio.h>
#include "communication.h"
// Helper functions to convert from bits to bytes
@ -20,4 +23,5 @@ void bit_array_to_byte(byte bit_array[], byte *data) {
data+=bit_array[i]*currentpow;
currentpow*=2;
} //2's complement notation
}
}