]> rtime.felk.cvut.cz Git - sojka/can-syscalls-examples.git/blobdiff - common.h
Add cansend examples
[sojka/can-syscalls-examples.git] / common.h
index 8d7f3ab6a9c6ec076aec0efe11eabaebae11a792..dd26da204848f9d1c81b84c025087eb92d3d3faa 100644 (file)
--- a/common.h
+++ b/common.h
@@ -11,6 +11,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
 #define STRINGIFY(val) #val
 #define TOSTRING(val) STRINGIFY(val)
 
@@ -42,5 +44,38 @@ void print_can_frame(const struct can_frame *cf)
        printf("\n");
 }
 
+void can_str2frame(const char *str, struct can_frame *cf)
+{
+       char *extra;
+       unsigned char *d = cf->data;
+       int ret = sscanf(str,
+                        "%x#%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%ms",
+                        &cf->can_id,
+                        d+0, d+1, d+2, d+3, d+4, d+5, d+6, d+7, &extra);
+       if (ret < 1) {
+               fprintf(stderr, "Error parsing CAN frame '%s'\n", str);
+               exit(1);
+       }
+       if (ret > 9) {
+               fprintf(stderr, "Error: Extra input '%s'\n", extra);
+               exit(1);
+       }
+       cf->can_dlc = ret - 1;
+}
+
+char *cansend_parse_args(int argc, char *argv[], int *count, struct can_frame *cf_array, size_t max_count)
+{
+       int i;
+       if (argc < 3) {
+               fprintf(stderr, "Usage: %s <CAN interface> <CAN frame>...\n", argv[0]);
+               fprintf(stderr, "       CAN frame is ID#DATA, e.g. 123#4567\n");
+               exit(1);
+       }
+
+       for (i = 0; i < MIN(argc - 2, max_count); i++)
+               can_str2frame(argv[i + 2], &cf_array[i]);
+       *count = argc - 2;
+       return argv[1];
+}
 
 #endif