all: Move to using the common read_data() instead of direct libusb functions.

This commit is contained in:
Solomon Peachy 2013-12-21 22:55:33 -05:00
parent db65d25feb
commit 1888254860
7 changed files with 153 additions and 250 deletions

View File

@ -429,11 +429,10 @@ static int canonselphy_main_loop(void *vctx, int copies) {
int ret, num;
/* Read in the printer status */
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
2000);
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
top:
if (state != last_state) {
@ -442,26 +441,17 @@ top:
}
/* Do it twice to clear initial state */
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
2000);
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
if (ret < 0 || num != READBACK_LEN) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, READBACK_LEN, ctx->endp_up);
if (num != READBACK_LEN) {
ERROR("Short read! (%d/%d)\n", num, READBACK_LEN);
return 4;
}
if (memcmp(rdbuf, rdbuf2, READBACK_LEN)) {
int i;
if (dyesub_debug) {
DEBUG("<- ");
for (i = 0 ; i < num ; i++) {
DEBUG2("%02x ", rdbuf[i]);
}
DEBUG2("\n");
}
memcpy(rdbuf2, rdbuf, READBACK_LEN);
} else if (state == last_state) {
sleep(1);
@ -607,7 +597,7 @@ top:
struct dyesub_backend canonselphy_backend = {
.name = "Canon SELPHY CP/ES",
.version = "0.62",
.version = "0.63",
.uri_prefix = "canonselphy",
.init = canonselphy_init,
.attach = canonselphy_attach,

View File

@ -198,47 +198,29 @@ static uint8_t * dnpds40_resp_cmd(struct dnpds40_ctx *ctx,
return NULL;
/* Read in the response header */
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
(uint8_t*)tmp,
8,
&num,
5000);
if (ret < 0 || num != 8) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, 8, ctx->endp_up);
ret = read_data(ctx->dev, ctx->endp_up,
(uint8_t*)tmp, 8, &num);
if (ret < 0)
return NULL;
}
if (dyesub_debug) {
DEBUG("<- ");
for (i = 0 ; i < num; i++) {
DEBUG2("%02x ", tmp[i]);
}
DEBUG2("\n");
if (num != 8) {
ERROR("Short read! (%d/%d)\n", num, 8);
return NULL;
}
i = atoi(tmp); /* Length of payload in bytes, possibly padded */
respbuf = malloc(i);
/* Read in the actual response */
memset(respbuf, 0, i);
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
respbuf,
i,
&num,
5000);
if (dyesub_debug) {
DEBUG("<- ");
for (i = 0 ; i < num; i++) {
DEBUG2("%02x ", respbuf[i]);
}
DEBUG2("\n");
ret = read_data(ctx->dev, ctx->endp_up,
respbuf, i, &num);
if (ret < 0) {
free(respbuf);
return NULL;
}
if (ret < 0 || num != i) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, i, ctx->endp_up);
if (num != i) {
ERROR("Short read! (%d/%d)\n", num, i);
free(respbuf);
return NULL;
}
@ -909,7 +891,7 @@ static int dnpds40_cmdline_arg(void *vctx, int run, char *arg1, char *arg2)
/* Exported */
struct dyesub_backend dnpds40_backend = {
.name = "DNP DS40/DS80",
.version = "0.20",
.version = "0.21",
.uri_prefix = "dnpds40",
.cmdline_usage = dnpds40_cmdline,
.cmdline_arg = dnpds40_cmdline_arg,

View File

@ -181,14 +181,13 @@ static int kodak1400_set_tonecurve(struct kodak1400_ctx *ctx, char *fname)
cmdbuf, 2)))
return -1;
ret = libusb_bulk_transfer(dev, endp_up,
respbuf,
sizeof(respbuf),
&num,
5000);
ret = read_data(dev, endp_up,
respbuf, sizeof(respbuf), &num);
if (ret < 0 || (num != 8)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
if (ret < 0)
return ret;
if (num != 8) {
ERROR("Short Read! (%d/%d)\n", num, 8);
return ret;
}
if (respbuf[1] != 0x01) {
@ -216,18 +215,17 @@ static int kodak1400_set_tonecurve(struct kodak1400_ctx *ctx, char *fname)
}
/* get the response */
ret = libusb_bulk_transfer(dev, endp_up,
respbuf,
sizeof(respbuf),
&num,
5000);
ret = read_data(dev, endp_up,
respbuf, sizeof(respbuf), &num);
if (ret < 0 || (num != 8)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
if (ret < 0)
return ret;
if (num != 8) {
ERROR("Short Read! (%d/%d)\n", num, 8);
return ret;
}
if (respbuf[1] != 0x00) {
ERROR("Received unexpected response\n");
ERROR("Received unexpected response!\n");
return ret;
}
@ -380,26 +378,12 @@ top:
return ret;
/* Read in the printer status */
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
2000);
if (ret < 0) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, READBACK_LEN, ctx->endp_up);
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
}
if (memcmp(rdbuf, rdbuf2, READBACK_LEN)) {
int i;
if (dyesub_debug) {
DEBUG("<- ");
for (i = 0 ; i < num ; i++) {
DEBUG2("%02x ", rdbuf[i]);
}
DEBUG2("\n");
}
memcpy(rdbuf2, rdbuf, READBACK_LEN);
} else if (state == last_state) {
sleep(1);
@ -570,7 +554,7 @@ top:
struct dyesub_backend kodak1400_backend = {
.name = "Kodak 1400/805",
.version = "0.24",
.version = "0.25",
.uri_prefix = "kodak1400",
.cmdline_usage = kodak1400_cmdline,
.cmdline_arg = kodak1400_cmdline_arg,

View File

@ -168,7 +168,7 @@ static int kodak605_main_loop(void *vctx, int copies) {
uint8_t cmdbuf[CMDBUF_LEN];
int last_state = -1, state = S_IDLE;
int i, num, ret;
int num, ret;
int pending = 0;
if (!ctx)
@ -203,17 +203,13 @@ top:
skip_query:
/* Read in the printer status */
memset(rdbuf, 0, READBACK_LEN);
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
5000);
if (ret < 0 || num < 10) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, READBACK_LEN, ctx->endp_up);
if (ret < 0)
return ret;
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
if (num < 10) {
ERROR("Short read! (%d/%d)\n", num, 10);
return 4;
}
@ -224,13 +220,6 @@ skip_query:
}
if (memcmp(rdbuf, rdbuf2, READBACK_LEN)) {
if (dyesub_debug) {
DEBUG("<- ");
for (i = 0 ; i < num ; i++) {
DEBUG2("%02x ", rdbuf[i]);
}
DEBUG2("\n");
}
memcpy(rdbuf2, rdbuf, READBACK_LEN);
} else if (state == last_state) {
sleep(1);
@ -341,16 +330,13 @@ static int kodak605_get_status(struct kodak605_ctx *ctx)
return ret;
/* Read in the printer status */
memset(rdbuf, 0, sizeof(rdbuf));
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
5000);
if (ret < 0 || num < (int)sizeof(rdbuf)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(rdbuf), ctx->endp_up);
if (ret < 0)
return ret;
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
if (num < (int)sizeof(rdbuf)) {
ERROR("Short Read! (%d/%d)\n", num, (int)sizeof(rdbuf));
return 4;
}
@ -369,7 +355,7 @@ static int kodak605_get_media(struct kodak605_ctx *ctx)
int ret, i, num = 0;
/* Send Status Query */
/* Send Media Query */
cmdbuf[0] = 0x02;
cmdbuf[1] = 0x00;
cmdbuf[2] = 0x00;
@ -379,16 +365,13 @@ static int kodak605_get_media(struct kodak605_ctx *ctx)
return ret;
/* Read in the printer status */
memset(rdbuf, 0, sizeof(rdbuf));
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
5000);
if (ret < 0 || num < (int)sizeof(rdbuf)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(rdbuf), ctx->endp_up);
if (ret < 0)
return ret;
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
if (num < (int)sizeof(rdbuf)) {
ERROR("Short Read! (%d/%d)\n", num, (int)sizeof(rdbuf));
return 4;
}
@ -450,32 +433,23 @@ static int kodak605_set_tonecurve(struct kodak605_ctx *ctx, char *fname)
return -1;
/* Get response back */
ret = libusb_bulk_transfer(dev, endp_up,
respbuf,
sizeof(respbuf),
&num,
5000);
if (ret < 0 || (num != 10)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
ret = read_data(dev, endp_up,
respbuf, sizeof(respbuf), &num);
if (ret < 0)
return ret;
if (num != 10) {
ERROR("Short Read! (%d/%d)\n", num, 10);
return 4;
}
// XXX parse the response?
ret = libusb_bulk_transfer(dev, endp_up,
(uint8_t*) data,
sizeof(respbuf),
&num,
5000);
if (ret < 0 || (num != sizeof(data))) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
return ret;
}
/* Send the data over! */
ret = send_data(dev, endp_up,
(uint8_t*)data, sizeof(data));
/* We're done */
free(data);
return 0;
return ret;
}
@ -507,7 +481,7 @@ static int kodak605_cmdline_arg(void *vctx, int run, char *arg1, char *arg2)
/* Exported */
struct dyesub_backend kodak605_backend = {
.name = "Kodak 605",
.version = "0.10",
.version = "0.12",
.uri_prefix = "kodak605",
.cmdline_usage = kodak605_cmdline,
.cmdline_arg = kodak605_cmdline_arg,

View File

@ -116,16 +116,16 @@ static int kodak6800_get_tonecurve(struct kodak6800_ctx *ctx, char *fname)
if ((ret = send_data(dev, endp_down,
cmdbuf, 16)))
return -1;
ret = libusb_bulk_transfer(dev, endp_up,
respbuf,
sizeof(respbuf),
&num,
5000);
if (ret < 0 || (num != 51)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
return ret;
ret = read_data(dev, endp_up,
respbuf, sizeof(respbuf), &num);
if (ret < 0)
return ret;
if (num != 51) {
ERROR("Short read! (%d/%d)\n", num, 51);
return 4;
}
/* Then we can poll the data */
@ -145,15 +145,14 @@ static int kodak6800_get_tonecurve(struct kodak6800_ctx *ctx, char *fname)
cmdbuf, 11)))
return -1;
ret = libusb_bulk_transfer(dev, endp_up,
respbuf,
sizeof(respbuf),
&num,
5000);
if (ret < 0 || (num != 64)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
ret = read_data(dev, endp_up,
respbuf, sizeof(respbuf), &num);
if (ret < 0)
return ret;
if (num != 64) {
ERROR("Short read! (%d/%d)\n", num, 51);
return 4;
}
/* Copy into buffer */
@ -232,14 +231,14 @@ static int kodak6800_set_tonecurve(struct kodak6800_ctx *ctx, char *fname)
cmdbuf, 16)))
return -1;
ret = libusb_bulk_transfer(dev, endp_up,
respbuf,
sizeof(respbuf),
&num,
5000);
if (ret < 0 || (num != 51)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
ret = read_data(dev, endp_up,
respbuf, sizeof(respbuf), &num);
if (ret < 0)
return ret;
if (num != 51) {
ERROR("Short read! (%d/%d)\n", num, 51);
return 4;
}
ptr = (uint8_t*) data;
@ -258,16 +257,16 @@ static int kodak6800_set_tonecurve(struct kodak6800_ctx *ctx, char *fname)
cmdbuf, count+1)))
return -1;
ret = libusb_bulk_transfer(dev, endp_up,
respbuf,
sizeof(respbuf),
&num,
5000);
if (ret < 0 || (num != 51)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, (int)sizeof(respbuf), endp_up);
return ret;
}
ret = read_data(dev, endp_up,
respbuf, sizeof(respbuf), &num);
if (ret < 0)
return ret;
if (num != 51) {
ERROR("Short read! (%d/%d)\n", num, 51);
return 4;
}
};
/* We're done */
@ -396,7 +395,7 @@ static int kodak6800_main_loop(void *vctx, int copies) {
uint8_t cmdbuf[CMDBUF_LEN];
int last_state = -1, state = S_IDLE;
int i, num, ret;
int num, ret;
int pending = 0;
if (!ctx)
@ -404,7 +403,8 @@ static int kodak6800_main_loop(void *vctx, int copies) {
top:
if (state != last_state) {
DEBUG("last_state %d new %d\n", last_state, state);
if (dyesub_debug)
DEBUG("last_state %d new %d\n", last_state, state);
}
if (pending)
@ -425,17 +425,13 @@ top:
skip_query:
/* Read in the printer status */
memset(rdbuf, 0, READBACK_LEN);
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
5000);
if (ret < 0 || num < 51) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, READBACK_LEN, ctx->endp_up);
if (ret < 0)
return ret;
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
if (num < 51) {
ERROR("Short read! (%d/%d)\n", num, 51);
return 4;
}
@ -448,11 +444,6 @@ skip_query:
// XXX detect media type based on readback?
if (memcmp(rdbuf, rdbuf2, READBACK_LEN)) {
DEBUG("readback: ");
for (i = 0 ; i < num ; i++) {
DEBUG2("%02x ", rdbuf[i]);
}
DEBUG2("\n");
memcpy(rdbuf2, rdbuf, READBACK_LEN);
} else if (state == last_state) {
sleep(1);
@ -604,7 +595,7 @@ skip_query:
/* Exported */
struct dyesub_backend kodak6800_backend = {
.name = "Kodak 6800/6850",
.version = "0.25",
.version = "0.26",
.uri_prefix = "kodak6800",
.cmdline_usage = kodak6800_cmdline,
.cmdline_arg = kodak6800_cmdline_arg,

View File

@ -146,7 +146,7 @@ static int mitsu70x_main_loop(void *vctx, int copies) {
uint8_t cmdbuf[CMDBUF_LEN];
int last_state = -1, state = S_IDLE;
int i, num, ret;
int num, ret;
int pending = 0;
if (!ctx)
@ -182,28 +182,17 @@ top:
skip_query:
/* Read in the printer status */
memset(rdbuf, 0, READBACK_LEN);
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
rdbuf,
READBACK_LEN,
&num,
5000);
ret = read_data(ctx->dev, ctx->endp_up,
rdbuf, READBACK_LEN, &num);
if (ret < 0)
return ret;
if (ret < 0 || num != 26) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num, READBACK_LEN, ctx->endp_up);
if (ret < 0)
return ret;
if (num != 26) {
ERROR("Short Read! (%d/%d)\n", num, 26);
return 4;
}
if (memcmp(rdbuf, rdbuf2, READBACK_LEN)) {
if(dyesub_debug) {
DEBUG("<- ");
for (i = 0 ; i < num ; i++) {
DEBUG2("%02x ", rdbuf[i]);
}
DEBUG2("\n");
}
memcpy(rdbuf2, rdbuf, READBACK_LEN);
} else if (state == last_state) {
sleep(1);
@ -300,11 +289,16 @@ static int mitsu70x_get_status(struct mitsu70x_ctx *ctx)
cmdbuf, 4)))
return ret;
memset(&resp, 0, sizeof(resp));
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
(uint8_t*) &resp,
sizeof(resp),
&num,
5000);
ret = read_data(ctx->dev, ctx->endp_up,
(uint8_t*) &resp, sizeof(resp), &num);
if (ret < 0)
return ret;
if (num != sizeof(resp)) {
ERROR("Short Read! (%d/%d)\n", num, (int)sizeof(resp));
return 4;
}
if (dyesub_debug) {
DEBUG("Status Dump:\n");
for (i = 0 ; i < sizeof(resp.unk) ; i++) {
@ -352,7 +346,7 @@ static int mitsu70x_cmdline_arg(void *vctx, int run, char *arg1, char *arg2)
/* Exported */
struct dyesub_backend mitsu70x_backend = {
.name = "Mitsubishi CP-D70/D707",
.version = "0.06",
.version = "0.07",
.uri_prefix = "mitsu70x",
.cmdline_usage = mitsu70x_cmdline,
.cmdline_arg = mitsu70x_cmdline_arg,

View File

@ -845,15 +845,14 @@ static int s2145_do_cmd(struct shinkos2145_ctx *ctx,
cmd, cmdlen)))
return (ret < 0) ? ret : -99;
ret = libusb_bulk_transfer(dev, endp_up,
rdbuf,
READBACK_LEN,
num,
5000);
ret = read_data(dev, endp_up,
rdbuf, READBACK_LEN, num);
if (ret < 0 || (*num < minlen)) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, *num, minlen, endp_up);
return (ret < 0) ? ret : -99;
if (ret < 0)
return ret;
if (*num < minlen) {
ERROR("Short read! (%d/%d))\n", *num, minlen);
return -99;
}
if (resp->result != RESULT_SUCCESS) {
@ -1205,16 +1204,12 @@ static int get_tonecurve(struct shinkos2145_ctx *ctx, int type, char *fname)
i = 0;
while (i < resp->total_size) {
ret = libusb_bulk_transfer(ctx->dev, ctx->endp_up,
data + i,
resp->total_size * 2 - i,
&num,
5000);
if (ret < 0) {
ERROR("Failure to receive data from printer (libusb error %d: (%d/%d from 0x%02x))\n", ret, num + i, (int)resp->total_size, ctx->endp_up);
ret = read_data(ctx->dev, ctx->endp_up,
data + i,
resp->total_size * 2 - i,
&num);
if (ret < 0)
return ret;
}
i += num;
}
@ -1471,7 +1466,7 @@ static int shinkos2145_read_parse(void *vctx, int data_fd) {
static int shinkos2145_main_loop(void *vctx, int copies) {
struct shinkos2145_ctx *ctx = vctx;
int i, ret, num;
int ret, num;
uint8_t cmdbuf[CMDBUF_LEN];
uint8_t rdbuf2[READBACK_LEN];
@ -1501,13 +1496,6 @@ static int shinkos2145_main_loop(void *vctx, int copies) {
}
if (memcmp(rdbuf, rdbuf2, READBACK_LEN)) {
if (dyesub_debug) {
DEBUG("<- ");
for (i = 0 ; i < num ; i++) {
DEBUG2("%02x ", rdbuf[i]);
}
DEBUG2("\n");
}
memcpy(rdbuf2, rdbuf, READBACK_LEN);
INFO("Printer Status: 0x%02x (%s)\n",
@ -1663,7 +1651,7 @@ static int shinkos2145_query_serno(struct libusb_device_handle *dev, uint8_t end
struct dyesub_backend shinkos2145_backend = {
.name = "Shinko/Sinfonia CHC-S2145 (S2)",
.version = "0.24",
.version = "0.25",
.uri_prefix = "shinkos2145",
.cmdline_usage = shinkos2145_cmdline,
.cmdline_arg = shinkos2145_cmdline_arg,