altos: Wait for BT disconnect before sending command
authorKeith Packard <keithp@keithp.com>
Tue, 3 Mar 2015 05:11:33 +0000 (21:11 -0800)
committerKeith Packard <keithp@keithp.com>
Tue, 3 Mar 2015 05:11:33 +0000 (21:11 -0800)
If AltosDroid manages to connect to the BT module before we've
configured it, we won't be able to talk to it as we can't force the
module to ignore connection attempts. Wait for AltosDroid to give up
and let us configure the device. Eventually, we'll manage, if
AltosDroid's delay interval is longer than the time it takes to
configure the unit.

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

index 93d9dd9d341313d54fa927ca496ff8544374b894..8e7052cb413000059c259587282121b0c60d4474 100644 (file)
@@ -263,6 +263,15 @@ uint8_t
 ao_btm_cmd(__code char *cmd)
 {
        ao_btm_drain();
+
+#ifdef AO_BTM_INT_PORT
+       /* Trust that AltosDroid will eventually disconnect and let us
+        * get things set up. The BTM module doesn't appear to listen
+        * for +++, so we have no way to force a disconnect.
+        */
+       while (ao_btm_connected)
+               ao_sleep(&ao_btm_connected);
+#endif
        ao_btm_string(cmd);
        return ao_btm_wait_reply();
 }
@@ -350,6 +359,10 @@ __xdata struct ao_task ao_btm_task;
 void
 ao_btm(void)
 {
+#ifdef AO_BTM_INT_PORT
+       ao_exti_enable(AO_BTM_INT_PORT, AO_BTM_INT_PIN);
+#endif
+
        /*
         * Wait for the bluetooth device to boot
         */
@@ -380,6 +393,8 @@ ao_btm(void)
        /* Turn off status reporting */
        ao_btm_cmd("ATQ1\r");
 
+       ao_btm_drain();
+
        ao_btm_stdio = ao_add_stdio(_ao_serial_btm_pollchar,
                                    ao_serial_btm_putchar,
                                    NULL);
@@ -388,10 +403,6 @@ ao_btm(void)
        /* Check current pin state */
        ao_btm_check_link();
 
-#ifdef AO_BTM_INT_PORT
-       ao_exti_enable(AO_BTM_INT_PORT, AO_BTM_INT_PIN);
-#endif
-
        for (;;) {
                while (!ao_btm_connected)
                        ao_sleep(&ao_btm_connected);