dnpds40: Distinguish between soft (user-correctable) and fatal errors.

This commit is contained in:
Solomon Peachy 2015-06-23 19:25:23 -04:00
parent d39ff78b4d
commit 19ce36f65b
1 changed files with 55 additions and 47 deletions

View File

@ -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,