]> rtime.felk.cvut.cz Git - sojka/can-syscalls-examples.git/blob - common.h
Add README
[sojka/can-syscalls-examples.git] / common.h
1 /**************************************************************/
2 /* CAN system calls example                                   */
3 /* Author: Michal Sojka, Czech Technical University in Prague */
4 /* License: Public domain                                     */
5 /**************************************************************/
6
7 #ifndef COMMON_H
8 #define COMMON_H
9
10 #include <linux/can.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 #define MIN(a, b) ((a) < (b) ? (a) : (b))
15
16 #define STRINGIFY(val) #val
17 #define TOSTRING(val) STRINGIFY(val)
18
19 /**
20  * Evaluate expression cmd and if its value is -1, print an error
21  * message with perror().
22  *
23  * @return Result of cmd evaluation
24  */
25 #define CHECK(cmd) ({ int ret = (cmd); if (ret == -1) { perror(#cmd " line " TOSTRING(__LINE__)); exit(1); }; ret; })
26 #define CHECKPTR(cmd) ({ void *ptr = (cmd); if (ptr == (void*)-1) { perror(#cmd " line " TOSTRING(__LINE__)); exit(1); }; ptr; })
27
28 char *candump_parse_args(int argc, char *argv[])
29 {
30         if (argc < 2) {
31                 fprintf(stderr, "Usage: %s <CAN interface>\n", argv[0]);
32                 exit(1);
33         }
34         return argv[1];
35 }
36
37 void print_can_frame(const struct can_frame *cf)
38 {
39         int i;
40
41         printf("%#010x [%d]", cf->can_id, cf->can_dlc);
42         for (i = 0; i < cf->can_dlc; i++)
43                 printf(" %02x", cf->data[i]);
44         printf("\n");
45 }
46
47 void can_str2frame(const char *str, struct can_frame *cf)
48 {
49         char *extra;
50         unsigned char *d = cf->data;
51         int ret = sscanf(str,
52                          "%x#%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%ms",
53                          &cf->can_id,
54                          d+0, d+1, d+2, d+3, d+4, d+5, d+6, d+7, &extra);
55         if (ret < 1) {
56                 fprintf(stderr, "Error parsing CAN frame '%s'\n", str);
57                 exit(1);
58         }
59         if (ret > 9) {
60                 fprintf(stderr, "Error: Extra input '%s'\n", extra);
61                 exit(1);
62         }
63         cf->can_dlc = ret - 1;
64 }
65
66 char *cansend_parse_args(int argc, char *argv[], int *count, struct can_frame *cf_array, size_t max_count)
67 {
68         int i;
69         if (argc < 3) {
70                 fprintf(stderr, "Usage: %s <CAN interface> <CAN frame>...\n", argv[0]);
71                 fprintf(stderr, "       CAN frame is ID#DATA, e.g. 123#4567\n");
72                 exit(1);
73         }
74
75         for (i = 0; i < MIN(argc - 2, max_count); i++)
76                 can_str2frame(argv[i + 2], &cf_array[i]);
77         *count = argc - 2;
78         return argv[1];
79 }
80
81 #endif