From 20f903e166b604729a677ecd35c937955fd5bc86 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 6 Jul 2013 18:56:19 -0400 Subject: [PATCH] s2145: Decode many of the values in the various status messages. Also, if we get an error after printing, log it properly instead of assuming we're peachy. --- shinko_s2145_print.c | 158 ++++++++++++++++++++++++++++++++----------- 1 file changed, 117 insertions(+), 41 deletions(-) diff --git a/shinko_s2145_print.c b/shinko_s2145_print.c index 86dc3b3..c1fa9c2 100644 --- a/shinko_s2145_print.c +++ b/shinko_s2145_print.c @@ -35,7 +35,7 @@ #include #include -#define VERSION "0.04" +#define VERSION "0.05" #define URI_PREFIX "shinko_s2145://" #include "backend_common.c" @@ -124,6 +124,55 @@ struct s2145_print_cmd { uint8_t method; } __attribute__((packed)); +#define PRINT_MEDIA_4x6 0x00 +#define PRINT_MEDIA_5x3_5 0x01 +#define PRINT_MEDIA_5x7 0x03 +#define PRINT_MEDIA_6x9 0x05 +#define PRINT_MEDIA_6x8 0x06 +#define PRINT_MEDIA_2x6 0x07 + +static char *print_medias[] = { + "4x6", + "5x3.5", + "Unused", + "5x7", + "Unused", + "6x9", + "6x8", + "2x6" +}; + +#define PRINT_MODE_DEFAULT 0x01 +#define PRINT_MODE_STD_GLOSSY 0x02 +#define PRINT_MODE_FINE_GLOSSY 0x03 +#define PRINT_MODE_STD_MATTE 0x04 +#define PRINT_MODE_FINE_MATTE 0x05 +#define PRINT_MODE_STD_EGLOSSY 0x06 +#define PRINT_MODE_FINE_EGLOSSY 0x07 + +static char *print_modes[] = { + "Unused", + "Default", + "Std Glossy", + "Fine Glossy", + "Std Matte", + "Fine Matte", + "Std ExGlossy", + "Fine ExGlossy" +}; + +#define PRINT_METHOD_STD 0x00 +#define PRINT_METHOD_4x6_2UP 0x02 +#define PRINT_METHOD_2x6_2UP 0x04 + +static char *print_methods[] = { + "Standard", + "Unused", + "4x6 2up", + "Unused", + "2x6 2up", +}; + struct s2145_cancel_cmd { struct s2145_cmd_hdr hdr; uint8_t id; @@ -163,6 +212,17 @@ struct s2145_fwinfo_cmd { #define FWINFO_TARGET_USB_APP 0x06 #define FWINFO_TARGET_TABLES 0x07 +static char *fwinfo_targets[] = { + "Unused", + "Main Boot", + "Main App", + "DSP Boot", + "DSP App", + "USB Boot", + "USB App", + "Tables" +}; + struct s2145_update_cmd { struct s2145_cmd_hdr hdr; uint8_t target; @@ -198,6 +258,22 @@ struct s2145_status_hdr { #define ERROR_PRINTER 0x11 #define ERROR_BUFFER_FULL 0x21 +/* 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 @@ -246,6 +322,22 @@ struct s2145_status_resp { #define BANK_STATUS_XFER 0x01 #define BANK_STATUS_FULL 0x02 +static char *bank_statuses[] = { + "Free", + "Xfer", + "Full", +}; + +#define TONECURVE_STATUS_INIT 0x00 +#define TONECURVE_STATUS_USER 0x01 +#define TONECURVE_STATUS_CURRENT 0x02 + +static char *tonecurve_statuses[] = { + "Initial", + "UserSet", + "Current", +}; + struct s2145_readtone_resp { struct s2145_status_hdr hdr; uint8_t blocks_remain; @@ -262,6 +354,14 @@ struct s2145_mediainfo_item { uint8_t reserved[3]; } __attribute__((packed)); +#define MEDIA_TYPE_UNKNOWN 0x00 +#define MEDIA_TYPE_PAPER 0x01 + +static char *media_types[] = { + "Unknown", + "Paper" +}; + struct s2145_mediainfo_resp { struct s2145_status_hdr hdr; uint8_t count; @@ -383,19 +483,21 @@ static int get_status(libusb_device_handle *dev, INFO("\tCutter:\t\t\t%08d\n", le32_to_cpu(resp.count_cutter)); INFO("\tPrint Head:\t\t%08d\n", le32_to_cpu(resp.count_head)); INFO("\tRibbon Remaining:\t%08d\n", le32_to_cpu(resp.count_ribbon_left)); - INFO("Bank 1: Job %03d @ %03d/%03d (%03d remaining)\n", + INFO("Bank 1: 0x%02x (%s) Job %03d @ %03d/%03d (%03d remaining)\n", + resp.bank1_status, bank_statuses[resp.bank1_status], resp.bank1_printid, le16_to_cpu(resp.bank1_remaining), le16_to_cpu(resp.bank1_finished), le16_to_cpu(resp.bank1_specified)); - INFO("Bank 2: Job %03d @ %03d/%03d (%03d remaining)\n", + INFO("Bank 2: 0x%02x (%s) Job %03d @ %03d/%03d (%03d remaining)\n", + resp.bank2_status, bank_statuses[resp.bank1_status], resp.bank2_printid, le16_to_cpu(resp.bank2_remaining), le16_to_cpu(resp.bank2_finished), le16_to_cpu(resp.bank2_specified)); - INFO("Tonecurve Status: 0x%02x\n", resp.tonecurve_status); + INFO("Tonecurve Status: 0x%02x (%s)\n", resp.tonecurve_status, tonecurve_statuses[resp.tonecurve_status]); return 0; } @@ -442,32 +544,7 @@ static int get_fwinfo(libusb_device_handle *dev, if (le16_to_cpu(resp.hdr.payload_len) != (sizeof(struct s2145_fwinfo_resp) - sizeof(struct s2145_status_hdr))) continue; - char *s; - switch (i) { - case 1: - s = "Main Boot"; - break; - case 2: - s = "Main App"; - break; - case 3: - s = "DSP Boot"; - break; - case 4: - s = "DSP App"; - break; - case 5: - s = "USB Boot"; - break; - case 6: - s = "USB App"; - break; - case 7: - s = "Parameter Table"; - break; - } - - INFO(" '%s' version %02x.%02x\n", s, + INFO(" '%s'\t ver %02x.%02x\n", fwinfo_targets[i], resp.major, resp.minor); #if 0 INFO(" name: '%s'\n", resp.name); @@ -567,11 +644,12 @@ static int get_mediainfo(libusb_device_handle *dev, INFO("Supported Media Information: %d entries:\n", resp.count); for (i = 0 ; i < resp.count ; i++) { - INFO(" %02d: C 0x%02x, %04dx%04d, M 0x%02x, P 0x%02x\n", i, - resp.items[i].code, le16_to_cpu(resp.items[i].columns), + INFO(" %02d: C 0x%02x (%s), %04dx%04d, M 0x%02x (%s), P 0x%02x (%s)\n", i, + resp.items[i].code, print_medias[resp.items[i].code], + le16_to_cpu(resp.items[i].columns), le16_to_cpu(resp.items[i].rows), - resp.items[i].media_type, - resp.items[i].print_type); + resp.items[i].media_type, media_types[resp.items[i].media_type], + resp.items[i].print_type, print_methods[resp.items[i].print_type]); } return 0; } @@ -1156,12 +1234,6 @@ top: print->mode = le32_to_cpu(hdr.mode); print->method = le32_to_cpu(hdr.method); - DEBUG("printcmd: "); - for (i = 0 ; i < sizeof(*print) ; i++) { - DEBUG2("%02x ", cmdbuf[i]); - } - DEBUG2("\n"); - if ((ret = send_data(dev, endp_down, (uint8_t *) print, sizeof(*print)))) goto done_claimed; @@ -1186,7 +1258,11 @@ top: break; case S_PRINTER_SENT_DATA: INFO("Waiting for printer to acknowledge completion\n"); - state = S_FINISHED; + if (sts->hdr.result != RESULT_SUCCESS) + goto printer_error; + if (sts->hdr.status == STATUS_READY || + sts->hdr.status == STATUS_FINISHED) + state = S_FINISHED; break; default: break;