* remote-array.c (array_wait): Poll the keyboard along with the
authorRob Savoye <rob@cygnus>
Fri, 22 Dec 1995 02:09:38 +0000 (02:09 +0000)
committerRob Savoye <rob@cygnus>
Fri, 22 Dec 1995 02:09:38 +0000 (02:09 +0000)
serial port so users can tpye at the target while their
application is running.

gdb/ChangeLog
gdb/remote-array.c

index 3fa3fe1..ea14724 100644 (file)
@@ -1,3 +1,9 @@
+Thu Dec 21 19:09:20 1995  Rob Savoye  <rob@chinadoll.cygnus.com>
+
+       * remote-array.c (array_wait): Poll the keyboard along with the
+       serial port so users can tpye at the target while their
+       application is running.
+
 Thu Dec 21 11:58:52 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * Makefile.in (ppcbug-rom.o, srec.o): Add dependencies.
@@ -51,7 +57,7 @@ Wed Dec 20 10:54:41 1995  Fred Fish  <fnf@cygnus.com>
        * symmisc.c (print_objfile_statistics): Print the per-objfile
        internal instrumentation statistics gathered.
        * xcoffread.c (xcoff_next_symbol_text): Now takes objfile argument.
-       
+
 Fri Dec 15 16:15:55 1995  Ian Lance Taylor  <ian@cygnus.com>
 
        * top.c (set_endian_from_file): Use new bfd_big_endian macro.
index 7a44d98..49e236d 100644 (file)
@@ -34,8 +34,8 @@
 #include <varargs.h>
 #endif
 #include <signal.h>
-#include "gdb_string.h"
 #include <sys/types.h>
+#include "gdb_string.h"
 #include "command.h"
 #include "serial.h"
 #include "monitor.h"
@@ -47,6 +47,7 @@ static const char hexchars[]="0123456789abcdef";
 static char *hex2mem();
 
 #define SREC_SIZE 160
+#define ARRAY_PROMPT ">> "
 
 #define SWAP_TARGET_AND_HOST(buffer,len)                               \
   do                                                                   \
@@ -399,7 +400,7 @@ static void
 expect_prompt(discard)
      int discard;
 {
-  expect (">> ", discard);
+  expect (ARRAY_PROMPT, discard);
 }
 
 /*
@@ -577,6 +578,9 @@ array_open(args, name, from_tty)
 /*  if (is_open) */
     array_close(0);
 
+  target_preopen (from_tty);
+  unpush_target (&array_ops);
+
   tmp_mips_processor_type = "lsi33k";  /* change the default from r3051 */
   mips_set_processor_type_command ("lsi33k", 0);
 
@@ -614,13 +618,15 @@ array_open(args, name, from_tty)
        because the '@' doesn't flush output like it does on the new ROMS.
      */
     printf_monitor ("@");      /* ask for the last signal */
-    expect_prompt(1);          /* See if we get a expect_prompt */   
+    expect_prompt(1);          /* See if we get a expect_prompt */
+#ifdef TEST_ARRAY              /* skip packet for testing */
     make_gdb_packet (packet, "?");     /* ask for a bogus packet */
     if (array_send_packet (packet) == 0)
       error ("Couldn't transmit packet\n");
     printf_monitor ("@\n");    /* force it to flush stdout */
    expect_prompt(1);           /* See if we get a expect_prompt */
-
+#endif
+  push_target (&array_ops);
   if (from_tty)
     printf("Remote target %s connected to %s\n", array_ops.to_shortname, dev_name);
 }
@@ -701,6 +707,8 @@ array_resume (pid, step, sig)
   }
 }
 
+#define TMPBUFSIZ 5
+
 /*
  * array_wait -- Wait until the remote machine stops, then return,
  *          storing status in status just as `wait' would.
@@ -711,6 +719,10 @@ array_wait (pid, status)
      struct target_waitstatus *status;
 {
   int old_timeout = timeout;
+  int result, i;
+  char c;
+  serial_t tty_desc;
+  serial_ttystate ttystate;
 
   debuglogs(1, "array_wait (), printing extraneous text.");
   
@@ -718,15 +730,47 @@ array_wait (pid, status)
   status->value.integer = 0;
 
   timeout = 0;         /* Don't time out -- user program is running. */
+#if !defined(__GO32__) && !defined(__MSDOS__) && !defined(__WIN32__)
+  tty_desc = SERIAL_FDOPEN (0);
+  ttystate = SERIAL_GET_TTY_STATE (tty_desc);
+  SERIAL_RAW (tty_desc);
 
-  expect_prompt(0);    /* Wait for expect_prompt, outputting extraneous text */
+  i = 0;
+  /* poll on the serial port and the keyboard. */
+  while (1) {
+    c = readchar(timeout);
+    if (c > 0) {
+      if (c == *(ARRAY_PROMPT + i)) {
+       if (++i >= strlen (ARRAY_PROMPT)) { /* matched the prompt */
+         debuglogs (4, "array_wait(), got the expect_prompt.");
+         break;
+       }
+      } else {         /* not the prompt */
+       i = 0;
+      }
+      fputc_unfiltered (c, gdb_stdout);
+      fflush (stdout);
+    }
+    c = SERIAL_READCHAR(tty_desc, timeout);
+    if (c > 0) {
+      SERIAL_WRITE(array_desc, &c, 1);
+      /* do this so it looks like there's keyboard echo */
+      if (c == 3)              /* exit on Control-C */
+       break;
+      fputc_unfiltered (c, gdb_stdout);
+      fflush (stdout);
+    }
+  }
+  SERIAL_SET_TTY_STATE (tty_desc, ttystate);
+#else
+  expect_prompt(1);
   debuglogs (4, "array_wait(), got the expect_prompt.");
+#endif
 
   status->kind = TARGET_WAITKIND_STOPPED;
   status->value.sig = TARGET_SIGNAL_TRAP;
 
-
-
   timeout = old_timeout;
 
   return 0;