Compare commits
13
Commits
45bad91ba7
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6996ef4dc7 | ||
|
|
d65f4a3baa | ||
|
|
85075c1efb | ||
|
|
1b848e77e5 | ||
|
|
21046b2bd3 | ||
|
|
45dffd54ad | ||
|
|
66002a0e1d | ||
|
|
c09f0a81b0 | ||
|
|
ed516cc804 | ||
|
|
aef366e593 | ||
|
|
cd7728c2b7 | ||
|
|
f8957a4cf9 | ||
|
|
52c2deb4ca |
+140
-32
@@ -12,6 +12,9 @@
|
|||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <termios.h>
|
#include <termios.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
|
||||||
@@ -52,8 +55,14 @@ typedef struct{
|
|||||||
WINDOW *lwin;
|
WINDOW *lwin;
|
||||||
char title[30];
|
char title[30];
|
||||||
} StFlt;
|
} StFlt;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int last_error;
|
int err;
|
||||||
|
long last_err;
|
||||||
|
} Error;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
long last_error;
|
||||||
int error_level;
|
int error_level;
|
||||||
int height;
|
int height;
|
||||||
int width;
|
int width;
|
||||||
@@ -61,6 +70,13 @@ typedef struct{
|
|||||||
int startx;
|
int startx;
|
||||||
WINDOW *lwin;
|
WINDOW *lwin;
|
||||||
char title[30];
|
char title[30];
|
||||||
|
Error speed;
|
||||||
|
Error rpm;
|
||||||
|
Error power;
|
||||||
|
Error eff;
|
||||||
|
Error bat;
|
||||||
|
Error tens;
|
||||||
|
Error amp;
|
||||||
} StStr;
|
} StStr;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -105,13 +121,9 @@ void win_init_str(StStr *st) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void get_fake_data(Tel *t) {
|
void get_fake_data(Tel *t) {
|
||||||
t->speed.data = t->speed.ldata + rand() % (t->speed.hdata - t->speed.ldata + 1);
|
|
||||||
t->power.data = t->power.ldata + rand() % (t->power.hdata - t->power.ldata + 1);
|
|
||||||
t->bat.data = t->bat.ldata + rand() % (t->bat.hdata - t->bat.ldata + 1);
|
|
||||||
t->rpm.data = t->rpm.ldata + rand() % (t->rpm.hdata - t->rpm.ldata + 1);
|
t->rpm.data = t->rpm.ldata + rand() % (t->rpm.hdata - t->rpm.ldata + 1);
|
||||||
t->tens.data = t->tens.ldata + ((float)rand() / (float)RAND_MAX) * (float)(t->tens.hdata - t->tens.ldata);
|
t->tens.data = t->tens.ldata + ((float)rand() / (float)RAND_MAX) * (float)(t->tens.hdata - t->tens.ldata);
|
||||||
t->amp.data = t->amp.ldata + ((float)rand() / (float)RAND_MAX) * (float)(t->amp.hdata - t->amp.ldata);
|
t->amp.data = t->amp.ldata + ((float)rand() / (float)RAND_MAX) * (float)(t->amp.hdata - t->amp.ldata);
|
||||||
t->eff.data = t->eff.ldata + ((float)rand() / (float)RAND_MAX) * (float)(t->eff.hdata - t->eff.ldata);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void read_can(Tel *t, int soc) {
|
void read_can(Tel *t, int soc) {
|
||||||
@@ -122,20 +134,18 @@ void read_can(Tel *t, int soc) {
|
|||||||
|
|
||||||
if (nbytes != sizeof(struct can_frame)) return;
|
if (nbytes != sizeof(struct can_frame)) return;
|
||||||
|
|
||||||
if (nbytes > 0) {
|
|
||||||
|
|
||||||
switch (frame.can_id) {
|
switch (frame.can_id) {
|
||||||
|
|
||||||
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:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void read_uart(Tel *t, int fd, SerialParser *uart_str) {
|
void read_uart(Tel *t, int fd, SerialParser *uart_str) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
@@ -165,6 +175,70 @@ 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];
|
||||||
|
int len = snprintf(msg, sizeof(msg), "%d,%d,%d,%.1f,%d,%.1f,%.1f,%d\n",
|
||||||
|
t->speed.data,
|
||||||
|
t->rpm.data,
|
||||||
|
t->power.data,
|
||||||
|
t->eff.data,
|
||||||
|
t->bat.data,
|
||||||
|
t->tens.data,
|
||||||
|
t->amp.data,
|
||||||
|
t->message.error_level );
|
||||||
|
|
||||||
|
if (len < 0 || len >= (int)sizeof(msg)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int total = 0;
|
||||||
|
while (total < len) {
|
||||||
|
int n = write(fd, msg + total, len - total);
|
||||||
|
if (n < 0) {
|
||||||
|
if (errno == EINTR) continue;
|
||||||
|
if (errno == EAGAIN) continue;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
total += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void calc_data(Tel *t, Bat_state *b, long now) {
|
void calc_data(Tel *t, Bat_state *b, long now) {
|
||||||
t->power.data = (int)(t->tens.data * t->amp.data);
|
t->power.data = (int)(t->tens.data * t->amp.data);
|
||||||
t->speed.data = (int)(t->rpm.data * 0.017f);
|
t->speed.data = (int)(t->rpm.data * 0.017f);
|
||||||
@@ -181,6 +255,7 @@ void calc_data(Tel *t, Bat_state *b, long now) {
|
|||||||
|
|
||||||
b->previous_ms = now;
|
b->previous_ms = now;
|
||||||
b->wh_used += (float)t->power.data * (float)dt / 3600000.0f;
|
b->wh_used += (float)t->power.data * (float)dt / 3600000.0f;
|
||||||
|
if (b->wh_used > b->wh_total) b->wh_used = b->wh_total;
|
||||||
}
|
}
|
||||||
|
|
||||||
long now_ms(void) {
|
long now_ms(void) {
|
||||||
@@ -418,28 +493,36 @@ void win_bar(StInt *st, bool use_color) {
|
|||||||
|
|
||||||
void win_warn(Tel *t, bool use_color, long now) {
|
void win_warn(Tel *t, bool use_color, long now) {
|
||||||
int warn_lvl = 0;
|
int warn_lvl = 0;
|
||||||
if ((t->speed.data > t->speed.hdata) || (t->speed.data < t->speed.ldata)) warn_lvl++;
|
int lwiny, lwinx;
|
||||||
if ((t->rpm.data > t->rpm.hdata) || (t->rpm.data < t->rpm.ldata)) warn_lvl++;
|
getmaxyx(t->message.lwin, lwiny, lwinx);
|
||||||
if ((t->power.data > t->power.hdata) || (t->power.data < t->power.ldata)) warn_lvl++;
|
win_clear(t->message.lwin);
|
||||||
if ((t->bat.data > t->bat.hdata) || (t->bat.data < t->bat.ldata)) warn_lvl++;
|
|
||||||
if ((t->eff.data > t->eff.hdata) || (t->eff.data < t->eff.ldata)) warn_lvl++;
|
t->message.speed.err = 0;
|
||||||
if ((t->tens.data > t->tens.hdata) || (t->tens.data < t->tens.ldata)) warn_lvl++;
|
t->message.rpm.err = 0;
|
||||||
if ((t->amp.data > t->amp.hdata) || (t->amp.data < t->amp.ldata)) warn_lvl++;
|
t->message.power.err = 0;
|
||||||
|
t->message.eff.err = 0;
|
||||||
|
t->message.bat.err = 0;
|
||||||
|
t->message.tens.err = 0;
|
||||||
|
t->message.amp.err = 0;
|
||||||
|
|
||||||
|
if ((t->speed.data > t->speed.hdata) || (t->speed.data < t->speed.ldata)) {warn_lvl++; t->message.speed.err = 1; t->message.speed.last_err = now; }
|
||||||
|
if ((t->rpm.data > t->rpm.hdata) || (t->rpm.data < t->rpm.ldata)) {warn_lvl++; t->message.rpm.err = 1; t->message.rpm.last_err = now; }
|
||||||
|
if ((t->power.data > t->power.hdata) || (t->power.data < t->power.ldata)) {warn_lvl++; t->message.power.err = 1; t->message.power.last_err = now; }
|
||||||
|
if ((t->bat.data > t->bat.hdata) || (t->bat.data < t->bat.ldata)) {warn_lvl++; t->message.bat.err = 1; t->message.bat.last_err = now; }
|
||||||
|
if ((t->eff.data > t->eff.hdata) || (t->eff.data < t->eff.ldata)) {warn_lvl++; t->message.eff.err = 1; t->message.eff.last_err = now; }
|
||||||
|
if ((t->tens.data > t->tens.hdata) || (t->tens.data < t->tens.ldata)) {warn_lvl++; t->message.tens.err = 1; t->message.tens.last_err = now; }
|
||||||
|
if ((t->amp.data > t->amp.hdata) || (t->amp.data < t->amp.ldata)) {warn_lvl++; t->message.amp.err = 1; t->message.amp.last_err = now; }
|
||||||
|
|
||||||
if (warn_lvl > 0) {
|
if (warn_lvl > 0) {
|
||||||
t->message.error_level = warn_lvl;
|
t->message.error_level = warn_lvl;
|
||||||
t->message.last_error = now;
|
t->message.last_error = now;
|
||||||
} else if ((now - t->message.last_error) > 3000) {
|
} else if ((now - t->message.last_error) > 3000) {
|
||||||
t->message.error_level = 0;
|
t->message.error_level = 0;
|
||||||
win_clear(t->message.lwin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int lwiny, lwinx;
|
|
||||||
getmaxyx(t->message.lwin, lwiny, lwinx);
|
|
||||||
|
|
||||||
if (use_color) wattron(t->message.lwin, COLOR_PAIR(2));
|
if (use_color) wattron(t->message.lwin, COLOR_PAIR(2));
|
||||||
|
|
||||||
if (warn_lvl > 0) {
|
if (warn_lvl > 0 || (now - t->message.last_error) < 3000) {
|
||||||
for (int y = 1; y < lwiny - 1; y++) {
|
for (int y = 1; y < lwiny - 1; y++) {
|
||||||
for (int x = 1; x < lwinx - 1; x++) {
|
for (int x = 1; x < lwinx - 1; x++) {
|
||||||
mvwaddch(t->message.lwin, y, x, ACS_CKBOARD);
|
mvwaddch(t->message.lwin, y, x, ACS_CKBOARD);
|
||||||
@@ -448,6 +531,19 @@ void win_warn(Tel *t, bool use_color, long now) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (use_color) wattroff(t->message.lwin, COLOR_PAIR(2));
|
if (use_color) wattroff(t->message.lwin, COLOR_PAIR(2));
|
||||||
|
|
||||||
|
if (use_color) wattron(t->message.lwin, COLOR_PAIR(1));
|
||||||
|
|
||||||
|
if (t->message.speed.err != 0 || (now - t->message.speed.last_err) < 3000 ) mvwprintw(t->message.lwin, 2 + 0 * ((lwiny - 2) / 4), 2 , "SPEED ERROR");
|
||||||
|
if (t->message.rpm.err != 0 || (now - t->message.rpm.last_err) < 3000 ) mvwprintw(t->message.lwin, 2 + 1 * ((lwiny - 2) / 4), 2 , "RPM ERROR" );
|
||||||
|
if (t->message.power.err != 0 || (now - t->message.power.last_err) < 3000 ) mvwprintw(t->message.lwin, 2 + 2 * ((lwiny - 2) / 4), 2 , "POWER ERROR");
|
||||||
|
if (t->message.eff.err != 0 || (now - t->message.eff.last_err) < 3000 ) mvwprintw(t->message.lwin, 2 + 3 * ((lwiny - 2) / 4), 2 , "EFF ERROR" );
|
||||||
|
if (t->message.bat.err != 0 || (now - t->message.bat.last_err) < 3000 ) mvwprintw(t->message.lwin, 2 + 0 * ((lwiny - 2) / 4), lwinx / 2, "BAT ERROR" );
|
||||||
|
if (t->message.tens.err != 0 || (now - t->message.tens.last_err) < 3000 ) mvwprintw(t->message.lwin, 2 + 1 * ((lwiny - 2) / 4), lwinx / 2, "TENS ERROR" );
|
||||||
|
if (t->message.amp.err != 0 || (now - t->message.amp.last_err) < 3000 ) mvwprintw(t->message.lwin, 2 + 2 * ((lwiny - 2) / 4), lwinx / 2, "AMP ERROR" );
|
||||||
|
|
||||||
|
if (use_color) wattroff(t->message.lwin, COLOR_PAIR(1));
|
||||||
|
|
||||||
wrefresh(t->message.lwin);
|
wrefresh(t->message.lwin);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -459,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;
|
||||||
@@ -468,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);
|
||||||
@@ -485,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -576,14 +678,14 @@ int main(int argc, char **argv) {
|
|||||||
int y6r = y - (y2 + 2* y6);
|
int y6r = y - (y2 + 2* y6);
|
||||||
|
|
||||||
Tel tel;
|
Tel tel;
|
||||||
tel.speed = (StInt){0 , 0 , 200 , 3, 1, y2 , x3 , 0 , 0 , NULL, "speed (km/h)" };
|
tel.speed = (StInt){0 , 0 , 51 , 3, 1, y2 , x3 , 0 , 0 , NULL, "speed (km/h)" };
|
||||||
tel.rpm = (StInt){0 , 0 , 6000 , 4, 1, y2 , x3 , 0 , x3 , NULL, "rpm (tr/min)" };
|
tel.rpm = (StInt){0 , 0 , 3000 , 4, 1, y2 , x3 , 0 , x3 , NULL, "rpm (tr/min)" };
|
||||||
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, 300.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, 0.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, 55.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" };
|
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}};
|
||||||
|
|
||||||
win_init_int(&tel.speed);
|
win_init_int(&tel.speed);
|
||||||
win_init_int(&tel.rpm);
|
win_init_int(&tel.rpm);
|
||||||
@@ -602,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' :
|
||||||
@@ -611,14 +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);
|
||||||
calc_data(&tel, &bat_state, now);
|
if (use_uart && is_receiver) read_uart_receiver(&tel, uart_fd, &uart_parser);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
@@ -628,6 +732,9 @@ int main(int argc, char **argv) {
|
|||||||
win_float(&tel.amp, use_color);
|
win_float(&tel.amp, use_color);
|
||||||
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 && !is_receiver) write_uart(&tel, uart_fd);
|
||||||
|
|
||||||
t100 = now;
|
t100 = now;
|
||||||
}
|
}
|
||||||
napms(10);
|
napms(10);
|
||||||
@@ -643,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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user