--- gforth/engine/io-nxt.c 2007/04/22 22:48:43 1.4 +++ gforth/engine/io-nxt.c 2007/06/16 20:47:00 1.9 @@ -37,13 +37,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); @@ -62,10 +63,96 @@ void bt_send_cmd(char * cmd) cmd[0] = len; for(i=1; i>8); cmd[i++] = (char)(sum & 0xff); - bt_send(cmd, len); + // systick_wait_ms(500); + + bt_send(cmd, len+1); +} + +int do_bluetooth () +{ + if(bt_state) { + if(bt_get_mode()) { + if(!bt_mode) { + bt_set_arm7_cmd(); + display_char(')'); display_update(); + bt_mode = 1; + } + return 1; + } else { + if(bt_mode) { + bt_clear_arm7_cmd(); + display_char('['); display_update(); + bt_mode = 0; + bt_state = 0; + } else { + display_char('.'); + display_update(); + } + } + } else { + if(!bt_mode) { + char cmd[30]; + + bt_receive(cmd); + if(cmd[0] | cmd[1]) { + display_char('0'+cmd[0]); + display_char('0'+cmd[1]); + } + + 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 + cmd[1] = 0x05; + bt_send_cmd(cmd); // add devices as known device + break; + case 0x13: // connect result + if(cmd[2]) { + display_char('/'); + int handle=cmd[3]; + cmd[1] = 0xB; // open stream + cmd[2] = handle; + bt_send_cmd(cmd); + bt_state = 1; + } else { + display_char('('); + } + break; + case 0x20: // discoverableack + if(cmd[2]) { + display_char('?'); + cmd[1] = 0x03; bt_send_cmd(cmd); // open port query + break; + } + case 0x14: + display_char('!'); + cmd[1] = 0x1C; cmd[2] = 1; bt_send_cmd(cmd); + break; + default: + break; + } + { + extern int display_x, display_y; + static int n=0; + int x = display_x; + int y = display_y; + display_goto_xy(0,6); + display_char("/|\\-"[(n++)&3]); + display_goto_xy(x,y); + } + display_update(); + } + } + return 0; } void prep_terminal () @@ -81,11 +168,16 @@ void prep_terminal () nxt_motor_init(); i2c_init(); bt_init(); - cmd[1] = 3; - bt_send_cmd(cmd); // open port query - - display_goto_xy(0,0); + do { + bt_receive(cmd); + } while((cmd[0] != 3) && (cmd[1] != 0x14)); + 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 display_clear(1); + show_splash(1000); + display_goto_xy(0,0); terminal_prepped = 1; } @@ -95,43 +187,15 @@ void deprep_terminal () terminal_prepped = 0; } -void do_bluetooth () -{ - if(!bt_mode) { - char cmd[30]; - - bt_receive(cmd); - - switch(cmd[1]) { - case 0x16: // request connection - cmd[1] = 9; // accept connection - cmd[2] = 1; // yes, we do - bt_send_cmd(cmd); - break; - case 0x13: // connect result - if(cmd[2]) { - int handle=cmd[3]; - cmd[1] = 0xB; // open stream - cmd[2] = handle; - bt_send_cmd(cmd); - bt_mode = 1; - } - break; - default: - break; - } - } -} - 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; } } @@ -148,25 +212,29 @@ Cell getkey() } while(!key_avail()); + + while((key=bt_getkey())==0); + display_char(key); display_update(); - return bt_getkey(); + return key; } void emit_char(char x) { if(!terminal_prepped) prep_terminal(); - display_char(x); + /* display_char(x); if(x == '\n') { display_update(); needs_update = 0; } else - needs_update = 1; - bt_send(&x, 1); + needs_update = 1; */ + if(bt_mode) bt_send(&x, 1); } void type_chars(char *addr, unsigned int l) { - int i; + if(bt_mode) bt_send(addr, l); + /* int i; for(i=0; i