summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuotao Fu <l.fu@pengutronix.de>2009-11-24 10:35:42 +0100
committerLuotao Fu <l.fu@pengutronix.de>2009-11-24 10:35:46 +0100
commit60b74f525fae6cf014bb379417cb09f46c03d014 (patch)
tree332c90af0fcbff4f2f83fc9ebc8c5a267814caec
parent669d25b920fbe70d0bd6f2b1adf82335b35c5e91 (diff)
downloadcanutils-60b74f525fae6cf014bb379417cb09f46c03d014.tar.gz
canutils-60b74f525fae6cf014bb379417cb09f46c03d014.tar.xz
add set ctrlmode
also rearranged some code Signed-off-by: Luotao Fu <l.fu@pengutronix.de>
-rw-r--r--src/canconfig.c79
1 files changed, 63 insertions, 16 deletions
diff --git a/src/canconfig.c b/src/canconfig.c
index 3257e8e..b5be62d 100644
--- a/src/canconfig.c
+++ b/src/canconfig.c
@@ -46,6 +46,16 @@ const char *can_modes[CAN_STATE_MAX] = {
"SLEEPING"
};
+/* this is shamelessly stolen from iproute and slightly modified */
+#define NEXT_ARG() \
+ do { \
+ argv++; \
+ if (--argc <= 0) { \
+ fprintf(stderr, "missing parameter for %s\n", *argv); \
+ exit(EXIT_FAILURE);\
+ }\
+ } while(0)
+
static void help(void)
{
fprintf(stderr, "usage:\n\t"
@@ -53,7 +63,8 @@ static void help(void)
"BR := <bitrate in Hz>\n\t"
"canconfig <dev> restart-ms { RESTART_MS }\n\t\t"
"RESTART_MS := <autorestart interval in ms>\n\t"
- "canconfig <dev> mode\n\t"
+ "canconfig <dev> mode { MODE }\n\t\t"
+ "MODE := <[loopback|listen-only|triple-sampling] [on|off]>\n\t"
"canconfig <dev> restart\n"
#if 0
"MODE\n\t\t"
@@ -126,15 +137,6 @@ static void cmd_state(int argc, char *argv[])
exit(EXIT_SUCCESS);
}
-static inline void print_ctrlmode(__u32 cm_mask, __u32 cm_flag)
-{
- __u32 active_cm = cm_mask & cm_flag;
- fprintf(stdout, "loopback [%s], listenonly [%s], 3 samples [%s]\n",
- (active_cm & CAN_CTRLMODE_LOOPBACK) ? "on" : "off",
- (active_cm & CAN_CTRLMODE_LISTENONLY) ? "on" : "off",
- (active_cm & CAN_CTRLMODE_3_SAMPLES) ? "on" : "off");
-}
-
static void do_restart(int argc, char *argv[])
{
if (scan_set_restart(argv[1]) < 0) {
@@ -152,6 +154,15 @@ static void cmd_restart(int argc, char *argv[])
exit(EXIT_SUCCESS);
}
+static inline void print_ctrlmode(__u32 cm_flags)
+{
+ fprintf(stdout,
+ "loopback[%s], listen-only[%s], tripple-sampling[%s]\n",
+ (cm_flags & CAN_CTRLMODE_LOOPBACK) ? "ON" : "OFF",
+ (cm_flags & CAN_CTRLMODE_LISTENONLY) ? "ON" : "OFF",
+ (cm_flags & CAN_CTRLMODE_3_SAMPLES) ? "ON" : "OFF");
+}
+
static void do_show_ctrlmode(int argc, char *argv[])
{
struct can_ctrlmode cm;
@@ -161,23 +172,59 @@ static void do_show_ctrlmode(int argc, char *argv[])
exit(EXIT_FAILURE);
} else {
fprintf(stdout, "%s mode: ", argv[1]);
- print_ctrlmode(cm.mask, cm.flags);
+ print_ctrlmode(cm.flags);
}
}
-#if 0
+/* this is shamelessly stolen from iproute and slightly modified */
+static void set_ctrlmode(char* name, char *arg,
+ struct can_ctrlmode *cm, __u32 flags)
+{
+ if (strcmp(arg, "on") == 0) {
+ cm->flags |= flags;
+ } else if (strcmp(arg, "off") != 0) {
+ fprintf(stderr,
+ "Error: argument of \"%s\" must be \"on\" or \"off\" %s\n",
+ name, arg);
+ exit(EXIT_FAILURE);
+ }
+ cm->mask |= flags;
+}
+
static void do_set_ctrlmode(int argc, char* argv[])
{
+ struct can_ctrlmode cm;
+ const char *name = argv[1];
+
+ while (argc > 0) {
+ if (!strcmp(*argv, "loopback")) {
+ NEXT_ARG();
+ set_ctrlmode("loopback", *argv, &cm,
+ CAN_CTRLMODE_LOOPBACK);
+ } else if (!strcmp(*argv, "listen-only")) {
+ NEXT_ARG();
+ set_ctrlmode("listen-only", *argv, &cm,
+ CAN_CTRLMODE_LISTENONLY);
+ } else if (!strcmp(*argv, "triple-sampling")) {
+ NEXT_ARG();
+ set_ctrlmode("triple-sampling", *argv, &cm,
+ CAN_CTRLMODE_3_SAMPLES);
+ }
+ argc--, argv++;
+ }
+
+ if (scan_set_ctrlmode(name, cm.mask, cm.flags) < 0) {
+ fprintf(stderr, "%s: failed to set mode\n", argv[1]);
+ exit(EXIT_FAILURE);
+ }
}
-#endif
static void cmd_ctrlmode(int argc, char *argv[])
{
-#if 0
if (argc >= 4) {
do_set_ctrlmode(argc, argv);
}
-#endif
+
do_show_ctrlmode(argc, argv);
exit(EXIT_SUCCESS);
@@ -228,8 +275,8 @@ static void cmd_show_interface(int argc, char *argv[])
{
do_show_bitrate(argc, argv);
do_show_state(argc, argv);
- do_show_ctrlmode(argc, argv);
do_show_restart_ms(argc, argv);
+ do_show_ctrlmode(argc, argv);
exit(EXIT_SUCCESS);
}