/*
 
 该类是SDK3.0.0之前的版本，由于很多客户还是使用之前的SDK，优化接口后改动太大，就用一个类保留之前的接口
 
 */

#import <Foundation/Foundation.h>
#import "SDKDefine.h"
#import "PTBitmap.h"

NS_ASSUME_NONNULL_BEGIN

@interface PTOldCommandTSPL : NSObject

@property(strong,nonatomic,readwrite) NSMutableData *cmdData;

@property (nonatomic, assign) NSStringEncoding encoding;

/**
 *  printer print self-test message.
 *  自检，打印打印机信息
 */
- (void)selfTest;

- (void)appendCommand:(NSString *)cmd;

/** 打印并走纸一行
 *  Print and feed one line
 */
- (void)printAndLineFeed;


/**
 set font bold
 设置字体加粗
 
 @param bold 0：不加粗 1：加粗
 */
- (void)setFontBold:(NSInteger)bold;

/**
 自动回传打印机状态
 开启之后，每打印一张都会返回10个字节的数据，格式：指令头4个字节(aa bb cc dd) + 4个字节的打印张数(从开启到关闭的打印总张数) + 1个字节的状态 + 结束符00
 
 会返回两次数据，第一次表示返回可获取打印总张数和状态，第二次表示打印结束
 eg:1.aabbccdd 03000000 2000
 2.aabbccdd ffffffff 0000 ：打印结束；aabbccdd 00000000 0000：关闭自动回传
 @param status 1：开启自动回传  3：关闭自动回传
 */
- (void)setPrinterStateAutomaticBackWithStatus:(NSInteger)status;

/**
 *  setting print area size in paper.
 *  打印纸张范围大小 打印纸的毫米
 */
- (void)setPrintAreaSizeWithWidth:(NSInteger)label_width
                           Height:(NSInteger)label_height;

/**
 
 get print status
 开盖因为不好判断纸张，所以默认无纸
 
 返回一个字节
 bit7  bit6  bit5  bit4  bit3  bit2  bit1  bit0
 1      1      1     1     1     1     1    1
 高温   开盖  打印中  暂停   丝带   缺纸   卡纸  开盖
 */
- (void)getPrinterStatus;

/**
 *  setting gap distance during labels.
 *  设置标签纸的间距
 *
 *  @param distance 两张标签紙中间的垂直距离
 *  @param offset   垂直间距的偏移
 */
- (void)setGapWithDistance:(NSInteger)distance
                    Offset:(NSInteger)offset;

/**
 *  setting black line
 *  设置黑线
 *
 *  @param height 黑线的高度 0~25.4 mm
 *  @param offset 黑线偏移量 0~label length
 *  height,offset 为0,0表示连续标签
 */
- (void)setBlineWithHeight:(NSInteger)height
                    Offset:(NSInteger)offset;

/**
 *  paper feed with distance.
 *  走纸
 */
- (void)setOffsetWithDistance:(NSInteger)distance;

/**
 *  setting print sets and copies.
 *  打印数量
 *
 *  @param sets   多少份       how many sets of labels will be printed.
 *  @param copies 每份多少张    how many copies should be printed for each particular label set.
 */
- (void)printWithSets:(NSInteger)sets  Copies:(NSInteger)copies;


/**
 打印自动换行文本，针对矢量字库的机型
 
 @param x_pos x起始坐标
 @param y_pos y起始坐标
 @param font 字体：1-9，1-8：只能打印英文  9：中英文都能打（一般选择9）
 @param rotation 打印方向
 @param x_multiplication font是1-8时：表示放大横向放大倍数  font是9的时候，表示文本的横向大小，eg：24
 @param y_multiplication font是1-8时：表示放大纵向放大倍数 font是9的时候，表示文本的纵向大小，eg：24
 @param safeHeight 打印的高度范围，超过部分不会打印
 @param width 打印的宽度范围，等于0的时候不自动换行
 @param lineSpacing 行间距
 @param text 文本
 @return 返回实际的打印高度
 */
- (NSInteger)printAutoTextForVectorWithXpos:(NSInteger)x_pos
                                       yPos:(NSInteger)y_pos
                                       font:(NSInteger)font
                                   rotation:(NSInteger)rotation
                            xMultiplication:(NSInteger)x_multiplication
                            yMultiplication:(NSInteger)y_multiplication
                                 safeHeight:(NSInteger)safeHeight
                                      width:(NSInteger)width
                                lineSpacing:(NSInteger)lineSpacing
                                       text:(NSString *)text;


