all: Add in "Unknown" marker reporting for the rest.

This commit is contained in:
Solomon Peachy 2018-04-29 14:07:08 -04:00
parent 03cce1efc8
commit b4e1c769bb
4 changed files with 171 additions and 89 deletions

View file

@ -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"},

View file

@ -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"},

View file

@ -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"

View file

@ -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"},