diff --git a/backend_hiti.c b/backend_hiti.c index 1cbab10..b37cfe4 100644 --- a/backend_hiti.c +++ b/backend_hiti.c @@ -54,7 +54,7 @@ struct hiti_cmd { #define CMD_PCC_STP 0x030F /* Set Target Printer (1 arg) XX -- master or slave perhaps? */ /* Request Device Status */ -#define CMD_RDS_RSS 0x0400 /* Request Status Summary (resp is 6 (p51x) or 3 (rest) */ +#define CMD_RDS_RSS 0x0400 /* Request Status Summary */ #define CMD_RDS_RIS 0x0401 /* Request Input Status */ #define CMD_RDS_RIA 0x0403 /* Request Input Alert */ #define CMD_RDS_RJA 0x0405 /* Request Jam Alert */ @@ -286,7 +286,7 @@ struct hiti_efd_sf { struct hiti_extprintdata { uint8_t hdr; /* 0xa5 */ uint16_t len; /* 24bit data length (+8) in BE format, first two bytes */ - uint8_t unk; /* 0x50 */ + uint8_t status; /* 0x50 */ uint16_t cmd; /* 0x8309, BE */ uint8_t lenb; /* LSB of length */ uint16_t startLine; /* Starting line number, BE */ @@ -298,7 +298,7 @@ struct hiti_extprintdata { struct hiti_seht2 { uint8_t hdr; /* 0xa5 */ uint16_t len; /* 24-bit data length (+5) in BE format, first two bytes */ - uint8_t unk; /* 0x50 */ + uint8_t status; /* 0x50 */ uint16_t cmd; /* 0x8303, BE */ uint8_t lenb; /* LSB of length */ uint8_t plane; @@ -505,7 +505,7 @@ static int hiti_sepd(struct hiti_ctx *ctx, uint32_t buf_len, cmd->hdr = 0xa5; cmd->len = cpu_to_be16(buf_len >> 8); - cmd->unk = 0x50; + cmd->status = 0x50; cmd->cmd = cpu_to_be16(CMD_ESD_SEPD); cmd->lenb = buf_len & 0xff; cmd->startLine = cpu_to_be16(startLine); @@ -819,17 +819,18 @@ static int hiti_get_info(struct hiti_ctx *ctx) return CUPS_BACKEND_FAILED; INFO("6x8 prints: %u\n", buf[0]); - int i; - - DEBUG("MAT "); - for (i = 0 ; i < 256 ; i++) { - if (i != 0 && (i % 16 == 0)) { - DEBUG2("\n"); - DEBUG(" "); + if (ctx->conn->type != P_HITI_51X) { + int i; + DEBUG("MAT "); + for (i = 0 ; i < 256 ; i++) { + if (i != 0 && (i % 16 == 0)) { + DEBUG2("\n"); + DEBUG(" "); + } + DEBUG2("%02x ", ctx->matrix[i]); } - DEBUG2("%02x ", ctx->matrix[i]); + DEBUG2("\n"); } - DEBUG2("\n"); // XXX other shit.. @@ -1146,7 +1147,7 @@ static int hiti_seht2(struct hiti_ctx *ctx, uint8_t plane, cmd->hdr = 0xa5; cmd->len = cpu_to_be16(buf_len >> 8); - cmd->unk = 0x50; + cmd->status = 0x50; cmd->cmd = cpu_to_be16(CMD_ESD_SEHT2); cmd->lenb = buf_len & 0xff; cmd->plane = plane; @@ -1173,12 +1174,46 @@ static int hiti_seht2(struct hiti_ctx *ctx, uint8_t plane, return ret; } +static int hiti_cvd(struct hiti_ctx *ctx, uint8_t *buf, uint32_t buf_len) +{ + uint8_t cmdbuf[sizeof(struct hiti_cmd)]; + struct hiti_cmd *cmd = (struct hiti_cmd *)cmdbuf; + int ret, num = 0; + + buf_len += 5; + + cmd->hdr = 0xa5; + cmd->len = cpu_to_be16(buf_len + 3); + cmd->status = 0x50; + cmd->cmd = cpu_to_be16(CMD_EDM_CVD); + + /* Send over command */ + if ((ret = send_data(ctx->conn, (uint8_t*) cmd, sizeof(*cmd)))) { + return ret; + } + + __usleep(10*1000); + + /* Read back command */ + ret = read_data(ctx->conn, cmdbuf, 6, &num); + if (ret) + return ret; + + // XXX check resp length? + + /* Send payload, if any */ + if (buf_len && !ret) { + ret = send_data(ctx->conn, buf, buf_len); + } + + return ret; +} + static int hiti_send_heat_data(struct hiti_ctx *ctx, uint8_t mode, uint8_t matte) { const char *fname = NULL; struct hiti_heattable table; int ret, len; - uint16_t resplen; int mediaver = ctx->ribbonvendor & 0x3f; int mediatype = ((ctx->ribbonvendor & 0xf000) == 0x1000); @@ -1254,26 +1289,22 @@ static int hiti_send_heat_data(struct hiti_ctx *ctx, uint8_t mode, uint8_t matte memset(&table, 0, sizeof(table)); } - resplen = 0; - len = fname ? sizeof(table.y) : 0; - /* Send over the heat tables */ ret = hiti_seht2(ctx, 0, table.y, sizeof(table.y)); if (!ret) ret = hiti_seht2(ctx, 1, table.m, sizeof(table.m)); if (!ret) ret = hiti_seht2(ctx, 2, table.c, sizeof(table.c)); - if (matte) { - ret = hiti_seht2(ctx, 3, table.om, sizeof(table.om)); - } else { - ret = hiti_seht2(ctx, 3, table.o, sizeof(table.o)); + if (!ret) { + if (matte) + ret = hiti_seht2(ctx, 3, table.om, sizeof(table.om)); + else + ret = hiti_seht2(ctx, 3, table.o, sizeof(table.o)); } - len = fname ? sizeof(table.cvd) : 0; - /* And finally, send over the CVD data */ if (!ret) - ret = hiti_docmd(ctx, CMD_EDM_CVD, table.cvd, len, &resplen); + ret = hiti_cvd(ctx, table.cvd, sizeof(table.cvd)); return ret; } @@ -1745,7 +1776,7 @@ static int hiti_main_loop(void *vctx, const void *vjob) int ret; uint32_t err = 0; - uint8_t sts[6]; + uint8_t sts[3]; struct hiti_job jobid; const struct hiti_printjob *job = vjob; @@ -2020,11 +2051,9 @@ static int hiti_query_version(struct hiti_ctx *ctx) static int hiti_query_status(struct hiti_ctx *ctx, uint8_t *sts, uint32_t *err) { int ret; - uint16_t len = (ctx->conn->type == P_HITI_51X) ? 6 : 3; + uint16_t len = 3; uint16_t cmd; - // XXX handle P51x response. - *err = 0; ret = hiti_docmd_resp(ctx, CMD_RDS_RSS, NULL, 0, sts, &len); @@ -2312,9 +2341,9 @@ static int hiti_query_markers(void *vctx, struct marker **markers, int *count) static int hiti_query_stats(void *vctx, struct printerstats *stats) { struct hiti_ctx *ctx = vctx; - uint8_t sts[6]; + uint8_t sts[3]; uint32_t err = 0; - uint32_t tmp[2] = {0, 0}; + uint32_t tmp[2] = {0, 0}; /* Second only used for P51x */ /* Update marker info */ if (hiti_query_markers(ctx, NULL, NULL)) @@ -2377,7 +2406,7 @@ static const char *hiti_prefixes[] = { const struct dyesub_backend hiti_backend = { .name = "HiTi Photo Printers", - .version = "0.26", + .version = "0.27", .uri_prefixes = hiti_prefixes, .cmdline_usage = hiti_cmdline, .cmdline_arg = hiti_cmdline_arg, @@ -2435,5 +2464,4 @@ const struct dyesub_backend hiti_backend = { - Incorporate changes for CS-series card printers - More "Matrix table" decoding work - Investigate Suspicion that HiTi keeps tweaking LUTs and/or Heat tables - - Fix P51x query_status, query_counter, query_statistics */