*
* 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)
static void
put_string(char *s)
{
- uint8_t c;
+ __xdata uint8_t c;
while (c = *s++)
putchar(c);
}
static void
readline(void)
{
- static uint8_t c;
+ __xdata uint8_t c;
if (lex_echo)
put_string("> ");
cmd_len = 0;
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) {
static void
hex(void)
{
- uint8_t r = LEX_ERROR;
+ __xdata uint8_t r = LEX_ERROR;
lex_i = 0;
white();
static void
decimal(void)
{
- uint8_t r = LEX_ERROR;
+ __xdata uint8_t r = LEX_ERROR;
lex_i = 0;
white();
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;
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;
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;
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
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;
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(' ');
}
static uint8_t
getnibble(void)
{
- uint8_t c;
+ __xdata uint8_t c;
c = getchar();
if ('0' <= c && c <= '9')
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;
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;
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);
}
}
+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"
"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
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();
case 'a':
adc_dump();
break;
+ case 'g':
+ gps_dump();
+ break;
case 'e':
ee_dump();
break;
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;
case 'O':
debug_output();
break;
-#endif
case '\r':
case '\n':
break;
}
-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");
}