--- gforth/engine/io-nxt.c 2007/04/22 20:06:26 1.2 +++ gforth/engine/io-nxt.c 2007/04/23 21:42:59 1.6 @@ -25,26 +25,115 @@ #include "forth.h" #include "../arch/arm/nxt/AT91SAM7.h" #include "../arch/arm/nxt/bt.h" +#include "../arch/arm/nxt/display.h" +#include "../arch/arm/nxt/aic.h" +#include "../arch/arm/nxt/systick.h" +#include "../arch/arm/nxt/sound.h" +#include "../arch/arm/nxt/interrupts.h" +#include "../arch/arm/nxt/nxt_avr.h" +#include "../arch/arm/nxt/nxt_motors.h" +#include "../arch/arm/nxt/i2c.h" -long key_avail () -{ - return bt_avail(); -} +int terminal_prepped = 0; +int needs_update = 0; +int bt_mode = 0; -Cell getkey() +void +show_splash(U32 milliseconds) { - return bt_getkey(); + display_clear(0); + display_goto_xy(6, 6); + display_string("Gforth"); + display_update(); + + systick_wait_ms(milliseconds); +} + +const static bt_lens[0x3C] = { 10, 3, 10, 3, 10, 30, 10, 3, 4, 4, 26, 4, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, + 0, 19, 0, 4, 0, 3, 0, 3, 0, 3, 3, 3, 0, 0, 0, 3, + 0, 0, 0, 3, 5, 0, 3, 4, 0, 3, 0, 3, 0 }; + +void bt_send_cmd(char * cmd) +{ + int len = bt_lens[cmd[1]]; + int i, sum=0; + + cmd[0] = len; + for(i=1; i>8); + cmd[i++] = (char)(sum & 0xff); + + bt_send(cmd, len+1); +} + +void 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 + cmd[1] = 0x9; // 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); + display_char('#'); display_update(); + while (*AT91C_US1_TNCR != 0); + // while(!(*AT91C_PIOA_PDSR & BT_BC4_CMD_PIN)); + bt_set_arm7_cmd(); + display_char('!'); display_update(); + bt_mode = 1; + } else { + display_char('('); display_update(); + } + break; + default: + break; + } + } } -int terminal_prepped = 0; - void prep_terminal () { + char cmd[30]; + aic_initialise(); interrupts_enable(); systick_init(); + sound_init(); + nxt_avr_init(); display_init(); + nxt_motor_init(); + i2c_init(); bt_init(); + do { + bt_receive(cmd); + } while((cmd[0] != 3) && (cmd[1] != 0x14)); + cmd[1] = 0x21; strcpy(cmd+2, "Gforth 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] = 0x03; bt_send_cmd(cmd); // open port query + + display_clear(1); + show_splash(1000); + display_goto_xy(0,0); terminal_prepped = 1; } @@ -54,16 +143,56 @@ void deprep_terminal () terminal_prepped = 0; } +long key_avail () +{ + if(!terminal_prepped) prep_terminal(); + + if(bt_mode) { + return bt_avail(); + } else { + if(bt_avail()) + do_bluetooth(); + return 0; + } +} + +Cell getkey() +{ + int key; + + if(!terminal_prepped) prep_terminal(); + + if(needs_update) { + display_update(); + needs_update = 0; + } + + while(!key_avail()); + + while((key=bt_getkey())==0); + display_char(key); display_update(); + + return key; +} + void emit_char(char x) { - bt_send(&x, 1); - display_char(x); + if(!terminal_prepped) prep_terminal(); + /* display_char(x); + if(x == '\n') { + display_update(); + needs_update = 0; + } else + needs_update = 1; */ + if(bt_mode) + bt_send(&x, 1); } void type_chars(char *addr, unsigned int l) { - int i; - bt_send(addr, l); + if(bt_mode) + bt_send(addr, l); + /* int i; for(i=0; i