diff --git a/shinko_s2145_print.c b/shinko_s2145_print.c index 983a746..2f16302 100644 --- a/shinko_s2145_print.c +++ b/shinko_s2145_print.c @@ -358,6 +358,212 @@ struct s2145_status_hdr { #define ERROR_PRINTER 0x11 #define ERROR_BUFFER_FULL 0x21 + +/* + + I have a list of 72 different errors that are displayed on the printer, + but it appears the list is incomplete, and there's no mapping between + category and major code numbers. Also, not all of the individual errors + have minor codes listed (particularly the "consumables") + + These are the observed error codes to date (via stored error log dumps): + + 0x01/0x16 @ 77845 [ jam/reloading or controller/paramtable or consumables? ] + 0x06/0x0b @ 77822, 70053 [ controller/fpga ? or consumables? ] + 0x05/0x64 @ 76034 [ jam ? (no match ) ] + 0x05/0x61 @ 76034, 75420 [ jam/cantload ? ] + 0x05/0x62 @ 76034 [ jam/cantload ? ] + 0x05/0x4e @ 69824, 69820, 69781 [ jam ? (no match) ] + + */ +static char *error_codes(uint8_t major, uint8_t minor) +{ + switch(major) { + case 9: /* "Controller Error" */ + switch(minor) { + case 0x01: + return "Controller: 01 EEPROM"; + case 0x02: + return "Controller: 02 EEPROM"; + case 0x04: + return "Controller: 04 DSP"; + case 0x05: + return "Controller: 05 DSP"; + case 0x06: + return "Controller: 06 Main FW"; + case 0x07: + return "Controller: 07 Main FW"; + case 0x08: + return "Controller: 08 DSP FW"; + case 0x09: + return "Controller: 09 DSP FW"; + case 0x0A: + return "Controller: 0A ASIC"; + case 0x0B: + return "Controller: 0B FPGA"; + case 0x0D: + return "Controller: 0D Tone Curve"; + case 0x16: + return "Controller: 16 Parameter Table"; + case 0x17: + return "Controller: 17 Parameter Table"; + case 0x18: + return "Controller: 18 Parameter Table"; + case 0x29: + return "Controller: 29 DSP Comms"; + case 0x2A: + return "Controller: 2A DSP Comms"; + default: + return "Controller: Unknown"; + } + case 8: /* XXXX "Mechanical Error" */ + switch (minor) { + case 0x01: + return "Mechanical: 01 Thermal Head"; + case 0x02: + return "Mechanical: 02 Thermal Head"; + case 0x03: + return "Mechanical: 03 Thermal Head"; + case 0x04: + return "Mechanical: 04 Pinch Roller"; + case 0x05: + return "Mechanical: 05 Pinch Roller"; + case 0x06: + return "Mechanical: 06 Pinch Roller"; + case 0x07: + return "Mechanical: 07 Pinch Roller"; + case 0x08: + return "Mechanical: 08 Pinch Roller"; + case 0x09: + return "Mechanical: 09 Cutter"; + case 0x0A: + return "Mechanical: 0A Cutter"; + default: + return "Mechanical: Unknown"; + } + case 2: /* XXXX "Sensor Error" */ + switch (minor) { + case 0x01: + return "Sensor: 01 Thermal Head"; + case 0x02: + return "Sensor: 02 Pinch Roller"; + case 0x03: + return "Sensor: 03 Cutter"; + case 0x04: + return "Sensor: 04 Cutter"; + case 0x05: + return "Sensor: 05 Cutter"; + default: + return "Sensor: Unknown"; + } + case 3: /* XXXX "Temperature Sensor Error" */ + switch (minor) { + case 0x01: + return "Temp Sensor: 01 Thermal Head High"; + case 0x02: + return "Temp Sensor: 02 Thermal Head Low"; + case 0x03: + return "Temp Sensor: 03 Environment High"; + case 0x04: + return "Temp Sensor: 04 Environment Low"; + case 0x05: + return "Temp Sensor: 05 Warmup Timed Out"; + default: + return "Temp Sensor: Unknown"; + } + + case 4: /* XXXX "Front Cover Open" */ + switch (minor) { + case 0x01: + return "Front Cover: 01 Cover Open"; + case 0x02: + return "Front Cover: 02 Cover Open Error"; + default: + return "Front Cover: Unknown"; + } + case 5: /* XXX "Paper Jam" */ + switch (minor) { + case 0x01: + return "Paper Jam: 01 Loading"; + case 0x02: + return "Paper Jam: 02 Loading"; + case 0x03: + return "Paper Jam: 03 Loading"; + case 0x04: + return "Paper Jam: 04 Loading"; + case 0x05: + return "Paper Jam: 05 Loading"; + case 0x11: + return "Paper Jam: 11 Reloading"; + case 0x12: + return "Paper Jam: 12 Reloading"; + case 0x13: + return "Paper Jam: 13 Reloading"; + case 0x14: + return "Paper Jam: 14 Reloading"; + case 0x15: + return "Paper Jam: 15 Reloading"; + case 0x16: + return "Paper Jam: 16 Reloading"; + case 0x21: + return "Paper Jam: 21 Takeup"; + case 0x22: + return "Paper Jam: 22 Takeup"; + case 0x41: + return "Paper Jam: 41 Printing"; + case 0x42: + return "Paper Jam: 42 Printing"; + case 0x43: + return "Paper Jam: 43 Printing"; + case 0x44: + return "Paper Jam: 44 Printing"; + case 0x45: + return "Paper Jam: 45 Printing"; + case 0x46: + return "Paper Jam: 46 Printing"; + case 0x47: + return "Paper Jam: 47 Printing"; + case 0x49: + return "Paper Jam: 49 Printing"; + case 0x4A: + return "Paper Jam: 4A Ribbon Cut"; + case 0x61: + return "Paper Jam: 61 Can't Load"; + case 0x62: + return "Paper Jam: 62 Can't Load"; + default: + return "Paper Jam: Unknown"; + } + case 6: /* XXXX "Consumables" */ + switch (minor) { + case 0x01: // XXX + return "Consumables: XX No Ribbon+Paper"; + case 0x02: // XXX + return "Consumables: XX No Ribbon"; + case 0x03: // XXX + return "Consumables: XX Ribbon Empty"; + case 0x04: // XXX + return "Consumables: XX Ribbon Mismatch"; + case 0x05: // XXX + return "Consumables: XX 01 Ribbon Incorrect"; + case 0x06: // XXX + return "Consumables: XX 02 Ribbon Incorrect"; + case 0x07: // XXX + return "Consumables: XX 03 Ribbon Incorrect"; + case 0x08: // XXX + return "Consumables: XX No Paper"; + case 0x09: // XXX + return "Consumables: XX Paper Empty"; + case 0x0A: // XXX + return "Consumables: XX Paper Mismatch"; + default: + return "Consumables: Unknown"; + } + default: + return "Unknown Error"; + } +} + static char *error_str(uint8_t v) { switch (v) { case ERROR_NONE: @@ -381,22 +587,6 @@ static char *error_str(uint8_t v) { } } -/* XXX observed major/minor error codes: - - 0x01/0x16 @ 77845 [maybe paper out?] - 0x06/0x0b @ 77822, 70053 - 0x05/0x64 @ 76034 - 0x05/0x61 @ 76034, 75420 - 0x05/0x62 @ 76034 - 0x05/0x4e @ 69824, 69820, 69781 - - Unfortunately I have no idea what these refer to. - - major (0x01/5/6) may refer to above error codes or media/print modes. - minor (0x61/62/64) may refer to equivalent status codes (see below) - - */ - #define STATUS_READY 0x00 #define STATUS_INIT_CPU 0x31 #define STATUS_INIT_RIBBON 0x32 @@ -624,9 +814,9 @@ static int s2145_do_cmd(libusb_device_handle *dev, if (resp->result != RESULT_SUCCESS) { INFO("Printer Status: %02x (%s)\n", resp->status, status_str(resp->status)); - INFO(" Result: 0x%02x Error: 0x%02x (0x%02x/0x%02x)\n", + INFO(" Result: 0x%02x Error: 0x%02x (0x%02x/0x%02x = %s)\n", resp->result, resp->error, resp->printer_major, - resp->printer_minor); + resp->printer_minor, error_codes(resp->printer_major, resp->printer_minor)); return -99; } @@ -1257,8 +1447,9 @@ top: INFO("Printer Status: 0x%02x (%s)\n", sts->hdr.status, status_str(sts->hdr.status)); if (sts->hdr.error == ERROR_PRINTER) { - ERROR("Printer Reported Error: 0x%02x.0x%02x\n", - sts->hdr.printer_major, sts->hdr.printer_minor); + ERROR("Printer Reported Error: 0x%02x.0x%02x = %s\n", + sts->hdr.printer_major, sts->hdr.printer_minor, + error_codes(sts->hdr.printer_major, sts->hdr.printer_minor)); } memcpy(rdbuf2, rdbuf, READBACK_LEN); } else if (state == last_state) { @@ -1353,13 +1544,13 @@ top: return 0; printer_error: - ERROR("Printer reported error: %#x (%s) status: %#x (%s) -> %#x.%#x\n", + ERROR("Printer reported error: %#x (%s) status: %#x (%s) -> %#x.%#x = %s\n", sts->hdr.error, error_str(sts->hdr.error), sts->hdr.status, status_str(sts->hdr.status), - sts->hdr.printer_major, sts->hdr.printer_minor); - // XXX need to decode these errors.. + sts->hdr.printer_major, sts->hdr.printer_minor, + error_codes(sts->hdr.printer_major, sts->hdr.printer_minor)); return 1; } @@ -1397,7 +1588,7 @@ static int shinkos2145_query_serno(struct libusb_device_handle *dev, uint8_t end struct dyesub_backend shinkos2145_backend = { .name = "Shinko/Sinfonia CHC-S2145", - .version = "0.18", + .version = "0.19", .uri_prefix = "shinkos2145", .cmdline_usage = shinkos2145_cmdline, .cmdline_arg = shinkos2145_cmdline_arg,