Compare commits

..
5 Commits
Author SHA1 Message Date
smayzy 6996ef4dc7 change tension limits 2026-05-19 19:00:07 +02:00
smayzy d65f4a3baa set now in main at the top 2026-05-10 19:26:17 +02:00
smayzy 85075c1efb use abs on speed 2026-05-07 12:31:10 +02:00
smayzy 1b848e77e5 set locale 2026-05-06 09:25:14 +02:00
smayzy 21046b2bd3 add receiver option 2026-05-03 18:31:02 +02:00
+56 -9
View File
@@ -13,6 +13,8 @@
#include <fcntl.h> #include <fcntl.h>
#include <termios.h> #include <termios.h>
#include <errno.h> #include <errno.h>
#include <locale.h>
#include <stdlib.h>
const int digit_bitmaps[10][5][3] = { const int digit_bitmaps[10][5][3] = {
{{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}}, // 0 {{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}}, // 0
@@ -137,7 +139,7 @@ void read_can(Tel *t, int soc) {
case 0x382: case 0x382:
if (frame.can_dlc >= 2) { if (frame.can_dlc >= 2) {
t->rpm.data = frame.data[0] | (frame.data[1] << 8); t->rpm.data = abs((int16_t)(frame.data[0] | (frame.data[1] << 8)));
} }
break; break;
default: default:
@@ -173,6 +175,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) { void write_uart(Tel *t, int fd) {
// speed,rpm,power,eff,bat,tens,amp,warn // speed,rpm,power,eff,bat,tens,amp,warn
char msg[256]; char msg[256];
@@ -518,6 +555,7 @@ int main(int argc, char **argv) {
int soc = 0; int soc = 0;
int use_uart = 0; int use_uart = 0;
int uart_fd = 0; int uart_fd = 0;
int is_receiver = 0;
struct sockaddr_can addr; struct sockaddr_can addr;
struct ifreq ifr; struct ifreq ifr;
@@ -527,7 +565,9 @@ int main(int argc, char **argv) {
Bat_state bat_state = {0, 1000, 0}; Bat_state bat_state = {0, 1000, 0};
while ((option = getopt(argc, argv, "d:hfcu")) !=-1) { setlocale(LC_NUMERIC, "C");
while ((option = getopt(argc, argv, "d:hfcur")) !=-1) {
switch (option) { switch (option) {
case 'd' : case 'd' :
delay = atoi(optarg); delay = atoi(optarg);
@@ -544,8 +584,11 @@ int main(int argc, char **argv) {
case 'u' : case 'u' :
use_uart = 1; use_uart = 1;
break; break;
case 'r' :
is_receiver = 1;
break;
case 'h' : case 'h' :
printf("Usage: ./cocomobile-tui [-d int <ms multiplier>] [-h <help>] [-f <random data generation>] [-c <enable can>] [-u <enable uart connection>]\n"); printf("Usage: ./cocomobile-tui [-d int <ms multiplier>] [-h <help>] [-f <random data generation>] [-c <enable can>] [-u <enable uart connection>] [-r <set for receiver (not for the car)>]\n");
return(0); return(0);
} }
} }
@@ -640,7 +683,7 @@ int main(int argc, char **argv) {
tel.power = (StInt){0 , 0 , 1300 , 4, 1, 2*y6 , 2*x3, y2 , 0 , NULL, "power (W)" }; tel.power = (StInt){0 , 0 , 1300 , 4, 1, 2*y6 , 2*x3, y2 , 0 , NULL, "power (W)" };
tel.bat = (StInt){0 , 0 , 100 , 3, 0, y4 , x3r , 0 , x-x3r , NULL, "batteries (%)" }; tel.bat = (StInt){0 , 0 , 100 , 3, 0, y4 , x3r , 0 , x-x3r , NULL, "batteries (%)" };
tel.eff = (StFlt){0.0f, 0.0f , 100.0f, 5, 1, y4r , x3r , y4 , x-x3r , NULL, "efficiency (Wh/Km)" }; tel.eff = (StFlt){0.0f, 0.0f , 100.0f, 5, 1, y4r , x3r , y4 , x-x3r , NULL, "efficiency (Wh/Km)" };
tel.tens = (StFlt){0.0f, 36.0f, 55.0f , 4, 1, y2r4 , x3r , y2 , x-x3r , NULL, "tension (V)" }; tel.tens = (StFlt){0.0f, 42.0f, 58.0f , 4, 1, y2r4 , x3r , y2 , x-x3r , NULL, "tension (V)" };
tel.amp = (StFlt){0.0f, 0.0f , 30.0f , 4, 1, y2r4r, x3r , y-y2r4r, x-x3r , NULL, "intensity (A)" }; tel.amp = (StFlt){0.0f, 0.0f , 30.0f , 4, 1, y2r4r, x3r , y-y2r4r, x-x3r , NULL, "intensity (A)" };
tel.message = (StStr){0 , 0 , y6r , 2*x3, y-y6r , 0 , NULL, "warnings" , {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}; tel.message = (StStr){0 , 0 , y6r , 2*x3, y-y6r , 0 , NULL, "warnings" , {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}};
@@ -661,6 +704,7 @@ int main(int argc, char **argv) {
bat_state.previous_ms = now; bat_state.previous_ms = now;
while(1) { while(1) {
now = now_ms();
ch = tolower(getch()); ch = tolower(getch());
switch (ch) { switch (ch) {
case 'q' : case 'q' :
@@ -670,13 +714,15 @@ int main(int argc, char **argv) {
if (fake_data) { if (fake_data) {
get_fake_data(&tel); get_fake_data(&tel);
} else { } else {
if (use_can) read_can(&tel, soc); if (use_can && !is_receiver) read_can(&tel, soc);
if (use_uart) read_uart(&tel, uart_fd, &uart_parser); 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; break;
} }
calc_data(&tel, &bat_state, now);
now = now_ms(); if (!is_receiver) calc_data(&tel, &bat_state, now);
if (now - t100 >= 100 * delay) { if (now - t100 >= 100 * delay) {
win_int(&tel.speed, use_color); win_int(&tel.speed, use_color);
win_int(&tel.rpm, use_color); win_int(&tel.rpm, use_color);
@@ -687,7 +733,7 @@ int main(int argc, char **argv) {
win_int(&tel.bat, use_color); win_int(&tel.bat, use_color);
win_warn(&tel, use_color, now); 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; t100 = now;
} }
@@ -704,5 +750,6 @@ int main(int argc, char **argv) {
delwin(tel.message.lwin); delwin(tel.message.lwin);
endwin(); endwin();
if (use_can) close(soc); if (use_can) close(soc);
if (use_uart) close(uart_fd);
return 0; return 0;
} }