/**
 打印自动换行文本，针对点阵字库的机型
 
 @param x_pos x起始坐标
 @param y_pos y起始坐标
 @param font 字体：0-1，0：12x24 24x24   1:8x16  16x16
 @param rotation 打印方向
 @param x_multiplication 横向放大倍数:1-10
 @param y_multiplication 纵向放大倍数:1-10
 @param safeHeight 打印的高度范围，超过部分不会打印
 @param width 打印的宽度范围，等于0的时候不自动换行
 @param lineSpacing 行间距
 @param text 文本
 @return 返回实际的打印高度
 */
- (NSInteger)printAutoTextWithXpos:(NSInteger)x_pos
                              yPos:(NSInteger)y_pos
                              font:(NSInteger)font
                          rotation:(NSInteger)rotation
                   xMultiplication:(NSInteger)x_multiplication
                   yMultiplication:(NSInteger)y_multiplication
                        safeHeight:(NSInteger)safeHeight
                             width:(NSInteger)width
                       lineSpacing:(NSInteger)lineSpacing
                              text:(NSString *)text;


/**
 打印文本
 
 @param x_pos 距离x起点坐标
 @param y_pos 距离y起点坐标
 @param font 字体大小 英文字体：0-8  中文：9
 @param rotation 0 90 180 270
 @param x_multiplication 英文字体：1-10 中文：40-80(大小可调)
 @param y_multiplication 英文字体：1-10 中文：40-80(大小可调)
 @param text 打印的文本
 */
- (void)appendTextWithXpos:(NSInteger)x_pos
                      Ypos:(NSInteger)y_pos
                      Font:(NSInteger)font
                  Rotation:(NSInteger)rotation
           Xmultiplication:(NSInteger)x_multiplication
           Ymultiplication:(NSInteger)y_multiplication
                      Text:(NSString *)text;

/**
 *  clean printer buffer.
 *  清除打印机缓冲区
 */
- (void)setCLS;

/**
 *  print barcode.
 *  打印一维条码
 *
 *  @param type     bar code type @[128,128M,EAN128,25,25C,39,29S,93,EAN13,EAN13+2,EAN13+5,EAN8,EAN8+5,CODA,POST,UPCA,UPCA+2,UPCA+5,UPCE,UPCE+2,UPCE+5,CPOST,MSI,MSIC,PLESSEY,ITF14,EAN14,11];
 *  @param readable 是否可读：0，不可读，1，可读 whether it is readable：0: unreadable; 1: readable
 *  @param rotation rotation：0，90，180，270
 *  @param narrow   窄元素 narrow element
 *  @param wide     宽元素 wide element
 */

/**
 print barcode.
 打印一维条码
 eg:100,100,”39”,96,1,0,2,4,”1000” 、 10,10,”128M”,48,1,0,2,2,”!104!096ABCD!101EFGH”
 
 @param x_pos Specify the x-coordinate of the bar code on the label
 @param y_pos Specify the y-coordinate of the bar code on the label
 @param type bar code type @[128,128M,EAN128,25,25C,39,29S,93,EAN13,EAN13+2,EAN13+5,EAN8,EAN8+5,CODA,POST,UPCA,UPCA+2,UPCA+5,UPCE,UPCE+2,UPCE+5,CPOST,MSI,MSIC,PLESSEY,ITF14,EAN14,11];
 @param height Bar code height (in dots)
 @param readable 是否可读：0，不可读，1，可读 whether it is readable：0: unreadable; 1: readable
 @param rotation rotation：0，90，180，270
 @param narrow 窄元素 narrow element
 @param wide 宽元素 wide element
 @param codeNumber the maximum number of digits of bar code content
 */
- (void)printBarcodeWithXPos:(NSInteger)x_pos
                        YPos:(NSInteger)y_pos
                        Type:(NSString *)type
                      Height:(NSInteger)height
               HumanReadable:(NSInteger)readable
                    Rotation:(NSInteger)rotation
                      Narrow:(NSInteger)narrow
                        Wide:(NSInteger)wide
                  CodeNumber:(NSString *)codeNumber;

