Use ao_delay to sleep for 2 seconds instead of trying ao_sleep
[fw/altos] / src / ao_cmd.c
index 33619b245086b8f8ad8a6de1f4cada00d542b64d..4a68fba49d56110b252a2896bc8041478c111171 100644 (file)
@@ -18,6 +18,7 @@
 #include "ao.h"
 
 __xdata uint16_t ao_cmd_lex_i;
 #include "ao.h"
 
 __xdata uint16_t ao_cmd_lex_i;
+__xdata uint32_t ao_cmd_lex_u32;
 __xdata char   ao_cmd_lex_c;
 __xdata enum ao_cmd_status ao_cmd_status;
 static __xdata uint8_t lex_echo;
 __xdata char   ao_cmd_lex_c;
 __xdata enum ao_cmd_status ao_cmd_status;
 static __xdata uint8_t lex_echo;
@@ -157,11 +158,11 @@ ao_cmd_decimal(void)
 {
        __xdata uint8_t r = ao_cmd_lex_error;
 
 {
        __xdata uint8_t r = ao_cmd_lex_error;
 
-       ao_cmd_lex_i = 0;
+       ao_cmd_lex_u32 = 0;
        ao_cmd_white();
        for(;;) {
                if ('0' <= ao_cmd_lex_c && ao_cmd_lex_c <= '9')
        ao_cmd_white();
        for(;;) {
                if ('0' <= ao_cmd_lex_c && ao_cmd_lex_c <= '9')
-                       ao_cmd_lex_i = (ao_cmd_lex_i * 10) + (ao_cmd_lex_c - '0');
+                       ao_cmd_lex_u32 = (ao_cmd_lex_u32 * 10) + (ao_cmd_lex_c - '0');
                else
                        break;
                r = ao_cmd_success;
                else
                        break;
                r = ao_cmd_success;
@@ -169,6 +170,21 @@ ao_cmd_decimal(void)
        }
        if (r != ao_cmd_success)
                ao_cmd_status = r;
        }
        if (r != ao_cmd_success)
                ao_cmd_status = r;
+       ao_cmd_lex_i = (uint16_t) ao_cmd_lex_u32;
+}
+
+uint8_t
+ao_match_word(__code char *word)
+{
+       while (*word) {
+               if (ao_cmd_lex_c != *word) {
+                       ao_cmd_status = ao_cmd_syntax_error;
+                       return 0;
+               }
+               word++;
+               ao_cmd_lex();
+       }
+       return 1;
 }
 
 static void
 }
 
 static void
@@ -179,37 +195,21 @@ eol(void)
 }
 
 static void
 }
 
 static void
-dump(void)
+echo(void)
 {
 {
-       __xdata uint16_t c;
-       __xdata uint8_t * __xdata start, * __xdata end;
-
-       ao_cmd_hex();
-       start = (uint8_t __xdata *) ao_cmd_lex_i;
        ao_cmd_hex();
        ao_cmd_hex();
-       end = (uint8_t __xdata *) ao_cmd_lex_i;
-       if (ao_cmd_status != ao_cmd_success)
-               return;
-       c = 0;
-       while (start <= end) {
-               if ((c & 7) == 0) {
-                       if (c)
-                               putchar('\n');
-                       ao_cmd_put16((uint16_t) start);
-               }
-               putchar(' ');
-               ao_cmd_put8(*start);
-               ++c;
-               start++;
-       }
-       putchar('\n');
+       lex_echo = ao_cmd_lex_i != 0;
 }
 
 static void
 }
 
 static void
-echo(void)
+ao_reboot(void)
 {
 {
-       ao_cmd_hex();
-       lex_echo = ao_cmd_lex_i != 0;
+       ao_cmd_white();
+       if (!ao_match_word("eboot"))
+               return;
+       WDCTL = WDCTL_EN | WDCTL_MODE_WATCHDOG | WDCTL_INT_64;
+       ao_delay(AO_SEC_TO_TICKS(2));
+       ao_panic(AO_PANIC_REBOOT);
 }
 
 static void
 }
 
 static void
@@ -305,7 +305,7 @@ __code struct ao_cmds       ao_base_cmds[] = {
        { '?', help,            "?                                  Print this message" },
        { 'T', ao_task_info,    "T                                  Show task states" },
        { 'E', echo,            "E <0 off, 1 on>                    Set command echo mode" },
        { '?', help,            "?                                  Print this message" },
        { 'T', ao_task_info,    "T                                  Show task states" },
        { 'E', echo,            "E <0 off, 1 on>                    Set command echo mode" },
-       { 'd', dump,            "d <start> <end>                    Dump memory" },
+       { 'r', ao_reboot,       "r eboot                            Reboot" },
        { 'v', version,         "v                                  Show version" },
        { 0,    help,   NULL },
 };
        { 'v', version,         "v                                  Show version" },
        { 0,    help,   NULL },
 };