mitsu70x: Fix lifetime print counter

* Figuring out a bunch of test stuff
 * Documentation
This commit is contained in:
Solomon Peachy 2021-05-06 22:32:58 -04:00
parent 4a1c7804bd
commit 7ce9bcfecc
1 changed files with 93 additions and 32 deletions

View File

@ -216,16 +216,18 @@ struct mitsu70x_status_deck {
uint8_t mecha_status[2];
uint8_t temperature; /* D70/D80 family only, K60 no? */
uint8_t error_status[3];
uint8_t rsvd_a[10]; /* K60 [1] == temperature? All: [3:6] == some counter in BCD. K60 [9] == ?? */
uint8_t rsvd_a[3]; /* K60 [1] == temperature? */
uint8_t lifetime_prints[4];
uint8_t rsvd_b[3]; /* K60 [3] == ?? */
uint8_t media_brand;
uint8_t media_type;
uint8_t rsvd_b[2];
uint8_t rsvd_c[2];
int16_t capacity; /* media capacity */
int16_t remain; /* media remaining */
uint8_t rsvd_c[2];
uint8_t lifetime_prints[4]; /* lifetime prints on deck + 10, in BCD! */
uint8_t rsvd_d[2]; // Unknown
uint16_t rsvd_e[16]; /* all 80 00 */
uint8_t rsvd_d[2];
uint8_t unknown_ctr[4]; /* lifetime + 10 (EK305), lifetime+41 (D80), in BCD! */
uint8_t rsvd_e[2]; // Unknown
uint16_t rsvd_f[16]; /* all 80 00 */
} __attribute__((packed));
struct mitsu70x_status_ver {
@ -259,21 +261,41 @@ struct mitsu70x_memorystatus_resp {
uint8_t rsvd;
} __attribute__((packed));
// XXX also seen commands 0x67, 0x72, 0x54, 0x6e
struct mitsu70x_calinfo_resp { /* Interpretations valid for ASK300 */
uint8_t hdr[6]; /* e4 6a 36 34 31 00 */
/* Note! All values below are ASCII hex! ie 0x23 -> 0x32 0x33 */
uint8_t adj_horiz[2]; /* 00 -> ff */
uint8_t unk_a[6];
// 46 45 45 43 31 44
uint8_t adj_fine[4]; /* 00DC */
uint8_t adj_m3[2]; /* -100 -> 100 (converted to hex) */
uint8_t unk_c[28];
// 30 30 30 30 46 46 36 34 35 35 30 30
// 46 46 36 34 35 35 30 30 44 43 30 30 30 30 30 30
uint8_t adj_density[4]; /* 6800 -> 9000, def 8000 */
uint8_t adj_24v[4]; /* 0000 -> 00FF */
} __attribute__((packed));
/*
NOTES: Other stuff seen:
1b 72 45 [31 32]
1b 5a 43 00
1b 54 53 90 00 0a 00 00 00 00 00 00 00 00 00 00
1b 54 00 [00 31 32] <-- No resp [00 any, 31 lower, 32 upper???]
1b 45 4a [30 31 32] <-- No resp [30 any deck, 31 is lower, 32 is upper?]
1b 56 34 [31 32]
1b 45 48 [30 31 32] <-- No resp [30 any deck, 31 is lower, 32 is upper?]
1b 72 67 00 00 00
1b 67 18 ... (??)
1b 52 XX 00 <-- XX = something + 0x51
1b 45 4a [30 31 32] <-- No resp [30 any deck, 31 is lower, 32 is upper?]
1b 45 53 00 10 [ ...? ] XX XX . "set printer number"..
1b 52 XX 00 <-- XX = something + 0x51
1b 54 00 [00 31 32] <-- No resp [00 any, 31 lower, 32 upper???]
1b 54 31 00 "feed and cut"
1b 54 53 90 00 0a 00 00 00 00 00 00 00 00 00 00
1b 56 34 [31 32]
1b 5a 43 00
1b 67 18 ... (??)
1b 6a ... Various test commands
1b 6e ... (??)
1b 72 45 [31 32]
1b 72 67 00 00 00
*/
@ -306,6 +328,7 @@ struct mitsu70x_hdr {
} __attribute__((packed));
STATIC_ASSERT(sizeof(struct mitsu70x_hdr) == 512);
STATIC_ASSERT(sizeof(struct mitsu70x_calinfo_resp) == 56);
static int mitsu70x_get_printerstatus(struct mitsu70x_ctx *ctx, struct mitsu70x_printerstatus_resp *resp);
static int mitsu70x_main_loop(void *vctx, const void *vjob);
@ -1315,7 +1338,7 @@ static int mitsu70x_get_printerstatus(struct mitsu70x_ctx *ctx, struct mitsu70x_
cmdbuf[0] = 0x1b;
cmdbuf[1] = 0x56;
cmdbuf[2] = 0x32;
cmdbuf[3] = 0x30; /* or x31 or x32, for SINGLE DECK query!
cmdbuf[3] = 0x30; /* or x31 or x32, for SINGLE DECK lower/upper query!
Results will only have one deck. */
if ((ret = send_data(ctx->conn,
cmdbuf, 4)))
@ -1356,7 +1379,7 @@ static int mitsu70x_test_print(struct mitsu70x_ctx *ctx, int type)
{
uint8_t cmdbuf[14];
int ret, num = 0;
uint8_t resp[26];
uint8_t resp[256];
/* Send Test ON */
memset(cmdbuf, 0, 8);
@ -1435,10 +1458,36 @@ static int mitsu70x_test_print(struct mitsu70x_ctx *ctx, int type)
resp, sizeof(resp), &num); /* Get 5 back */
return ret;
}
#if 0
/* Get vertical & horizontal alignment */
// XXX this HANGS the printer.
static int mitsu70x_test_dump(struct mitsu70x_ctx *ctx)
{
uint8_t cmdbuf[14];
int ret, num = 0;
uint8_t resp[256];
/* Send Test ON */
memset(cmdbuf, 0, 8);
cmdbuf[0] = 0x1b;
cmdbuf[1] = 0x76;
cmdbuf[2] = 0x54;
cmdbuf[3] = 0x45;
cmdbuf[4] = 0x53;
cmdbuf[5] = 0x54;
cmdbuf[6] = 0x4f;
cmdbuf[7] = 0x4e;
if ((ret = send_data(ctx->conn,
cmdbuf, 8)))
return ret;
memset(resp, 0, sizeof(resp));
ret = read_data(ctx->conn,
resp, sizeof(resp), &num); // always e4 44 4f 4e 45
if (ret) return ret;
/* Get calibration parameters */
memset(cmdbuf, 0, 6);
cmdbuf[0] = 0x1b;
cmdbuf[1] = 0x6a;
@ -1450,16 +1499,25 @@ static int mitsu70x_test_print(struct mitsu70x_ctx *ctx, int type)
cmdbuf, 6)))
return ret;
ret = read_data(ctx->conn,
resp, sizeof(resp), &num); // 6 back?
resp, sizeof(resp), &num); // 56 back!
/* To set: 1b 6a 30 70 XX 41 ?? ?? */
/* response is struct mitsu70x_calinfo_resp */
return ret;
/* Horiz = 0x31, range 0x00->0xff */
/* VertA = 0x32, range -1 -> 9 (def 4) */
/* VertB = 0x33, range -4 -> 6 (def 1) */
/* VertC = 0x34, range -1 -> 9 (def 4) */
/* To set calibration: 1b 6a 30 70 XX 41 ?? ??
#endif
where ?? ?? is ASCII representation of hex value
Horiz = 0x31, range 0x00->0xff
VertA = 0x32, range -1 -> 9 (def 4)
VertB = 0x33, range -4 -> 6 (def 1)
VertC = 0x34, range -1 -> 9 (def 4)
Read EEPROM:
-> 1b 6a 36 36 31 00 31 30 30 30 30 30 30 30
<- e4 6a 36 36 31 00 30 30 30 30 30 30 30 30
[ 4096 bytes of eeprom ]
*/
}
static int mitsu70x_set_sleeptime(struct mitsu70x_ctx *ctx, uint8_t time)
@ -2275,7 +2333,7 @@ static int mitsu70x_cmdline_arg(void *vctx, int argc, char **argv)
if (!ctx)
return -1;
while ((i = getopt(argc, argv, GETOPT_LIST_GLOBAL "jk:T:swWX:x:")) >= 0) {
while ((i = getopt(argc, argv, GETOPT_LIST_GLOBAL "jk:tT:swWX:x:")) >= 0) {
switch(i) {
GETOPT_PROCESS_GLOBAL
case 'j':
@ -2287,6 +2345,9 @@ static int mitsu70x_cmdline_arg(void *vctx, int argc, char **argv)
case 's':
j = mitsu70x_query_status(ctx);
break;
case 't':
j = mitsu70x_test_dump(ctx);
break;
case 'T':
j = mitsu70x_test_print(ctx, atoi(optarg));
break;
@ -2427,7 +2488,7 @@ static int mitsu70x_query_stats(void *vctx, struct printerstats *stats)
stats->mediatype[0] = ctx->marker[0].name;
stats->levelmax[0] = ctx->marker[0].levelmax;
stats->levelnow[0] = ctx->marker[0].levelnow;
stats->cnt_life[0] = packed_bcd_to_uint32((char*)resp.lower.lifetime_prints, 4) - 10;
stats->cnt_life[0] = packed_bcd_to_uint32((char*)resp.lower.lifetime_prints, 4);
if (stats->decks == 2) {
stats->name[1] = "Upper";
@ -2435,7 +2496,7 @@ static int mitsu70x_query_stats(void *vctx, struct printerstats *stats)
stats->mediatype[1] = ctx->marker[1].name;
stats->levelmax[1] = ctx->marker[1].levelmax;
stats->levelnow[1] = ctx->marker[1].levelnow;
stats->cnt_life[1] = packed_bcd_to_uint32((char*)resp.upper.lifetime_prints, 4) - 10;
stats->cnt_life[1] = packed_bcd_to_uint32((char*)resp.upper.lifetime_prints, 4);
}
return CUPS_BACKEND_OK;
}
@ -2450,7 +2511,7 @@ static const char *mitsu70x_prefixes[] = {
/* Exported */
const struct dyesub_backend mitsu70x_backend = {
.name = "Mitsubishi CP-D70 family",
.version = "0.102" " (lib " LIBMITSU_VER ")",
.version = "0.103" " (lib " LIBMITSU_VER ")",
.flags = BACKEND_FLAG_DUMMYPRINT,
.uri_prefixes = mitsu70x_prefixes,
.cmdline_usage = mitsu70x_cmdline,