Diff for /gforth/engine/io-nxt.c between versions 1.9 and 1.12

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;

Removed from v.1.9  
changed lines
  Added in v.1.12


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>