|
|
|
@ -558,6 +558,9 @@ struct shinkos6145_ctx { |
|
|
|
|
|
|
|
|
|
uint8_t image_avg[3]; /* CMY */ |
|
|
|
|
|
|
|
|
|
char serial[32]; |
|
|
|
|
char fwver[32]; |
|
|
|
|
|
|
|
|
|
struct marker marker; |
|
|
|
|
|
|
|
|
|
struct sinfonia_6x45_mediainfo_resp media; |
|
|
|
@ -1534,12 +1537,13 @@ static int shinkos6145_query_markers(void *vctx, struct marker **markers, int *c |
|
|
|
|
|
|
|
|
|
ctx->marker.levelnow = le32_to_cpu(sts.count_ribbon_left); |
|
|
|
|
|
|
|
|
|
*markers = &ctx->marker; |
|
|
|
|
*count = 1; |
|
|
|
|
if (markers) *markers = &ctx->marker; |
|
|
|
|
if (count) *count = 1; |
|
|
|
|
|
|
|
|
|
return CUPS_BACKEND_OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Exported */ |
|
|
|
|
#define USB_VID_SHINKO 0x10CE |
|
|
|
|
#define USB_PID_SHINKO_S6145 0x0019 |
|
|
|
@ -1550,6 +1554,108 @@ static int shinkos6145_query_markers(void *vctx, struct marker **markers, int *c |
|
|
|
|
#define USB_VID_HITI 0x0D16 |
|
|
|
|
#define USB_PID_HITI_M610 0x0010 |
|
|
|
|
|
|
|
|
|
static int shinkos6145_query_stats(void *vctx, struct printerstats *stats) |
|
|
|
|
{ |
|
|
|
|
struct shinkos6145_ctx *ctx = vctx; |
|
|
|
|
struct sinfonia_cmd_hdr cmd; |
|
|
|
|
struct s6145_status_resp status; |
|
|
|
|
int num; |
|
|
|
|
uint16_t usbID = 0xffff; |
|
|
|
|
|
|
|
|
|
if (shinkos6145_query_markers(ctx, NULL, NULL)) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
/* Query Status */ |
|
|
|
|
cmd.cmd = cpu_to_le16(SINFONIA_CMD_GETSTATUS); |
|
|
|
|
cmd.len = cpu_to_le16(0); |
|
|
|
|
|
|
|
|
|
if (sinfonia_docmd(&ctx->dev, |
|
|
|
|
(uint8_t*)&cmd, sizeof(cmd), |
|
|
|
|
(uint8_t*)&status, sizeof(status), |
|
|
|
|
&num)) { |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Query USB ID */ |
|
|
|
|
{ |
|
|
|
|
struct libusb_device_descriptor desc; |
|
|
|
|
struct libusb_device *dev; |
|
|
|
|
|
|
|
|
|
dev = libusb_get_device(ctx->dev.dev); |
|
|
|
|
libusb_get_device_descriptor(dev, &desc); |
|
|
|
|
|
|
|
|
|
usbID = desc.idProduct; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch (ctx->dev.type) { |
|
|
|
|
case P_SHINKO_S6145: |
|
|
|
|
stats->mfg = "Sinfonia"; |
|
|
|
|
stats->model = "CS2 / S6145"; |
|
|
|
|
break; |
|
|
|
|
case P_SHINKO_S6145D: |
|
|
|
|
stats->mfg = "Ciaat"; |
|
|
|
|
stats->model = "Brava 21"; |
|
|
|
|
break; |
|
|
|
|
case P_SHINKO_S2245: |
|
|
|
|
stats->mfg = "Sinfonia"; |
|
|
|
|
stats->model = "S3 / S2245"; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
if (usbID == USB_PID_KA_6900) { |
|
|
|
|
stats->mfg = "Kodak"; |
|
|
|
|
stats->model = "6900"; |
|
|
|
|
} else if (usbID == USB_PID_HITI_M610) { |
|
|
|
|
stats->mfg = "HiTi"; |
|
|
|
|
stats->model = "M610"; |
|
|
|
|
} else { |
|
|
|
|
stats->mfg = "Unknown"; |
|
|
|
|
stats->model = "Unknown"; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (sinfonia_query_serno(ctx->dev.dev, ctx->dev.endp_up, |
|
|
|
|
ctx->dev.endp_down, ctx->dev.iface, |
|
|
|
|
ctx->serial, sizeof(stats->serial))) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
stats->serial = ctx->serial; |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
struct sinfonia_fwinfo_cmd cmd; |
|
|
|
|
struct sinfonia_fwinfo_resp resp; |
|
|
|
|
int num = 0; |
|
|
|
|
cmd.hdr.cmd = cpu_to_le16(SINFONIA_CMD_FWINFO); |
|
|
|
|
cmd.hdr.len = cpu_to_le16(1); |
|
|
|
|
cmd.target = FWINFO_TARGET_MAIN_APP; |
|
|
|
|
|
|
|
|
|
if (sinfonia_docmd(&ctx->dev, |
|
|
|
|
(uint8_t*)&cmd, sizeof(cmd), |
|
|
|
|
(uint8_t*)&resp, sizeof(resp), |
|
|
|
|
&num)) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
snprintf(ctx->fwver, sizeof(ctx->fwver)-1, |
|
|
|
|
"%d.%d", resp.major, resp.minor); |
|
|
|
|
stats->fwver = ctx->fwver; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
stats->decks = 1; |
|
|
|
|
stats->mediatype[0] = ctx->marker.name; |
|
|
|
|
stats->levelmax[0] = ctx->marker.levelmax; |
|
|
|
|
stats->levelnow[0] = ctx->marker.levelnow; |
|
|
|
|
stats->name[0] = "Roll"; |
|
|
|
|
if (status.hdr.status == ERROR_PRINTER) { |
|
|
|
|
if(status.hdr.error == ERROR_NONE) |
|
|
|
|
status.hdr.error = status.hdr.status; |
|
|
|
|
stats->status[0] = strdup(sinfonia_error_str(status.hdr.error)); |
|
|
|
|
} else { |
|
|
|
|
stats->status[0] = strdup(sinfonia_status_str(status.hdr.status)); |
|
|
|
|
} |
|
|
|
|
stats->cnt_life[0] = le32_to_cpu(status.count_lifetime); |
|
|
|
|
|
|
|
|
|
return CUPS_BACKEND_OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const char *shinkos6145_prefixes[] = { |
|
|
|
|
"sinfonia-chcs6145", "ciaat-brava-21", |
|
|
|
|
"sinfonia-chcs2245", "hiti-m610", "kodak-6900", |
|
|
|
@ -1562,7 +1668,7 @@ static const char *shinkos6145_prefixes[] = { |
|
|
|
|
|
|
|
|
|
struct dyesub_backend shinkos6145_backend = { |
|
|
|
|
.name = "Shinko/Sinfonia CHC-S6145/CS2/S2245/S3", |
|
|
|
|
.version = "0.46" " (lib " LIBSINFONIA_VER ")", |
|
|
|
|
.version = "0.47" " (lib " LIBSINFONIA_VER ")", |
|
|
|
|
.uri_prefixes = shinkos6145_prefixes, |
|
|
|
|
.cmdline_usage = shinkos6145_cmdline, |
|
|
|
|
.cmdline_arg = shinkos6145_cmdline_arg, |
|
|
|
@ -1574,6 +1680,7 @@ struct dyesub_backend shinkos6145_backend = { |
|
|
|
|
.main_loop = shinkos6145_main_loop, |
|
|
|
|
.query_serno = sinfonia_query_serno, |
|
|
|
|
.query_markers = shinkos6145_query_markers, |
|
|
|
|
.query_stats = shinkos6145_query_stats, |
|
|
|
|
.devices = { |
|
|
|
|
{ USB_VID_SHINKO, USB_PID_SHINKO_S6145, P_SHINKO_S6145, NULL, "sinfonia-chcs6145"}, |
|
|
|
|
{ USB_VID_SHINKO, USB_PID_SHINKO_S6145D, P_SHINKO_S6145D, NULL, "ciaat-brava-21"}, |
|
|
|
|