new command to change the baudrate of the xbee
[protos/xbee-avr.git] / commands.c
index 1cacfed..a14d098 100644 (file)
 #include <aversive/pgmspace.h>
 #include <aversive/queue.h>
 #include <aversive/endian.h>
+#include <aversive/error.h>
 #include <parse.h>
 #include <rdline.h>
 #include <parse_string.h>
 #include <parse_num.h>
+#include <uart.h>
 
 #include "xbee_atcmd.h"
 #include "xbee_neighbor.h"
@@ -46,6 +48,7 @@
 
 #include "rc_proto.h"
 #include "main.h"
+#include "cmdline.h"
 
 /* commands_gen.c */
 extern parse_pgm_inst_t cmd_reset;
@@ -396,7 +399,7 @@ static void cmd_write_parsed(void *parsed_result, void *data)
                param = &res->u32;
        }
        else {
-               printf("Unknown argument type\n");
+               printf_P(PSTR("Unknown argument type\r\n"));
                return;
        }
        memcpy_P(&cmd, copy.name, 2);
@@ -612,7 +615,7 @@ static void cmd_range_parsed(void *parsed_result, void *data)
        }
        else if (!strcmp(res->action, "start")) {
                if (range_running) {
-                       printf("already running\n");
+                       printf_P(PSTR("already running\r\n"));
                        return;
                }
                range_cur_count = range_count;
@@ -623,7 +626,7 @@ static void cmd_range_parsed(void *parsed_result, void *data)
        }
        else if (!strcmp(res->action, "end")) {
                if (range_running == 0) {
-                       printf("not running\n");
+                       printf_P(PSTR("not running\r\n"));
                        return;
                }
                range_running = 0;
@@ -669,7 +672,7 @@ static void cmd_range_period_parsed(void *parsed_result, void *data)
        struct cmd_range_period_result *res = parsed_result;
 
        if (res->period < 10) {
-               printf("error, minimum period is 10 ms\n");
+               printf_P(PSTR("error, minimum period is 10 ms\r\n"));
                return;
        }
 
@@ -847,15 +850,15 @@ static void cmd_monitor_parsed(void *parsed_result, void *data)
                printf_P(PSTR("monitor period is %d ms, %d regs in list\r\n"),
                       monitor_period_ms, monitor_count);
                LIST_FOREACH(m, &xbee_monitor_list, next)
-                       printf_P(PSTR(" %S\n"), m->desc);
+                       printf_P(PSTR(" %S\r\n"), m->desc);
        }
        else if (!strcmp_P(res->action, PSTR("start"))) {
                if (monitor_running) {
-                       printf("already running\n");
+                       printf_P(PSTR("already running\r\n"));
                        return;
                }
                if (monitor_count == 0) {
-                       printf("no regs to be monitored\n");
+                       printf_P(PSTR("no regs to be monitored\r\n"));
                        return;
                }
                callout_init(&monitor_event);
@@ -869,7 +872,7 @@ static void cmd_monitor_parsed(void *parsed_result, void *data)
        }
        else if (!strcmp_P(res->action, PSTR("end"))) {
                if (monitor_running == 0) {
-                       printf("not running\n");
+                       printf_P(PSTR("not running\r\n"));
                        return;
                }
                monitor_running = 0;
@@ -923,13 +926,13 @@ static void cmd_monitor_add_parsed(void *parsed_result, void *data)
        }
 
        if (m != NULL) {
-               printf("already exist\n");
+               printf_P(PSTR("already exist\r\n"));
                return;
        }
 
        m = malloc(sizeof(*m));
        if (m == NULL) {
-               printf("no mem\n");
+               printf_P(PSTR("no mem\r\n"));
                return;
        }
        m->desc = copy.desc;
@@ -980,7 +983,7 @@ static void cmd_monitor_period_parsed(void *parsed_result, void *data)
        struct cmd_monitor_period_result *res = parsed_result;
 
        if (res->period < 100) {
-               printf("error, minimum period is 100 ms\n");
+               printf_P(PSTR("error, minimum period is 100 ms\r\n"));
                return;
        }
 
@@ -1032,7 +1035,7 @@ static void cmd_monitor_del_parsed(void *parsed_result, void *data)
        free(res->m);
        monitor_count --;
        if (monitor_count == 0) {
-               printf("Disable monitoring, no more event\n");
+               printf_P(PSTR("Disable monitoring, no more event\r\n"));
                callout_stop(&cm, &monitor_event);
                monitor_running = 0;
                return;
@@ -1107,7 +1110,7 @@ struct cmd_raw_result {
 /* function called when cmd_raw is parsed successfully */
 static void cmd_raw_parsed(void *parsed_result, void *data)
 {
-       printf("switched to raw mode, CTRL-D to exit\n");
+       printf_P(PSTR("switched to raw mode, CTRL-D to exit\r\n"));
        rdline_stop(&xbeeboard.rdl); /* don't display prompt when return */
        xbee_raw = 1;
 }
@@ -1214,6 +1217,46 @@ parse_pgm_inst_t cmd_debug = {
        },
 };
 
+#ifndef USE_USB
+/**********************************************************/
+
+/* this structure is filled when cmd_baudrate is parsed successfully */
+struct cmd_baudrate_result {
+       fixed_string_t arg0;
+       uint32_t arg1;
+};
+
+/* function called when cmd_baudrate is parsed successfully */
+static void cmd_baudrate_parsed(void * parsed_result, __attribute__((unused)) void *data)
+{
+       struct cmd_baudrate_result *res = parsed_result;
+       struct uart_config c;
+
+       uart_getconf(XBEE_UART, &c);
+       c.baudrate = res->arg1;
+       uart_setconf(XBEE_UART, &c);
+}
+
+prog_char str_baudrate_arg0[] = "baudrate";
+parse_pgm_token_string_t cmd_baudrate_arg0 =
+       TOKEN_STRING_INITIALIZER(struct cmd_baudrate_result, arg0,
+                                str_baudrate_arg0);
+parse_pgm_token_num_t cmd_baudrate_arg1 =
+       TOKEN_NUM_INITIALIZER(struct cmd_baudrate_result, arg1,
+                             UINT32);
+
+prog_char help_baudrate[] = "Change xbee baudrate";
+parse_pgm_inst_t cmd_baudrate = {
+       .f = cmd_baudrate_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_baudrate,
+       .tokens = {        /* token list, NULL terminated */
+               (prog_void *)&cmd_baudrate_arg0,
+               (prog_void *)&cmd_baudrate_arg1,
+               NULL,
+       },
+};
+#endif
 
 
 /* in progmem */
@@ -1251,5 +1294,8 @@ parse_pgm_ctx_t main_ctx[] = {
        (parse_pgm_inst_t *)&cmd_raw,
        (parse_pgm_inst_t *)&cmd_dump,
        (parse_pgm_inst_t *)&cmd_debug,
+#ifndef USE_USB
+       (parse_pgm_inst_t *)&cmd_baudrate,
+#endif
        NULL,
 };