386BSD 0.1 development
authorWilliam F. Jolitz <wjolitz@soda.berkeley.edu>
Fri, 28 Feb 1992 20:43:32 +0000 (12:43 -0800)
committerWilliam F. Jolitz <wjolitz@soda.berkeley.edu>
Fri, 28 Feb 1992 20:43:32 +0000 (12:43 -0800)
Work on file usr/othersrc/public/ghostscript-2.4.1/gdevn533.c

Co-Authored-By: Lynne Greer Jolitz <ljolitz@cardio.ucsf.edu>
Synthesized-from: 386BSD-0.1

usr/othersrc/public/ghostscript-2.4.1/gdevn533.c [new file with mode: 0644]

diff --git a/usr/othersrc/public/ghostscript-2.4.1/gdevn533.c b/usr/othersrc/public/ghostscript-2.4.1/gdevn533.c
new file mode 100644 (file)
index 0000000..64996ca
--- /dev/null
@@ -0,0 +1,164 @@
+/* Copyright (C) 1989, 1990, 1991 Aladdin Enterprises.  All rights reserved.
+   Distributed by Free Software Foundation, Inc.
+
+This file is part of Ghostscript.
+
+Ghostscript is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
+to anyone for the consequences of using it or for whether it serves any
+particular purpose or works at all, unless he says so in writing.  Refer
+to the Ghostscript General Public License for full details.
+
+Everyone is granted permission to copy, modify and redistribute
+Ghostscript, but only under the conditions described in the Ghostscript
+General Public License.  A copy of this license is supposed to have been
+given to you along with Ghostscript so you can know your rights and
+responsibilities.  It should be in a file named COPYING.  Among other
+things, the copyright notice and this notice must be preserved on all
+copies.  */
+
+/* gdevn533.c */
+/* Sony NWP-533 driver for GhostScript */
+#include "gdevprn.h"
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <newsiop/lbp.h>
+
+/* The device descriptor */
+private dev_proc_open_device(nwp533_open);
+private dev_proc_output_page(nwp533_output_page);
+private dev_proc_close_device(nwp533_close);
+private gx_device_procs nwp533_procs =
+  prn_procs(nwp533_open, nwp533_output_page, nwp533_close);
+gx_device_printer gs_nwp533_device =
+  prn_device(nwp533_procs, "nwp533",
+       78.4,                           /* width_10ths */
+       112.9,                          /* height_10ths */
+       400,                            /* x_dpi */
+       400,                            /* y_dpi */
+       0,0,0,0,                        /* margins */
+       1, 0);
+
+private int printer_file = -1;
+
+/* return True if should retry - False if should quit */
+private int
+analyze_error()
+{
+  struct lbp_stat status;
+  char message[80];
+  char *detail, *old_detail;
+  int waiting;
+  int retry_after_return;
+
+  if(ioctl(printer_file, LBIOCRESET, 0) < 0)
+    return (0 == 1);
+  if(ioctl(printer_file, LBIOCSTATUS, &status) < 0)
+    return (0 == 1);
+  sprintf(message, "printer status: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x",
+         status.stat[0], status.stat[1], status.stat[2], 
+         status.stat[3], status.stat[4], status.stat[5]);
+  perror(message);
+
+  old_detail = detail = NULL;
+  waiting = retry_after_return = (1 == 1); /* True */
+  do
+    {
+      if(status.stat[0] & (ST0_CALL | ST0_REPRINT_REQ | ST0_WAIT | ST0_PAUSE))
+       {
+         if(status.stat[1] & ST1_NO_CARTRIGE)/* mispelled? */
+           detail = "No cartridge - waiting";
+         else if(status.stat[1] & ST1_NO_PAPER)
+           detail = "Out of paper - waiting";
+         else if(status.stat[1] & ST1_JAM)
+           detail = "Paper jam - waiting";
+         else if(status.stat[1] & ST1_OPEN)
+           detail = "Door open - waiting";
+         else if(status.stat[1] & ST1_TEST)
+           detail = "Test printing - waiting";
+         else
+           {
+             retry_after_return = (1 == 0);
+             waiting = (1 == 0);
+             detail = "Please analyze status bytes";
+           }
+       }
+      else
+       waiting = (0 == 1);
+      if(detail != NULL && detail != old_detail)
+       {
+         perror(detail);
+         old_detail = detail;
+       }
+      if(waiting)
+       {
+         ioctl(1, LBIOCRESET, 0);
+         sleep(5);
+         ioctl(1, LBIOCSTATUS, &status);
+       }
+    }
+  while(waiting);
+  return retry_after_return;
+}
+
+private int
+nwp533_open(gx_device *dev)
+{
+  fprintf(stderr, "in nwp533 open\n");
+
+  if(printer_file < 0)
+    if((printer_file = open("/dev/lbp", O_WRONLY)) < 0)
+      return printer_file;
+
+  return gdev_prn_open(dev);
+}
+
+private int
+nwp533_close(gx_device *dev)
+{
+  fprintf(stderr, "in nwp533 close\n");
+
+  if(printer_file >= 0)
+    {
+      close(printer_file);
+      printer_file = -1;
+    }
+
+  return gdev_prn_close(dev);
+}
+
+/* Send the page to the printer. */
+private int
+nwp533_output_page(gx_device *dev, int num_copies, int flush)
+{
+  fprintf(stderr, "in nwp533 output page [%d, %d]\n",
+         dev->width, dev->height);
+
+ restart:
+  if(ioctl(printer_file, LBIOCSTOP, 0) < 0)
+    {
+      if(analyze_error())
+       goto restart;
+      perror("Waiting for device");
+      return -1;
+    }
+  lseek(printer_file, 0, 0);
+
+  if(write(printer_file, prn_dev->mem.base,
+          (dev->width * dev->height) / 8) !=
+     (dev->width * dev->height) / 8)
+    {
+      perror("Writting to output");
+      return -1;
+    }
+ retry:
+  if(ioctl(printer_file, LBIOCSTART, 0) < 0)
+    {
+      if(analyze_error())
+       goto retry;
+      perror("Starting print");
+      return -1;
+    }
+
+  return 0;
+}