mitsu70x: Better support for the CP-D707DW

We can now determine job status of upper vs lower deck.

Need better smarts for determinig if we can print.

(Testing provided by a contributor who wishes to remain anonymous!)
This commit is contained in:
Solomon Peachy 2018-08-27 12:15:08 -04:00
parent 3589a09ed3
commit 4b13d56d9d
2 changed files with 60 additions and 22 deletions

6
README
View file

@ -48,7 +48,7 @@
Mitsubishi CP-3800DW
Mitsubishi CP-9550D/DW/DW-S/DZ/DZ-S
Mitsubishi CP-9600D/DW
Mitsubishi CP-D70DW
Mitsubishi CP-D70DW and CP-D707DW
Mitsubishi CP-D80DW
Mitsubishi CP-K60DW-S
Mitsubishi CP-D90DW
@ -67,7 +67,6 @@
Mitsubishi CP-3020D/DE and CP-3020DA/DAE
Mitsubishi CP-9000DW, CP-9500DW, and CP-9600DW-S
Mitsubishi CP-9800DW, CP-9800DW-S, CP-9810DW, and CP-9820DW-S
Mitsubishi CP-D707DW
Olmec OP900
Shinko CHC-S6245 (aka Sinfonia CE1)
Sony UP-CR10L (aka DNP DS-SL10)
@ -655,9 +654,6 @@
Mitsubishi CP-D80DW
Mitsubishi CP-K60DW-S
Fujifilm ASK-300
Untested but believed to work:
Mitsubishi CP-D707DW
Unsupported printers (Unknown VID/PID):

View file

