fix support for printers that use packbits transfer mode, like PT-D450PV

This commit is contained in:
Dominic Radermacher 2019-03-17 11:36:04 +01:00
parent 1c552a3d11
commit 213a70eee0
8 changed files with 130 additions and 8440 deletions

View file

@ -32,24 +32,27 @@
#define _(s) gettext(s)
struct _pt_tape_info tape_info[6]= {
{6, 32}, /* 6mm tape is 32px wide? works for me ;-) */
{9, 52}, /* 9mm tape is 52px wide? works for me ;-) */
{12,76}, /* and 76px work for me on a 12mm tape - maybe its only 64px */
{18,120},
{24,128},
{0,0} /* terminating entry */
/* Print area width in 180 DPI pixels */
struct _pt_tape_info tape_info[]= {
{ 6, 32}, /* 6 mm tape */
{ 9, 52}, /* 9 mm tape */
{12, 76}, /* 12 mm tape */
{18, 120}, /* 18 mm tape */
{24, 128}, /* 24 mm tape */
{36, 192}, /* 36 mm tape */
{ 0, 0} /* terminating entry */
};
struct _pt_dev_info ptdevs[] = {
{0x04f9, 0x202d, "PT-2430PC", 128, FLAG_NONE}, /* 180dpi, maximum 128px */
{0x04f9, 0x2031, "PT-2430PC", 128, FLAG_SWITCH_WRONG}, /* */
{0x04f9, 0x202c, "PT-1230PC", 76, FLAG_NONE}, /* 180dpi, supports tapes up to 12mm - I don't know how much pixels it can print! */
{0x04f9, 0x202d, "PT-2430PC", 128, FLAG_NONE}, /* 180dpi, maximum 128px */
{0x04f9, 0x2007, "PT-2420PC", 128, FLAG_RASTER_PACKBITS}, /* 180dpi, 128px, maximum tape width 24mm, must send TIFF compressed pixel data */
{0x04f9, 0x202c, "PT-1230PC", 76, FLAG_NONE}, /* 180dpi, supports tapes up to 12mm - I don't know how much pixels it can print! */
{0x04f9, 0x2061, "PT-P700", 120, FLAG_UNSUP_RASTER}, /* DOES NOT WORK */
{0x04f9, 0x2073, "PT-D450VP", 120, FLAG_UNSUP_RASTER}, /* DOES NOT WORK */
/* Notes about the PT-D450VP: Tape detecting works, but printing does
not. The tape is just blank. I assume, the printer does not understand
the sent rasterdata. I'm also unsure about how many dots width we have */
{0x04f9, 0x2073, "PT-D450VP", 128, FLAG_RASTER_PACKBITS},
/* Notes about the PT-D450VP: I'm unsure if print width really is 128px */
{0x04f9, 0x2041, "PT-2730PC", 128, FLAG_NONE}, /* 180dpi, maximum 128px, max tape width 24mm - reported to work with some quirks */
/* Notes about the PT-2730PC: was reported to need 48px whitespace
within png-images before content is actually printed - can not check this */
{0,0,"",0,0}
};
@ -72,6 +75,10 @@ int ptouch_open(ptouch_dev *ptdev)
fprintf(stderr, _("out of memory\n"));
return -1;
}
if (((*ptdev)->status=malloc(sizeof(struct _ptouch_stat))) == NULL) {
fprintf(stderr, _("out of memory\n"));
return -1;
}
if ((libusb_init(NULL)) < 0) {
fprintf(stderr, _("libusb_init() failed\n"));
return -1;
@ -149,9 +156,15 @@ int ptouch_init(ptouch_dev ptdev)
return ptouch_send(ptdev, (uint8_t *)cmd, strlen(cmd));
}
int ptouch_enable_packbits(ptouch_dev ptdev)
{ /* 4D 00 = disable compression */
char cmd[] = "M\x02"; /* 4D 02 = enable packbits compression mode */
return ptouch_send(ptdev, (uint8_t *)cmd, strlen(cmd));
}
int ptouch_rasterstart(ptouch_dev ptdev)
{
char cmd[]="\x1b\x69\x52\x01"; /* 1B 69 52 01 = RASTER DATA */
char cmd[] = "\x1b\x69\x52\x01"; /* 1B 69 52 01 = Select graphics transfer mode = Raster */
return ptouch_send(ptdev, (uint8_t *)cmd, strlen(cmd));
}
@ -219,7 +232,7 @@ void ptouch_rawstatus(uint8_t raw[32])
int ptouch_getstatus(ptouch_dev ptdev)
{
char cmd[]="\x1b\x69\x53";
char cmd[]="\x1biS"; /* 1B 69 53 = ESC i S = Status info request */
uint8_t buf[32];
int i, r, tx=0, tries=0;
struct timespec w;
@ -241,14 +254,7 @@ int ptouch_getstatus(ptouch_dev ptdev)
}
if (tx == 32) {
if (buf[0]==0x80 && buf[1]==0x20) {
memcpy(ptdev->raw, buf, 32);
if (buf[8] != 0) {
fprintf(stderr, _("Error 1 = %02x\n"), buf[8]);
}
if (buf[9] != 0) {
fprintf(stderr, _("Error 2 = %02x\n"), buf[9]);
}
ptdev->tape_width_mm=buf[10];
memcpy(ptdev->status, buf, 32);
ptdev->tape_width_px=0;
for (i=0; tape_info[i].mm > 0; i++) {
if (tape_info[i].mm == buf[10]) {
@ -258,8 +264,6 @@ int ptouch_getstatus(ptouch_dev ptdev)
if (ptdev->tape_width_px == 0) {
fprintf(stderr, _("unknown tape width of %imm, please report this.\n"), buf[10]);
}
ptdev->media_type=buf[11];
ptdev->status=buf[18];
return 0;
}
}
@ -284,21 +288,31 @@ int ptouch_getstatus(ptouch_dev ptdev)
int ptouch_getmaxwidth(ptouch_dev ptdev)
{
/* TODO: should also check what the device supports. but I assume,
you can't use a large tape in a printe that doesn't support it anyways */
return ptdev->tape_width_px;
}
int ptouch_sendraster(ptouch_dev ptdev, uint8_t *data, int len)
{
uint8_t buf[32];
uint8_t buf[70];
int rc;
if (len > ptdev->devinfo->max_px / 8) {
return -1;
}
if (len > 16) { /* PT-2430PC can not print more than 128 px */
return -1; /* as we support more devices, we need to check */
} /* how much pixels each device support */
buf[0]=0x47;
buf[1]=len;
buf[2]=0;
memcpy(buf+3, data, len);
return ptouch_send(ptdev, buf, len+3);
if (ptdev->devinfo->flags & FLAG_RASTER_PACKBITS) {
/* Fake compression by encoding a single uncompressed run */
buf[1] = len + 1;
buf[2] = 0;
buf[3] = len - 1;
memcpy(buf + 4, data, len);
rc = ptouch_send(ptdev, buf, len + 4);
} else {
buf[1] = len;
buf[2] = 0;
memcpy(buf + 3, data, len);
rc = ptouch_send(ptdev, buf, len + 3);
}
return rc;
}