|
|
|
@ -45,12 +45,12 @@ |
|
|
|
|
#define USB_PID_MITSU_9550DS 0x03A5 // or DZ/DZS/DZU
|
|
|
|
|
#define USB_PID_MITSU_9600D 0x03A9 |
|
|
|
|
//#define USB_PID_MITSU_9600DS XXXXXX
|
|
|
|
|
#define USB_PID_MITSU_CP30D 0x03AB |
|
|
|
|
#define USB_PID_MITSU_9800D 0x03AD |
|
|
|
|
#define USB_PID_MITSU_9800DS 0x03AE |
|
|
|
|
#define USB_PID_MITSU_98__D 0x3B21 |
|
|
|
|
//#define USB_PID_MITSU_9810D XXXXXX
|
|
|
|
|
//#define USB_PID_MITSU_9820DS XXXXXX
|
|
|
|
|
//#define USB_PID_MITSU_CP30D XXXXXX
|
|
|
|
|
|
|
|
|
|
/* Spool file structures */ |
|
|
|
|
|
|
|
|
@ -144,14 +144,21 @@ struct mitsu9550_ctx { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/* Printer data structures */ |
|
|
|
|
#define CP9XXXX_STS_STS3 0x20 |
|
|
|
|
#define CP9XXXX_STS_STS2 0x21 /* mitsu9550_status2 */ |
|
|
|
|
#define CP9XXXX_STS_STS5 0x22 |
|
|
|
|
#define CP9XXXX_STS_STS4 0x23 |
|
|
|
|
#define CP9XXXX_STS_MEDIA 0x24 /* mitsu9550_media */ |
|
|
|
|
#define CP9XXXX_STS_STS1 0x30 /* mitsu9550_status */ |
|
|
|
|
|
|
|
|
|
struct mitsu9550_media { |
|
|
|
|
uint8_t hdr[2]; /* 24 2e */ |
|
|
|
|
uint8_t unk[12]; |
|
|
|
|
uint8_t type; |
|
|
|
|
uint8_t unka[13]; |
|
|
|
|
uint16_t max; /* BE, prints per media */ |
|
|
|
|
uint8_t unkb[2]; |
|
|
|
|
uint16_t remain; /* BE, prints remaining */ |
|
|
|
|
uint16_t remain2; /* BE, prints remaining (CP30)*/ |
|
|
|
|
uint16_t remain; /* BE, prints remaining (Everything else) */ |
|
|
|
|
uint8_t unkc[14]; |
|
|
|
|
} __attribute__((packed)); |
|
|
|
|
|
|
|
|
@ -191,17 +198,21 @@ static int mitsu9550_main_loop(void *vctx, const void *vjob); |
|
|
|
|
struct mitsu9550_media *media = (struct mitsu9550_media *) rdbuf; \
|
|
|
|
|
uint16_t donor; \
|
|
|
|
|
/* media */ \
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 0, 0, 1); \
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_MEDIA); \
|
|
|
|
|
if (ret < 0) \
|
|
|
|
|
return CUPS_BACKEND_FAILED; \
|
|
|
|
|
\
|
|
|
|
|
donor = be16_to_cpu(media->remain); \
|
|
|
|
|
if (ctx->conn->type == P_MITSU_CP30D) { \
|
|
|
|
|
donor = be16_to_cpu(media->remain2); \
|
|
|
|
|
} else { \
|
|
|
|
|
donor = be16_to_cpu(media->remain); \
|
|
|
|
|
} \
|
|
|
|
|
if (donor != ctx->marker.levelnow) { \
|
|
|
|
|
ctx->marker.levelnow = donor; \
|
|
|
|
|
dump_markers(&ctx->marker, 1, 0); \
|
|
|
|
|
} \
|
|
|
|
|
/* Sanity-check media response */ \
|
|
|
|
|
if (media->remain == 0 || media->max == 0) { \
|
|
|
|
|
if ((media->remain == 0 && media->remain2 == 0) || media->max == 0) { \
|
|
|
|
|
ERROR("Printer out of media!\n"); \
|
|
|
|
|
return CUPS_BACKEND_HOLD; \
|
|
|
|
|
} \
|
|
|
|
@ -210,11 +221,11 @@ static int mitsu9550_main_loop(void *vctx, const void *vjob); |
|
|
|
|
return CUPS_BACKEND_HOLD; \
|
|
|
|
|
} \
|
|
|
|
|
/* status2 */ \
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 0, 1, 0); \
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_STS2); \
|
|
|
|
|
if (ret < 0) \
|
|
|
|
|
return CUPS_BACKEND_FAILED; \
|
|
|
|
|
/* status */ \
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 1, 0, 0); \
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_STS1); \
|
|
|
|
|
if (ret < 0) \
|
|
|
|
|
return CUPS_BACKEND_FAILED; \
|
|
|
|
|
\
|
|
|
|
@ -261,7 +272,7 @@ static int mitsu98xx_fillmatte(struct mitsu9550_printjob *job) |
|
|
|
|
return CUPS_BACKEND_OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mitsu9550_get_status(struct mitsu9550_ctx *ctx, uint8_t *resp, int status, int status2, int media); |
|
|
|
|
static int mitsu9550_get_status(struct mitsu9550_ctx *ctx, uint8_t *resp, int type); |
|
|
|
|
static const char *mitsu9550_media_types(uint8_t type, uint8_t is_s); |
|
|
|
|
|
|
|
|
|
static void *mitsu9550_init(void) |
|
|
|
@ -312,7 +323,7 @@ static int mitsu9550_attach(void *vctx, struct dyesub_connection *conn, uint8_t |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (test_mode < TEST_MODE_NOATTACH) { |
|
|
|
|
if (mitsu9550_get_status(ctx, (uint8_t*) &media, 0, 0, 1)) |
|
|
|
|
if (mitsu9550_get_status(ctx, (uint8_t*) &media, CP9XXXX_STS_MEDIA)) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
} else { |
|
|
|
|
int media_code = 0x2; |
|
|
|
@ -321,6 +332,7 @@ static int mitsu9550_attach(void *vctx, struct dyesub_connection *conn, uint8_t |
|
|
|
|
|
|
|
|
|
media.max = cpu_to_be16(400); |
|
|
|
|
media.remain = cpu_to_be16(330); |
|
|
|
|
media.remain2 = cpu_to_be16(330); |
|
|
|
|
media.type = media_code; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -328,7 +340,12 @@ static int mitsu9550_attach(void *vctx, struct dyesub_connection *conn, uint8_t |
|
|
|
|
ctx->marker.name = mitsu9550_media_types(media.type, ctx->is_s); |
|
|
|
|
ctx->marker.numtype = media.type; |
|
|
|
|
ctx->marker.levelmax = be16_to_cpu(media.max); |
|
|
|
|
ctx->marker.levelnow = be16_to_cpu(media.remain); |
|
|
|
|
|
|
|
|
|
if (ctx->conn->type == P_MITSU_CP30D) { |
|
|
|
|
ctx->marker.levelnow = be16_to_cpu(media.remain2); |
|
|
|
|
} else { |
|
|
|
|
ctx->marker.levelnow = be16_to_cpu(media.remain); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return CUPS_BACKEND_OK; |
|
|
|
|
} |
|
|
|
@ -635,7 +652,7 @@ hdr_done: |
|
|
|
|
return CUPS_BACKEND_OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mitsu9550_get_status(struct mitsu9550_ctx *ctx, uint8_t *resp, int status, int status2, int media) |
|
|
|
|
static int mitsu9550_get_status(struct mitsu9550_ctx *ctx, uint8_t *resp, int type) |
|
|
|
|
{ |
|
|
|
|
struct mitsu9550_cmd cmd; |
|
|
|
|
int num, ret; |
|
|
|
@ -643,12 +660,7 @@ static int mitsu9550_get_status(struct mitsu9550_ctx *ctx, uint8_t *resp, int st |
|
|
|
|
/* Send Printer Query */ |
|
|
|
|
cmd.cmd[0] = 0x1b; |
|
|
|
|
cmd.cmd[1] = 0x56; |
|
|
|
|
if (status) |
|
|
|
|
cmd.cmd[2] = 0x30; |
|
|
|
|
else if (status2) |
|
|
|
|
cmd.cmd[2] = 0x21; |
|
|
|
|
else if (media) |
|
|
|
|
cmd.cmd[2] = 0x24; |
|
|
|
|
cmd.cmd[2] = type; |
|
|
|
|
cmd.cmd[3] = 0x00; |
|
|
|
|
if ((ret = send_data(ctx->conn, |
|
|
|
|
(uint8_t*) &cmd, sizeof(cmd)))) |
|
|
|
@ -894,7 +906,7 @@ static int validate_media(int type, int media, int cols, int rows) |
|
|
|
|
return 1; |
|
|
|
|
// XXX validate media type vs job size. Don't know readback codes.
|
|
|
|
|
// S == 1600x1200
|
|
|
|
|
// L == 1600x2100
|
|
|
|
|
// L == 1600x2100 ( type 00 ?)
|
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
WARNING("Unknown printer type %d\n", type); |
|
|
|
@ -1151,25 +1163,29 @@ top: |
|
|
|
|
struct mitsu9550_media *media = (struct mitsu9550_media *) rdbuf; |
|
|
|
|
uint16_t donor; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 0, 0, 1); // media
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_MEDIA); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
donor = be16_to_cpu(media->remain); |
|
|
|
|
if (ctx->conn->type == P_MITSU_CP30D) { |
|
|
|
|
donor = be16_to_cpu(media->remain2); |
|
|
|
|
} else { |
|
|
|
|
donor = be16_to_cpu(media->remain); |
|
|
|
|
} |
|
|
|
|
if (donor != ctx->marker.levelnow) { |
|
|
|
|
ctx->marker.levelnow = donor; |
|
|
|
|
dump_markers(&ctx->marker, 1, 0); |
|
|
|
|
} |
|
|
|
|
/* Sanity-check media response */ |
|
|
|
|
if (media->remain == 0 || media->max == 0) { |
|
|
|
|
if ((media->remain == 0 && media->remain2 == 0) || media->max == 0) { |
|
|
|
|
ERROR("Printer out of media!\n"); |
|
|
|
|
return CUPS_BACKEND_HOLD; |
|
|
|
|
} |
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 0, 1, 0); // status2
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_STS2); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 1, 0, 0); // status
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_STS1); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
@ -1248,25 +1264,29 @@ top: |
|
|
|
|
struct mitsu9550_media *media = (struct mitsu9550_media *) rdbuf; |
|
|
|
|
uint16_t donor; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 0, 0, 1); // media
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_MEDIA); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
donor = be16_to_cpu(media->remain); |
|
|
|
|
if (ctx->conn->type == P_MITSU_CP30D) { |
|
|
|
|
donor = be16_to_cpu(media->remain2); |
|
|
|
|
} else { |
|
|
|
|
donor = be16_to_cpu(media->remain); |
|
|
|
|
} |
|
|
|
|
if (donor != ctx->marker.levelnow) { |
|
|
|
|
ctx->marker.levelnow = donor; |
|
|
|
|
dump_markers(&ctx->marker, 1, 0); |
|
|
|
|
} |
|
|
|
|
/* Sanity-check media response */ |
|
|
|
|
if (media->remain == 0 || media->max == 0) { |
|
|
|
|
if ((media->remain == 0 && media->remain2 == 0) || media->max == 0) { |
|
|
|
|
ERROR("Printer out of media!\n"); |
|
|
|
|
return CUPS_BACKEND_HOLD; |
|
|
|
|
} |
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 0, 1, 0); // status2
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_STS2); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, 1, 0, 0); // status
|
|
|
|
|
ret = mitsu9550_get_status(ctx, rdbuf, CP9XXXX_STS_STS1); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
@ -1297,12 +1317,12 @@ top: |
|
|
|
|
return CUPS_BACKEND_OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void mitsu9550_dump_media(struct mitsu9550_media *resp, int is_s) |
|
|
|
|
static void mitsu9550_dump_media(struct mitsu9550_ctx *ctx, struct mitsu9550_media *resp) |
|
|
|
|
{ |
|
|
|
|
INFO("Media type : %02x (%s)\n", |
|
|
|
|
resp->type, mitsu9550_media_types(resp->type, is_s)); |
|
|
|
|
resp->type, mitsu9550_media_types(resp->type, ctx->is_s)); |
|
|
|
|
INFO("Media remaining : %03d/%03d\n", |
|
|
|
|
be16_to_cpu(resp->remain), be16_to_cpu(resp->max)); |
|
|
|
|
(ctx->conn->type == P_MITSU_CP30D) ? be16_to_cpu(resp->remain2) : be16_to_cpu(resp->remain), be16_to_cpu(resp->max)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void mitsu9550_dump_status(struct mitsu9550_status *resp) |
|
|
|
@ -1327,10 +1347,10 @@ static int mitsu9550_query_media(struct mitsu9550_ctx *ctx) |
|
|
|
|
struct mitsu9550_media resp; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, 0, 0, 1); |
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, CP9XXXX_STS_MEDIA); |
|
|
|
|
|
|
|
|
|
if (!ret) |
|
|
|
|
mitsu9550_dump_media(&resp, ctx->is_s); |
|
|
|
|
mitsu9550_dump_media(ctx, &resp); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
@ -1340,7 +1360,7 @@ static int mitsu9550_query_status(struct mitsu9550_ctx *ctx) |
|
|
|
|
struct mitsu9550_status resp; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, 1, 0, 0); |
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, CP9XXXX_STS_STS1); |
|
|
|
|
|
|
|
|
|
if (!ret) |
|
|
|
|
mitsu9550_dump_status(&resp); |
|
|
|
@ -1353,7 +1373,7 @@ static int mitsu9550_query_status2(struct mitsu9550_ctx *ctx) |
|
|
|
|
struct mitsu9550_status2 resp; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, 0, 1, 0); |
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, CP9XXXX_STS_STS2); |
|
|
|
|
|
|
|
|
|
if (!ret) |
|
|
|
|
mitsu9550_dump_status2(&resp); |
|
|
|
@ -1361,6 +1381,18 @@ static int mitsu9550_query_status2(struct mitsu9550_ctx *ctx) |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mitsu9550_query_statusX(struct mitsu9550_ctx *ctx) |
|
|
|
|
{ |
|
|
|
|
struct mitsu9550_status2 resp; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, CP9XXXX_STS_STS3); |
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, CP9XXXX_STS_STS4); |
|
|
|
|
ret = mitsu9550_get_status(ctx, (uint8_t*) &resp, CP9XXXX_STS_STS5); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mitsu9550_query_serno(struct dyesub_connection *conn, char *buf, int buf_len) |
|
|
|
|
{ |
|
|
|
|
struct mitsu9550_cmd cmd; |
|
|
|
@ -1446,7 +1478,10 @@ static int mitsu9550_cmdline_arg(void *vctx, int argc, char **argv) |
|
|
|
|
j = mitsu9550_query_media(ctx); |
|
|
|
|
break; |
|
|
|
|
case 's': |
|
|
|
|
j = mitsu9550_query_status(ctx); |
|
|
|
|
if (ctx->conn->type == P_MITSU_CP30D) |
|
|
|
|
j = mitsu9550_query_statusX(ctx); |
|
|
|
|
else |
|
|
|
|
j = mitsu9550_query_status(ctx); |
|
|
|
|
if (!j) |
|
|
|
|
j = mitsu9550_query_status2(ctx); |
|
|
|
|
break; |
|
|
|
@ -1469,10 +1504,14 @@ static int mitsu9550_query_markers(void *vctx, struct marker **markers, int *cou |
|
|
|
|
struct mitsu9550_media media; |
|
|
|
|
|
|
|
|
|
/* Query printer status */ |
|
|
|
|
if (mitsu9550_get_status(ctx, (uint8_t*) &media, 0, 0, 1)) |
|
|
|
|
if (mitsu9550_get_status(ctx, (uint8_t*) &media, CP9XXXX_STS_MEDIA)) |
|
|
|
|
return CUPS_BACKEND_FAILED; |
|
|
|
|
|
|
|
|
|
ctx->marker.levelnow = be16_to_cpu(media.remain); |
|
|
|
|
if (ctx->conn->type == P_MITSU_CP30D) { |
|
|
|
|
ctx->marker.levelnow = be16_to_cpu(media.remain); |
|
|
|
|
} else { |
|
|
|
|
ctx->marker.levelnow = be16_to_cpu(media.remain2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*markers = &ctx->marker; |
|
|
|
|
*count = 1; |
|
|
|
@ -1490,7 +1529,7 @@ static const char *mitsu9550_prefixes[] = { |
|
|
|
|
/* Exported */ |
|
|
|
|
const struct dyesub_backend mitsu9550_backend = { |
|
|
|
|
.name = "Mitsubishi CP9xxx family", |
|
|
|
|
.version = "0.56" " (lib " LIBMITSU_VER ")", |
|
|
|
|
.version = "0.57" " (lib " LIBMITSU_VER ")", |
|
|
|
|
.uri_prefixes = mitsu9550_prefixes, |
|
|
|
|
.cmdline_usage = mitsu9550_cmdline, |
|
|
|
|
.cmdline_arg = mitsu9550_cmdline_arg, |
|
|
|
@ -1512,6 +1551,7 @@ const struct dyesub_backend mitsu9550_backend = { |
|
|
|
|
{ USB_VID_MITSU, USB_PID_MITSU_9550DS, P_MITSU_9550S, NULL, "mitsubishi-9550dz"}, /* Duplicate */ |
|
|
|
|
{ USB_VID_MITSU, USB_PID_MITSU_9600D, P_MITSU_9600, NULL, "mitsubishi-9600dw"}, |
|
|
|
|
// { USB_VID_MITSU, USB_PID_MITSU_9600D, P_MITSU_9600S, NULL, "mitsubishi-9600dw-s"},
|
|
|
|
|
{ USB_VID_MITSU, USB_PID_MITSU_CP30D, P_MITSU_CP30D, NULL, "mitsubishi-cp30dw"}, |
|
|
|
|
{ USB_VID_MITSU, USB_PID_MITSU_9800D, P_MITSU_9800, NULL, "mitsubishi-9800dw"}, |
|
|
|
|
{ USB_VID_MITSU, USB_PID_MITSU_9800D, P_MITSU_9800, NULL, "mitsubishi-9800d"}, /* Duplicate */ |
|
|
|
|
{ USB_VID_MITSU, USB_PID_MITSU_9800DS, P_MITSU_9800S, NULL, "mitsubishi-9800dw-s"}, |
|
|
|
@ -1520,7 +1560,6 @@ const struct dyesub_backend mitsu9550_backend = { |
|
|
|
|
{ USB_VID_MITSU, USB_PID_MITSU_98__D, P_MITSU_9810, NULL, "mitsubishi-9810d"}, /* Duplicate */ |
|
|
|
|
// { USB_VID_MITSU, USB_PID_MITSU_9810D, P_MITSU_9810, NULL, "mitsubishi-9810dw"},
|
|
|
|
|
// { USB_VID_MITSU, USB_PID_MITSU_9820DS, P_MITSU_9820S, NULL, "mitsubishi-9820dw-s"},
|
|
|
|
|
// { USB_VID_MITSU, USB_PID_MITSU_CP30D, P_MITSU_CP30D, NULL, "mitsubishi-cp30dw"},
|
|
|
|
|
{ 0, 0, 0, NULL, NULL} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
@ -1656,9 +1695,9 @@ const struct dyesub_backend mitsu9550_backend = { |
|
|
|
|
Media Query |
|
|
|
|
|
|
|
|
|
-> 1b 56 24 00 |
|
|
|
|
<- 24 2e 00 00 00 00 00 00 00 00 00 00 00 00 TT 00 :: TT = Type |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 MM MM 00 00 :: MM MM = Max prints |
|
|
|
|
NN NN 00 00 00 00 00 00 00 00 00 00 00 00 00 00 :: NN NN = Remaining |
|
|
|
|
<- 24 2e 00 00 00 00 00 00 00 00 00 00 00 00 TT 00 :: TT = Type (!CP30) |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 MM MM N1 N1 :: MM MM = Max prints |
|
|
|
|
NN NN 00 00 00 00 00 00 00 00 00 00 00 00 00 00 :: NN NN = Remaining (!CP30) ; N1 N1 = Remaining (CP30) |
|
|
|
|
|
|
|
|
|
[[ unknown query, 9800-only ]] |
|
|
|
|
|
|
|
|
@ -1670,38 +1709,54 @@ const struct dyesub_backend mitsu9550_backend = { |
|
|
|
|
-> 1b 72 10 00 |
|
|
|
|
<- e4 82 10 00 LL [ 10 unknown bytes. guess. ] |
|
|
|
|
|
|
|
|
|
Status Query |
|
|
|
|
Status Query [All models except CP30] |
|
|
|
|
|
|
|
|
|
-> 1b 56 30 00 |
|
|
|
|
-> 30 2e 00 00 00 00 MM 00 NN NN ZZ 00 00 00 00 00 :: MM, NN, ZZ |
|
|
|
|
QQ RR SS 00 00 00 00 00 00 00 00 00 00 00 00 00 :: QQ, RR, SS |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 TT UU 00 00 :: TT, UU |
|
|
|
|
|
|
|
|
|
Status Query B (not sure what to call this) |
|
|
|
|
Status Query B |
|
|
|
|
|
|
|
|
|
-> 1b 56 20 00 [ CP30 ] |
|
|
|
|
<- 20 2e 00 0a 10 00 00 00 00 00 00 00 CC CC RR RR :: CC == cols |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 :: RR == rows (04b0 for L??) |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
|
|
|
|
|
|
|
|
|
-> 1b 56 21 00 |
|
|
|
|
Status Query C |
|
|
|
|
|
|
|
|
|
-> 1b 56 21 00 [ Most models ] |
|
|
|
|
<- 21 2e 00 80 00 22 a8 0b 00 00 00 00 00 00 00 00 |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 QQ 00 00 00 00 :: QQ == Prints in job? |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 NN NN 0A 00 00 01 :: NN NN = Remaining media |
|
|
|
|
|
|
|
|
|
Status Query C (unknown) |
|
|
|
|
21 2e 00 00 00 20 08 02 00 00 00 00 00 00 00 00 [ CP30 ] |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
|
|
|
|
|
|
|
|
|
-> 1b 56 36 00 |
|
|
|
|
<- ??? 48 bytes? |
|
|
|
|
Status Query D (unknown, possibly lifetime print count?) |
|
|
|
|
|
|
|
|
|
Status Query D (unknown) |
|
|
|
|
-> 1b 56 22 00 [ CP30 ] |
|
|
|
|
<- 22 2e 00 40 00 00 00 00 00 00 00 00 00 00 00 00 |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
|
|
|
|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
|
|
|
|
|
|
|
|
|
-> 1b 56 20 00 |
|
|
|
|
<- ??? 48 bytes? |
|
|
|
|
Status Query E (unknown, possibly firmware versions?) |
|
|
|
|
|
|
|
|
|
Status Query E (unknown) |
|
|
|
|
-> 1b 56 23 00 [ CP30 ] |
|
|
|
|
<- 23 2e 00 00 00 00 32 32 33 46 31 30 32 32 34 42 223F10 224B10 ... 222A10 |
|
|
|
|
31 30 00 00 00 00 00 00 32 32 32 41 31 30 00 00 |
|
|
|
|
00 00 00 05 d9 3f 79 20 00 00 13 97 00 00 00 00 |
|
|
|
|
|
|
|
|
|
-> 1b 56 33 00 |
|
|
|
|
Status Query X (unknown) |
|
|
|
|
|
|
|
|
|
-> 1b 56 36 00 |
|
|
|
|
<- ??? 48 bytes? |
|
|
|
|
|
|
|
|
|
Status Query F (unknown, possibly lifetime print count?) |
|
|
|
|
|
|
|
|
|
-> 1b 56 23 00 |
|
|
|
|
Status Query Y (unknown) |
|
|
|
|
|
|
|
|
|
-> 1b 56 33 00 |
|
|
|
|
<- ??? 48 bytes? |
|
|
|
|
|
|
|
|
|
[[ Job Cancel ]] |
|
|
|
|