/**
 print QRCode
 打印二维条码
 eg:100,10,L,7,M,0,M1,S1,"ATHE FIRMWARE HAS BEEN UPDATED"
 
 @param x_pos The upper left corner x-coordinate of the QR code
 @param y_pos The upper left corner y-coordinate of the QR code
 @param ecc_level Error correction recovery level
 L :7% M :15% Q : 25% H : 30%
 @param width 1~10
 @param mode A/M  A:Auto M:Manual
 @param rotation 0 、 90 、180 、270
 @param model M1: (default), original version  M2: enhanced version
 @param mask S0~S8, default is S7
 @param text The encodable character set is described as below
 */
- (void)printQRcodeWithXPos:(NSInteger)x_pos
                       YPos:(NSInteger)y_pos
                   EccLevel:(NSString *)ecc_level
                  CellWidth:(NSInteger)width
                       Mode:(NSString *)mode
                   Rotation:(NSInteger)rotation
                      Model:(NSString *)model
                       Mask:(NSString *)mask
                       Text:(NSString *)text;


/**
 Print Bitmap
 打印位图,取反已经在SDK中处理
 
 @param xpos Specify the x-coordinate
 @param ypos Specify the y-coordinate
 @param mode mode Graphic modes listed below: 0:OVERWRITE 1:OR 2:XOR 3:compress 16:OVERWRITE compress 17:OR compress 18:XOR compress
 @param image image
 @param bitmapMode binary/dithering
 @param compress TIFF/ZPL2/LZO/None
 @return The data is less than the cache and can be printed NO:The data exceeds the cache and cannot be printed
 */
- (BOOL)addBitmapWithXPos:(NSInteger)xpos
                     YPos:(NSInteger)ypos
                     Mode:(NSInteger)mode
                    image:(CGImageRef)image
               bitmapMode:(PTBitmapMode)bitmapMode
                 compress:(PTBitmapCompressMode)compress;

#pragma mark BasicSetting 基本设定

/**
 *  setting print speed
 *  设置打印速度
 *
 */
- (void)setSpeed:(NSInteger)speed;

/**
 *  setting print density
 *  设置打印浓度
 *
 *  @param density 浓度 0~15 level
 */
- (void)setDensity:(NSInteger)density;

/**
 *  setting print direction and mirror.
 *  设置打印的方向和镜像
 *
 *  @param direction 方向，面对打印机，向自己方向出纸，0，正常，1，方向
 *  @param mirror    镜像，可选项 0 普通，1 镜像
 */
- (void)setDirection:(NSInteger)direction Mirror:(NSInteger)mirror;

/**
 *  setting print reference position
 *  设置标签参考起点
 *
 */
- (void)setReferenceXPos:(NSInteger)x_pos
                    YPos:(NSInteger)y_pos;

/**
 *  page 18.
 *  setting the code page of inernational character set.设置国际字符集
 7-bit code page name:
 USA: USA
 BRI: British
 GER: German
 FRE: French
 DAN: Danish
 ITA: Italian
 SPA: Spanish
 SWE: Swedish
 SWI: Swiss
 
 8-bit code page number:
 437: United States
 850: Multilingual
 852: Slavic
 860: Portuguese
 863: Canadian/French
 865: Nordic
 857: Turkish (TSPL2 printers only)
 
 Windows code page:
 1250: Central Europe (TSPL2 printers only)
 1252: Latin I (TSPL2 printers only)
 1253: Greek (TSPL2 printers only)
 1254: Turkish (TSPL2 printers only)
 *
 *  @param codepage 字符集代码
 */
- (void)setCodePage:(NSString *)codepage;

/**
 *  page 21.
 *  feed label with the specified length.设置标签进纸长度
 *
 *  @param feedLength (1~9999)
 */
- (void)setFeedLength:(NSInteger)feedLength;

/**
 *  feed label to the beginning of next label.设置进纸到下一标签起始处
 */
- (void)setFormFeed;

/** 回纸 */
- (void)setBackFeed:(NSInteger)distance;
- (void)setBackUP:(NSInteger)distance;

/**
 *  page 25.
 *  feed label until the internal sensor has determined the origin.设置标签定位到内部传感器确定的起点
 */
- (void)setHome;

/**
 *  page 28.
 *  control the sound frequency of the beeper.设置蜂鸣
 *
 *  @param level    0-9
 *  @param interval 1-4095
 */
- (void)setSoundWithLevel:(NSInteger)level
                 Interval:(NSInteger)interval;

