summaryrefslogtreecommitdiff
path: root/devices/gdevn533.c
diff options
context:
space:
mode:
Diffstat (limited to 'devices/gdevn533.c')
-rw-r--r--devices/gdevn533.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/devices/gdevn533.c b/devices/gdevn533.c
new file mode 100644
index 000000000..f8d145e7e
--- /dev/null
+++ b/devices/gdevn533.c
@@ -0,0 +1,207 @@
+/* Copyright (C) 2001-2012 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
+ CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* Sony NWP-533 driver for GhostScript */
+#include "gdevprn.h"
+#define prn_dev ((gx_device_printer *)dev) /* needed in 5.31 et seq */
+#include <sys/ioctl.h>
+#include <newsiop/lbp.h>
+
+/***
+ *** Note: this driver was contributed by a user, Tero Kivinen:
+ *** please contact kivinen@joker.cs.hut.fi if you have questions.
+ ***/
+
+#define A4_PAPER 1
+
+#ifdef A4_PAPER
+#define PAPER_XDOTS A4_XDOTS
+#define PAPER_YDOTS A4_YDOTS
+#else
+#define PAPER_XDOTS B4_XDOTS
+#define PAPER_YDOTS B4_YDOTS
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/* The device descriptor */
+static dev_proc_open_device(nwp533_open);
+static dev_proc_print_page(nwp533_print_page);
+static dev_proc_close_device(nwp533_close);
+/* Since the print_page doesn't alter the device, this device can print in the background */
+static gx_device_procs nwp533_procs =
+ prn_procs(nwp533_open, gdev_prn_bg_output_page_seekable, nwp533_close);
+
+const gx_device_printer far_data gs_nwp533_device =
+ prn_device(nwp533_procs, "nwp533",
+ PAPER_XDOTS * 10.0 / DPI, /* width_10ths */
+ PAPER_YDOTS * 10.0 / DPI, /* height_10ths */
+ DPI, /* x_dpi */
+ DPI, /* y_dpi */
+ 0,0,0,0, /* margins */
+ 1, nwp533_print_page);
+
+/* return True if should retry - False if should quit */
+static int
+analyze_error(int printer_file)
+{
+ struct lbp_stat status;
+ char *detail = NULL, *old_detail = NULL;
+ int waiting = TRUE;
+ int retry_after_return = TRUE;
+
+ if(ioctl(printer_file, LBIOCRESET, 0) < 0)
+ {
+ perror("ioctl(LBIOCRESET)");
+ return FALSE;
+ }
+ if (ioctl(printer_file, LBIOCSTATUS, &status) < 0)
+ {
+ perror("ioctl(LBIOCSTATUS)");
+ return FALSE;
+ }
+
+ do
+ {
+ /* Is there an error */
+ 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 {
+ waiting = FALSE;
+ retry_after_return = FALSE;
+
+ if(status.stat[2] & ST2_FIXER)
+ detail = "Fixer trouble - quiting";
+ else if(status.stat[2] & ST2_SCANNER)
+ detail = "Scanner trouble - quiting";
+ else if(status.stat[2] & ST2_MOTOR)
+ detail = "Scanner motor trouble - quiting";
+ else if(status.stat[5] & ST5_NO_TONER)
+ detail = "No toner - quiting";
+ }
+ }
+ else
+ {
+ waiting = FALSE;
+ }
+ 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;
+}
+
+static int
+nwp533_open(gx_device *dev)
+{
+ gx_device_printer *pdev = (gx_device_printer *) dev;
+
+ if (pdev->fname[0] == '\0')
+ {
+ strcpy(pdev->fname, "/dev/lbp");
+ }
+ return gdev_prn_open(dev);
+}
+
+static int
+nwp533_close(gx_device *dev)
+{
+ if (((gx_device_printer *) dev)->file != NULL)
+ {
+ int printer_file;
+
+ printer_file = fileno(((gx_device_printer *) dev)->file);
+ restart2:
+ if(ioctl(printer_file, LBIOCSTOP, 0) < 0)
+ {
+ if(analyze_error(printer_file))
+ goto restart2;
+ perror("Waiting for device");
+ return_error(gs_error_ioerror);
+ }
+ }
+ return gdev_prn_close(dev);
+}
+
+/* Send the page to the printer. */
+static int
+nwp533_print_page(gx_device_printer *dev, FILE *prn_stream)
+{
+ int lnum;
+ int line_size = gdev_mem_bytes_per_scan_line(dev);
+ byte *in;
+ int printer_file;
+ printer_file = fileno(prn_stream);
+
+ if (line_size % 4 != 0)
+ {
+ line_size += 4 - (line_size % 4);
+ }
+ in = (byte *) gs_malloc(dev->memory, line_size, 1, "nwp533_output_page(in)");
+ restart:
+ if(ioctl(printer_file, LBIOCSTOP, 0) < 0)
+ {
+ if(analyze_error(printer_file))
+ goto restart;
+ perror("Waiting for device");
+ return_error(gs_error_ioerror);
+ }
+ lseek(printer_file, 0, 0);
+
+ for ( lnum = 0; lnum < dev->height; lnum++)
+ {
+ gdev_prn_copy_scan_lines(prn_dev, lnum, in, line_size);
+ if(write(printer_file, in, line_size) != line_size)
+ {
+ perror("Writting to output");
+ return_error(gs_error_ioerror);
+ }
+ }
+ retry:
+ if(ioctl(printer_file, LBIOCSTART, 0) < 0)
+ {
+ if(analyze_error(printer_file))
+ goto retry;
+ perror("Starting print");
+ return_error(gs_error_ioerror);
+ }
+ gs_free(dev->memory, in, line_size, 1, "nwp533_output_page(in)");
+
+ return 0;
+}