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

version 1.3, 2007/04/22 20:51:55 version 1.9, 2007/06/16 20:47:00
Line 35 Line 35
 #include "../arch/arm/nxt/i2c.h"  #include "../arch/arm/nxt/i2c.h"
   
 int terminal_prepped = 0;  int terminal_prepped = 0;
   int needs_update = 0;
   int bt_mode = 0;
   int bt_state = 0;
   
 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);
 }  }
   
   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<len-2; i++)
       sum += cmd[i];
     sum = -sum;
     cmd[i++] = (char)(sum>>8);
     cmd[i++] = (char)(sum & 0xff);
   
     //  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 ()  void prep_terminal ()
 {  {
     char cmd[30];
   
   aic_initialise();    aic_initialise();
   interrupts_enable();    interrupts_enable();
   systick_init();    systick_init();
Line 58  void prep_terminal () Line 168  void prep_terminal ()
   nxt_motor_init();    nxt_motor_init();
   i2c_init();    i2c_init();
   bt_init();    bt_init();
   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);    display_clear(1);
     show_splash(1000);
     display_goto_xy(0,0);
   
   terminal_prepped = 1;    terminal_prepped = 1;
 }  }
Line 72  void deprep_terminal () Line 190  void deprep_terminal ()
 long key_avail ()  long key_avail ()
 {  {
   if(!terminal_prepped) prep_terminal();    if(!terminal_prepped) prep_terminal();
   return bt_avail();  
     do_bluetooth();
     if(bt_mode) {
       return bt_avail();
     } else {
       systick_wait_ms(100);
       return 0;
     }
 }  }
   
 Cell getkey()  Cell getkey()
 {  {
     int key;
   
   if(!terminal_prepped) prep_terminal();    if(!terminal_prepped) prep_terminal();
   return bt_getkey();  
     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)  void emit_char(char x)
 {  {
   if(!terminal_prepped) prep_terminal();    if(!terminal_prepped) prep_terminal();
   display_char(x);    /*  display_char(x);
   display_update();    if(x == '\n') {
   bt_send(&x, 1);      display_update();
       needs_update = 0;
     } else
     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;    if(bt_mode) bt_send(addr, l);
     /*  int i;
   for(i=0; i<l; i++)    for(i=0; i<l; i++)
     emit_char(addr[i]);    emit_char(addr[i]); */
 }  }

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


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