version 1.9, 2007/06/16 20:47:00
|
version 1.12, 2008/02/23 13:03:56
|
Line 6
|
Line 6
|
|
|
Gforth is free software; you can redistribute it and/or |
Gforth is free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License |
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. |
of the License, or (at your option) any later version. |
|
|
This program is distributed in the hope that it will be useful, |
This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
GNU General Public License for more details. |
GNU General Public License for more details. |
|
|
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
along with this program; if not, see http://www.gnu.org/licenses/. |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
|
|
The following is stolen from the readline library for bash |
The following is stolen from the readline library for bash |
*/ |
*/ |
Line 38 int terminal_prepped = 0;
|
Line 37 int terminal_prepped = 0;
|
int needs_update = 0; |
int needs_update = 0; |
int bt_mode = 0; |
int bt_mode = 0; |
int bt_state = 0; |
int bt_state = 0; |
|
static char bt_buf[0x100]; |
|
static char udp_buf[0x100]; |
|
int bt_index; |
|
int udp_index; |
|
int udp_size; |
|
|
void |
void |
show_splash(U32 milliseconds) |
show_splash(U32 milliseconds) |
Line 74 void bt_send_cmd(char * cmd)
|
Line 78 void bt_send_cmd(char * cmd)
|
|
|
int do_bluetooth () |
int do_bluetooth () |
{ |
{ |
if(bt_state) { |
if(!bt_mode) { |
if(bt_get_mode()) { |
char cmd[30]; |
if(!bt_mode) { |
|
bt_set_arm7_cmd(); |
bt_receive(cmd); |
display_char(')'); display_update(); |
if(cmd[0]) { |
bt_mode = 1; |
display_goto_xy(0,1); |
} |
display_hex(cmd[0],2); |
return 1; |
display_goto_xy(3,1); |
} else { |
display_hex(cmd[1],2); |
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) { |
switch(cmd[1]) { |
char cmd[30]; |
case 0x16: // request connection |
|
display_char('-'); |
bt_receive(cmd); |
cmd[1] = 0x9; // accept connection |
if(cmd[0] | cmd[1]) { |
cmd[2] = 1; // yes, we do |
display_char('0'+cmd[0]); |
bt_send_cmd(cmd); |
display_char('0'+cmd[1]); |
break; |
} |
case 0x0f: // inquiry result |
|
display_char('+'); |
switch(cmd[1]) { |
cmd[1] = 0x05; |
case 0x10: |
bt_send_cmd(cmd); // add devices as known device |
case 0x16: // request connection |
break; |
display_char('-'); |
case 0x13: // connect result |
cmd[1] = 0x9; // accept connection |
if(cmd[2]) { |
cmd[2] = 1; // yes, we do |
int n=0; |
bt_send_cmd(cmd); |
int handle=cmd[3]; |
break; |
display_char('/'); display_update(); |
case 0x0f: // inquiry result |
systick_wait_ms(300); |
cmd[1] = 0x05; |
bt_receive(cmd); |
bt_send_cmd(cmd); // add devices as known device |
if(cmd[0]==0) { |
break; |
|
case 0x13: // connect result |
|
if(cmd[2]) { |
|
display_char('/'); |
|
int handle=cmd[3]; |
|
cmd[1] = 0xB; // open stream |
cmd[1] = 0xB; // open stream |
cmd[2] = handle; |
cmd[2] = handle; |
bt_send_cmd(cmd); |
bt_send_cmd(cmd); |
bt_state = 1; |
systick_wait_ms(100); |
} else { |
bt_set_arm7_cmd(); |
display_char('('); |
bt_mode = 1; |
|
display_char(')'); display_update(); |
|
type_chars("Gforth NXT\n", 11); |
} |
} |
break; |
// bt_state = 1; |
case 0x20: // discoverableack |
} else { |
if(cmd[2]) { |
display_char('('); |
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; |
|
} |
} |
{ |
break; |
extern int display_x, display_y; |
case 0x20: // discoverableack |
static int n=0; |
if(cmd[2]) { |
int x = display_x; |
display_char('?'); |
int y = display_y; |
cmd[1] = 0x03; bt_send_cmd(cmd); // open port query |
display_goto_xy(0,6); |
break; |
display_char("/|\\-"[(n++)&3]); |
|
display_goto_xy(x,y); |
|
} |
} |
display_update(); |
case 0x10: |
|
case 0x14: |
|
display_char('!'); |
|
cmd[1] = 0x1C; cmd[2] = 1; bt_send_cmd(cmd); |
|
break; |
|
default: |
|
break; |
} |
} |
|
display_update(); |
} |
} |
return 0; |
return bt_mode; |
} |
} |
|
|
void prep_terminal () |
void prep_terminal () |
Line 164 void prep_terminal ()
|
Line 151 void prep_terminal ()
|
systick_init(); |
systick_init(); |
sound_init(); |
sound_init(); |
nxt_avr_init(); |
nxt_avr_init(); |
display_init(); |
|
nxt_motor_init(); |
nxt_motor_init(); |
i2c_init(); |
i2c_init(); |
bt_init(); |
bt_init(); |
do { |
udp_init(); |
bt_receive(cmd); |
display_init(); |
} while((cmd[0] != 3) && (cmd[1] != 0x14)); |
show_splash(2000); |
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); |
display_goto_xy(0,0); |
|
display_string("BT Reset "); |
|
display_update(); |
|
// bt_reset(); |
|
display_string("ok"); |
|
display_update(); |
|
bt_buf[0] = 0; |
|
bt_buf[1] = 0; |
|
bt_index = 0; |
|
// bt_start_ad_converter(); |
|
// 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_string("."); |
|
display_goto_xy(0,1); |
|
display_update(); |
|
while(!do_bluetooth() && !udp_configured()); |
|
|
terminal_prepped = 1; |
terminal_prepped = 1; |
} |
} |
Line 191 long key_avail ()
|
Line 191 long key_avail ()
|
{ |
{ |
if(!terminal_prepped) prep_terminal(); |
if(!terminal_prepped) prep_terminal(); |
|
|
do_bluetooth(); |
if(do_bluetooth()) { |
if(bt_mode) { |
return bt_buf[0] - bt_index; |
return bt_avail(); |
} else if(udp_configured()) { |
|
return udp_size - udp_index; |
} else { |
} else { |
systick_wait_ms(100); |
systick_wait_ms(100); |
return 0; |
return 0; |
Line 203 long key_avail ()
|
Line 204 long key_avail ()
|
Cell getkey() |
Cell getkey() |
{ |
{ |
int key; |
int key; |
|
|
if(!terminal_prepped) prep_terminal(); |
if(!terminal_prepped) prep_terminal(); |
|
|
if(needs_update) { |
if(needs_update) { |
display_update(); |
display_update(); |
needs_update = 0; |
needs_update = 0; |
} |
} |
|
|
while(!key_avail()); |
|
|
|
while((key=bt_getkey())==0); |
do { |
|
if(do_bluetooth()) { |
|
while(bt_index >= bt_buf[0]) { |
|
bt_receive(bt_buf); |
|
bt_index = 0; |
|
} |
|
key = bt_buf[bt_index++]; |
|
} else if(udp_configured()) { |
|
if(udp_index < udp_size) { |
|
key = udp_buf[udp_index++]; |
|
} else { |
|
udp_size = udp_read(udp_buf, 0x100); |
|
udp_index = 0; |
|
key = 0; |
|
} |
|
} else { |
|
key = 0; |
|
} |
|
} while(!key); |
|
|
display_char(key); display_update(); |
display_char(key); display_update(); |
|
|
return key; |
return key; |
} |
} |
|
|
void emit_char(char x) |
void emit_char(char x) |
{ |
{ |
|
char buf[3]; |
if(!terminal_prepped) prep_terminal(); |
if(!terminal_prepped) prep_terminal(); |
/* display_char(x); |
if(bt_mode) { |
if(x == '\n') { |
buf[0] = 1; |
display_update(); |
buf[1] = 0; |
needs_update = 0; |
buf[2] = x; |
} else |
bt_send(buf, 3); |
needs_update = 1; */ |
} |
if(bt_mode) bt_send(&x, 1); |
|
} |
} |
|
|
void type_chars(char *addr, unsigned int l) |
void type_chars(char *addr, unsigned int l) |
{ |
{ |
if(bt_mode) bt_send(addr, l); |
int i; |
/* int i; |
char buf[0x100]; |
for(i=0; i<l; i++) |
if(bt_mode) { |
emit_char(addr[i]); */ |
buf[0]=l; |
|
buf[1]=0; |
|
for(i=0; i<l; i++) { |
|
buf[2+i]=addr[i]; |
|
} |
|
bt_send(buf, l+2); |
|
} |
} |
} |
|
|
|
volatile unsigned char gMakeRequest; |