platform/posix: exit on none existing uart device, terminate if uart is unplugged

This commit is contained in:
Dirk Helbig 2025-03-04 12:39:55 +01:00
parent 683d7c6847
commit 7bab55ed9a

View File

@ -90,7 +90,7 @@ static int btstack_uart_posix_init(const btstack_uart_config_t * config){
static void hci_uart_posix_process(btstack_data_source_t *ds, btstack_data_source_callback_type_t callback_type);
static void btstack_uart_block_posix_process_write(btstack_data_source_t *ds) {
if (btstack_uart_block_write_bytes_len == 0) return;
uint32_t start = btstack_run_loop_get_time_ms();
@ -135,7 +135,7 @@ static void btstack_uart_block_posix_process_read(btstack_data_source_t *ds) {
}
uint32_t start = btstack_run_loop_get_time_ms();
// read up to bytes_to_read data in
ssize_t bytes_read = read(ds->source.fd, btstack_uart_block_read_bytes_data, btstack_uart_block_read_bytes_len);
// log_info("read need %u bytes, got %d", btstack_uart_block_read_bytes_len, (int) bytes_read);
@ -145,17 +145,17 @@ static void btstack_uart_block_posix_process_read(btstack_data_source_t *ds) {
}
if (bytes_read == 0){
log_error("read zero bytes\n");
return;
exit(EXIT_FAILURE);
}
if (bytes_read < 0) {
log_error("read returned error\n");
return;
exit(EXIT_FAILURE);
}
btstack_uart_block_read_bytes_len -= bytes_read;
btstack_uart_block_read_bytes_data += bytes_read;
if (btstack_uart_block_read_bytes_len > 0) return;
btstack_run_loop_disable_data_source_callbacks(ds, DATA_SOURCE_CALLBACK_READ);
if (block_received){
@ -176,13 +176,13 @@ static int btstack_uart_posix_set_baudrate(uint32_t baudrate){
case 9600: brate=B9600; break;
case 19200: brate=B19200; break;
case 38400: brate=B38400; break;
case 57600: brate=B57600; break;
case 115200: brate=B115200; break;
case 57600: brate=B57600; break;
case 115200: brate=B115200; break;
#ifdef B230400
case 230400: brate=B230400; break;
case 230400: brate=B230400; break;
#endif
#ifdef B460800
case 460800: brate=B460800; break;
case 460800: brate=B460800; break;
#endif
#ifdef B500000
case 500000: brate=B500000; break;
@ -191,7 +191,7 @@ static int btstack_uart_posix_set_baudrate(uint32_t baudrate){
case 576000: brate=B576000; break;
#endif
#ifdef B921600
case 921600: brate=B921600; break;
case 921600: brate=B921600; break;
#endif
#ifdef B1000000
case 1000000: brate=B1000000; break;
@ -311,12 +311,12 @@ static int btstack_uart_posix_open(void){
int fd = open(device_name, flags);
if (fd == -1) {
log_error("Unable to open port %s", device_name);
return -1;
exit(EXIT_FAILURE);
}
if (tcgetattr(fd, &btstack_uart_block_termios) < 0) {
log_error("Couldn't get term attributes");
return -1;
exit(EXIT_FAILURE);
}
cfmakeraw(&btstack_uart_block_termios); // make raw
@ -326,11 +326,11 @@ static int btstack_uart_posix_open(void){
btstack_uart_block_termios.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
btstack_uart_block_termios.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl
// see: http://unixwiz.net/techtips/termios-vmin-vtime.html
btstack_uart_block_termios.c_cc[VMIN] = 1;
btstack_uart_block_termios.c_cc[VTIME] = 0;
// no parity
btstack_uart_posix_set_parity_option(&btstack_uart_block_termios, parity);
@ -339,15 +339,15 @@ static int btstack_uart_posix_open(void){
if(tcsetattr(fd, TCSANOW, &btstack_uart_block_termios) < 0) {
log_error("Couldn't set term attributes");
return -1;
exit(EXIT_FAILURE);
}
// store fd in data source
transport_data_source.source.fd = fd;
// also set baudrate
if (btstack_uart_posix_set_baudrate(baudrate) < 0){
return -1;
exit(EXIT_FAILURE);
}
// set up data_source
@ -360,13 +360,13 @@ static int btstack_uart_posix_open(void){
log_info("Open tty %s", device_name);
return 0;
}
}
static int btstack_uart_posix_close_new(void){
// first remove run loop handler
btstack_run_loop_remove_data_source(&transport_data_source);
// then close device
close(transport_data_source.source.fd);
transport_data_source.source.fd = -1;
@ -434,7 +434,7 @@ static void (*frame_received)(uint16_t frame_size);
static void btstack_uart_slip_posix_block_sent(void);
static void btstack_uart_slip_posix_process_write(btstack_data_source_t *ds) {
if (btstack_uart_slip_write_bytes_len == 0) return;
uint32_t start = btstack_run_loop_get_time_ms();
@ -507,7 +507,7 @@ static void btstack_uart_slip_posix_process_read(btstack_data_source_t *ds) {
btstack_uart_slip_receive_track_start = 0;
btstack_uart_slip_receive_start_time = start;
}
// read up to bytes_to_read data in
ssize_t bytes_read = read(ds->source.fd, btstack_uart_slip_receive_buffer, SLIP_RECEIVE_BUFFER_SIZE);
@ -517,7 +517,7 @@ static void btstack_uart_slip_posix_process_read(btstack_data_source_t *ds) {
log_info("read took %u ms", end - start);
}
if (bytes_read < 0) return;
btstack_uart_slip_receive_pos = 0;
btstack_uart_slip_receive_len = (uint16_t ) bytes_read;