add can support

This commit is contained in:
smayzy 2026-04-09 17:56:06 +02:00
parent 6cd0fbcf3f
commit 673cdb16a0

View File

@ -6,6 +6,10 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>
#include <linux/can.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.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
@ -99,6 +103,26 @@ void get_fake_data(Tel *t) {
t->mot_temp.data = t->mot_temp.ldata + ((float)rand() / (float)RAND_MAX) * (float)(t->mot_temp.hdata - t->mot_temp.ldata); t->mot_temp.data = t->mot_temp.ldata + ((float)rand() / (float)RAND_MAX) * (float)(t->mot_temp.hdata - t->mot_temp.ldata);
} }
void read_can(Tel *t, int soc) {
struct can_frame frame;
int nbytes = read(soc, &frame, sizeof(struct can_frame));
if (nbytes > 0) {
switch (frame.can_id) {
case 0x382:
if (frame.can_dlc >= 2) {
t->rpm.data = frame.data[0] | (frame.data[1] << 8);
t->speed.data = t->rpm.data * 0.017;
}
break;
default:
break;
}
}
}
long now_ms(void) { long now_ms(void) {
struct timespec ts; struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts); clock_gettime(CLOCK_MONOTONIC, &ts);
@ -338,6 +362,11 @@ int main(int argc, char **argv) {
int option; int option;
int delay = 1; int delay = 1;
int fake_data = 0; int fake_data = 0;
int use_can = 0;
int soc = 0;
struct sockaddr_can addr;
struct ifreq ifr;
while ((option = getopt(argc, argv, "d:hf")) !=-1) { while ((option = getopt(argc, argv, "d:hf")) !=-1) {
switch (option) { switch (option) {
@ -350,12 +379,32 @@ int main(int argc, char **argv) {
case 'f' : case 'f' :
fake_data = 1; fake_data = 1;
break; break;
case 'c' :
use_can = 1;
break;
case 'h' : case 'h' :
printf("Usage: ./cocomobile-tui [-d int DELAY by how much to slow down] [-h HELP] [-f generate fake data]\n"); printf("Usage: ./cocomobile-tui [-d int DELAY by how much to slow down] [-h HELP] [-f generate fake data] [-c enable can]\n");
return(0); return(0);
} }
} }
if (use_can) {
soc = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (soc < 0) {
perror("socket error");
return 1;
}
strcpy(ifr.ifr_name, "can0");
ioctl(soc, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if (bind(soc, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind error");
close(soc);
return 1;
}
}
initscr(); initscr();
noecho(); noecho();
cbreak(); cbreak();
@ -429,7 +478,7 @@ int main(int argc, char **argv) {
if (fake_data) { if (fake_data) {
get_fake_data(&tel); get_fake_data(&tel);
} else { } else {
//real_data() if (use_can) read_can(&tel, soc);
} }
break; break;
} }