/**
 *  page 29.
 *  activate the cutter to immediately cut the labels without back feeding the label.设置切纸
 */
- (void)setCut;

/**
 *  page 30.
 *  设置停止送纸
 */
- (void)setLimitFeed:(NSInteger)max_len;

/**
 *  page 32.
 *  draw a bar on the label format.在标签上画一条线
 */
- (void)printBarWithXPos:(NSInteger)x_pos
                    YPos:(NSInteger)y_pos
                   Width:(NSInteger)width
                  Height:(NSInteger)height;

/**
 *  page 39.
 *  draw rectangles on the label.在标签上绘制矩形
 *  @param thickness 线宽
 */
- (void)setBoxWithXStart:(NSInteger)x_start
                  YStart:(NSInteger)y_start
                    XEnd:(NSInteger)x_end
                    YEnd:(NSInteger)y_end
               Thickness:(NSInteger)thickness;

/** 在标签上绘制椭圆 */
- (void)setEllipseWithXStart:(NSInteger)x_start
                      YStart:(NSInteger)y_start
                       Width:(NSInteger)width
                      Height:(NSInteger)height
                   Thickness:(NSInteger)thickness;

/**
 *  page 41.
 *  draw a circle on the label.在标签上绘制圆形
 *
 *  @param diameter  直径
 *  @param thickness 线宽
 */
- (void)setCircleWithXStart:(NSInteger)x_start
                     YStart:(NSInteger)y_start
                   Diameter:(NSInteger)diameter
                  Thickness:(NSInteger)thickness;

/**
 *  page 43.
 *  clear a specified region in the image buffer.擦除图像缓冲区指定的区域
 */
- (void)setEraseWithXStart:(NSInteger)x_start
                    YStart:(NSInteger)y_start
                    XWidth:(NSInteger)x_width
                   YHeight:(NSInteger)y_height;

/**
 *  page 42.
 *  define the DataMatrix 2D bar code.Currently,only ECC200 error correction is supported.
 *  设置 DataMatrix 二维码，当前仅支持 ECC200 错误纠正
 *
 *  @param xm         [可选]，Module size，x6，x8
 *  @param row        [可选]，范围：10-144
 *  @param col        [可选]，范围：10-144
 *  @param expression 表达式
 */
- (void)setDmatrixWithExpression:(NSString *)expression
                            XPos:(NSInteger)x_pos
                            YPos:(NSInteger)y_pos
                           Width:(NSInteger)width
                          Height:(NSInteger)height
                              XM:(NSString *)xm
                             Row:(NSString *)row
                             Col:(NSString *)col;

/**
 *  page 44.
 *  define a 2D Maxicode.打印 Maxicode 二维码
 *
 *  @param mode    2,3,4,5
 *  @param iClass   [option],Class of Service ,3-digit number(for mode 2,3)
 *  @param country [option],Country code, 3-digit number (for mode 2,3)
 *  @param post    [option],
 Mode 2: (USA) 5-digit+ 4-digit number.
 Mode 3: (Canada) 6 alphanumeric post code included by double quotes.
 *  @param lm      Expression length (double quote is ignored) , 范围：1-138, (this parameter is just for mode 4 and 5.)
 */
- (void)setMaxicode:(NSString *)text
               XPos:(NSInteger)x_pos
               YPos:(NSInteger)y_pos
               Mode:(NSInteger)mode
              Class:(NSInteger)iClass
            Country:(NSInteger)country
               Post:(NSString *)post
                 LM:(NSInteger)lm;

/**
 *
 *  page 46.
 *  define a PDF417 2D barcode.
 
 [Option]
 
 P  Data compression method
 0: Auto encoding
 1: Binary mode
 
 E  Error correction level. Range: 0~8 Center pattern in barcode area
 0: The pattern will print upper left justified the area
 1: The pattern is printed middle of area
 
 Ux,y,c Human readable
 x: Human readable characters in the specified x-coordinate
 y: Human readable characters in the specified y-coordinate
 c: Maximum characters of human readable character per line
 
 W  Module width in dot. Range: 2~9
 H  Bar height in dot. Range: 4~99
 R  Maximum number of rows
 C  Maximum number of columns
 T  Truncation.
 0: Not truncated
 1: Truncated
 
 *  @param option 可选项
 */
- (void)printPDF417WithXPos:(NSInteger)x_pos
                       YPos:(NSInteger)y_pos
                      Width:(NSInteger)width
                     Height:(NSInteger)height
                     Rotate:(NSInteger)rotate
                     Option:(NSString *)option
                 Expression:(NSString *)expression;

