diff --git a/include/ptouch.h b/include/ptouch.h index 54e01f7..76d64e5 100644 --- a/include/ptouch.h +++ b/include/ptouch.h @@ -109,6 +109,7 @@ int ptouch_finalize(ptouch_dev ptdev, int chain); int ptouch_getstatus(ptouch_dev ptdev); int ptouch_getmaxwidth(ptouch_dev ptdev); int ptouch_send_d460bt_magic(ptouch_dev ptdev); +int ptouch_send_d460bt_chain(ptouch_dev ptdev); int ptouch_enable_packbits(ptouch_dev ptdev); int ptouch_info_cmd(ptouch_dev ptdev, int size_x); int ptouch_send_precut_cmd(ptouch_dev ptdev, int precut); diff --git a/src/libptouch.c b/src/libptouch.c index 28b124a..d20ea5d 100644 --- a/src/libptouch.c +++ b/src/libptouch.c @@ -195,6 +195,14 @@ int ptouch_init(ptouch_dev ptdev) return ptouch_send(ptdev, (uint8_t *)cmd, sizeof(cmd)); } +/* Sends some magic commands to enable chaining on the PT-D460BT. + These should go out right before magic commands. */ +int ptouch_send_d460bt_chain(ptouch_dev ptdev) +{ + uint8_t cmd[] = "\x1b\x69\x4b\x00"; + return ptouch_send(ptdev, (uint8_t *)cmd, sizeof(cmd)); +} + /* Sends some magic commands to make prints work on the PT-D460BT. These should go out after info_cmd and right before the raster data. */ int ptouch_send_d460bt_magic(ptouch_dev ptdev) @@ -286,7 +294,8 @@ int ptouch_finalize(ptouch_dev ptdev, int chain) char cmd_eject[]="\x1a"; /* Print command with feeding */ char cmd_chain[]="\x0c"; /* Print command (no cut) */ - char *cmd = chain ? cmd_chain : cmd_eject; + // The D460BT devices use a leading packet to indicate chaining instead. + char *cmd = (chain && (!(ptdev->devinfo->flags & FLAG_D460BT_MAGIC))) ? cmd_chain : cmd_eject; return ptouch_send(ptdev, (uint8_t *)cmd, 1); } diff --git a/src/ptouch-print.c b/src/ptouch-print.c index 832b7bf..600261a 100644 --- a/src/ptouch-print.c +++ b/src/ptouch-print.c @@ -41,7 +41,7 @@ void rasterline_setpixel(uint8_t* rasterline, size_t size, int pixel); int get_baselineoffset(char *text, char *font, int fsz); int find_fontsize(int want_px, char *font, char *text); int needed_width(char *text, char *font, int fsz); -int print_img(ptouch_dev ptdev, gdImage *im); +int print_img(ptouch_dev ptdev, gdImage *im, int chain); int write_png(gdImage *im, const char *file); gdImage *img_append(gdImage *in_1, gdImage *in_2); gdImage *img_cutmark(int tape_width); @@ -74,7 +74,7 @@ void rasterline_setpixel(uint8_t* rasterline, size_t size, int pixel) return; } -int print_img(ptouch_dev ptdev, gdImage *im) +int print_img(ptouch_dev ptdev, gdImage *im, int chain) { int d,i,k,offset,tape_width; uint8_t rasterline[(ptdev->devinfo->max_px)/8]; @@ -112,6 +112,12 @@ int print_img(ptouch_dev ptdev, gdImage *im) } } if ((ptdev->devinfo->flags & FLAG_D460BT_MAGIC) == FLAG_D460BT_MAGIC) { + if (chain) { + ptouch_send_d460bt_chain(ptdev); + if (debug) { + printf(_("send PT-D460BT chain commands\n")); + } + } ptouch_send_d460bt_magic(ptdev); if (debug) { printf(_("send PT-D460BT magic commands\n")); @@ -631,7 +637,7 @@ int main(int argc, char *argv[]) if (save_png) { write_png(out, save_png); } else { - print_img(ptdev, out); + print_img(ptdev, out, chain); if (ptouch_finalize(ptdev, chain) != 0) { printf(_("ptouch_finalize(%d) failed\n"), chain); return -1;