kodak8800: error -> string mapping

This commit is contained in:
Solomon Peachy 2021-08-05 22:17:47 -04:00
parent b8e8c41815
commit 364808f4a9
1 changed files with 61 additions and 23 deletions

View File

@ -39,7 +39,7 @@ struct rtp1_req {
struct rtp1_sts {
uint8_t base[2]; // x10 x10 or x10 x12 ? (10 == ok, 12 == error?)
uint16_t err; /* RTP_ERROR_* */
uint16_t err; /* see kodak8800_errorstr() */
uint8_t sts[4]; // [0] STATE_* [2] PRINT_*
};
@ -67,21 +67,6 @@ struct rtp1_resp {
#define PRINT_O 0x05
#define PRINT_EJECT 0x06
#define RTP_ERROR_UKNOWN_0105 0x0105 // seen after issuing START command
#define RTP_ERROR_JOB_NOT_OPEN 0x0203
#define RTP_ERROR_COMMAND_DISABLED 0x0307
#define RTP_ERROR_RIBBON_TOO_SHORT 0x0420
#define RTP_ERROR_OPERATING_SYS 0x0503
#define RTP_ERROR_DOOR_OPEN 0x0504
#define RTP_ERROR_RIBBON_CHECK 0x2001
#define RTP_ERROR_PAPER_CHECK 0x2004
#define RTP_ERROR_ENGINE_PROTOCOL 0x4302
#define RTP_ERROR_BARCODE_SENSE 0x430A
#define RTP_ERROR_UNKNOWN_FF01 0xFF01 // seen in interface log
#define RTP_ERROR_HOST_READ 0xFF02
#define RTP_ERROR_UNKNOWN_FF04 0xFF04 // seen when issuing CANCELJOB
#define RTP_ERROR_UNKNOWN_FFFF 0xFFFF // Seen in interface log
struct rtp1_counters {
uint32_t cutter_count;
uint32_t prints_finished;
@ -215,6 +200,55 @@ struct kodak8800_ctx {
struct marker marker;
};
static const char* kodak8800_errorstrs(uint16_t error)
{
switch (error) {
case 0x0105: return "Unknown 0105"; // seen after issuing START command with a bogus job
case 0x0203: return "Job not Open";
case 0x0307: return "Command Disabled";
case 0x0420: return "Ribbon too Short";
case 0x0503: return "Operating System";
case 0x0504: return "Cover Open";
case 0x2001: return "Check Ribbon";
// case 0x2002: return "Out of Paper";
// case 0x2003: return "Ribbon Jammed";
case 0x2004: return "Ribbon Access Door Open";
// case 0x2005: return "Paper Access Door open";
// case 0x2006: return "Cutter Jammed";
// case 0x2007: return "Ribbon Failed to Advance";
// case 0x2008: return "Ribbon Failed to Rewind";
// case 0x2009: return "Paper Failed to Advance";
// case 0x200a: return "Paper Failed to Rewind";
// case 0x200b: return "Invalid Ribbon Barcode Type";
// case 0x200c: return "Head Error";
// case 0x200d: return "Invalid Head Position";
// case 0x200e: return "Cooling Timeout Failure";
// case 0x200f: return "Heating Timeout Failure";
// 2040-2043 == "Ribbon Error" ?
// 2044 == "paper feed" ?
case 0x4302: return "Engine Protocol";
// case 0x4303: return "Engine Command not Valid";
// case 0x4304: return "Undefined Engine Command";
// case 0x4305: return "Failure to Program Engine Flash";
// case 0x4306: return "Engine Powering Up";
// case 0x4307: return "VM Range";
// case 0x4307: return "Ribbon ADC";
// case 0x4309: return "Cam Homing";
case 0x430a: return "Barcode Sensor";
// case 0x430b: return "Unknown RTP";
// case 0x430c: return "Device not Responding";
// case 0x430d: return "Bad RTP Response Signature";
// case 0x430e: return "Bad RTP Command Echo";
// 8002 == printer not responding ?
case 0xff01: return "Unknown ff01"; // seen in interface log
case 0xff02: return "Host Read (instead of write)";
case 0xff04: return "Unknown ff04"; // seen after issuing bad CANCELJOB
case 0xffff: return "Unknown ffff"; // seen in interface log
default:
return "Unknown";
}
}
/* Helper Functions */
static int rtp1_docmd(struct kodak8800_ctx *ctx, const uint8_t *cmd,
const uint8_t *payload, uint32_t payload_len,
@ -425,17 +459,18 @@ static int kodak8800_geterrorlog(struct kodak8800_ctx *ctx, int id)
if (ret)
return CUPS_BACKEND_FAILED;
DEBUG("PRINT / PAPER / RIBBON @ PL : CODE\n");
DEBUG("PRINT / PAPER / RIBBON @ PL : CODE (Reason)\n");
for (i = 0; i < NUM_ERRORRECS; i++) {
if (errors.row[i].type == ERROR_TYPE_END)
continue;
INFO(" %06d / %06d / %06d @ %02d : x%04x\n",
INFO(" %06d / %06d / %06d @ %02d : x%04x (%s)\n",
be32_to_cpu(errors.row[i].printnum),
be32_to_cpu(errors.row[i].papernum) / 300 / 12,
be32_to_cpu(errors.row[i].ribbonnum) / 300 / 12,
errors.row[i].plane,
be16_to_cpu(errors.row[i].code));
be16_to_cpu(errors.row[i].code),
kodak8800_errorstrs(be16_to_cpu(errors.row[i].code)));
}
/* After an error log query, have to kick things */
@ -694,8 +729,9 @@ static int kodak8800_main_loop(void *vctx, const void *vjob) {
if (ret)
return ret;
if (sts.err) {
ERROR("Printer reports error: %04x\n", sts.err);
return CUPS_BACKEND_FAILED; // XXX make it more subtle!
ERROR("Printer reports error: %s (%04x)\n",
kodak8800_errorstrs(sts.err), sts.err);
return CUPS_BACKEND_FAILED;
}
if (sts.sts[0] == STATE_IDLE) {
break;
@ -734,7 +770,8 @@ static int kodak8800_main_loop(void *vctx, const void *vjob) {
if (ret)
return ret;
if (sts.err) {
ERROR("Printer reports error: %04x\n", sts.err);
ERROR("Printer reports error: %s (%04x)\n",
kodak8800_errorstrs(sts.err), sts.err);
return CUPS_BACKEND_FAILED;
}
@ -755,7 +792,8 @@ static int kodak8800_main_loop(void *vctx, const void *vjob) {
if (ret)
return ret;
if (sts.err) {
ERROR("Printer reports error: %04x\n", sts.err);
ERROR("Printer reports error: %s (%04x)\n",
kodak8800_errorstrs(sts.err), sts.err);
return CUPS_BACKEND_FAILED;
}
if (sts.sts[0] == STATE_IDLE) {