altos: Create telebt-v1.0 product. Remove old telebt products
[fw/altos] / src / drivers / ao_btm.c
index f381604796dd3d390aae7469fce3df611782e49a..3b6028a030f49abc5ef9cae9133b6bdc72659ae2 100644 (file)
 
 #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_pollchar        _ao_serial1_pollchar
 #define ao_serial_btm_set_speed ao_serial1_set_speed
 #define ao_serial_btm_drain    ao_serial1_drain
+#define ao_serial_btm_rx_fifo  ao_serial1_rx_fifo
 #endif
 
 int8_t                 ao_btm_stdio;
@@ -111,6 +112,30 @@ __code struct ao_cmds ao_btm_cmds[] = {
 #define AO_BTM_MAX_REPLY       16
 __xdata char           ao_btm_reply[AO_BTM_MAX_REPLY];
 
+/*
+ * Read one bluetooth character.
+ * Returns AO_READ_AGAIN if no character arrives within 10ms
+ */
+
+static int
+ao_btm_getchar(void)
+{
+       int     c;
+
+       ao_arch_block_interrupts();
+       while ((c = _ao_serial_btm_pollchar()) == AO_READ_AGAIN) {
+               ao_alarm(AO_MS_TO_TICKS(10));
+               c = ao_sleep(&ao_serial_btm_rx_fifo);
+               ao_clear_alarm();
+               if (c) {
+                       c = AO_READ_AGAIN;
+                       break;
+               }
+       }
+       ao_arch_release_interrupts();
+       return c;
+}
+
 /*
  * Read a line of data from the serial port, truncating
  * it after a few characters.
@@ -120,26 +145,15 @@ uint8_t
 ao_btm_get_line(void)
 {
        uint8_t ao_btm_reply_len = 0;
-       char c;
-
-       for (;;) {
-
-               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')
-                               goto done;
-               }
-               for (c = 0; c < 10; c++) {
-                       ao_delay(AO_MS_TO_TICKS(10));
-                       if (!ao_fifo_empty(ao_serial1_rx_fifo))
-                               break;
-               }
-               if (c == 10)
-                       goto done;
+       int c;
+
+       while ((c = ao_btm_getchar()) != 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')
+                       break;
        }
-done:
        for (c = ao_btm_reply_len; c < sizeof (ao_btm_reply);)
                ao_btm_reply[c++] = '\0';
        return ao_btm_reply_len;
@@ -279,7 +293,7 @@ ao_btm(void)
        /* Turn off status reporting */
        ao_btm_cmd("ATQ1\r");
 
-       ao_btm_stdio = ao_add_stdio(ao_serial_btm_pollchar,
+       ao_btm_stdio = ao_add_stdio(_ao_serial_btm_pollchar,
                                    ao_serial_btm_putchar,
                                    NULL);
        ao_btm_echo(0);
@@ -288,7 +302,7 @@ ao_btm(void)
                while (!ao_btm_connected)
                        ao_sleep(&ao_btm_connected);
                while (ao_btm_connected) {
-                       ao_led_for(AO_LED_GREEN, AO_MS_TO_TICKS(20));
+                       ao_led_for(AO_BT_LED, AO_MS_TO_TICKS(20));
                        ao_delay(AO_SEC_TO_TICKS(3));
                }
        }