all: Add in "Unknown" marker reporting for the rest.
This commit is contained in:
parent
03cce1efc8
commit
b4e1c769bb
|
@ -87,6 +87,8 @@ struct kodak1400_ctx {
|
|||
uint8_t *plane_r;
|
||||
uint8_t *plane_g;
|
||||
uint8_t *plane_b;
|
||||
|
||||
struct marker marker;
|
||||
};
|
||||
|
||||
static int send_plane(struct kodak1400_ctx *ctx,
|
||||
|
@ -313,6 +315,11 @@ static int kodak1400_attach(void *vctx, struct libusb_device_handle *dev,
|
|||
ctx->type = lookup_printer_type(&kodak1400_backend,
|
||||
desc.idVendor, desc.idProduct);
|
||||
|
||||
ctx->marker.color = "#00FFFF#FF00FF#FFFF00";
|
||||
ctx->marker.name = "Unknown";
|
||||
ctx->marker.levelmax = -1;
|
||||
ctx->marker.levelnow = -2;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
|
@ -608,6 +615,16 @@ top:
|
|||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
static int kodak1400_query_markers(void *vctx, struct marker **markers, int *count)
|
||||
{
|
||||
struct kodak1400_ctx *ctx = vctx;
|
||||
|
||||
*markers = &ctx->marker;
|
||||
*count = 1;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
/* Exported */
|
||||
#define USB_VID_KODAK 0x040A
|
||||
#define USB_PID_KODAK_1400 0x4022
|
||||
|
@ -623,7 +640,7 @@ static const char *kodak1400_prefixes[] = {
|
|||
|
||||
struct dyesub_backend kodak1400_backend = {
|
||||
.name = "Kodak 1400/805",
|
||||
.version = "0.35",
|
||||
.version = "0.36",
|
||||
.uri_prefixes = kodak1400_prefixes,
|
||||
.cmdline_usage = kodak1400_cmdline,
|
||||
.cmdline_arg = kodak1400_cmdline_arg,
|
||||
|
@ -632,6 +649,7 @@ struct dyesub_backend kodak1400_backend = {
|
|||
.teardown = kodak1400_teardown,
|
||||
.read_parse = kodak1400_read_parse,
|
||||
.main_loop = kodak1400_main_loop,
|
||||
.query_markers = kodak1400_query_markers,
|
||||
.devices = {
|
||||
{ USB_VID_KODAK, USB_PID_KODAK_1400, P_KODAK_1400_805, "Kodak", "kodak1400"},
|
||||
{ USB_VID_KODAK, USB_PID_KODAK_805, P_KODAK_1400_805, "Kodak", "kodak805"},
|
||||
|
|
|
@ -124,6 +124,8 @@ struct magicard_ctx {
|
|||
int datalen;
|
||||
|
||||
int hdr_len;
|
||||
|
||||
struct marker marker;
|
||||
};
|
||||
|
||||
struct magicard_cmd_header {
|
||||
|
@ -470,6 +472,11 @@ static int magicard_attach(void *vctx, struct libusb_device_handle *dev,
|
|||
ctx->type = lookup_printer_type(&magicard_backend,
|
||||
desc.idVendor, desc.idProduct);
|
||||
|
||||
ctx->marker.color = "#00FFFF#FF00FF#FFFF00"; // XXX YMCK too!
|
||||
ctx->marker.name = "Unknown"; // LC1/LC3/LC6/LC8
|
||||
ctx->marker.levelmax = -1;
|
||||
ctx->marker.levelnow = -2;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
|
@ -890,6 +897,16 @@ static int magicard_cmdline_arg(void *vctx, int argc, char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int magicard_query_markers(void *vctx, struct marker **markers, int *count)
|
||||
{
|
||||
struct magicard_ctx *ctx = vctx;
|
||||
|
||||
*markers = &ctx->marker;
|
||||
*count = 1;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
static const char *magicard_prefixes[] = {
|
||||
"magicard",
|
||||
"tango2e", "enduro", "enduroplus",
|
||||
|
@ -898,7 +915,7 @@ static const char *magicard_prefixes[] = {
|
|||
|
||||
struct dyesub_backend magicard_backend = {
|
||||
.name = "Magicard family",
|
||||
.version = "0.11",
|
||||
.version = "0.12",
|
||||
.uri_prefixes = magicard_prefixes,
|
||||
.cmdline_arg = magicard_cmdline_arg,
|
||||
.cmdline_usage = magicard_cmdline,
|
||||
|
@ -907,6 +924,7 @@ struct dyesub_backend magicard_backend = {
|
|||
.teardown = magicard_teardown,
|
||||
.read_parse = magicard_read_parse,
|
||||
.main_loop = magicard_main_loop,
|
||||
.query_markers = magicard_query_markers,
|
||||
.devices = {
|
||||
{ USB_VID_MAGICARD, USB_PID_MAGICARD_TANGO2E, P_MAGICARD, NULL, "tango2e"},
|
||||
{ USB_VID_MAGICARD, USB_PID_MAGICARD_ENDURO, P_MAGICARD, NULL, "enduro"},
|
||||
|
|
|
@ -74,8 +74,29 @@ struct mitsup95d_ctx {
|
|||
uint32_t datalen;
|
||||
|
||||
uint8_t ftr[2];
|
||||
|
||||
struct marker marker;
|
||||
};
|
||||
|
||||
#define QUERYRESP_SIZE_MAX 9
|
||||
|
||||
static const char *mitsup93d_errors(uint8_t code)
|
||||
{
|
||||
switch (code) {
|
||||
case 0x6f: return "Door Open";
|
||||
case 0x50: return "No Paper";
|
||||
default: return "Unknown Error";
|
||||
}
|
||||
}
|
||||
|
||||
static const char *mitsup95d_errors(uint8_t code)
|
||||
{
|
||||
switch (code & 0xf) {
|
||||
case 3: return "Door Open";
|
||||
case 4: return "No Paper";
|
||||
default: return "Unknown Error";
|
||||
}
|
||||
}
|
||||
|
||||
static void *mitsup95d_init(void)
|
||||
{
|
||||
|
@ -89,6 +110,35 @@ static void *mitsup95d_init(void)
|
|||
return ctx;
|
||||
}
|
||||
|
||||
static int mitsup95d_get_status(struct mitsup95d_ctx *ctx, uint8_t *resp)
|
||||
{
|
||||
uint8_t querycmd[4] = { 0x1b, 0x72, 0x00, 0x00 };
|
||||
int ret;
|
||||
int num;
|
||||
|
||||
/* P93D is ... special. Windows switches to this halfway through
|
||||
but it seems be okay to use it everywhere */
|
||||
if (ctx->type == P_MITSU_P93D) {
|
||||
querycmd[2] = 0x03;
|
||||
}
|
||||
|
||||
/* Query Status to sanity-check job */
|
||||
if ((ret = send_data(ctx->dev, ctx->endp_down,
|
||||
querycmd, sizeof(querycmd))))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
ret = read_data(ctx->dev, ctx->endp_up,
|
||||
resp, QUERYRESP_SIZE_MAX, &num);
|
||||
|
||||
if (ret < 0)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
if (ctx->type == P_MITSU_P95D && num != 9) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else if (ctx->type == P_MITSU_P93D && num != 8) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
static int mitsup95d_attach(void *vctx, struct libusb_device_handle *dev,
|
||||
uint8_t endp_up, uint8_t endp_down, uint8_t jobid)
|
||||
{
|
||||
|
@ -108,6 +158,11 @@ static int mitsup95d_attach(void *vctx, struct libusb_device_handle *dev,
|
|||
ctx->type = lookup_printer_type(&mitsup95d_backend,
|
||||
desc.idVendor, desc.idProduct);
|
||||
|
||||
ctx->marker.color = "#000000"; /* Ie black! */
|
||||
ctx->marker.name = "Unknown";
|
||||
ctx->marker.levelmax = -1;
|
||||
ctx->marker.levelnow = -2;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
|
@ -267,21 +322,12 @@ top:
|
|||
|
||||
static int mitsup95d_main_loop(void *vctx, int copies) {
|
||||
struct mitsup95d_ctx *ctx = vctx;
|
||||
uint8_t querycmd[4] = { 0x1b, 0x72, 0x00, 0x00 };
|
||||
uint8_t queryresp[9];
|
||||
|
||||
uint8_t queryresp[QUERYRESP_SIZE_MAX];
|
||||
int ret;
|
||||
int num;
|
||||
|
||||
if (!ctx)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
|
||||
/* P93D is ... special. Windows switches to this halfway through
|
||||
but it seems be okay to use it everywhere */
|
||||
if (ctx->type == P_MITSU_P93D) {
|
||||
querycmd[2] = 0x03;
|
||||
}
|
||||
|
||||
/* Update printjob header to reflect number of requested copies */
|
||||
if (ctx->hdr2[13] != 0xff)
|
||||
ctx->hdr2[13] = copies;
|
||||
|
@ -296,22 +342,13 @@ static int mitsup95d_main_loop(void *vctx, int copies) {
|
|||
|
||||
/* Query Status to make sure printer is idle */
|
||||
do {
|
||||
if ((ret = send_data(ctx->dev, ctx->endp_down,
|
||||
querycmd, sizeof(querycmd))))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
ret = read_data(ctx->dev, ctx->endp_up,
|
||||
queryresp, sizeof(queryresp), &num);
|
||||
if (ret < 0)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
if (ctx->type == P_MITSU_P95D && num != 9) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else if (ctx->type == P_MITSU_P93D && num != 8) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
ret = mitsup95d_get_status(ctx, queryresp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->type == P_MITSU_P95D) {
|
||||
if (queryresp[5] & 0x40) {
|
||||
ERROR("Printer error %02x\n", queryresp[5]); // XXX decode
|
||||
if (queryresp[6] & 0x40) {
|
||||
INFO("Printer Status: %s (%02x)\n", mitsup95d_errors(queryresp[6]), queryresp[6]);
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
if (queryresp[5] == 0x00)
|
||||
|
@ -365,28 +402,13 @@ static int mitsup95d_main_loop(void *vctx, int copies) {
|
|||
return CUPS_BACKEND_FAILED;
|
||||
|
||||
/* Query Status to sanity-check job */
|
||||
if ((ret = send_data(ctx->dev, ctx->endp_down,
|
||||
querycmd, sizeof(querycmd))))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
ret = read_data(ctx->dev, ctx->endp_up,
|
||||
queryresp, sizeof(queryresp), &num);
|
||||
|
||||
if (ret < 0)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
if (ctx->type == P_MITSU_P95D && num != 9) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else if (ctx->type == P_MITSU_P93D && num != 8) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
|
||||
if (queryresp[5] & 0x40) {
|
||||
ERROR("Printer error %02x\n", queryresp[5]); // XXX decode
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
ret = mitsup95d_get_status(ctx, queryresp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->type == P_MITSU_P95D) {
|
||||
if (queryresp[5] & 0x40) {
|
||||
ERROR("Printer error %02x\n", queryresp[5]); // XXX decode
|
||||
if (queryresp[6] & 0x40) {
|
||||
INFO("Printer Status: %s (%02x)\n", mitsup95d_errors(queryresp[6]), queryresp[6]);
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
if (queryresp[5] != 0x00) {
|
||||
|
@ -395,7 +417,7 @@ static int mitsup95d_main_loop(void *vctx, int copies) {
|
|||
}
|
||||
} else {
|
||||
if (queryresp[6] == 0x45) {
|
||||
ERROR("Printer error %02x\n", queryresp[7]);
|
||||
INFO("Printer Status: %s (%02x)\n", mitsup93d_errors(queryresp[7]), queryresp[7]);
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
if (queryresp[6] != 0x30) {
|
||||
|
@ -416,23 +438,13 @@ static int mitsup95d_main_loop(void *vctx, int copies) {
|
|||
sleep(1);
|
||||
|
||||
/* Query Status */
|
||||
if ((ret = send_data(ctx->dev, ctx->endp_down,
|
||||
querycmd, sizeof(querycmd))))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
ret = read_data(ctx->dev, ctx->endp_up,
|
||||
queryresp, sizeof(queryresp), &num);
|
||||
|
||||
if (ret < 0)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
if (ctx->type == P_MITSU_P95D && num != 9) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else if (ctx->type == P_MITSU_P93D && num != 8) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
ret = mitsup95d_get_status(ctx, queryresp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->type == P_MITSU_P95D) {
|
||||
if (queryresp[5] & 0x40) {
|
||||
ERROR("Printer error %02x\n", queryresp[5]); // XXX decode
|
||||
if (queryresp[6] & 0x40) {
|
||||
INFO("Printer Status: %s (%02x)\n", mitsup95d_errors(queryresp[6]), queryresp[6]);
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
if (queryresp[5] == 0x00)
|
||||
|
@ -446,7 +458,7 @@ static int mitsup95d_main_loop(void *vctx, int copies) {
|
|||
}
|
||||
} else {
|
||||
if (queryresp[6] == 0x45) {
|
||||
ERROR("Printer error %02x\n", queryresp[7]);
|
||||
INFO("Printer Status: %s (%02x)\n", mitsup93d_errors(queryresp[7]), queryresp[7]);
|
||||
return CUPS_BACKEND_STOP;
|
||||
}
|
||||
if (queryresp[6] == 0x30)
|
||||
|
@ -464,31 +476,18 @@ static int mitsup95d_main_loop(void *vctx, int copies) {
|
|||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
static int mitsup95d_get_status(struct mitsup95d_ctx *ctx)
|
||||
static int mitsup95d_dump_status(struct mitsup95d_ctx *ctx)
|
||||
{
|
||||
uint8_t querycmd[4] = { 0x1b, 0x72, 0x00, 0x00 };
|
||||
uint8_t queryresp[9];
|
||||
uint8_t queryresp[QUERYRESP_SIZE_MAX];
|
||||
int ret;
|
||||
int num;
|
||||
|
||||
/* Query Status to sanity-check job */
|
||||
if ((ret = send_data(ctx->dev, ctx->endp_down,
|
||||
querycmd, sizeof(querycmd))))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
ret = read_data(ctx->dev, ctx->endp_up,
|
||||
queryresp, sizeof(queryresp), &num);
|
||||
|
||||
if (ret < 0)
|
||||
return CUPS_BACKEND_FAILED;
|
||||
if (ctx->type == P_MITSU_P95D && num != 9) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
} else if (ctx->type == P_MITSU_P93D && num != 8) {
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
ret = mitsup95d_get_status(ctx, queryresp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ctx->type == P_MITSU_P95D) {
|
||||
if (queryresp[5] & 0x40) {
|
||||
INFO("Printer Status: error %02x\n", queryresp[5]);
|
||||
if (queryresp[6] & 0x40) {
|
||||
INFO("Printer Status: %s (%02x)\n", mitsup95d_errors(queryresp[6]), queryresp[6]);
|
||||
} else if (queryresp[5] == 0x00) {
|
||||
INFO("Printer Status: Idle\n");
|
||||
} else if (queryresp[5] == 0x02 && queryresp[7] > 0) {
|
||||
|
@ -496,9 +495,9 @@ static int mitsup95d_get_status(struct mitsup95d_ctx *ctx)
|
|||
}
|
||||
} else {
|
||||
if (queryresp[6] == 0x45) {
|
||||
INFO("Printer Status: error %02x\n", queryresp[7]);
|
||||
INFO("Printer Status: %s (%02x)\n", mitsup93d_errors(queryresp[7]), queryresp[7]);
|
||||
} else if (queryresp[6] == 0x30) {
|
||||
INFO("Printer Status: Idle");
|
||||
INFO("Printer Status: Idle\n");
|
||||
} else if (queryresp[6] == 0x43 && queryresp[7] > 0) {
|
||||
INFO("Printer Status: Printing (%d) copies remaining\n", queryresp[7]);
|
||||
}
|
||||
|
@ -524,7 +523,7 @@ static int mitsup95d_cmdline_arg(void *vctx, int argc, char **argv)
|
|||
switch(i) {
|
||||
GETOPT_PROCESS_GLOBAL
|
||||
case 's':
|
||||
j = mitsup95d_get_status(ctx);
|
||||
j = mitsup95d_dump_status(ctx);
|
||||
break;
|
||||
default:
|
||||
break; /* Ignore completely */
|
||||
|
@ -536,6 +535,32 @@ static int mitsup95d_cmdline_arg(void *vctx, int argc, char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mitsup95d_query_markers(void *vctx, struct marker **markers, int *count)
|
||||
{
|
||||
struct mitsup95d_ctx *ctx = vctx;
|
||||
uint8_t queryresp[QUERYRESP_SIZE_MAX];
|
||||
|
||||
if (mitsup95d_get_status(ctx, queryresp))
|
||||
return CUPS_BACKEND_FAILED;
|
||||
|
||||
ctx->marker.levelnow = -3;
|
||||
|
||||
if (ctx->type == P_MITSU_P95D) {
|
||||
if (queryresp[6] & 0x40) {
|
||||
ctx->marker.levelnow = 0;
|
||||
}
|
||||
} else {
|
||||
if (queryresp[6] == 0x45) {
|
||||
ctx->marker.levelnow = 0;
|
||||
}
|
||||
}
|
||||
|
||||
*markers = &ctx->marker;
|
||||
*count = 1;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
static const char *mitsup95d_prefixes[] = {
|
||||
"mitsup9x",
|
||||
"mitsup95d", "mitsup93d",
|
||||
|
@ -545,7 +570,7 @@ static const char *mitsup95d_prefixes[] = {
|
|||
/* Exported */
|
||||
struct dyesub_backend mitsup95d_backend = {
|
||||
.name = "Mitsubishi P93D/P95D",
|
||||
.version = "0.07",
|
||||
.version = "0.08",
|
||||
.uri_prefixes = mitsup95d_prefixes,
|
||||
.cmdline_arg = mitsup95d_cmdline_arg,
|
||||
.cmdline_usage = mitsup95d_cmdline,
|
||||
|
@ -554,6 +579,7 @@ struct dyesub_backend mitsup95d_backend = {
|
|||
.teardown = mitsup95d_teardown,
|
||||
.read_parse = mitsup95d_read_parse,
|
||||
.main_loop = mitsup95d_main_loop,
|
||||
.query_markers = mitsup95d_query_markers,
|
||||
.devices = {
|
||||
{ USB_VID_MITSU, USB_PID_MITSU_P93D, P_MITSU_P93D, NULL, "mitsup93d"},
|
||||
{ USB_VID_MITSU, USB_PID_MITSU_P95D, P_MITSU_P95D, NULL, "mitsup95d"},
|
||||
|
@ -705,12 +731,14 @@ struct dyesub_backend mitsup95d_backend = {
|
|||
STATUS query
|
||||
|
||||
-> 1b 72 00 00
|
||||
<- e4 72 00 00 04 XX 00 YY 00
|
||||
<- e4 72 00 00 04 XX ZZ YY 00
|
||||
|
||||
YY == remaining copies
|
||||
XX == Status?
|
||||
00 == Idle
|
||||
02 == Printing
|
||||
ZZ == Error!
|
||||
00 == None
|
||||
43 == Door open
|
||||
44 == No Paper
|
||||
4? == "Button"
|
||||
|
|
|
@ -58,6 +58,8 @@ struct updr150_ctx {
|
|||
int datalen;
|
||||
|
||||
uint32_t copies_offset;
|
||||
|
||||
struct marker marker;
|
||||
};
|
||||
|
||||
static void* updr150_init(void)
|
||||
|
@ -92,6 +94,11 @@ static int updr150_attach(void *vctx, struct libusb_device_handle *dev,
|
|||
|
||||
ctx->copies_offset = 0;
|
||||
|
||||
ctx->marker.color = "#00FFFF#FF00FF#FFFF00";
|
||||
ctx->marker.name = "Unknown";
|
||||
ctx->marker.levelmax = -1;
|
||||
ctx->marker.levelnow = -2;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
|
@ -279,6 +286,16 @@ static int updr150_cmdline_arg(void *vctx, int argc, char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int updr150_query_markers(void *vctx, struct marker **markers, int *count)
|
||||
{
|
||||
struct updr150_ctx *ctx = vctx;
|
||||
|
||||
*markers = &ctx->marker;
|
||||
*count = 1;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
static const char *sonyupdr150_prefixes[] = {
|
||||
"sonyupdr150", "sonyupdr200", "sonyupcr10",
|
||||
NULL
|
||||
|
@ -286,7 +303,7 @@ static const char *sonyupdr150_prefixes[] = {
|
|||
|
||||
struct dyesub_backend updr150_backend = {
|
||||
.name = "Sony UP-DR150/UP-DR200/UP-CR10",
|
||||
.version = "0.21",
|
||||
.version = "0.22",
|
||||
.uri_prefixes = sonyupdr150_prefixes,
|
||||
.cmdline_arg = updr150_cmdline_arg,
|
||||
.init = updr150_init,
|
||||
|
@ -294,6 +311,7 @@ struct dyesub_backend updr150_backend = {
|
|||
.teardown = updr150_teardown,
|
||||
.read_parse = updr150_read_parse,
|
||||
.main_loop = updr150_main_loop,
|
||||
.query_markers = updr150_query_markers,
|
||||
.devices = {
|
||||
{ USB_VID_SONY, USB_PID_SONY_UPDR150, P_SONY_UPDR150, NULL, "sonyupdr150"},
|
||||
{ USB_VID_SONY, USB_PID_SONY_UPDR200, P_SONY_UPDR150, NULL, "sonyupdr200"},
|
||||
|
|
Loading…
Reference in a new issue