altos: Solidify BT connections
authorKeith Packard <keithp@keithp.com>
Tue, 19 Apr 2011 20:20:19 +0000 (13:20 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 19 Apr 2011 20:20:19 +0000 (13:20 -0700)
Use delays while sending commands to BT module.
Don't use BT for stdio until the module is initialized.
Add \r to name setting command
Don't require 'connected' signal for command input.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/ao.h
src/ao_btm.c
src/ao_stdio.c

index dad1f3dfba3b3a1ec748dd8ff51d574c104fbc8b..226f9a2248dd0425ebed6bf27593d245ce796384 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -1194,7 +1194,7 @@ extern __xdata uint8_t ao_stdin_ready;
 uint8_t
 ao_echo(void);
 
-void
+int8_t
 ao_add_stdio(char (*pollchar)(void),
             void (*putchar)(char) __reentrant,
             void (*flush)(void)) __reentrant;
index 4f56c382daa8cce6df8461f3ac8ab568b8b7a06c..784a566f81b14fce9e8cdd42713fe1ab56b253f6 100644 (file)
@@ -26,8 +26,6 @@ __xdata char          ao_btm_buffer[1024];
 int                    ao_btm_ptr;
 char                   ao_btm_dir;
 
-uint8_t                        ao_btm_send_chars = 0;
-
 void
 ao_btm_putchar(char c);
 
@@ -109,6 +107,9 @@ ao_btm_drain()
                ;
 }
 
+/*
+ * Set the stdio echo for the bluetooth link
+ */
 void
 ao_btm_echo(uint8_t echo)
 {
@@ -138,7 +139,7 @@ ao_cmd_filter(void)
                ao_cmd_lex();
        }
        ao_cmd_status = 0;
-       return !ao_btm_connected;
+       return 0;
 }
 
 /*
@@ -161,16 +162,10 @@ ao_btm_pollchar(void)
 void
 ao_btm_putchar(char c)
 {
-       if (!ao_btm_send_chars) {
-               ao_btm_log_out_char(c);
-               ao_serial_putchar(c);
-       }
-}
-
-void
-ao_btm_stdio_putchar(char c) {
-       if (ao_btm_connected)
-               ao_btm_putchar(c);
+       ao_btm_log_out_char(c);
+       ao_serial_putchar(c);
+       if (!ao_btm_running)
+               ao_delay(1);
 }
 
 /*
@@ -211,12 +206,13 @@ ao_btm_cmd(__code char *cmd)
 uint8_t
 ao_btm_set_name(void)
 {
-       char    sn[7];
-       char    *s = sn + 7;
+       char    sn[8];
+       char    *s = sn + 8;
        char    c;
        int     n;
        ao_btm_string("ATN=TeleBT-");
        *--s = '\0';
+       *--s = '\r';
        n = ao_serial_number;
        do {
                *--s = '0' + n % 10;
@@ -236,6 +232,7 @@ ao_btm_try_speed(uint8_t speed)
                return 1;
        return 0;
 }
+
 /*
  * A thread to initialize the bluetooth device and
  * hang around to blink the LED when connected
@@ -243,12 +240,9 @@ ao_btm_try_speed(uint8_t speed)
 void
 ao_btm(void)
 {
-       ao_add_stdio(ao_btm_pollchar,
-                    ao_btm_stdio_putchar,
-                    NULL);
-       ao_btm_stdio = ao_num_stdios - 1;
-       ao_btm_echo(0);
-
+       /*
+        * Wait for the bluetooth device to boot
+        */
        ao_delay(AO_SEC_TO_TICKS(3));
 
        /*
@@ -276,6 +270,11 @@ ao_btm(void)
        /* Turn off status reporting */
        ao_btm_cmd("ATQ1\r");
 
+       ao_btm_stdio = ao_add_stdio(ao_btm_pollchar,
+                                   ao_btm_putchar,
+                                   NULL);
+       ao_btm_echo(0);
+
        ao_btm_running = 1;
        for (;;) {
                while (!ao_btm_connected && !ao_btm_chat)
index ec3b6607b2e8cfb5ea1cf567a9ea98d22b2eda46..6b8908329aa1e8838eecdc62333720f8ffa2608a 100644 (file)
@@ -69,7 +69,7 @@ ao_echo(void)
        return ao_stdios[ao_cur_stdio].echo;
 }
 
-void
+int8_t
 ao_add_stdio(char (*pollchar)(void),
             void (*putchar)(char),
             void (*flush)(void)) __reentrant
@@ -80,5 +80,5 @@ ao_add_stdio(char (*pollchar)(void),
        ao_stdios[ao_num_stdios].putchar = putchar;
        ao_stdios[ao_num_stdios].flush = flush;
        ao_stdios[ao_num_stdios].echo = 1;
-       ao_num_stdios++;
+       return ao_num_stdios++;
 }