altos: Make TeleMini v2.0 fit
[fw/altos] / src / core / ao_cmd.c
index 3d086a57e106d8f0110e0da6ad8a309fe985552d..4ebaa6079368ec80164a8176d8d010914552cc9d 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include "ao.h"
+#include "ao_task.h"
 
 __pdata uint16_t ao_cmd_lex_i;
 __pdata uint32_t ao_cmd_lex_u32;
@@ -28,8 +29,8 @@ static __xdata char   cmd_line[CMD_LEN];
 static __pdata uint8_t cmd_len;
 static __pdata uint8_t cmd_i;
 
-static void
-put_string(__code char *s)
+void
+ao_put_string(__code char *s)
 {
        char    c;
        while ((c = *s++))
@@ -39,7 +40,7 @@ put_string(__code char *s)
 static void
 backspace(void)
 {
-       put_string ("\010 \010");
+       ao_put_string ("\010 \010");
 }
 
 static void
@@ -47,7 +48,7 @@ readline(void)
 {
        char c;
        if (ao_echo())
-               put_string("> ");
+               ao_put_string("> ");
        cmd_len = 0;
        for (;;) {
                flush();
@@ -205,9 +206,9 @@ ao_cmd_hex(void)
 }
 
 void
-ao_cmd_decimal(void)
+ao_cmd_decimal(void) __reentrant
 {
-       __pdata uint8_t r = ao_cmd_lex_error;
+       uint8_t r = ao_cmd_lex_error;
 
        ao_cmd_lex_u32 = 0;
        ao_cmd_white();
@@ -262,6 +263,11 @@ ao_reboot(void)
        ao_panic(AO_PANIC_REBOOT);
 }
 
+#ifndef HAS_VERSION
+#define HAS_VERSION 1
+#endif
+
+#if HAS_VERSION
 static void
 version(void)
 {
@@ -284,11 +290,9 @@ version(void)
               , ao_log_format
 #endif
                );
-#if HAS_MS5607
-       ao_ms5607_info();
-#endif
        printf("software-version %s\n", ao_version);
 }
+#endif
 
 #ifndef NUM_CMDS
 #define NUM_CMDS       11
@@ -303,13 +307,21 @@ help(void)
        __pdata uint8_t cmds;
        __pdata uint8_t cmd;
        __code struct ao_cmds * __pdata cs;
-       const char *h;
+       __code const char *h;
+       uint8_t e;
 
        for (cmds = 0; cmds < ao_ncmds; cmds++) {
                cs = ao_cmds[cmds];
                for (cmd = 0; cs[cmd].func; cmd++) {
                        h = cs[cmd].help;
-                       printf("%-45s %s\n", h, h + 1 + strlen(h));
+                       ao_put_string(h);
+                       e = strlen(h);
+                       h += e + 1;
+                       e = 45 - e;
+                       while (e--)
+                               putchar(' ');
+                       ao_put_string(h);
+                       putchar('\n');
                }
        }
 }
@@ -370,14 +382,33 @@ ao_cmd(void)
        }
 }
 
+#if HAS_BOOT_LOADER
+
+#include <ao_boot.h>
+
+static void
+ao_loader(void)
+{
+       flush();
+       ao_boot_loader();
+}
+#endif
+
 __xdata struct ao_task ao_cmd_task;
 
 __code struct ao_cmds  ao_base_cmds[] = {
        { help,         "?\0Help" },
+#if HAS_TASK_INFO
        { ao_task_info, "T\0Tasks" },
+#endif
        { echo,         "E <0 off, 1 on>\0Echo" },
        { ao_reboot,    "r eboot\0Reboot" },
+#if HAS_VERSION
        { version,      "v\0Version" },
+#endif
+#if HAS_BOOT_LOADER
+       { ao_loader,    "X\0Switch to boot loader" },
+#endif
        { 0,    NULL },
 };