|
|
|
@ -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) {
|
|
|
|
|