X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao_cmd.c;h=6e91a72d5b452c31e75a01140afd9a4af20fd4a4;hp=303f9bc5eaf7021c7552f5170d03a665031ff0bd;hb=c4e983daa4579896b227fdcb2be43fad75e94307;hpb=acc4fc635edb70ec1ba2dff9f7ac0c8542c72c47 diff --git a/ao_cmd.c b/ao_cmd.c index 303f9bc5..6e91a72d 100644 --- a/ao_cmd.c +++ b/ao_cmd.c @@ -3,8 +3,7 @@ * * 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; either version 2 of the License, or - * (at your option) any later version. + * the Free Software Foundation; version 2 of the License. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -22,16 +21,16 @@ #define SYNTAX_ERROR 2 #define SUCCESS 0 -static __data uint16_t lex_i; -static __data uint8_t lex_c; -static __data uint8_t lex_status; -static __data uint8_t lex_echo; +static __xdata uint16_t lex_i; +static __xdata uint8_t lex_c; +static __xdata uint8_t lex_status; +static __xdata uint8_t lex_echo; #define CMD_LEN 32 static __xdata uint8_t cmd_line[CMD_LEN]; -static __data uint8_t cmd_len; -static __data uint8_t cmd_i; +static __xdata uint8_t cmd_len; +static __xdata uint8_t cmd_i; void putchar(char c) @@ -56,7 +55,7 @@ getchar(void) static void put_string(char *s) { - uint8_t c; + __xdata uint8_t c; while (c = *s++) putchar(c); } @@ -64,7 +63,7 @@ put_string(char *s) static void readline(void) { - static uint8_t c; + __xdata uint8_t c; if (lex_echo) put_string("> "); cmd_len = 0; @@ -153,8 +152,8 @@ void puti(int i) { static uint8_t __xdata num_buffer[NUM_LEN]; - uint8_t __xdata *num_ptr = num_buffer + NUM_LEN; - uint8_t neg = 0; + uint8_t __xdata * __xdata num_ptr = num_buffer + NUM_LEN; + uint8_t __xdata neg = 0; *--num_ptr = '\0'; if (i < 0) { @@ -183,7 +182,7 @@ white(void) static void hex(void) { - uint8_t r = LEX_ERROR; + __xdata uint8_t r = LEX_ERROR; lex_i = 0; white(); @@ -207,7 +206,7 @@ hex(void) static void decimal(void) { - uint8_t r = LEX_ERROR; + __xdata uint8_t r = LEX_ERROR; lex_i = 0; white(); @@ -253,11 +252,39 @@ adc_dump(void) put_string("\n"); } +static void +gps_dump(void) __reentrant +{ + ao_mutex_get(&ao_gps_mutex); + if (ao_gps_data.flags & AO_GPS_VALID) { + printf("GPS %2d:%02d:%02d %2d°%2d.%04d'%c %2d°%2d.%04d'%c %5dm %2d sat\n", + ao_gps_data.hour, + ao_gps_data.minute, + ao_gps_data.second, + ao_gps_data.latitude.degrees, + ao_gps_data.latitude.minutes, + ao_gps_data.latitude.minutes_fraction, + (ao_gps_data.flags & AO_GPS_LATITUDE_MASK) == AO_GPS_LATITUDE_NORTH ? + 'N' : 'S', + ao_gps_data.longitude.degrees, + ao_gps_data.longitude.minutes, + ao_gps_data.longitude.minutes_fraction, + (ao_gps_data.flags & AO_GPS_LONGITUDE_MASK) == AO_GPS_LONGITUDE_WEST ? + 'W' : 'E', + ao_gps_data.altitude, + (ao_gps_data.flags & AO_GPS_NUM_SAT_MASK) >> AO_GPS_NUM_SAT_SHIFT); + } else { + printf("GPS %2d sat\n", + (ao_gps_data.flags & AO_GPS_NUM_SAT_MASK) >> AO_GPS_NUM_SAT_SHIFT);; + } + ao_mutex_put(&ao_gps_mutex); +} + static void dump(void) { - uint16_t c; - uint8_t __xdata *start, *end; + __xdata uint16_t c; + __xdata uint8_t * __xdata start, * __xdata end; hex(); start = (uint8_t __xdata *) lex_i; @@ -283,9 +310,9 @@ dump(void) static void ee_dump(void) { - uint8_t b; - uint16_t block; - uint8_t i; + __xdata uint8_t b; + __xdata uint16_t block; + __xdata uint8_t i; hex(); block = lex_i; @@ -309,11 +336,11 @@ ee_dump(void) static void ee_store(void) { - uint16_t block; - uint8_t i; - uint16_t len; - uint8_t b; - uint32_t addr; + __xdata uint16_t block; + __xdata uint8_t i; + __xdata uint16_t len; + __xdata uint8_t b; + __xdata uint32_t addr; hex(); block = lex_i; @@ -342,17 +369,16 @@ echo(void) lex_echo = lex_i != 0; } -#if INCLUDE_REMOTE_DEBUG static void debug_enable(void) { - dbg_debug_mode(); + ao_dbg_debug_mode(); } static void debug_reset(void) { - dbg_reset(); + ao_dbg_reset(); } static void @@ -365,16 +391,16 @@ debug_put(void) hex(); if (lex_status != SUCCESS) break; - dbg_send_byte(lex_i); + ao_dbg_send_byte(lex_i); } } static void debug_get(void) { - uint16_t count; - uint16_t i; - uint8_t byte; + __xdata uint16_t count; + __xdata uint16_t i; + __xdata uint8_t byte; hex(); if (lex_status != SUCCESS) return; @@ -386,7 +412,7 @@ debug_get(void) for (i = 0; i < count; i++) { if (i && (i & 7) == 0) put_string("\n"); - byte = dbg_recv_byte(); + byte = ao_dbg_recv_byte(); put8(byte); putchar(' '); } @@ -396,7 +422,7 @@ debug_get(void) static uint8_t getnibble(void) { - uint8_t c; + __xdata uint8_t c; c = getchar(); if ('0' <= c && c <= '9') @@ -412,10 +438,10 @@ getnibble(void) static void debug_input(void) { - uint16_t count; - uint16_t addr; - uint8_t b; - uint8_t i; + __xdata uint16_t count; + __xdata uint16_t addr; + __xdata uint8_t b; + __xdata uint8_t i; hex(); count = lex_i; @@ -423,24 +449,24 @@ debug_input(void) addr = lex_i; if (lex_status != SUCCESS) return; - dbg_start_transfer(addr); + ao_dbg_start_transfer(addr); i = 0; while (count--) { if (!(i++ & 7)) put_string("\n"); - b = dbg_read_byte(); + b = ao_dbg_read_byte(); put8(b); } - dbg_end_transfer(); + ao_dbg_end_transfer(); put_string("\n"); } static void debug_output(void) { - uint16_t count; - uint16_t addr; - uint8_t b; + __xdata uint16_t count; + __xdata uint16_t addr; + __xdata uint8_t b; hex(); count = lex_i; @@ -448,22 +474,21 @@ debug_output(void) addr = lex_i; if (lex_status != SUCCESS) return; - dbg_start_transfer(addr); + ao_dbg_start_transfer(addr); while (count--) { b = getnibble() << 4; b |= getnibble(); if (lex_status != SUCCESS) return; - dbg_write_byte(b); + ao_dbg_write_byte(b); } - dbg_end_transfer(); + ao_dbg_end_transfer(); } -#endif static void dump_log(void) { - uint8_t more; + __xdata uint8_t more; for (more = ao_log_dump_first(); more; more = ao_log_dump_next()) { putchar(ao_log_dump.type); @@ -477,16 +502,28 @@ dump_log(void) } } +static void +send_serial(void) +{ + white(); + while (lex_c != '\n') { + ao_serial_putchar(lex_c); + lex(); + } +} + static const uint8_t help_txt[] = "All numbers are in hex\n" "? Print this message\n" "a Display current ADC values\n" + "g Display current GPS values\n" "d Dump memory\n" "e Dump a block of EEPROM data\n" "w ... Write data to EEPROM\n" "l Dump last flight log\n" "E <0 off, 1 on> Set command echo mode\n" -#if INCLUDE_REMOTE_DEBUG + "S Send data to serial line\n" + "T Show task states\n" "\n" "Target debug commands:\n" "D Enable debug mode\n" @@ -495,7 +532,6 @@ static const uint8_t help_txt[] = "G Get data from debug port\n" "O Output bytes to target at \n" "I Input bytes to target at \n" -#endif ; static void @@ -519,11 +555,9 @@ report(void) void ao_cmd(void *parameters) { - uint8_t c; + __xdata uint8_t c; (void) parameters; - ao_led_on(AO_LED_GREEN); - ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(30)); lex_echo = 1; for (;;) { readline(); @@ -541,6 +575,9 @@ ao_cmd(void *parameters) case 'a': adc_dump(); break; + case 'g': + gps_dump(); + break; case 'e': ee_dump(); break; @@ -550,10 +587,15 @@ ao_cmd(void *parameters) case 'l': dump_log(); break; + case 'T': + ao_task_info(); + break; + case 'S': + send_serial(); + break; case 'E': echo(); break; -#if INCLUDE_REMOTE_DEBUG case 'D': debug_enable(); break; @@ -572,7 +614,6 @@ ao_cmd(void *parameters) case 'O': debug_output(); break; -#endif case '\r': case '\n': break; @@ -585,10 +626,10 @@ ao_cmd(void *parameters) } -struct ao_task __xdata cmd_task; +__xdata struct ao_task ao_cmd_task; void ao_cmd_init(void) { - ao_add_task(&cmd_task, ao_cmd); + ao_add_task(&ao_cmd_task, ao_cmd, "cmd"); }