/** page 50 */
- (void)printAztecWithXPos:(NSInteger)XPos
                      YPos:(NSInteger)YPos
                    rotate:(NSInteger)rotate
                      size:(NSInteger)size
                       ecp:(NSInteger)ecp
                       flg:(NSInteger)flg
                      menu:(NSInteger)menu
                     multi:(NSInteger)multi
                       rev:(NSInteger)rev
                 aztecData:(NSString *)aztecData;

/**
 *  page 52.
 *  print Bitmap format image.
 */
- (void)putBMPWithFilename:(NSString *)filename
                      XPos:(NSInteger)x_pos
                      YPos:(NSInteger)y_pos;

/**
 *  page 54.
 *  print PCX format images.
 */
- (void)putPCXWithFilename:(NSString *)filename
                      XPos:(NSInteger)x_pos
                      YPos:(NSInteger)y_pos;

/**
 *  page 63.
 *  reverse a region in image buffer.
 */
- (void)setReverseWithXStart:(NSInteger)x_start
                      YStart:(NSInteger)y_start
                      XWidth:(NSInteger)x_width
                     YHeight:(NSInteger)y_height;

#pragma mark Device Reconfiguration Commands

/**
 *  page 32.
 *  setting the counter number in the program and its increments.计数器设置
 *
 *  @param counterNumber 第几个计数器 which number of counter（0-50）
 *  @param step          计数间隔 counting interval    （-99999999 ~ 99999999）
 */
- (void)setCounterWithCounterNumber:(NSInteger)counterNumber
                               Step:(NSInteger)step;

- (void)setCutterON;
- (void)setCutterOFF;
- (void)setCutterBATCH;

/**
 *  set number of printing labels per cut
 *
 *  @param pieces (0 ~ 65535)
 */
- (void)setCutterPieces:(NSInteger)pieces;

- (void)setPARTIAL_CUTTER_OFF;
- (void)setPARTIAL_CUTTER_BATCH;

/**
 *  set number of printing labels per cut
 *
 *  @param pieces (0 ~ 65535)
 */
- (void)setPARTIAL_CUTTER_Pieces:(NSInteger)pieces;

- (void)setBackOFF;
- (void)setBackON;

/**
 *  This setting is used to enable/disable the KEY1/KEY2/KEY3 function.
 *
 *  @param index    KEY1,KEY2,KEY3
 *  @param switcher ON/OFF
 */
- (void)setKEY:(NSInteger)index Switch:(NSString *)switcher;

/**
 *  This setting is used to enable/disable the LED function.
 LED1 Power on/off
 LED2 Printer on-line/off-line
 LED3 Error/normal
 *
 *  @param index    LED1,LED2,LED3
 *  @param switcher ON/OFF
 */
- (void)setLED:(NSInteger)index Switch:(NSString *)switcher;

- (void)setPeelON;
- (void)setPeelOFF;

/**
 *  This command is used to enable/disable feeding of labels to gap/black mark position for tearing off.
 *  This setting will be saved in printer memory when turning off the power.
 */
- (void)setTearON;
- (void)setTearOFF;

- (void)setStriperON;
- (void)setStriperOFF;

/**
 *  This setting is used to enable/disable head open sensor.
 */
- (void)setHeadON;
- (void)setHeadOFF;

- (void)setRibbonON;
- (void)setRibbonOFF;

/**
 *  This setting defines communication parameters for printer serial port.
 *
 *  @param baud   24,48,96,19,38,57,115( 对应单位2400 bps,4800 bps,9600 bps,38400 bps,15200 bps)
 *  @param parity N,E,O(NO/Even/Odd parity check)
 *  @param data   7,8(bits Data)
 *  @param stop   1,2(stop bit)
 */
- (void)setCOM1WithBaud:(NSInteger)baud
                 Parity:(NSString *)parity
                   Data:(NSString *)data
                   Stop:(NSString *)stop;

/**
 *  This command will print one label and feed label gap to tear br position for tearing away.
 *  This setting will be saved in printer memory.
 *
 *  @param key OFF/ON/AUTO/<num>
 */
- (void)setPrintKey:(NSString *)key;

- (void)setReprintON;
- (void)setReprintOFF;

@end

NS_ASSUME_NONNULL_END
