dnpds80: Improvements gleamed from playing with the windows driver:

* Query serial number (yay!)
 * Query the 'PQTY' counter, not sure what that is.
 * Query 'Media ID set", not sure what that is.
 * Clear counter command fixed.
This commit is contained in:
Solomon Peachy 2013-12-16 20:15:48 -05:00
parent 84a755f785
commit fefaaa1e47
1 changed files with 79 additions and 8 deletions

View File

@ -54,8 +54,8 @@ struct dnpds40_ctx {
};
struct dnpds40_cmd {
uint8_t esc;
uint8_t p;
uint8_t esc; /* Fixed at ascii ESC, aka 0x1B */
uint8_t p; /* Fixed at ascii 'P' aka 0x50 */
uint8_t arg1[6];
uint8_t arg2[16];
uint8_t arg3[8]; /* Decimal value of arg4's length, or empty */
@ -69,13 +69,16 @@ struct dnpds40_cmd {
static void dnpds40_build_cmd(struct dnpds40_cmd *cmd, char *arg1, char *arg2, uint32_t arg3_len)
{
char buf[9];
memset(cmd, 0x20, sizeof(*cmd));
cmd->esc = 0x1b;
cmd->p = 0x50;
memcpy(cmd->arg1, arg1, min(strlen(arg1), sizeof(cmd->arg1)));
memcpy(cmd->arg2, arg2, min(strlen(arg2), sizeof(cmd->arg2)));
if (arg3_len)
snprintf((char*)cmd->arg3, 8, "%08d", arg3_len);
if (arg3_len) {
snprintf(buf, sizeof(buf), "%08d", arg3_len);
memcpy(cmd->arg3, buf, 8);
}
}
@ -236,6 +239,35 @@ static uint8_t * dnpds40_resp_cmd(struct dnpds40_ctx *ctx,
return respbuf;
}
static int dnpds40_query_serno(struct libusb_device_handle *dev, uint8_t endp_up, uint8_t endp_down, char *buf, int buf_len)
{
struct dnpds40_cmd cmd;
uint8_t *resp;
int len = 0;
struct dnpds40_ctx ctx = {
.dev = dev,
.endp_up = endp_up,
.endp_down = endp_down,
};
/* Get Serial Number */
dnpds40_build_cmd(&cmd, "INFO", "SERIAL_NUMBER", 0);
resp = dnpds40_resp_cmd(&ctx, &cmd, &len);
if (!resp)
return -1;
dnpds40_cleanup_string((char*)resp, len);
strncpy(buf, (char*)resp, buf_len);
buf[buf_len-1] = 0;
free(resp);
return 0;
}
static void *dnpds40_init(void)
{
struct dnpds40_ctx *ctx = malloc(sizeof(struct dnpds40_ctx));
@ -398,6 +430,19 @@ static int dnpds40_get_info(struct dnpds40_ctx *ctx)
uint8_t *resp;
int len = 0;
/* Get Serial Number */
dnpds40_build_cmd(&cmd, "INFO", "SERIAL_NUMBER", 0);
resp = dnpds40_resp_cmd(ctx, &cmd, &len);
if (!resp)
return -1;
dnpds40_cleanup_string((char*)resp, len);
INFO("Serial Number: '%s'\n", (char*)resp);
free(resp);
/* Get Firmware Version */
dnpds40_build_cmd(&cmd, "INFO", "FVER", 0);
@ -475,6 +520,19 @@ static int dnpds40_get_info(struct dnpds40_ctx *ctx)
free(resp);
/* Get Qty of prints made on this media? */
dnpds40_build_cmd(&cmd, "INFO", "PQTY", 0);
resp = dnpds40_resp_cmd(ctx, &cmd, &len);
if (!resp)
return -1;
dnpds40_cleanup_string((char*)resp, len);
INFO("Prints Performed(?): '%s'\n", (char*)resp + 4);
free(resp);
/* Get Horizonal resolution */
dnpds40_build_cmd(&cmd, "INFO", "RESOLUTION_H", 0);
@ -530,6 +588,19 @@ static int dnpds40_get_info(struct dnpds40_ctx *ctx)
free(resp);
/* Get Media ID Set (?) */
dnpds40_build_cmd(&cmd, "MNT_RD", "MEDIA_ID_SET", 0);
resp = dnpds40_resp_cmd(ctx, &cmd, &len);
if (!resp)
return -1;
dnpds40_cleanup_string((char*)resp, len);
INFO("Media ID(?): '%s'\n", (char*)resp+4);
free(resp);
return 0;
}
@ -652,7 +723,6 @@ static int dnpds40_get_counters(struct dnpds40_ctx *ctx)
free(resp);
return 0;
}
@ -663,10 +733,10 @@ static int dnpds40_clear_counter(struct dnpds40_ctx *ctx, char counter)
int ret;
/* Generate command */
dnpds40_build_cmd(&cmd, "MNT_WT", "COUNTER_CLR", 4);
dnpds40_build_cmd(&cmd, "MNT_WT", "COUNTER_CLEAR", 4);
msg[0] = 'C';
msg[1] = counter;
msg[2] = 0x0d;
msg[2] = 0x0d; /* ie carriage return, ASCII '\r' */
msg[3] = 0x00;
if ((ret = dnpds40_do_cmd(ctx, &cmd, (uint8_t*)msg, 4)))
@ -733,7 +803,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.13",
.version = "0.14",
.uri_prefix = "dnpds40",
.cmdline_usage = dnpds40_cmdline,
.cmdline_arg = dnpds40_cmdline_arg,
@ -742,6 +812,7 @@ struct dyesub_backend dnpds40_backend = {
.teardown = dnpds40_teardown,
.read_parse = dnpds40_read_parse,
.main_loop = dnpds40_main_loop,
.query_serno = dnpds40_query_serno,
.devices = {
{ USB_VID_DNP, USB_PID_DNP_DS40, P_DNP_DS40, ""},
{ USB_VID_DNP, USB_PID_DNP_DS80, P_DNP_DS80, ""},