--- gforth/engine/io-nxt.c 2007/04/24 20:18:57 1.7 +++ gforth/engine/io-nxt.c 2007/12/31 18:40:25 1.11 @@ -6,7 +6,7 @@ Gforth is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 + as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + along with this program; if not, see http://www.gnu.org/licenses/. The following is stolen from the readline library for bash */ @@ -37,13 +36,14 @@ int terminal_prepped = 0; int needs_update = 0; int bt_mode = 0; +int bt_state = 0; void show_splash(U32 milliseconds) { display_clear(0); - display_goto_xy(6, 6); - display_string("Gforth"); + display_goto_xy(4, 6); + display_string("Gforth NXT"); display_update(); systick_wait_ms(milliseconds); @@ -66,48 +66,71 @@ void bt_send_cmd(char * cmd) cmd[i++] = (char)(sum>>8); cmd[i++] = (char)(sum & 0xff); + // systick_wait_ms(500); + bt_send(cmd, len+1); } -void do_bluetooth () +int do_bluetooth () { if(!bt_mode) { char cmd[30]; - + bt_receive(cmd); if(cmd[0] | cmd[1]) { display_char('0'+cmd[0]); display_char('0'+cmd[1]); - display_update(); } switch(cmd[1]) { - case 0x10: case 0x16: // request connection + display_char('-'); cmd[1] = 0x9; // accept connection cmd[2] = 1; // yes, we do bt_send_cmd(cmd); break; + case 0x0f: // inquiry result + display_char('+'); + cmd[1] = 0x05; + bt_send_cmd(cmd); // add devices as known device + break; case 0x13: // connect result if(cmd[2]) { + int n=0; int handle=cmd[3]; - cmd[1] = 0xB; // open stream - cmd[2] = handle; - bt_send_cmd(cmd); - while (*AT91C_US1_TNCR != 0); - // while(!(*AT91C_PIOA_PDSR & BT_BC4_CMD_PIN)); - bt_set_arm7_cmd(); - display_char(')'); display_update(); - bt_mode = 1; - // bt_send("Hello Bluetooth\n", 16); + display_char('/'); display_update(); + systick_wait_ms(300); + bt_receive(cmd); + if(cmd[0]==0) { + cmd[1] = 0xB; // open stream + cmd[2] = handle; + bt_send_cmd(cmd); + systick_wait_ms(100); + bt_set_arm7_cmd(); + bt_mode = 1; + display_char(')'); display_update(); + } + // bt_state = 1; } else { - display_char('('); display_update(); + display_char('('); } break; - default: - break; + case 0x20: // discoverableack + if(cmd[2]) { + display_char('?'); + break; + } + case 0x10: + case 0x14: + display_char('!'); + cmd[1] = 0x1C; cmd[2] = 1; bt_send_cmd(cmd); + break; + default: + break; } + display_update(); } + return 0; } void prep_terminal () @@ -123,14 +146,15 @@ void prep_terminal () nxt_motor_init(); i2c_init(); bt_init(); + bt_start_ad_converter(); do { bt_receive(cmd); } while((cmd[0] != 3) && (cmd[1] != 0x14)); - // cmd[1] = 0x21; strcpy(cmd+2, "NXT"); bt_send_cmd(cmd); do_bluetooth(); - cmd[1] = 0x1C; cmd[2] = 1; bt_send_cmd(cmd); do_bluetooth(); // make visible - cmd[1] = 0x36; cmd[2] = 1; bt_send_cmd(cmd); do_bluetooth(); // don't break stream mode + // cmd[1] = 0x36; // break stream mode + // cmd[2] = 0; + // bt_send_cmd(cmd); + // cmd[1] = 0x1C; cmd[2] = 1; bt_send_cmd(cmd); // make visible cmd[1] = 0x03; bt_send_cmd(cmd); // open port query - display_clear(1); show_splash(1000); display_goto_xy(0,0); @@ -147,11 +171,11 @@ long key_avail () { if(!terminal_prepped) prep_terminal(); + do_bluetooth(); if(bt_mode) { return bt_avail(); } else { - if(bt_avail()) - do_bluetooth(); + systick_wait_ms(100); return 0; } }