altos: fix functions calling pollchar to use 'int' to hold the value
[fw/altos] / src / drivers / ao_btm.c
index 44155ec142aa934863daa384500726f503a3af09..c862200a8fe01232f199777abe434d2ab4160b49 100644 (file)
 
 #include "ao.h"
 
+#ifndef ao_serial_btm_getchar
+#define ao_serial_btm_putchar  ao_serial1_putchar
+#define ao_serial_btm_pollchar ao_serial1_pollchar
+#define ao_serial_btm_set_speed ao_serial1_set_speed
+#define ao_serial_btm_drain    ao_serial1_drain
+#endif
+
 int8_t                 ao_btm_stdio;
 __xdata uint8_t                ao_btm_connected;
 
+#define BT_DEBUG 0
+
+#if BT_DEBUG
+__xdata char           ao_btm_buffer[256];
+int                    ao_btm_ptr;
+char                   ao_btm_dir;
+
+static void
+ao_btm_add_char(char c)
+{
+       if (ao_btm_ptr < sizeof (ao_btm_buffer))
+               ao_btm_buffer[ao_btm_ptr++] = c;
+}
+
+static void
+ao_btm_log_char(char c, char dir)
+{
+       if (dir != ao_btm_dir) {
+               ao_btm_add_char(dir);
+               ao_btm_dir = dir;
+       }
+       ao_btm_add_char(c);
+}
+
+static void
+ao_btm_log_out_char(char c)
+{
+       ao_btm_log_char(c, '>');
+}
+
+static void
+ao_btm_log_in_char(char c)
+{
+       ao_btm_log_char(c, '<');
+}
+
+/*
+ * Dump everything received from the bluetooth device during startup
+ */
+static void
+ao_btm_dump(void)
+{
+       int i;
+       char c;
+
+       for (i = 0; i < ao_btm_ptr; i++) {
+               c = ao_btm_buffer[i];
+               if (c < ' ' && c != '\n')
+                       printf("\\%03o", ((int) c) & 0xff);
+               else
+                       putchar(ao_btm_buffer[i]);
+       }
+       putchar('\n');
+}
+
+static void
+ao_btm_speed(void)
+{
+       ao_cmd_decimal();
+       if (ao_cmd_lex_u32 == 57600)
+               ao_serial_btm_set_speed(AO_SERIAL_SPEED_57600);
+       else if (ao_cmd_lex_u32 == 19200)
+               ao_serial_btm_set_speed(AO_SERIAL_SPEED_19200);
+       else
+               ao_cmd_status = ao_cmd_syntax_error;
+}
+
+__code struct ao_cmds ao_btm_cmds[] = {
+       { ao_btm_dump,          "d\0Dump btm buffer." },
+       { ao_btm_speed,         "s <19200,57600>\0Set btm serial speed." },
+       { 0, NULL },
+};
+
+#define ao_btm_log_init()      ao_cmd_register(&ao_btm_cmds[0])
+
+#else
+#define ao_btm_log_in_char(c)
+#define ao_btm_log_out_char(c)
+#define ao_btm_log_init()
+#endif
+
 #define AO_BTM_MAX_REPLY       16
 __xdata char           ao_btm_reply[AO_BTM_MAX_REPLY];
 
-extern volatile __xdata struct ao_fifo ao_usart1_rx_fifo;
-
 /*
  * Read a line of data from the serial port, truncating
  * it after a few characters.
@@ -34,11 +120,12 @@ uint8_t
 ao_btm_get_line(void)
 {
        uint8_t ao_btm_reply_len = 0;
-       char c;
+       int c;
 
        for (;;) {
 
-               while ((c = ao_serial_pollchar()) != AO_READ_AGAIN) {
+               while ((c = ao_serial_btm_pollchar()) != AO_READ_AGAIN) {
+                       ao_btm_log_in_char(c);
                        if (ao_btm_reply_len < sizeof (ao_btm_reply))
                                ao_btm_reply[ao_btm_reply_len++] = c;
                        if (c == '\r' || c == '\n')
@@ -46,7 +133,7 @@ ao_btm_get_line(void)
                }
                for (c = 0; c < 10; c++) {
                        ao_delay(AO_MS_TO_TICKS(10));
-                       if (!ao_fifo_empty(ao_usart1_rx_fifo))
+                       if (!ao_fifo_empty(ao_serial1_rx_fifo))
                                break;
                }
                if (c == 10)
@@ -85,7 +172,8 @@ ao_btm_echo(uint8_t echo)
 void
 ao_btm_putchar(char c)
 {
-       ao_serial_putchar(c);
+       ao_btm_log_out_char(c);
+       ao_serial_btm_putchar(c);
        ao_delay(1);
 }
 
@@ -146,8 +234,8 @@ ao_btm_set_name(void)
 uint8_t
 ao_btm_try_speed(uint8_t speed)
 {
-       ao_serial_set_speed(speed);
-       ao_btm_drain();
+       ao_serial_btm_set_speed(speed);
+       ao_serial_btm_drain();
        (void) ao_btm_cmd("\rATE0\rATQ0\r");
        if (ao_btm_cmd("AT\r") == 1)
                return 1;
@@ -166,10 +254,6 @@ ao_btm(void)
         */
        ao_delay(AO_SEC_TO_TICKS(3));
 
-#if HAS_BEEP
-       ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200));
-#endif
-
        /*
         * The first time we connect, the BTM-180 comes up at 19200 baud.
         * After that, it will remember and come up at 57600 baud. So, see
@@ -195,8 +279,8 @@ ao_btm(void)
        /* Turn off status reporting */
        ao_btm_cmd("ATQ1\r");
 
-       ao_btm_stdio = ao_add_stdio(ao_serial_pollchar,
-                                   ao_serial_putchar,
+       ao_btm_stdio = ao_add_stdio(ao_serial_btm_pollchar,
+                                   ao_serial_btm_putchar,
                                    NULL);
        ao_btm_echo(0);
 
@@ -228,18 +312,20 @@ __xdata struct ao_task ao_btm_task;
 #endif
 
 void
-ao_btm_check_link() __critical
+ao_btm_check_link()
 {
-       /* Check the pin and configure the interrupt detector to wait for the
-        * pin to flip the other way
-        */
-       if (BT_LINK_PIN) {
-               ao_btm_connected = 0;
-               PICTL |= BT_PICTL_ICON;
-       } else {
-               ao_btm_connected = 1;
-               PICTL &= ~BT_PICTL_ICON;
-       }
+       ao_arch_critical(
+               /* Check the pin and configure the interrupt detector to wait for the
+                * pin to flip the other way
+                */
+               if (BT_LINK_PIN) {
+                       ao_btm_connected = 0;
+                       PICTL |= BT_PICTL_ICON;
+               } else {
+                       ao_btm_connected = 1;
+                       PICTL &= ~BT_PICTL_ICON;
+               }
+               );
 }
 
 void
@@ -262,7 +348,8 @@ void
 ao_btm_init (void)
 {
        ao_serial_init();
-       ao_serial_set_speed(AO_SERIAL_SPEED_19200);
+
+       ao_serial_btm_set_speed(AO_SERIAL_SPEED_19200);
 
 #if BT_LINK_ON_P1
        /*
@@ -299,4 +386,5 @@ ao_btm_init (void)
 #endif
 
        ao_add_task(&ao_btm_task, ao_btm, "bt");
+       ao_btm_log_init();
 }