Diff for /gforth/engine/io-nxt.c between versions 1.5 and 1.13

version 1.5, 2007/04/22 23:18:05 version 1.13, 2008/07/15 16:11:49
Line 1 Line 1
 /* direct key io driver for NXT brick  /* direct key io driver for NXT brick
   
   Copyright (C) 2007 Free Software Foundation, Inc.    Copyright (C) 2007,2008 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
   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 37 Line 36
 int terminal_prepped = 0;  int terminal_prepped = 0;
 int needs_update = 0;  int needs_update = 0;
 int bt_mode = 0;  int bt_mode = 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)
 {  {
   display_clear(0);    display_clear(0);
   display_goto_xy(6, 6);    display_goto_xy(4, 6);
   display_string("Gforth");    display_string("Gforth NXT");
   display_update();    display_update();
   
   systick_wait_ms(milliseconds);    systick_wait_ms(milliseconds);
Line 66  void bt_send_cmd(char * cmd) Line 71  void bt_send_cmd(char * cmd)
   cmd[i++] = (char)(sum>>8);    cmd[i++] = (char)(sum>>8);
   cmd[i++] = (char)(sum & 0xff);    cmd[i++] = (char)(sum & 0xff);
   
     //  systick_wait_ms(500);
   
   bt_send(cmd, len+1);    bt_send(cmd, len+1);
 }  }
   
 void do_bluetooth ()  int do_bluetooth ()
 {  {
   if(!bt_mode) {    if(!bt_mode) {
     char cmd[30];      char cmd[30];
       
     bt_receive(cmd);      bt_receive(cmd);
       if(cmd[0]) {
         display_goto_xy(0,1);
         display_hex(cmd[0],2);
         display_goto_xy(3,1);
         display_hex(cmd[1],2);
       }
           
     switch(cmd[1]) {      switch(cmd[1]) {
     case 0x16: // request connection      case 0x16: // request connection
       cmd[1] = 9; // accept connection        display_char('-');
         cmd[1] = 0x9; // accept connection
       cmd[2] = 1; // yes, we do        cmd[2] = 1; // yes, we do
       bt_send_cmd(cmd);        bt_send_cmd(cmd);
       break;        break;
       case 0x0f: // inquiry result
         display_char('+');
         cmd[1] = 0x05;
         bt_send_cmd(cmd); // add devices as known device
         break;
     case 0x13: // connect result      case 0x13: // connect result
       if(cmd[2]) {        if(cmd[2]) {
           int n=0;
         int handle=cmd[3];          int handle=cmd[3];
         cmd[1] = 0xB; // open stream          display_char('/'); display_update();
         cmd[2] = handle;          systick_wait_ms(300);
         bt_send_cmd(cmd);          bt_receive(cmd);
         bt_mode = 1;          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();
             type_chars("Gforth NXT\n", 11);
           }
           //        bt_state = 1;
         } else {
           display_char('(');
       }        }
       break;        break;
   default:      case 0x20: // discoverableack
     break;        if(cmd[2]) {
           display_char('?');
           cmd[1] = 0x03; bt_send_cmd(cmd); // open port query
           break;
         }
       case 0x10:
       case 0x14:
         display_char('!');
         cmd[1] = 0x1C; cmd[2] = 1; bt_send_cmd(cmd);
         break;
       default:
         break;
     }      }
       display_update();
   }    }
     return bt_mode;
 }  }
   
 void prep_terminal ()  void prep_terminal ()
Line 106  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();
   cmd[1] = 0x21; strcpy(cmd+2, "Gforth NXT"); bt_send_cmd(cmd); do_bluetooth();    udp_init();
   cmd[1] = 0x1C; cmd[2] = 1; bt_send_cmd(cmd); do_bluetooth(); // make visible    display_init();
   cmd[1] = 0x03; bt_send_cmd(cmd); // open port query    show_splash(2000);
   
   display_goto_xy(0,0);    display_goto_xy(0,0);
   display_clear(1);    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 129  long key_avail () Line 191  long key_avail ()
 {  {
   if(!terminal_prepped) prep_terminal();    if(!terminal_prepped) prep_terminal();
   
   if(bt_mode) {    if(do_bluetooth()) {
     return bt_avail();      return bt_buf[0] - bt_index;
     } else if(udp_configured()) {
       return udp_size - udp_index;
   } else {    } else {
     if(bt_avail())      systick_wait_ms(100);
       do_bluetooth();  
     return 0;      return 0;
   }    }
 }  }
Line 141  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());    do {
       if(do_bluetooth()) {
   return bt_getkey();        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();
     
     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)
 {  {
   int i;    int i;
   for(i=0; i<l; i++)    char buf[0x100];
     emit_char(addr[i]);    if(bt_mode) {
       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.5  
changed lines
  Added in v.1.13


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