dnpds40: Distinguish between soft (user-correctable) and fatal errors.
This commit is contained in:
parent
d39ff78b4d
commit
19ce36f65b
|
@ -162,16 +162,9 @@ static char *dnpds40_media_types(int media)
|
|||
return "Unknown type";
|
||||
}
|
||||
|
||||
static char *dnpds40_statuses(char *str)
|
||||
static char *dnpds40_statuses(int status)
|
||||
{
|
||||
char tmp[6];
|
||||
int i;
|
||||
memcpy(tmp, str, 5);
|
||||
tmp[5] = 0;
|
||||
|
||||
i = atoi(tmp);
|
||||
|
||||
switch (i) {
|
||||
switch (status) {
|
||||
case 0: return "Idle";
|
||||
case 1: return "Printing";
|
||||
case 500: return "Cooling Print Head";
|
||||
|
@ -766,6 +759,7 @@ static int dnpds40_main_loop(void *vctx, int copies) {
|
|||
int len = 0;
|
||||
uint8_t *ptr;
|
||||
char buf[9];
|
||||
int status;
|
||||
|
||||
if (!ctx)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
|
@ -894,46 +888,61 @@ top:
|
|||
if (!resp)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
dnpds40_cleanup_string((char*)resp, len);
|
||||
status = atoi((char*)resp);
|
||||
free(resp);
|
||||
|
||||
/* If we're not idle */
|
||||
if (strcmp("00000", (char*)resp)) {
|
||||
if (!strcmp("00001", (char*)resp)) {
|
||||
int bufs;
|
||||
/* Figure out what's going on */
|
||||
switch(status) {
|
||||
case 0: /* Idle; we can continue! */
|
||||
break;
|
||||
case 1: /* Printing */
|
||||
{
|
||||
int bufs;
|
||||
|
||||
free(resp);
|
||||
/* Query buffer state */
|
||||
dnpds40_build_cmd(&cmd, "INFO", "FREE_PBUFFER", 0);
|
||||
resp = dnpds40_resp_cmd(ctx, &cmd, &len);
|
||||
if (!resp)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
dnpds40_cleanup_string((char*)resp, len);
|
||||
/* Query buffer state */
|
||||
dnpds40_build_cmd(&cmd, "INFO", "FREE_PBUFFER", 0);
|
||||
resp = dnpds40_resp_cmd(ctx, &cmd, &len);
|
||||
|
||||
/* Check to see if we have sufficient buffers */
|
||||
bufs = atoi(((char*)resp)+3);
|
||||
if (bufs < ctx->buf_needed) {
|
||||
INFO("Insufficient printer buffers (%d vs %d), retrying...\n", bufs, ctx->buf_needed);
|
||||
sleep(1);
|
||||
goto top;
|
||||
}
|
||||
} else if (!strcmp("00500", (char*)resp) ||
|
||||
!strcmp("00510", (char*)resp)) {
|
||||
INFO("Printer cooling down...\n");
|
||||
if (!resp)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
|
||||
dnpds40_cleanup_string((char*)resp, len);
|
||||
/* Check to see if we have sufficient buffers */
|
||||
bufs = atoi(((char*)resp)+3);
|
||||
if (bufs < ctx->buf_needed) {
|
||||
INFO("Insufficient printer buffers (%d vs %d), retrying...\n", bufs, ctx->buf_needed);
|
||||
sleep(1);
|
||||
goto top;
|
||||
} else if (!strcmp("00900", (char*)resp)) {
|
||||
INFO("Waking printer up from standby...\n");
|
||||
// XXX do someting here?
|
||||
} else if (!strcmp("01500", (char*)resp)) {
|
||||
ERROR("Paper definition error, aborting job\n");
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
} else if (!strcmp("01600", (char*)resp)) {
|
||||
ERROR("Data error, aborting job\n");
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
} else {
|
||||
ERROR("Printer Status: %s => %s\n", (char*)resp, dnpds40_statuses((char*)resp));
|
||||
free(resp);
|
||||
return CUPS_BACKEND_RETRY_CURRENT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 500: /* Cooling print head */
|
||||
case 510: /* Cooling paper motor */
|
||||
INFO("Printer cooling down...\n");
|
||||
sleep(1);
|
||||
goto top;
|
||||
case 900:
|
||||
INFO("Waking printer up from standby...\n");
|
||||
// XXX do someting here?
|
||||
break;
|
||||
case 1000: /* Cover open */
|
||||
case 1010: /* No Scrap Box */
|
||||
case 1100: /* Paper End */
|
||||
case 1200: /* Ribbon End */
|
||||
case 1300: /* Paper Jam */
|
||||
case 1400: /* Ribbon Error */
|
||||
WARNING("Printer not ready: %s, please correct...\n", dnpds40_statuses(status));
|
||||
sleep(1);
|
||||
goto top;
|
||||
case 1500: /* Paper definition error */
|
||||
ERROR("Paper definition error, aborting job\n");
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
case 1600: /* Data error */
|
||||
ERROR("Data error, aborting job\n");
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
default:
|
||||
ERROR("Fatal Printer Error: %d => %s, halting queue!\n", status, dnpds40_statuses(status));
|
||||
return CUPS_BACKEND_HOLD;
|
||||
}
|
||||
|
||||
/* Send the stream over as individual data chunks */
|
||||
|
@ -963,8 +972,6 @@ top:
|
|||
goto top;
|
||||
}
|
||||
|
||||
if (resp) free(resp);
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
|
@ -1234,8 +1241,9 @@ static int dnpds40_get_status(struct dnpds40_ctx *ctx)
|
|||
return CUPS_BACKEND_FAILED;
|
||||
|
||||
dnpds40_cleanup_string((char*)resp, len);
|
||||
len = atoi((char*)resp);
|
||||
|
||||
INFO("Printer Status: %s => %s\n", (char*)resp, dnpds40_statuses((char*)resp));
|
||||
INFO("Printer Status: %d => %s\n", len, dnpds40_statuses(len));
|
||||
|
||||
free(resp);
|
||||
|
||||
|
@ -1548,7 +1556,7 @@ static int dnpds40_cmdline_arg(void *vctx, int argc, char **argv)
|
|||
/* Exported */
|
||||
struct dyesub_backend dnpds40_backend = {
|
||||
.name = "DNP DS40/DS80/DSRX1/DS620",
|
||||
.version = "0.50",
|
||||
.version = "0.51",
|
||||
.uri_prefix = "dnpds40",
|
||||
.cmdline_usage = dnpds40_cmdline,
|
||||
.cmdline_arg = dnpds40_cmdline_arg,
|
||||
|
|
Loading…
Reference in New Issue