first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / kernel / ao_cmd.c
index d28db5b7ec06cbd2abc9b31868e123dc3d4cf598..d8ba8372f5d0e308109ad6bd17c84a1a7c0d4541 100644 (file)
@@ -19,8 +19,6 @@
 #include "ao.h"
 #include "ao_task.h"
 
-uint16_t ao_cmd_lex_i;
-uint32_t ao_cmd_lex_u32;
 char   ao_cmd_lex_c;
 enum ao_cmd_status ao_cmd_status;
 
@@ -36,6 +34,8 @@ static char   cmd_line[AO_CMD_LEN];
 static uint8_t cmd_len;
 static uint8_t cmd_i;
 
+static const char backspace[] = "\010 \010";
+
 void
 ao_put_string(const char *s)
 {
@@ -44,18 +44,12 @@ ao_put_string(const char *s)
                putchar(c);
 }
 
-static void
-backspace(void)
-{
-       ao_put_string ("\010 \010");
-}
-
 void
-ao_cmd_readline(void)
+ao_cmd_readline(const char *prompt)
 {
        char c;
        if (ao_echo())
-               ao_put_string("> ");
+               ao_put_string(prompt);
        cmd_len = 0;
        for (;;) {
                flush();
@@ -64,7 +58,7 @@ ao_cmd_readline(void)
                if (c == '\010' || c == '\177') {
                        if (cmd_len != 0) {
                                if (ao_echo())
-                                       backspace();
+                                       ao_put_string(backspace);
                                --cmd_len;
                        }
                        continue;
@@ -74,7 +68,7 @@ ao_cmd_readline(void)
                if (c == '\025') {
                        while (cmd_len != 0) {
                                if (ao_echo())
-                                       backspace();
+                                       ao_put_string(backspace);
                                --cmd_len;
                        }
                        continue;
@@ -138,8 +132,8 @@ ao_getnibble(void)
 void
 ao_cmd_put16(uint16_t v)
 {
-       ao_cmd_put8(v >> 8);
-       ao_cmd_put8(v);
+       ao_cmd_put8((uint8_t) (v >> 8));
+       ao_cmd_put8((uint8_t) v);
 }
 
 void
@@ -166,63 +160,61 @@ int8_t
 ao_cmd_hexchar(char c)
 {
        if ('0' <= c && c <= '9')
-               return (c - '0');
+               return (int8_t) (c - '0');
        if ('a' <= c && c <= 'f')
-               return (c - 'a' + 10);
+               return (int8_t) (c - 'a' + 10);
        if ('A' <= c && c <= 'F')
-               return (c - 'A' + 10);
+               return (int8_t) (c - 'A' + 10);
        return -1;
 }
 
-void
-ao_cmd_hexbyte(void)
+static uint32_t
+get_hex(uint8_t lim)
 {
+       uint32_t result = 0;
        uint8_t i;
-       int8_t  n;
 
-       ao_cmd_lex_i = 0;
        ao_cmd_white();
-       for (i = 0; i < 2; i++) {
-               n = ao_cmd_hexchar(ao_cmd_lex_c);
+       for (i = 0; i < lim; i++) {
+               int8_t n = ao_cmd_hexchar(ao_cmd_lex_c);
                if (n < 0) {
-                       ao_cmd_status = ao_cmd_syntax_error;
+                       if (i == 0 || lim != 0xff)
+                               ao_cmd_status = ao_cmd_lex_error;
                        break;
                }
-               ao_cmd_lex_i = (ao_cmd_lex_i << 4) | n;
+               result = (uint32_t) ((result << 4) | (uint32_t) n);
                ao_cmd_lex();
        }
+       return result;
 }
 
-void
-ao_cmd_hex(void)
+uint8_t
+ao_cmd_hexbyte(void)
 {
-       uint8_t r = ao_cmd_lex_error;
-       int8_t  n;
+       return (uint8_t) get_hex(2);
+}
 
-       ao_cmd_lex_i = 0;
-       ao_cmd_white();
-       for(;;) {
-               n = ao_cmd_hexchar(ao_cmd_lex_c);
-               if (n < 0)
-                       break;
-               ao_cmd_lex_i = (ao_cmd_lex_i << 4) | n;
-               r = ao_cmd_success;
-               ao_cmd_lex();
-       }
-       if (r != ao_cmd_success)
-               ao_cmd_status = r;
+uint32_t
+ao_cmd_hex(void)
+{
+       return get_hex(0xff);
 }
 
-void
+uint32_t
 ao_cmd_decimal(void) 
 {
+       uint32_t result = 0;
        uint8_t r = ao_cmd_lex_error;
+       bool negative = false;
 
-       ao_cmd_lex_u32 = 0;
        ao_cmd_white();
+       if (ao_cmd_lex_c == '-') {
+               negative = true;
+               ao_cmd_lex();
+       }
        for(;;) {
                if ('0' <= ao_cmd_lex_c && ao_cmd_lex_c <= '9')
-                       ao_cmd_lex_u32 = (ao_cmd_lex_u32 * 10) + (ao_cmd_lex_c - '0');
+                       result = result * 10 + (ao_cmd_lex_c - '0');
                else
                        break;
                r = ao_cmd_success;
@@ -230,7 +222,9 @@ ao_cmd_decimal(void)
        }
        if (r != ao_cmd_success)
                ao_cmd_status = r;
-       ao_cmd_lex_i = (uint16_t) ao_cmd_lex_u32;
+       if (negative)
+               result = -result;
+       return result;
 }
 
 uint8_t
@@ -250,9 +244,9 @@ ao_match_word(const char *word)
 static void
 echo(void)
 {
-       ao_cmd_hex();
+       uint32_t v = ao_cmd_hex();
        if (ao_cmd_status == ao_cmd_success)
-               ao_stdios[ao_cur_stdio].echo = ao_cmd_lex_i != 0;
+               ao_stdios[ao_cur_stdio].echo = v != 0;
 }
 
 static void
@@ -276,13 +270,15 @@ ao_reboot(void)
 #endif
 
 #if HAS_VERSION
+#define _stringify(x) #x
+#define stringify(x) _stringify(x)
 static void
 version(void)
 {
        printf("manufacturer     %s\n"
               "product          %s\n"
               "serial-number    %u\n"
-#if HAS_FLIGHT || HAS_TRACKER
+#if HAS_LOG && (HAS_FLIGHT || HAS_TRACKER)
               "current-flight   %u\n"
 #endif
 #if HAS_LOG
@@ -300,7 +296,7 @@ version(void)
               , ao_manufacturer
               , ao_product
               , ao_serial_number
-#if HAS_FLIGHT || HAS_TRACKER
+#if HAS_LOG && (HAS_FLIGHT || HAS_TRACKER)
               , ao_flight_number
 #endif
 #if HAS_LOG
@@ -313,7 +309,7 @@ version(void)
               , (unsigned) ((uint32_t) AO_BOOT_APPLICATION_BOUND - (uint32_t) AO_BOOT_APPLICATION_BASE)
 #endif
                );
-       printf("software-version %s\n", ao_version);
+       printf("software-version %." stringify(AO_MAX_VERSION) "s\n", ao_version);
 }
 #endif
 
@@ -331,7 +327,7 @@ help(void)
        uint8_t cmd;
        const struct ao_cmds * cs;
        const char *h;
-       uint8_t e;
+       size_t e;
 
        for (cmds = 0; cmds < ao_ncmds; cmds++) {
                cs = ao_cmds[cmds];
@@ -379,7 +375,7 @@ ao_cmd(void)
        void (*func)(void);
 
        for (;;) {
-               ao_cmd_readline();
+               ao_cmd_readline("> ");
                ao_cmd_lex();
                ao_cmd_white();
                c = ao_cmd_lex_c;