#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.
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')
}
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)
void
ao_btm_putchar(char c)
{
- ao_serial_putchar(c);
+ ao_btm_log_out_char(c);
+ ao_serial_btm_putchar(c);
ao_delay(1);
}
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;
*/
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
/* 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);
#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
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
/*
#endif
ao_add_task(&ao_btm_task, ao_btm, "bt");
+ ao_btm_log_init();
}