Parse GPS data locally. Add 'g' command to display recent GPS results.
[fw/altos] / ao_cmd.c
index fd87f87edc36b6615d5c1e15f577cc7f81e44769..6e91a72d5b452c31e75a01140afd9a4af20fd4a4 100644 (file)
--- 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
 #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,47 +474,56 @@ 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)
 {
-#if 0
-       uint8_t more;
+       __xdata uint8_t more;
 
-       for (more = log_first(); more; more = log_next()) {
-               putchar(log_dump.type);
+       for (more = ao_log_dump_first(); more; more = ao_log_dump_next()) {
+               putchar(ao_log_dump.type);
                putchar(' ');
-               put16(log_dump.tick);
+               put16(ao_log_dump.tick);
                putchar(' ');
-               put16(log_dump.u.anon.d0);
+               put16(ao_log_dump.u.anon.d0);
                putchar(' ');
-               put16(log_dump.u.anon.d1);
+               put16(ao_log_dump.u.anon.d1);
                putchar('\n');
        }
-#endif
+}
+
+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 <start> <end>                    Dump memory\n"
        "e <block>                          Dump a block of EEPROM data\n"
        "w <block> <start> <len> <data> ... 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<data>                            Send data to serial line\n"
+       "T                                  Show task states\n"
         "\n"
         "Target debug commands:\n"
        "D                                  Enable debug mode\n"
@@ -497,7 +532,6 @@ static const uint8_t help_txt[] =
        "G <count>                          Get data from debug port\n"
        "O <count> <addr>                   Output <count> bytes to target at <addr>\n"
        "I <count> <addr>                   Input <count> bytes to target at <addr>\n"
-#endif
 ;
 
 static void
@@ -521,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();
@@ -543,6 +575,9 @@ ao_cmd(void *parameters)
                case 'a':
                        adc_dump();
                        break;
+               case 'g':
+                       gps_dump();
+                       break;
                case 'e':
                        ee_dump();
                        break;
@@ -552,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;
@@ -574,7 +614,6 @@ ao_cmd(void *parameters)
                case 'O':
                        debug_output();
                        break;
-#endif
                case '\r':
                case '\n':
                        break;
@@ -587,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");
 }