X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_cmd.c;h=d1c049ac78aaf5b03905dc13542905f74cb01d71;hb=HEAD;hp=5d8683e132da42ab3a3a3c35419bc456e1604106;hpb=75df97b5f6ade3310618a477b685d39b7fd4666e;p=fw%2Faltos diff --git a/src/kernel/ao_cmd.c b/src/kernel/ao_cmd.c index 5d8683e1..d8ba8372 100644 --- a/src/kernel/ao_cmd.c +++ b/src/kernel/ao_cmd.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,41 +19,37 @@ #include "ao.h" #include "ao_task.h" -__pdata uint16_t ao_cmd_lex_i; -__pdata uint32_t ao_cmd_lex_u32; -__pdata char ao_cmd_lex_c; -__pdata enum ao_cmd_status ao_cmd_status; +char ao_cmd_lex_c; +enum ao_cmd_status ao_cmd_status; +#ifndef AO_CMD_LEN #if AO_PYRO_NUM -#define CMD_LEN 128 +#define AO_CMD_LEN 128 #else -#define CMD_LEN 48 +#define AO_CMD_LEN 48 #endif +#endif + +static char cmd_line[AO_CMD_LEN]; +static uint8_t cmd_len; +static uint8_t cmd_i; -static __xdata char cmd_line[CMD_LEN]; -static __pdata uint8_t cmd_len; -static __pdata uint8_t cmd_i; +static const char backspace[] = "\010 \010"; void -ao_put_string(__code char *s) +ao_put_string(const char *s) { char c; while ((c = *s++)) putchar(c); } -static void -backspace(void) -{ - ao_put_string ("\010 \010"); -} - -static void -readline(void) +void +ao_cmd_readline(const char *prompt) { char c; if (ao_echo()) - ao_put_string("> "); + ao_put_string(prompt); cmd_len = 0; for (;;) { flush(); @@ -61,7 +58,7 @@ readline(void) if (c == '\010' || c == '\177') { if (cmd_len != 0) { if (ao_echo()) - backspace(); + ao_put_string(backspace); --cmd_len; } continue; @@ -71,7 +68,7 @@ readline(void) if (c == '\025') { while (cmd_len != 0) { if (ao_echo()) - backspace(); + ao_put_string(backspace); --cmd_len; } continue; @@ -87,7 +84,7 @@ readline(void) break; } - if (cmd_len >= CMD_LEN - 2) + if (cmd_len >= AO_CMD_LEN - 2) continue; cmd_line[cmd_len++] = c; if (ao_echo()) @@ -98,12 +95,13 @@ readline(void) cmd_i = 0; } -void +char ao_cmd_lex(void) { ao_cmd_lex_c = '\n'; if (cmd_i < cmd_len) ao_cmd_lex_c = cmd_line[cmd_i++]; + return ao_cmd_lex_c; } static void @@ -134,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 @@ -162,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) { - __pdata 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 -ao_cmd_decimal(void) __reentrant +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; @@ -226,11 +222,13 @@ ao_cmd_decimal(void) __reentrant } 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 -ao_match_word(__code char *word) +ao_match_word(const char *word) { while (*word) { if (ao_cmd_lex_c != *word) { @@ -246,9 +244,9 @@ ao_match_word(__code 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 @@ -272,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 +#if HAS_LOG && (HAS_FLIGHT || HAS_TRACKER) "current-flight %u\n" #endif #if HAS_LOG @@ -289,24 +289,27 @@ version(void) #endif #if defined(AO_BOOT_APPLICATION_BASE) && defined(AO_BOOT_APPLICATION_BOUND) "program-space %u\n" +#endif +#if AO_VALUE_32 + "altitude-32 1\n" #endif , ao_manufacturer , ao_product , ao_serial_number -#if HAS_FLIGHT +#if HAS_LOG && (HAS_FLIGHT || HAS_TRACKER) , ao_flight_number #endif #if HAS_LOG - , ao_log_format + , AO_LOG_FORMAT #if !DISABLE_LOG_SPACE , (unsigned long) ao_storage_log_max #endif #endif #if defined(AO_BOOT_APPLICATION_BASE) && defined(AO_BOOT_APPLICATION_BOUND) - , (uint32_t) AO_BOOT_APPLICATION_BOUND - (uint32_t) AO_BOOT_APPLICATION_BASE + , (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 @@ -314,17 +317,17 @@ version(void) #define NUM_CMDS 11 #endif -static __code struct ao_cmds *__xdata (ao_cmds[NUM_CMDS]); -static __pdata uint8_t ao_ncmds; +static const struct ao_cmds *(ao_cmds[NUM_CMDS]); +static uint8_t ao_ncmds; static void help(void) { - __pdata uint8_t cmds; - __pdata uint8_t cmd; - __code struct ao_cmds * __pdata cs; - __code const char *h; - uint8_t e; + uint8_t cmds; + uint8_t cmd; + const struct ao_cmds * cs; + const char *h; + size_t e; for (cmds = 0; cmds < ao_ncmds; cmds++) { cs = ao_cmds[cmds]; @@ -348,7 +351,7 @@ report(void) switch(ao_cmd_status) { case ao_cmd_lex_error: case ao_cmd_syntax_error: - puts("Syntax error"); + ao_put_string("Syntax error\n"); ao_cmd_status = 0; default: break; @@ -356,7 +359,7 @@ report(void) } void -ao_cmd_register(__code struct ao_cmds *cmds) +ao_cmd_register(const struct ao_cmds *cmds) { if (ao_ncmds >= NUM_CMDS) ao_panic(AO_PANIC_CMD); @@ -366,13 +369,13 @@ ao_cmd_register(__code struct ao_cmds *cmds) void ao_cmd(void) { - __pdata char c; + char c; uint8_t cmd, cmds; - __code struct ao_cmds * __xdata cs; - void (*__xdata func)(void); + const struct ao_cmds * cs; + void (*func)(void); for (;;) { - readline(); + ao_cmd_readline("> "); ao_cmd_lex(); ao_cmd_white(); c = ao_cmd_lex_c; @@ -390,11 +393,17 @@ ao_cmd(void) if (func) break; } +#if HAS_MONITOR + ao_mutex_get(&ao_monitoring_mutex); +#endif if (func) (*func)(); else ao_cmd_status = ao_cmd_syntax_error; report(); +#if HAS_MONITOR + ao_mutex_put(&ao_monitoring_mutex); +#endif } } @@ -410,11 +419,13 @@ ao_loader(void) } #endif -__xdata struct ao_task ao_cmd_task; +#if HAS_TASK +struct ao_task ao_cmd_task; +#endif -__code struct ao_cmds ao_base_cmds[] = { +const struct ao_cmds ao_base_cmds[] = { { help, "?\0Help" }, -#if HAS_TASK_INFO +#if HAS_TASK_INFO && HAS_TASK { ao_task_info, "T\0Tasks" }, #endif { echo, "E <0 off, 1 on>\0Echo" }, @@ -432,5 +443,7 @@ void ao_cmd_init(void) { ao_cmd_register(&ao_base_cmds[0]); +#if HAS_TASK ao_add_task(&ao_cmd_task, ao_cmd, "cmd"); +#endif }