From 21046b2bd3f53ebb2ea5615b2a170720cf34204d Mon Sep 17 00:00:00 2001 From: smayzy Date: Sun, 3 May 2026 18:31:02 +0200 Subject: [PATCH] add receiver option --- src/main.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index 9217cb6..668c968 100644 --- a/src/main.c +++ b/src/main.c @@ -173,6 +173,41 @@ void read_uart(Tel *t, int fd, SerialParser *uart_str) { } } +void read_uart_receiver(Tel *t, int fd, SerialParser *uart_str) { + char buf[128]; + int n = read(fd, buf, sizeof(buf)); + + if (n < 0) return; // -1 EAGAIN means empty + + if (n > 0) { + for (int i = 0; i < n; i++) { + char c = buf[i]; + if (c == '\n') { + uart_str->linebuf[uart_str->linepos] = '\0'; + int tmp_speed, tmp_rpm, tmp_power, tmp_bat, tmp_warn; + float tmp_eff, tmp_tens, tmp_amp; + if (sscanf(uart_str->linebuf, "%d,%d,%d,%f,%d,%f,%f,%d", &tmp_speed, &tmp_rpm, &tmp_power, &tmp_eff, &tmp_bat, &tmp_tens, &tmp_amp, &tmp_warn) == 8) { + t->speed.data = tmp_speed; + t->rpm.data = tmp_rpm; + t->power.data = tmp_power; + t->eff.data = tmp_eff; + t->bat.data = tmp_bat; + t->tens.data = tmp_tens; + t->amp.data = tmp_amp; + t->message.error_level = tmp_warn; + } + + uart_str->linepos = 0; + } + if (uart_str->linepos < (int)sizeof(uart_str->linebuf) - 1) { + uart_str->linebuf[uart_str->linepos++] = c; + } else { + uart_str->linepos = 0; // drop line to prevent overflow + } + } + } +} + void write_uart(Tel *t, int fd) { // speed,rpm,power,eff,bat,tens,amp,warn char msg[256]; @@ -518,6 +553,7 @@ int main(int argc, char **argv) { int soc = 0; int use_uart = 0; int uart_fd = 0; + int is_receiver = 0; struct sockaddr_can addr; struct ifreq ifr; @@ -527,7 +563,7 @@ int main(int argc, char **argv) { Bat_state bat_state = {0, 1000, 0}; - while ((option = getopt(argc, argv, "d:hfcu")) !=-1) { + while ((option = getopt(argc, argv, "d:hfcur")) !=-1) { switch (option) { case 'd' : delay = atoi(optarg); @@ -544,8 +580,11 @@ int main(int argc, char **argv) { case 'u' : use_uart = 1; break; + case 'r' : + is_receiver = 1; + break; case 'h' : - printf("Usage: ./cocomobile-tui [-d int ] [-h ] [-f ] [-c ] [-u ]\n"); + printf("Usage: ./cocomobile-tui [-d int ] [-h ] [-f ] [-c ] [-u ] [-r ]\n"); return(0); } } @@ -670,12 +709,13 @@ int main(int argc, char **argv) { if (fake_data) { get_fake_data(&tel); } else { - if (use_can) read_can(&tel, soc); - if (use_uart) read_uart(&tel, uart_fd, &uart_parser); + if (use_can && !is_receiver) read_can(&tel, soc); + if (use_uart && !is_receiver) read_uart(&tel, uart_fd, &uart_parser); + if (use_uart && is_receiver) read_uart_receiver(&tel, uart_fd, &uart_parser); } break; } - calc_data(&tel, &bat_state, now); + if (!is_receiver) calc_data(&tel, &bat_state, now); now = now_ms(); if (now - t100 >= 100 * delay) { win_int(&tel.speed, use_color); @@ -687,7 +727,7 @@ int main(int argc, char **argv) { win_int(&tel.bat, use_color); win_warn(&tel, use_color, now); - if (use_uart) write_uart(&tel, uart_fd); + if (use_uart && !is_receiver) write_uart(&tel, uart_fd); t100 = now; } @@ -704,5 +744,6 @@ int main(int argc, char **argv) { delwin(tel.message.lwin); endwin(); if (use_can) close(soc); + if (use_uart) close(uart_fd); return 0; }