+#ifdef AO_BTM_INT_PORT
+#include <ao_exti.h>
+#endif
+
+#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_sleep_for(timeout) ao_sleep_for((void *) &ao_serial1_rx_fifo, timeout)
+#define ao_serial_btm_set_speed ao_serial1_set_speed
+#define ao_serial_btm_drain ao_serial1_drain
+#endif
+
+uint8_t ao_btm_stdio;
+uint8_t ao_btm_connected;
+
+#define BT_DEBUG 0
+
+#if BT_DEBUG
+char ao_btm_buffer[256];
+uint16_t 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;
+ uint16_t r;
+
+ 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');
+ r = ao_cmd_decimal();
+ if (ao_cmd_status == ao_cmd_success && r)
+ ao_btm_ptr = 0;
+ ao_cmd_status = ao_cmd_success;
+}
+
+static void
+ao_btm_speed(void)
+{
+ switch (ao_cmd_decimal()) {
+ case 57600:
+ ao_serial_btm_set_speed(AO_SERIAL_SPEED_57600);
+ break;
+ case 19200:
+ ao_serial_btm_set_speed(AO_SERIAL_SPEED_19200);
+ break;
+ default:
+ ao_cmd_status = ao_cmd_syntax_error;
+ break;
+ }
+}
+
+static uint8_t ao_btm_enable;
+
+static void
+ao_btm_do_echo(void)
+{
+ int c;
+ while (ao_btm_enable) {
+ ao_arch_block_interrupts();
+ while ((c = _ao_serial_btm_pollchar()) == AO_READ_AGAIN && ao_btm_enable)
+ _ao_serial_btm_sleep_for(0);
+ ao_arch_release_interrupts();
+ if (c != AO_READ_AGAIN) {
+ putchar(c);
+ flush();
+ }
+ }
+ ao_exit();
+}