@ -200,7 +200,9 @@ struct mitsu70x_jobstatus {
uint8_t mecha_status[2];
uint8_t temperature;
uint8_t error_status[3];
uint8_t reserved[6];
uint8_t mecha_status_up[2];
uint8_t temperature_up;
uint8_t error_status_up[3];
} __attribute__((packed));
struct mitsu70x_job {
@ -796,9 +798,9 @@ static int mitsu70x_attach(void *vctx, struct libusb_device_handle *dev, int typ
resp.lower.media_type = 0x0f;
}
/* Figure out if we're a D707 with two decks */
if (ctx->type == P_MITSU_D70X &&
resp.upper.mecha_status[0] != MECHA_STATUS_INIT &&
resp.upper.capacity != 0xffff)
resp.upper.mecha_status[0] != MECHA_STATUS_INIT)
ctx->num_decks = 2;
else
ctx->num_decks = 1;
@ -1260,19 +1262,20 @@ done:
list = dyesub_joblist_create(&mitsu70x_backend, ctx);
/* 6x4 can be combined, only on 6x8/6x9" media. */
// XXX TODO: Don't combine if one deck is an exact match!
// XXX what about splitting copies between decks?
can_combine = 0;
if (job->rows == 1218 ||
job->rows == 1228) {
if (ctx->medias[0] == 0xf ||
ctx->medias[0] == 0x5 ||
ctx->medias[1] == 0xf ||
ctx->medias[1] == 0xf || /* Two decks possible */
ctx->medias[1] == 0x5)
can_combine = !job->raw_format;
} else if (job->rows == 1076) {
if (ctx->type == P_KODAK_305 ||
ctx->type == P_MITSU_K60) {
if (ctx->medias[0] == 0x4 ||
ctx->medias[1] == 0x4)
if (ctx->medias[0] == 0x4) /* Only one deck */
can_combine = !job->raw_format;
}
}
@ -1765,9 +1768,22 @@ top:
if (ret)
return CUPS_BACKEND_FAILED;
// XXX TODO: Goal here is to find a deck we can use!
// so... get disposition of both decks.
// figure out which decks are legal to use
/* Make sure temperature is sane */
if (jobstatus.temperature == TEMPERATURE_COOLING) {
INFO("Printer cooling down...\n");
if (ctx->num_decks == 2)
INFO("Lower deck cooling down...\n");
else
INFO("Printer cooling down...\n");
sleep(1);
goto top;
}
if (ctx->num_decks == 2 &&
jobstatus.temperature_up == TEMPERATURE_COOLING) {
INFO("Upper deck cooling down...\n");
sleep(1);
goto top;
}
@ -1875,7 +1891,7 @@ skip_status:
hdr->jobid = cpu_to_be16(ctx->jobid);
/* Set deck */
if (ctx->type == P_MITSU_D70X) {
q if (ctx->type == P_MITSU_D70X) {
hdr->deck = 0; /* D70 use automatic deck selection */
/* XXX alternatively route it based on state and media? */
} else {
@ -1949,6 +1965,8 @@ skip_status:
if (ret)
return CUPS_BACKEND_FAILED;
// XXX need to examine status of the correct deck for the job!
/* See if we hit a printer error. */
if (jobstatus.error_status[0]) {
ERROR("%s/%s -> %s: %02x/%02x/%02x\n",
@ -1973,6 +1991,7 @@ skip_status:
jobstatus.job_status[2],
jobstatus.job_status[3]);
/* Check for job completion */
if (jobstatus.job_status[0] == JOB_STATUS0_END) {
if (jobstatus.job_status[1] ||
jobstatus.job_status[2] ||
@ -2106,15 +2125,38 @@ static int mitsu70x_query_jobs(struct mitsu70x_ctx *ctx)
INFO("JOB00 ID : %06u\n", jobstatus.jobid);
INFO("JOB00 status : %s\n", mitsu70x_jobstatuses(jobstatus.job_status));
INFO("Power Status: %s\n", jobstatus.power ? "Sleeping" : "Awake");
INFO("Mechanical Status: %s\n",
mitsu70x_mechastatus(jobstatus.mecha_status));
if (jobstatus.error_status[0]) {
INFO("%s/%s -> %s\n",
mitsu70x_errorclass(jobstatus.error_status),
mitsu70x_errors(jobstatus.error_status),
mitsu70x_errorrecovery(jobstatus.error_status));
if (ctx->num_decks == 2) {
INFO("Lower Deck Mechanical Status: %s\n",
mitsu70x_mechastatus(jobstatus.mecha_status));
if (jobstatus.error_status[0]) {
INFO("%s/%s -> %s\n",
mitsu70x_errorclass(jobstatus.error_status),
mitsu70x_errors(jobstatus.error_status),
mitsu70x_errorrecovery(jobstatus.error_status));
}
INFO("Lower Deck Temperature: %s\n", mitsu70x_temperatures(jobstatus.temperature));
INFO("Upper Deck Mechanical Status: %s\n",
mitsu70x_mechastatus(jobstatus.mecha_status_up));
if (jobstatus.error_status[0]) {
INFO("%s/%s -> %s\n",
mitsu70x_errorclass(jobstatus.error_status_up),
mitsu70x_errors(jobstatus.error_status_up),
mitsu70x_errorrecovery(jobstatus.error_status_up));
}
INFO("Lower Deck Temperature: %s\n", mitsu70x_temperatures(jobstatus.temperature_up));
} else {
INFO("Mechanical Status: %s\n",
mitsu70x_mechastatus(jobstatus.mecha_status));
if (jobstatus.error_status[0]) {
INFO("%s/%s -> %s\n",
mitsu70x_errorclass(jobstatus.error_status),
mitsu70x_errors(jobstatus.error_status),
mitsu70x_errorrecovery(jobstatus.error_status));
}
INFO("Temperature: %s\n", mitsu70x_temperatures(jobstatus.temperature));
}
INFO("Temperature: %s\n", mitsu70x_temperatures(jobstatus.temperature));
// memory status?
#if 0
@ -2267,7 +2309,7 @@ static const char *mitsu70x_prefixes[] = {
/* Exported */
struct dyesub_backend mitsu70x_backend = {
.name = "Mitsubishi CP-D70 family",
.version = "0.82",
.version = "0.83",
.uri_prefixes = mitsu70x_prefixes,
.flags = BACKEND_FLAG_JOBLIST,
.cmdline_usage = mitsu70x_cmdline,