From 9ce6e859bf4c0a7eb51c8e3a000f9adcfe126bad Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 19 Jan 2013 21:36:23 -0500 Subject: [PATCH] [kodak1400] Fleshing out the state machine. --- .gitignore | 1 + kodak1400_print.c | 147 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 141 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 5d999df..5a0fa41 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +*~ selphy_print kodak1400_print diff --git a/kodak1400_print.c b/kodak1400_print.c index 9a8baeb..8e7d3a9 100644 --- a/kodak1400_print.c +++ b/kodak1400_print.c @@ -25,6 +25,8 @@ * */ +#include + #include #include #include @@ -37,7 +39,7 @@ #include -#define VERSION "0.02" +#define VERSION "0.03" #define STR_LEN_MAX 64 #define CMDBUF_LEN 96 #define READBACK_LEN 8 @@ -77,11 +79,13 @@ enum { S_PRINTER_READY, S_PRINTER_INIT_SENT, S_PRINTER_READY_Y, - S_PRINTER_Y_SENT, + S_PRINTER_SENT_Y, S_PRINTER_READY_M, - S_PRINTER_M_SENT, + S_PRINTER_SENT_M, S_PRINTER_READY_C, - S_PRINTER_C_SENT, + S_PRINTER_SENT_C, + S_PRINTER_READY_L, + S_PRINTER_SENT_L, S_PRINTER_DONE, S_FINISHED, }; @@ -101,6 +105,10 @@ struct kodak1400_hdr { uint8_t null4[12]; }; +static uint8_t idle_data[READBACK_LEN] = { 0xe4, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; + + static int find_and_enumerate(struct libusb_context *ctx, struct libusb_device ***list, char *match_serno, @@ -194,6 +202,8 @@ int main (int argc, char **argv) uint8_t endp_up = 0; uint8_t endp_down = 0; + uint16_t temp16; + int data_fd = fileno(stdin); int i, num; @@ -391,16 +401,139 @@ top: } fflush(stderr); -#if 0 switch (state) { - + case S_IDLE: + /* Send reset/attention */ + memset(cmdbuf, 0, CMDBUF_LEN); + cmdbuf[0] = 0x1b; + + ret = libusb_bulk_transfer(dev, endp_down, + cmdbuf, CMDBUF_LEN, + &num, 2000); + if (ret < 0) { + ERROR("libusb error %d: (%d/%d from 0x%02x)\n", ret, num, READBACK_LEN, endp_up); + ret = 4; + goto done_claimed; + } + /* Send page setup */ + memset(cmdbuf, 0, CMDBUF_LEN); + cmdbuf[0] = 0x1b; + cmdbuf[1] = 0x5a; + cmdbuf[2] = 0x53; + temp16 = ntohs(hdr.columns); + memcpy(cmdbuf+3, &temp16, 2); + temp16 = ntohs(hdr.rows); + memcpy(cmdbuf+5, &temp16, 2); + + ret = libusb_bulk_transfer(dev, endp_down, + cmdbuf, CMDBUF_LEN, + &num, 2000); + + if (ret < 0) { + ERROR("libusb error %d: (%d/%d from 0x%02x)\n", ret, num, READBACK_LEN, endp_up); + ret = 4; + goto done_claimed; + } + + // send lamination + // send matte + + /* Send lamination strength */ + memset(cmdbuf, 0, CMDBUF_LEN); + cmdbuf[0] = 0x1b; + cmdbuf[1] = 0x62; + cmdbuf[2] = hdr.lam_strength; + + ret = libusb_bulk_transfer(dev, endp_down, + cmdbuf, CMDBUF_LEN, + &num, 2000); + + if (ret < 0) { + ERROR("libusb error %d: (%d/%d from 0x%02x)\n", ret, num, READBACK_LEN, endp_up); + ret = 4; + goto done_claimed; + } + + // send unkn1 + state = S_PRINTER_READY_Y; + break; + case S_PRINTER_READY_Y: + // send plane init + for (i = 0 ; i < hdr.rows ; i++) { + ret = libusb_bulk_transfer(dev, endp_down, + plane_b + i * hdr.columns, hdr.columns, + &num, 2000); + + if (ret < 0) { + ERROR("libusb error %d: (%d/%d from 0x%02x)\n", ret, num, READBACK_LEN, endp_up); + ret = 4; + goto done_claimed; + } + } + state = S_PRINTER_SENT_Y; + break; + case S_PRINTER_SENT_Y: + if (!memcmp(rdbuf, idle_data, READBACK_LEN)) + state = S_PRINTER_READY_M; + break; + case S_PRINTER_READY_M: + // send plane init + for (i = 0 ; i < hdr.rows ; i++) { + ret = libusb_bulk_transfer(dev, endp_down, + plane_g + i * hdr.columns, hdr.columns, + &num, 2000); + + if (ret < 0) { + ERROR("libusb error %d: (%d/%d from 0x%02x)\n", ret, num, READBACK_LEN, endp_up); + ret = 4; + goto done_claimed; + } + } + state = S_PRINTER_SENT_M; + break; + case S_PRINTER_SENT_M: + if (!memcmp(rdbuf, idle_data, READBACK_LEN)) + state = S_PRINTER_READY_C; + break; + case S_PRINTER_READY_C: + // send plane init + for (i = 0 ; i < hdr.rows ; i++) { + ret = libusb_bulk_transfer(dev, endp_down, + plane_r + i * hdr.columns, hdr.columns, + &num, 2000); + + if (ret < 0) { + ERROR("libusb error %d: (%d/%d from 0x%02x)\n", ret, num, READBACK_LEN, endp_up); + ret = 4; + goto done_claimed; + } + } + state = S_PRINTER_SENT_C; + break; + case S_PRINTER_SENT_C: + if (!memcmp(rdbuf, idle_data, READBACK_LEN)) + state = S_PRINTER_READY_L; + break; + case S_PRINTER_READY_L: + // send laminate init + state = S_PRINTER_SENT_L; + break; + case S_PRINTER_SENT_L: + if (!memcmp(rdbuf, idle_data, READBACK_LEN)) + state = S_PRINTER_DONE; + break; + case S_PRINTER_DONE: + // send cleanup. + state = S_FINISHED; + break; + default: + break; }; if (state != S_FINISHED) goto top; -#endif /* All done, clean up */ done_claimed: