diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/loadpng.h | 15 | ||||
-rw-r--r-- | include/ql.h | 155 |
2 files changed, 170 insertions, 0 deletions
diff --git a/include/loadpng.h b/include/loadpng.h new file mode 100644 index 0000000..cace43a --- /dev/null +++ b/include/loadpng.h @@ -0,0 +1,15 @@ +/* + * Copyright 2017 DiUS Computing Pty Ltd. All rights reserved. + * + * Released under GPLv3, see LICENSE for details. + * + * @author Johny Mattsson <jmattsson@dius.com.au> + */ +#ifndef _LOADPNG_H_ +#define _LOADPNG_H_ + +#include "ql.h" + +ql_raster_image_t *loadpng(const char *path); + +#endif diff --git a/include/ql.h b/include/ql.h new file mode 100644 index 0000000..b854c06 --- /dev/null +++ b/include/ql.h @@ -0,0 +1,155 @@ +/* + * Copyright 2017 DiUS Computing Pty Ltd. All rights reserved. + * + * Released under GPLv3, see LICENSE for details. + * + * @author Johny Mattsson <jmattsson@dius.com.au> + */ +#ifndef _QL_H_ +#define _QL_H_ + +#include <stdint.h> +#include <stdbool.h> +#include <stdio.h> +#include <unistd.h> + +/* The QL module is based on an amalgamation of information from: + * + * - Brother QL-500/550/560/570/580N/650TD/700/1050/1060N Command Reference + * http://download.brother.com/welcome/docp000678/cv_qlseries_eng_raster_600.pdf + * - Software Developer's Manual Raster Command Reference QL-710W/720NW + * http://download.brother.com/welcome/docp000698/cv_ql710720_eng_raster_100.pdf + * - Actual experience communicating with a QL-570 + * + */ + +typedef struct +{ + uint8_t print_head_mark; + uint8_t sz; + uint8_t rsvd_2; // 'B' + uint8_t model_class; + uint8_t model_code; + uint8_t rsvd_5; // '0' + uint8_t rsvd_6; // '0' + uint8_t rsvd_7; // 0x00 + uint8_t err_info_1; + uint8_t err_info_2; + uint8_t media_width_mm; + uint8_t media_type; + uint8_t rsvd_12; // 0x00 + uint8_t rsvd_13; // 0x00 + uint8_t rsvd_14; // 0x3f + uint8_t mode; + uint8_t rsvd_16; // 0x00 + uint8_t media_length_mm; + uint8_t status_type; + uint8_t phase_type; + uint8_t phase_hi; + uint8_t phase_lo; + uint8_t notification; + uint8_t rsvd_23; // 0x00 + uint8_t rsvd_24[8]; // 0x00... +} ql_status_t; + +#define QL_ERR_1_NO_MEDIA 0x01 +#define QL_ERR_1_END_OF_MEDIA 0x02 +#define QL_ERR_1_CUTTER_JAM 0x04 +// 0x08 not defined +#define QL_ERR_1_PRINTER_IN_USE 0x10 +#define QL_ERR_1_PRINTER_TURNED_OFF 0x20 +#define QL_ERR_1_HIGH_VOLTAGE_ADAPTER 0x40 +#define QL_ERR_1_FAN_MOTOR_ERROR 0x80 + +#define QL_ERR_2_REPLACE_MEDIA 0x01 +#define QL_ERR_2_EXPANSION_BUFFER_FULL 0x02 +#define QL_ERR_2_COMMUNICATION_ERROR 0x04 +#define QL_ERR_2_COMMUNICATION_BUFFER_FULL 0x08 +#define QL_ERR_2_COVER_OPEN 0x10 +#define QL_ERR_2_CANCEL_KEY 0x20 +#define QL_ERR_2_MEDIA_CANNOT_BE_FED 0x40 +#define QL_ERR_2_SYSTEM_ERROR 0x80 + +#define QL_MEDIA_LENGTH_CONTINUOUS 0x00 + +#define QL_MEDIA_TYPE_NO_MEDIA 0x00 +#define QL_MEDIA_TYPE_CONTINUOUS 0x0a +#define QL_MEDIA_TYPE_DIECUT_LABELS 0x0b +// The 710/720 might report these instead +#define QL_MEDIA_TYPE_CONTINUOUS_ALT 0x4a +#define QL_MEDIA_TYPE_DIECUT_LABELS_ALT 0x4b + +// Flags for mode +#define QL_MODE_NO_AUTOCUT 0x00 +#define QL_MODE_AUTOCUT 0x40 + +#define QL_STATUS_TYPE_REPLY 0x00 +#define QL_STATUS_TYPE_PRINTING_DONE 0x01 +#define QL_STATUS_TYPE_ERROR_OCCURRED 0x02 +#define QL_STATUS_TYPE_TURNED_OFF 0x04 +#define QL_STATUS_TYPE_NOTIFICATION 0x05 +#define QL_STATUS_TYPE_PHASE_CHANGE 0x06 + +#define QL_PHASE_TYPE_RECEIVING 0x00 +#define QL_PHASE_TYPE_PRINTING 0x01 + +#define QL_NOTIFICATION_NONE 0x00 +#define QL_NOTIFICATION_COOLING_STARTED 0x03 +#define QL_NOTIFICATION_COOLING_DONE 0x04 + +// Flags for expanded mode +#define QL_EXPANDED_MODE_CUT_AT_END 0x10 /* Gah, 710 doc claims 0x08! */ +#define QL_EXPANDED_MODE_HIGH_RES 0x40 /* QL-570/580N/700 */ + +typedef struct { + uint16_t width; + uint16_t height; + uint8_t data[]; +} ql_raster_image_t; + +typedef struct { + uint8_t threshold; // pixel values below threshold deemed black + uint8_t flags; // QL_PRINT_CFG_xxx flags, indicating which other fields valid + uint8_t media_type; + uint8_t media_width; + uint8_t media_length; + bool first_page; // used for autocut pagination +} ql_print_cfg_t; + +#define QL_PRINT_CFG_MEDIA_TYPE 0x02 +#define QL_PRINT_CFG_MEDIA_WIDTH 0x04 +#define QL_PRINT_CFG_MEDIA_LENGTH 0x08 +#define QL_PRINT_CFG_QUALITY_PRIO 0x40 + +typedef struct ql_ctx *ql_ctx_t; + +ql_ctx_t ql_open(const char *printer); +void ql_close(ql_ctx_t ctx); + +bool ql_init(ql_ctx_t ctx); // also cancel +bool ql_request_status(ql_ctx_t ctx); +bool ql_read_status(ql_ctx_t ctx, ql_status_t *status); + +bool ql_needs_mode_switch(const ql_status_t *status); +bool ql_switch_to_raster_mode(ql_ctx_t ctx); + +bool ql_set_mode(ql_ctx_t ctx, unsigned mode); +bool ql_set_expanded_mode(ql_ctx_t ctx, unsigned mode); +bool ql_set_autocut_every_n(ql_ctx_t ctx, uint8_t n); +bool ql_set_margin(ql_ctx_t ctx, uint16_t dots); + +// Note: status needed for 1050/1060N detection to adjust command format +bool ql_print_raster_image(ql_ctx_t ctx, const ql_status_t *status, const ql_raster_image_t *img, const ql_print_cfg_t *cfg); + +// Caution: ql_decode_*() are *not* multi-thread safe +const char *ql_decode_mode(const ql_status_t *status); +const char *ql_decode_errors(const ql_status_t *status); +const char *ql_decode_model(const ql_status_t *status); +const char *ql_decode_media_type(const ql_status_t *status); +#define QL_DECODE_MODEL 0x01 +#define QL_DECODE_ERROR 0x02 +#define QL_DECODE_MEDIA 0x04 +#define QL_DECODE_MODE 0x08 +void ql_decode_print_status(FILE *out, const ql_status_t *status, unsigned flags); + +#endif |