//
//  PTCommandESC.h
//  PrinterCommand
//
//  Created by midmirror on 16/3/10.
//  Copyright © 2016年 midmirror. All rights reserved.
//

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

typedef NS_ENUM(NSInteger, ESCText) {
    
    ESCTextNormal = 0,
    ESCTextMini = 1,
    ESCTextBold = 8,
    ESCTextDoubleHeight = 16,
    ESCTextDoubleWidth = 32,
    ESCTextUnderline = 128,
};

typedef NS_ENUM(NSInteger, ESCBarcode) {
    
//    ESCBarcodeA_UPCA    = 0,
//    ESCBarcodeA_UPCE    = 1,
//    ESCBarcodeA_EAN13   = 2,
//    ESCBarcodeA_EAN8    = 3,
//    ESCBarcodeA_CODE39  = 4,
//    ESCBarcodeA_ITF     = 5,
//    ESCBarcodeA_CODEBAR = 6,
    
    ESCBarcodeB_UPCA    = 65,
    ESCBarcodeB_UPCE    = 66,
    ESCBarcodeB_EAN13   = 67,
    ESCBarcodeB_EAN8    = 68,
    ESCBarcodeB_CODE39  = 69,
    ESCBarcodeB_ITF     = 70,
    ESCBarcodeB_CODEBAR = 71,
    ESCBarcodeB_CODE93  = 72,
    ESCBarcodeB_CODE128 = 73,
//    ESCBarcodeB_EAN128  = 74,
//    ESCBarcodeB_RSS14   = 75,
//    ESCBarcodeB_RSS14T  = 76,
//    ESCBarcodeB_RSSL    = 77,
//    ESCBarcodeB_RSSE    = 78,
};


/**
 *  ESC-POS 指令集:大约200个生成指令的函数。
 */
@interface PTCommandESC : NSObject

- (void)initCommandQueue;

- (void)appendCommandData:(NSData *)cmdData;

- (NSData *)getCommandData;

- (void)appendText:(NSString *)text;

/** 打印并走纸一行 */
- (void)printAndLineFeed;

/** 打印并回到标准模式(页模式) */
- (void)printAndReturnStandardMode;

/** 回车 */
- (void)printAndCarriageReturn;

/** 在页模式下打印数据 */
- (void)printDataInPageMode;

/**
 *  page 73. 打印并走纸
 *  @param offset (0~255)
 */
- (void)printAndFeed:(NSInteger)offset;

/**
 *  page 76. 打印并回纸
 *  @param offset (0~48)
 */
- (void)printAndReverseFeed:(NSInteger)offset;

/**
 *  page 78. 打印并向前走纸n行
 *  @param lines (0~255)
 */
- (void)printAndFeedLines:(NSInteger)lines;

/**
 *  page 80. 打印并回纸n行
 *  @param lines (0~2)
 */
- (void)printAndReverseFeedLines:(NSInteger)lines;

/**
 *  page 83. 设置默认行距
 */
- (void)setLineSpacingDefault;

/**
 *  page 85. 设置行距
 *  @param spacing (0~255)
 */
- (void)setLineSpacing:(NSInteger)spacing;

#pragma mark Character Commands

/** 在页模式下取消打印数据 */
- (void)cancelPrint;

/**
 *  page 91. 设置右边字符间隔
 *  @param spacing (0~255)
 */
- (void)setRightCharacterSpacing:(NSInteger)spacing;

/**
 *  page 93. 设置富文本样式，可叠加效果，比如粗体字和下划线
 */
- (void)setTextStyleMini:(BOOL)mini
                    bold:(BOOL)bold
             doubleWidth:(BOOL)doubleWidth
            doubleHeight:(BOOL)doubleHeight
               underline:(BOOL)underline;

/**
 *  page 93 添加文本，并设置字体形式
 *
 *  @param text text string
 *  @param mode ESCText
 */
- (void)appendText:(NSString *)text mode:(ESCText)mode;

/**
 *  page 98. 设置或取消字符设置
 *  n = 0, character set cancel     [default]
 *  n = 1, character set selected
 *  @param set (0~1)
 */
- (void)setUserDefinedCharacterSet:(NSInteger)set;

/**
 *  page 99. 定义用户已设定的字符
 *  @param codeStart (32~126)
 *  @param codeEnd   (32~126)
 *  @param horizontal (data.length = 3*horizontal)
 *  @param data (0~255)
 */
- (void)defineCharactersWithCodeStart:(NSInteger)codeStart
                              codeEnd:(NSInteger)codeEnd
                           horizontal:(NSInteger)horizontal
                                 data:(NSData *)data;

/**
 *  page 104. 下划线模式开关
 *  0,48 turns off underline mode
 *  1,49 turns on underline mode (1-dot thick)
 *  2,50 turns on underline mode (2-dots thick)
 *  @param underline (0~2,48~50)
 */
- (void)setUnderline:(NSInteger)underline;

/**
 *  page 106. 取消用户已设定的字符
 *  @param n (32~126)
 */
- (void)cancelUserDefinedCharacters:(NSInteger)n;

/**
 *  page 108. 字符加粗开关
 *  n = 0 [default]
 *  @param bold (0~255)
 */
- (void)setBold:(NSInteger)bold;

/**
 *  page 109. 字符黑体字开关
 *  n = 0 [default]
 *
 *  @param doubleStrike (0~255)
 */
- (void)setDoubleStrike:(NSInteger)doubleStrike;

/**
 *  page 110. 设置字符字体
 *  @param font (0~2),(48~50),(97)
 */
- (void)setCharacterFont:(NSInteger)font;

/** ESC R
 *  page 115. 设置国际字符设定
 *  @param set (n<=15)
 */
- (void)setInternationalCharacterSet:(NSInteger)set;

/** ESC V
 *  page 117. 顺时针旋转90度开关
 *  @param mode (0~2),(48~50)
 */
- (void)setVerticalMode:(NSInteger)mode;

/** ESC r
 * page 119. 设置打印颜色
 * n = 0 [default]
 * 0,48 black
 * 1,49 red
 *  @param color (0,1,48,49)
 */
- (void)setPrintColor:(NSInteger)color;

/** ESC t
 *  page 121. 设置字符编码表
 *
 *  @param table (0~5),(16~19),(255)
 */
- (void)setCharacterCodeTable:(NSInteger)table;

/** ESC {
 *  page 124. 颠倒打印开关
 *  @param mode (0~255)
 */
- (void)setUpToDownMode:(NSInteger)mode;

#pragma mark GS ( N

/** GS ( N
 *  page 128. 设置字符颜色
 *  color = 49 [default]
 *
 *  @param color (58~51)
 */
- (void)setCharacterColor:(NSInteger)color;

/** GS ( N
 *  page 130. 设置背景颜色
 *  m = 48 [default]
 *  48 none; 49 clolor1; 50 color2; 51 color3
 *  @param color (48~51)
 */
- (void)setBackgroundColor:(NSInteger)color;

/** GS ( N
 *  page 132. 阴影模式开关
 *
 *  @param mode (0,1,48,49)
 *  @param color (48~51) 48 none; 49 clolor1; 50 color2; 51 color3
 */
- (void)setShadowMode:(NSInteger)mode color:(NSInteger)color;

/** GS !
 *  page 134. 设置字符大小
 *  n = 0 [default]
 */
- (void)setCharacterSize:(NSInteger)size;
- (void)setCharacterWidth:(NSInteger)width height:(NSInteger)height;

/** GS B
 * page 136. 黑白反向打印模式
 *  n = 0 [default]
 *
 *  @param reverse (0~255)
 */
- (void)setReverse:(NSInteger)reverse;

/** GS b
 *  page 138. 平滑模式开关
 *  mode = 0 [default]
 *
 *  @param smooth (0~255)
 */
- (void)setSmooth:(NSInteger)smooth;

#pragma mark Panel Button Commands

/**
 *  page.140 激活/关闭面板按钮
 *  n = 0 enable [default]
 *  n = 1 disable
 *
 *  @param mode (0~255)
 */
- (void)setPanelButtonMode:(NSInteger)mode;

/**
 *  page 145. 是否使用纸尽传感器
 */
- (void)enableOutPaperSensor:(BOOL)enable;

/**
 *  page 147. 设置停止打印传感器
 */
- (void)enableStopPrintSensor:(BOOL)enable;

#pragma mark Print Positioin Commands

/**
 *  page 151. 横向跳格
 */
- (void)setHorizontalTab;

/**
 *  page 152. 设置绝对打印位置
 *
 *  @param position 0-255
 */
- (void)setAbsolutePosition:(NSInteger)position;

/**
 *  page 154. 设置横向跳格位置
 */
- (void)setHorizontalTabPositionsData:(NSData *)data;

/**
 *  page 156. 在页模式下设置打印方向
 
 *  0,48 left to right
 *  1,49 bottom to top
 *  2,50 right to left
 *  3,51 top to bottom
 
 *  @param direction (0~3),(48~51)
 */
- (void)pageSetPrintDirection:(NSInteger)direction;

/**
 *  page 158. 在页模式下设置打印区域
 *
 *  @param xPos (0~65535)
 *  @param yPos   (0~65535)
 *  @param width      (0~65535)
 *  @param height     (0~65535)
 */
- (void)pageSetPrintAreaWithXPos:(NSInteger)xPos
                            yPos:(NSInteger)yPos
                           width:(NSInteger)width
                          height:(NSInteger)height;

/**
 *  page 163. 设置相对打印位置
 *
 *  @param position (-32768 ~ 32767)
 */
- (void)setRelativePosition:(NSInteger)position;

/**
 *  page 165. 设置对齐方式
 *  n = 0 [default]
 *  0,48 left justification
 *  1,49 centered
 *  2,50 right justification
 *
 *  @param justification (0~2),(48~50)
 */
- (void)setJustification:(NSInteger)justification;

/**
 *  page 167. 在页模式下设置绝对垂直打印位置
 *  @param yPos (0~65535)
 */
- (void)pageSetAbsoluteYPos:(NSInteger)yPos;

/**
 *  page 169. 设置左边空白宽度
 *
 *  @param left 左对齐 (0~65535)
 */
- (void)setLeftMargin:(NSInteger)left;

/**
 *  page 171. 设置起始打印行位置
 *  0,48 cancel data in the current print buffer.
 *  1,49 print data in the current print buffer.
 *
 *  @param mode (0,1,48,49)
 */
- (void)setLinePrintPositionMode:(NSInteger)mode;

/**
 *  page 173. 设置打印区域宽度
 *
 *  @param width (0~65535)
 */
- (void)setPrintAreaWidth:(NSInteger)width;

/**
 *  page 177. 在页模式下设置相对垂直打印位置
 *  @param yPos (-32767 ~ 32768)
 */
- (void)pageSetRelativeYPos:(NSInteger)yPos;

#pragma mark Bit Image Commands

/**
 *  page 180. 设置位图模式
 *  @param mode  (0~1),(31~32)
 *  @param width (1~2047)
 *  @param data  (0~255)
 */
- (void)setImageMode:(NSInteger)mode imageWidth:(NSInteger)width data:(NSData *)data;

/**
 *  page 194. 打印NV位图
 *
 *  @param imageID (1~255)
 *  @param mode (0,48:Normal),(1,49:Double-width),(2,50:Double-height),(3,51:Quadruple)
 */
- (void)setNVBitImage:(NSInteger)imageID Mode:(NSInteger)mode;

/**
 *  page 210. 传输NV图形内存容量
 *
 *  @param size 0,48
 */
- (void)setNVGraphicsMemorySize:(NSString *)size;

/**
 *  page 212. 设置图形点密度标准
 *
 *  @param fn 1,49
 *  @param x  50,51
 */
- (void)setGraphicDotDensity:(NSInteger)fn x:(NSInteger)x;

/**
 *  page 214. 打印在打印缓存的图形数据
 *
 *  @param fn 2,50
 */
- (void)printBufferGraphic:(NSInteger)fn;

/**
 *  page 215. 传输NV图形内存剩余容量
 *
 *  @param fn 3,51
 */
- (void)transmitGraphicRemainingMemory:(NSInteger)fn;

/**
 *  page 216. 传输下载图形内存的剩余容量
 *
 *  @param fn 4,52
 */
- (void)transmitDownloadGraphicRemainingMemory:(NSInteger)fn;

/**
 *  page 218. 传输已定义NV图形键值表
 */
- (void)transmitNVGrapihcKeyCodeList;

/**
 *  page 220. 删除所有NV图形数据
 */
- (void)deleteNVGraphicAll;

/**
 *  page 221. 删除指定的NV图形数据
 *
 *  @param keycode1 (32~126)
 *  @param keycode2 (32~126)
 */
- (void)deleteNVGraphicWithKeycode1:(NSInteger)keycode1 keycode2:(NSInteger)keycode2;

/**
 *  page 222. 定义NV像素图图形数据
 *
 *  @param keycode          (32~126)
 *  @param keycode2          (32~126)
 *  @param imageWidth  (1~8192)
 *  @param imageHeight (1~2304)
 *  @param data    imageData
 */
- (void)defineRasterNVGraphicData:(NSData *)data
                          keycode:(NSInteger)keycode
                         keycode2:(NSInteger)keycode2
                       imageWidth:(NSInteger)imageWidth
                      imageHeight:(NSInteger)imageHeight;

/**
 *  page 227. 定义所有NV纵列图形数据
 *
 *  @param keycode     (32~126)
 *  @param keycode2    (32~126)
 *  @param imageWidth  (1~8192)
 *  @param imageHeight (1~2304)
 *  @param data   imageData
 */
- (void)defineColumnNVGraphicData:(NSData *)data
                          keycode:(NSInteger)keycode
                         keycode2:(NSInteger)keycode2
                       imageWidth:(NSInteger)imageWidth
                      imageHeight:(NSInteger)imageHeight;

/**
 *  page 231. 打印指定的NV图形数据
 *
 *  @param keycode      (32~126)
 *  @param keycode2     (32~126)
 *  @param xScale   1,2
 *  @param yScale  1,2
 */
- (void)printNVGraphicWithKeycode:(NSInteger)keycode
                         keycode2:(NSInteger)keycode2
                           xScale:(NSInteger)xScale
                           yScale:(NSInteger)yScale;

/**
 *  page 238. 传输已定义下载图形键值表
 */
- (void)transmitGraphicKeycodeList;

/**
 *  page 240. 删除所有NV图形数据
 */
- (void)deleteDownloadedNVGraphicAll;

/**
 *  page 241. 打印指定的NV图形数据
 *
 *  @param keycode (32~126)
 *  @param keycode2 (32~126)
 */
- (void)deleteDownloadedNVGraphicKeycode:(NSInteger)keycode keycode2:(NSInteger)keycode2;

/**
 *  page 242. 定义已下载的光栅格式图形数据
 *
 *  @param keycode         (32~126)
 *  @param keycode2         (32~126)
 *  @param imageWidth  (1~8192)
 *  @param imageHeight (1~2304)
 *  @param data   imageData
 */
- (void)defineDownloadedRasterNVGraphicData:(NSData *)data
                                    keycode:(NSInteger)keycode
                                   keycode2:(NSInteger)keycode2
                                 imageWidth:(NSInteger)imageWidth
                                imageHeight:(NSInteger)imageHeight;

/**
 *  page 246. 定义已下载的列格式图形数据
 *
 *  @param keycode         (32~126)
 *  @param keycode2         (32~126)
 *  @param imageWidth  (1~8192)
 *  @param imageHeight (1~2304)
 *  @param data   imageData
 */
- (void)defineDownloadedColumnNVGraphicData:(NSData *)data
                                    keycode:(NSInteger)keycode
                                   keycode2:(NSInteger)keycode2
                                 imageWidth:(NSInteger)imageWidth
                                imageHeight:(NSInteger)imageHeight;

/**
 *  page 250. 打印指定下载的NV图形数据
 *
 *  @param keycode         (32~126)
 *  @param keycode2         (32~126)
 */
- (void)printDownloadedNVGraphicWithKeycode:(NSInteger)keycode
                                   keycode2:(NSInteger)keycode2
                                     xScale:(NSInteger)xScale
                                     yScale:(NSInteger)yScale;

/**
 *  page 252. 在打印缓存像素图储存图形数据
 *  Users have the option of specifying horizontal(times bx) * vertical(times by) size setting for the selected data.
 *  @param xScale          (1~2)
 *  @param yScale          (1~2)
 *  @param imageWidth  (1~2047)
 *  @param imageHeight (1~1662,831,415)
 *  @param data   imageData
 */
- (void)storeRasterGraphicData:(NSData *)data
                        xScale:(NSInteger)xScale
                        yScale:(NSInteger)yScale
                    imageWidth:(NSInteger)imageWidth
                   imageHeight:(NSInteger)imageHeight;

/**
 *  page 261. 在打印缓存纵列储存的图形数据
 *  Users have the option of specifying horizontal bx * vertical by size setting for the selected data.
 *  @param xScale          (1~2)
 *  @param yScale          (1~2)
 *  @param imageWidth  (1~2047)
 *  @param imageHeight (1~1662,831,415)
 *  @param data   imageData
 */
- (void)storeColumnGraphicData:(NSData *)data
                        xScale:(NSInteger)xScale
                        yScale:(NSInteger)yScale
                    imageWidth:(NSInteger)imageWidth
                   imageHeight:(NSInteger)imageHeight;

/**
 *  page 264. 定义NV位图
 *  Defines the NV bit image in the NV graphics area.
 *  @param number    (1~255)
 */
- (void)defineNVGraphicData:(NSData *)data number:(NSInteger)number;

/**
 *  page 268. 打印像素图位图
 *
 *  @param image  source image
 *  @param mode   binary/dithering
 *  @param compress TIFF/ZPL2/None
 */
- (void)appendRasterImage:(CGImageRef)image mode:(PTBitmapMode)mode compress:(PTBitmapCompressMode)compress;

/**
 *  page 273. 定义下载位图
 *
 *  @param widthBytes  (1~255)
 *  @param heightBytes    (1~255)
 *  @param imageData        imageData
 */
- (void)defineDownloadedImage:(NSData *)imageData
                   widthBytes:(NSInteger)widthBytes
                  heightBytes:(NSInteger)heightBytes;

/**
 *  page 276. 打印已下载的位图
 *
 *  (0,48:Normal),(1,49:Double-width),(2,50:Double-height),(3,51:Quadruple)
 *
 *  @param scale (0~3),(48~51)
 */
- (void)printDownloadedImageWithScale:(NSInteger)scale;

/**
 *  page 283. 打印可变垂直大小位图
 */
- (void)appendColumnImage:(CGImageRef)image scale:(NSInteger)scale;

#pragma mark Status Commands

/**
 *  page 288. 传输实时状态
 *  @param status (1~4),(7~8)
 */
- (void)transmitRealTimeStatus:(NSInteger)status;

/**
 *  page 305. 传输外部设备状态
 *  @param status (0,48)
 */
- (void)transmitPeripheralDeviceStatus:(NSInteger)status;

/**
 *  page 306. 传输纸张传感器状态
 */
- (void)transmitPaperSonsorStatus;

/**
 *  page 308. 激活/关闭自动返回状态
 */
- (void)setASBStatusWithDrawer:(BOOL)drawer
                       offline:(BOOL)offline
                         error:(BOOL)error
                     rollPaper:(BOOL)rollPaper
                   panelSwitch:(BOOL)panelSwitch;

/**
 *  page 322. 激活/关闭油墨自动返回状态
 */
- (void)setInkASBWithOffline:(BOOL)offline detection:(BOOL)detection;

/**
 *  page 327. 传输状态
 * 1,49: transmits paper sensor status
 * 2,50: transmits drawer kick-out connector status
 * 4,52: transmits ink status
 *
 *  @param status (1,2,4,49,50,52)
 */
- (void)transmitStatus:(NSInteger)status;

#pragma mark Bar Code Commands


/**
 *  page 334. 设置打印条码数字字体
 *  0,48 font a
 *  1,49 font b
 *  2,50 font c
 *
 *  @param font (0~2),(48~50)
 */
- (void)setHRIFont:(NSInteger)font;

/**
 *  @param justification    page 165. 对齐方式       取值0,1,2 : 左、中、右
 *  @param type             page 339. 取值：(A:0~6),(B:65~73)
 *  @param width            page 355. 取值：(2~6),(68~76)
 *  @param height           page 337. 取值：(1~255)
 *  @param hri     page 332. 取值：(0~3),(48~51)
 *  @param data          page 339.
 */
- (void)appendBarcode:(ESCBarcode)type
                 data:(NSString *)data
        justification:(NSInteger)justification
                width:(NSInteger)width
               height:(NSInteger)height
                  hri:(NSInteger)hri;

#pragma mark Macro Function Commands

/**
 *  page 360. 开始或结束宏定义
 */
- (void)defineMacro;

/**
 *  page 362. 执行宏操作
 *  Executes a macro 'times' while 'wait_times' * 100 msec for each macro execution,using the mode specified by 'mode' as follows.
 *
 *  @param times      (1~255)
 *  @param waitTimes (0~255)
 *  @param mode       (0,1)
 */
- (void)executeMacroWithTimes:(NSInteger)times
                    waitTimes:(NSInteger)waitTimes
                         mode:(NSInteger)mode;

#pragma mark Mechanism Control Commands

/**
 *  page 366. 返回主页
 */
- (void)returnHome;

/**
 *  page 367. 打开/关闭单向打印模式
 *
 *  @param mode (0~255)
 */
- (void)setUnidirectionalPrintMode:(NSInteger)mode;

/**
 *  page 368. 局部切纸
 */
- (void)setPartialCut1;

/**
 *  page 370. 局部切纸
 */
- (void)setPartialCut3;

/**
 *  page 372. 设置剪纸模式并剪纸
 *
 *  @param mode     (0,1,48,49)
 *  @param distance (0~255)
 */
- (void)setCutMode:(NSInteger)mode distance:(NSInteger)distance;

#pragma mark Miscellaneous Commands

/**
 *  page 380. 发送实时请求
 *
 *  @param request (1~2)
 */
- (void)sendRealTimeRequest:(NSInteger)request;

/**
 *  page 385. 实时脉冲
 *
 *  @param mode 0,1
 *  @param time (1~8)
 */
- (void)generatePulseWithMode:(NSInteger)mode Time:(NSInteger)time;

/**
 *  page 388. 执行关机事件
 */
- (void)executePowerOffSequence;

/**
 *  page 391. 实时传输指定状态
 *
 *  @param status 1,5
 */
- (void)transmitSpecifiedStatus:(NSInteger)status;

/**
 *  page 396. 清除缓存
 */
- (void)clearBuffer;

/**
 *  page 405
 *
 *  @param times (0~63)
 *  @param t1    (0~255)
 *  @param t2    (0~255)
 */
- (void)escBeepIntegratedBeeperWithTimes:(NSInteger)times T1:(NSInteger)t1 T2:(NSInteger)t2;

/**
 *  page 406
 *
 *  @param a     (48~51)
 *  @param times 0,255
 *  @param t1    (1~50,255)
 *  @param t2    (1~50)
 */
- (void)escSetIntegratedBeeperWhenOfflineFactorsOccurA:(NSInteger)a Times:(NSInteger)times T1:(NSInteger)t1 T2:(NSInteger)t2;

/**
 *  page 408
 *
 *  @param times 0,255
 *  @param t1    (1~50,255)
 *  @param t2    (1~50)
 */
- (void)escSetIntegratedBeeperExceptWhenOfflineFactorsOccurWithTimes:(NSInteger)times T1:(NSInteger)t1 T2:(NSInteger)t2;

/**
 *  page 410. 设置外围设备
 *  1,3 enables printer
 *  2   disables printer
 *
 *  @param mode (1~3)
 */
- (void)escSelectPeripheralDevice:(NSInteger)mode;

/**
 *  page 412. 初始化打印机
 */
- (void)initializePrinter;

/**
 *  page 413. 设置页模式
 */
- (void)setPageMode;

/**
 *  page 416. 设置标准模式
 */
- (void)setStandardMode;

/**
 *  page 418. 发射脉冲
 *  0,48: drawer kick-out connector pin 2
 *  1,49: drawer kick-out connector pin 5
 *
 *  @param pin_mode 0,1,48,49
 *  @param on_time  (0~255)
 *  @param off_time (0~255)
 */
- (void)escGeneratePulsePinMode:(NSInteger)pin_mode ONTime:(NSInteger)on_time OFFTime:(NSInteger)off_time;

/**
 *  page 420. 执行测试打印
 *
 *  @param type (0,1,2),(48,49,50)
 *  @param mode (1,2,3),(49,50,51),64
 */
- (void)escExecuteTestPrintType:(NSInteger)type Mode:(NSInteger)mode;

/**
 *  page 424. 激活/关闭实时命令
 *
 *  @param cmdLength (3,5)
 *  @param type   (1,2)
 *  @param mode   (0,1,48,49)
 */
- (void)escSetRealTimeCommandLength:(NSInteger)cmdLength type:(NSInteger)type mode:(NSInteger)mode;

/**
 *  page 427. 请求传输响应或状态
 */
- (void)escRequestTransmissionOfResponseOrStatus;

/**
 *  page 445. 选择打印控制方法
 *  0,48:   print mode when power is turned on
 *  (1,49: mode1), (2,50:mode2), (3,51:mode3), (4,52:mode4)
 *
 *  @param mode (0,4),(48,52)
 */
- (void)escSelectPrintControlMode:(NSInteger)mode;

/**
 *  page 448. 选择打印浓度
 *
 *  @param density (250~255),(0~6)
 */
- (void)setDensity:(NSInteger)density;

/**
 *  page 451. 选择打印速度
 *
 *  @param speed (0~11),(48~57)
 */
- (void)setSpeed:(NSInteger)speed;

/**
 *  page 453. 选择激活部分热打印头的数量
 *
 *  @param number (0~4),(48~52),128
 */
- (void)escSelectNumbersOfPartsForThermalHeadEnergizing:(NSInteger)number;

/**
 *  page 456. 页模式下设置可打印区域
 */
- (void)setPageAreaWithWidth:(NSInteger)width
                      height:(NSInteger)height
                     xOffset:(NSInteger)xOffset;

/**
 *   page 461. 画线
 *
 *  @param xPos (0~431)
 *  @param yPos (0~1199)
 *  @param xEnd (0~431)
 *  @param yEnd (0~1199)
 *  @param mode (1~3)
 */
- (void)appendLineWithXPos:(NSInteger)xPos
                      yPos:(NSInteger)yPos
                      xEnd:(NSInteger)xEnd
                      yEnd:(NSInteger)yEnd
                      mode:(NSInteger)mode;

/**
 *  page 465. 绘制矩形
 *
 *  @param xPos (0~431)
 *  @param yPos (0~1199)
 *  @param xEnd (0~431)
 *  @param yEnd (0~1199)
 *  @param mode (1~3)
 */
- (void)appendRectWithXPos:(NSInteger)xPos
                      yPos:(NSInteger)yPos
                      xEnd:(NSInteger)xEnd
                      yEnd:(NSInteger)yEnd
                      mode:(NSInteger)mode;

/**
 *  page 468. 传送打印机ID
 * (1,49: Printer model ID),(2,50: Type ID), (3,51: Version ID)
 *
 *  @param id_number (1~3),(49~51)
 */
- (void)escTransmitPrinterID:(NSInteger)id_number;

/**
 *  page 484. 设置水平垂直移动单位
 *
 *  @param horizontal (0~255)
 *  @param vertical (0~255)
 */
- (void)setMotionUnitsWithHorizontal:(NSInteger)horizontal vertical:(NSInteger)vertical;

/**
 *  page 486. 初始化维护计数器
 *
 *  @param counter (20,21,50,70)
 */
- (void)escInitializeMaintenanceCounter:(NSInteger)counter;

/**
 *  page 488. 传送维护计数器
 *
 *  @param counter (20,21,50,70)
 */
- (void)escTransmitMaintenanceCounter:(NSInteger)counter;

/**
 *  page 493. 设置在线恢复等待时间
 *
 *  @param wait_time1 (0~255) default 6
 *  @param wait_time2 (0~255) default 0
 */
- (void)escSetOnlineRecoveryWaitTime1:(NSInteger)wait_time1 WaitTime2:(NSInteger)wait_time2;

#pragma mark Kanji Commands

/**
 *  page 502. 选择打印日本汉字字符模式
 */
- (void)setKanjiWithReverse:(BOOL)reverse
                doubleWidth:(BOOL)doubleWidth
               doubleHeight:(BOOL)doubleHeight
                  underline:(BOOL)underline;

/**
 *  page 505. 选择日本汉字字符模式
 */
- (void)setKanjiMode;

/**
 *  page 508. 选择日本汉字字符字体
 *
 *  @param mode (0~2),(48~50)
 */
- (void)setKanjiFontMode:(NSInteger)mode;

/**
 *  page 510. 打开/关闭日本汉字字符下划线
 *  0,48: turn off kanji underline mode
 *  1,49: turn on kanji underline mode(1-dot thick)
 *  2,50: turn on kanji underline mode(2-dots thick)
 *
 *  @param underline (0~2),(48~50)
 */
- (void)setKanjiUnderline:(NSInteger)underline;

/**
 *  page 512. 取消日本汉字字符模式
 */
- (void)cancelKanjiMode;

/**
 *  page 514. 定义用户定义的日本汉字字符
 *
 *  @param first (119,236,254)
 *  @param second (33~126),(64~126),(128~158),(161~254)
 */
- (void)defineKanji:(NSData *)data first:(NSInteger)first second:(NSInteger)second;

/**
 *  page 518. 选择日本汉字代码系统
 *  0,48 JIS code
 *  1,49 SHIFT JIS code
 *
 *  @param system (0,1),(48,49)
 */
- (void)setKanjiCodeSystem:(NSInteger)system;

/**
 *  page 520. 设定日本汉字字符间距
 *
 *  @param left (0~32) default:0
 *  @param right (0~32) default:0
 */
- (void)setKanjiSpacingWithLeft:(NSInteger)left right:(NSInteger)right;

/**
 *  page 522. 打开/关闭日本汉字倍高倍宽
 *
 *  @param mode (0~255)
 */
- (void)setKanjiQuadrupleMode:(NSInteger)mode;

/**
 *  page 523. 取消用户定义的日本汉字字符
 *
 *  @param first (119,236,254)
 *  @param second (33~126),(64~126),(128~158),(161~254)
 */
- (void)cancelKanjiDefineWithFirst:(NSInteger)first second:(NSInteger)second;

#pragma mark Two Dimension Code Commands

/**
 *  Document 14.1
 *
 *  @param data      data String
 *  @param row       0, 3 to 90
 *  @param column    0 to 30
 *  @param width     2 to 8
 *  @param rowHeight 2 to 8
 *  @param eccMode   48 to 49
 *  @param eccLevel  48 to 50
 *  @param option    0 to 1
 */
- (void)appendPDF417Data:(NSString *)data
                     row:(NSInteger)row
                  column:(NSInteger)column
                   width:(NSInteger)width
               rowHeight:(NSInteger)rowHeight
                 eccMode:(NSInteger)eccMode
                eccLevel:(NSInteger)eccLevel
                  option:(NSInteger)option;

/**
 *  page 549. 传输符号存储区中符号数据的大小信息
 */
- (void)transmitPDF417SymbolDataSize;

/**
 
 Document 14.2
 *  @param justification    page 165. 对齐方式       取值0,1,2 : 左、中、右
 *  @param leftMargin       page 169. 左间距
 *  @param model            page 552. 二维码样式     取值49,50 : 两种样式
 *  @param size             page 553. 大小          取值1~16
 *  @param eccLevel  page 555. 纠错等级       取值48~51: Level L,M,Q,H
 *  @param data             page 557. 二维码数据
 */
- (void)appendQRCodeData:(NSString *)data
           justification:(NSInteger)justification
              leftMargin:(NSInteger)leftMargin
                eccLevel:(NSInteger)eccLevel
                   model:(NSInteger)model
                    size:(NSInteger)size;

/**
 *  page 562. 二维码:传输符号存储区中的符号数据的大小信息
 */
- (void)transmitQRCodeSymbolDataSize;

/**
 *  Document 14.3
 *
 *  @param data maxicode数据
 */
- (void)appendMaxiCodeData:(NSString *)data mode:(NSInteger)mode;

/**
 *  page 570. 传输符号存储区中的符号数据大小信息
 */
- (void)transmitMaxiCodeSymbolDataSize;


/**
 *  Document 14.4
 *
 *  @param data        RSS-2D data
 *  @param mode        72,73,76
 *  @param moduleWidth 2 to 8
 *  @param maxWidth    2 to 8
 */
- (void)appendRSS2Data:(NSData *)data
                  mode:(NSInteger)mode
           moduleWidth:(NSInteger)moduleWidth
              maxWidth:(NSInteger)maxWidth;

/**
 *  page 579. 传输符号存储区中符号数据的大小信息
 */
- (void)transmitRSS2SymbolDataSize;

/**
 *  Document 14.5
 *
 *  @param data        composite symbol data
 *  @param mode        48 to 49
 *  @param type        65 to 77
 *  @param moduleWidth 2 to 8
 *  @param maxWidth    2 to 8
 *  @param hriFont     0 to 3, 48 to 51
 */
- (void)appendCompositeSymbolData:(NSData *)data
                             mode:(NSInteger)mode
                             type:(NSInteger)type
                      moduleWidth:(NSInteger)moduleWidth
                         maxWidth:(NSInteger)maxWidth
                          hriFont:(NSInteger)hriFont;

/**
 *  page 600. 传输符号存储区中的符号数据的大小信息
 */
- (void)transmitCompositeSymbolDataSize;

#pragma mark Customize Commands

/**
 *  page 606. 写入NV用户内存
 *  @param address (0~1023)
 */
- (void)writeNVUserMemory:(NSInteger)address data:(NSData *)data;

/**
 *  page 608. 读取NV用户内存
 *  @param address (0~1023)
 */
- (void)readNVUserMemory:(NSInteger)address length:(NSInteger)length;

/**
 *  page 615. 删除指定记录数据
 *
 *  @param mode (0,48)
 *  @param key (32~126)
 *  @param key2 (32~126)
 */
- (void)deleteRecordWithMode:(NSInteger)mode key:(NSInteger)key key2:(NSInteger)key2;

/**
 *  page 616. 存储指定记录数据
 *
 *  @param mode (0,48)
 *  @param key (32~126)
 *  @param key2 (32~126)
 */
- (void)storeRecordWithMode:(NSInteger)mode key:(NSInteger)key key2:(NSInteger)key2 data:(NSData *)data;

/**
 *  page 618. 传输指定记录数据
 *
 *  @param mode (0,48)
 *  @param key (32~126)
 *  @param key2 (32~126)
 */
- (void)transmitDataInRecordWithMode:(NSInteger)mode key:(NSInteger)key key2:(NSInteger)key2;

/**
 *  page 620. 传输当前NV用户已使用内存容量
 *
 *  @param mode 3,51
 */
- (void)transmitNVMemoryUsedCapacityWithMode:(NSInteger)mode;

/**
 *  page 621. 传输NV用户内存剩余容量
 *
 *  @param mode 4,52
 */
- (void)transmitNVMemoryRemainingCapacityWithMode:(NSInteger)mode;

/**
 *  page 622. 传输键控代码列表
 *
 *  @param mode 5,53
 */
- (void)transmitKeyCodeListWithMode:(NSInteger)mode;

/**
 *  page 624. 删除所有NV用户内存
 *
 *  @param mode 6,54
 */
- (void)deleteNVMemoryAllWithMode:(NSInteger)mode;

/**
 *  page 631. 变换用户设置模式
 */
- (void)changeUserSettingMode;

/**
 *  page 632. 结束用户设置模式会话
 */
- (void)endUserSettingMode;

/**
 *  page 633. 更改内存开关
 *
 *  @param data (0~255)
 */
- (void)escChangeMemorySwitchData:(NSData *)data;

/**
 *  page 646. 传输内存开关设置
 *
 *  @param a (1,2,8)
 */
- (void)escTransmitMemorySwitchSettingA:(NSInteger)a;

/**
 *  page 648. 设定自定义设置值
 */
- (void)escSetCustomizedSettingValuesData:(NSData *)data;

/**
 *  page 663. 传输自定义设置值
 *
 *  @param a (5,6,97,116,118)
 */
- (void)escTransmitCustomizedSettingValuesA:(NSInteger)a;

/**
 *  page 666. 复制用户定义页面
 *
 *  @param font_number  (10,12,17,18)
 *  @param d1 (30,31)
 *  @param d2 (30,31) d1 can't be euqual o d2!!
 */
- (void)escCopyUserDefinedPageWithFontNumber:(NSInteger)font_number D1:(NSInteger)d1 D2:(NSInteger)d2;

/**
 *  page 669. 定义字符代码页数据(列格式)
 *
 *  @param c1 (128~255)
 *  @param c2 (128~255)
 */
- (void)escDefineColumnFormatDataForCharacterCodePageY:(NSInteger)y C1:(NSInteger)c1 C2:(NSInteger)c2 Data:(NSData *)data;

/**
 *  page 671. 定义字符代码页数据(行格式)
 *
 *  @param c1 (128~255)
 *  @param c2 (128~255)
 */
- (void)escDefineRasterFormatDataForCharacterrCodePageX:(NSInteger)x C1:(NSInteger)c1 C2:(NSInteger)c2 Data:(NSData *)data;

/**
 *  page 673. 删除字符代码页数据
 *
 *  @param c1 (128~255)
 *  @param c2 (128~255)
 */
- (void)escDeleteDataForChracterCodePageC1:(NSInteger)c1 C2:(NSInteger)c2;

/**
 *  page 674. 设置串行接口配置项
 *
 *  @param a    (1~4),depend on data
 */
- (void)escSetConfigurationItemForSerialInterfaceA:(NSInteger)a Data:(NSData *)data;

/**
 *  page 678. 传输串行接口配置项
 *
 *  @param pl   (2)
 *  @param ph   (0)
 *  @param a    (1~4)
 */
- (void)escTransmitConfigurationItemForSerialInterfacePL:(NSInteger)pl PH:(NSInteger)ph A:(NSInteger)a;

/**
 *  page 680. 设置蓝牙接口配置项
 *  @param a (49,65)
 */
- (void)escSetConfigurationItemForBluetoothInterfaceA:(NSInteger)a Data:(NSData *)data;

/**
 *  page 682. 传输设置蓝牙接口配置项
 *
 *  @param a (48,49,65)
 */
- (void)escTransmitConfigurationItemForBluetoothInterfaceA:(NSInteger)a;

/**
 *  page 685. 删除页面布局
 */
- (void)escDeletePaperLayout;

/**
 *  page 686. 设置页面布局
 *
 *  @param p (9~36)
 *  @param sa (48,49,64)
 *  @param sb (135~3000)
 *  @param sc (25~100)
 *  @param sd (0~3000)
 *  @param se (0~3000)
 *  @param sf (38~3000)
 *  @param sg (when sa = '48' or '49':27~507),(when sa = '64':47~507)
 *  @param sh (when sa = '48' or '49':240~720),(when sa = '64':240~700)
 */
- (void)escSetPaperLayoutP:(NSInteger)p   SA:(NSInteger)sa SB:(NSInteger)sb SC:(NSInteger)sc
                        SD:(NSInteger)sd SE:(NSInteger)se SF:(NSInteger)sf SG:(NSInteger)sg SH:(NSInteger)sh;

/**
 *  page 692. 传输页面布局信息
 *
 *  @param n 64,80
 */
- (void)escTransmitPaperLayoutInformation:(NSInteger)n;

/**
 *  page 701. 工作区域设置值保存到存储区域
 *
 *  @param fn (1,49)
 *  @param m  (1,49)
 */
- (void)escSaveSettingValuesFromWorkAreaIntoStorageAreaFN:(NSInteger)fn M:(NSInteger)m;

/**
 *  page 702. 加载存储区域已保存的设定值到工作区域
 *
 *  @param fn (2,50)
 *  @param m  (0,1,48,49)
 */
- (void)escLoadSettingValuesStoredInStorageAreaToWorkAreaFN:(NSInteger)fn M:(NSInteger)m;

/**
 *  page 703. 初始化过程后选择设置值加载到工作区域
 *
 *  @param fn (3,51)
 *  @param m  (0,1,48,49)
 */
- (void)escSelectSettingValuesLoadedToWorkAreaAfterInitializationProcessFN:(NSInteger)fn M:(NSInteger)m;

#pragma mark Counter Printing Commands

/**
 *  page 705. 选择计数器打印模式
 *
 *  @param digits        (2~5)
 *  @param justification (0~2),(48~50)
 */
- (void)escSelectCounterPrintModeWithDigits:(NSInteger)digits Justification:(NSInteger)justification;

/**
 *  page 707. 选择计数模式
 *
 *  @param counting_mode  (0~65535)
 *  @param repetition     (0~65535)
 */
- (void)escSelectCounterModeA_MinimumValue:(NSInteger)minimum_value
                              MaximumValue:(NSInteger)maximum_value
                              CountingMode:(NSInteger)counting_mode
                                Repetition:(NSInteger)repetition;

/**
 *  page 709. 设定计数器
 *
 *  @param counter (0~65535) default:1
 */
- (void)escSetCounter:(NSInteger)counter;

/**
 *  page 710. 选择计数器模式
 *
 *  @param sa (0~65535)     default:1
 *  @param sb (0~65535)     default:65535
 *  @param sn (0~255)       default:1
 *  @param sr (0~255)       default:1
 *  @param sc (0~65535)     default:1
 */
- (void)escSelectCounterModeB_SA:(NSInteger)sa SB:(NSInteger)sb SN:(NSInteger)sn SR:(NSInteger)sr SC:(NSInteger)sc;

/**
 *  page 713. 打印计数器
 */
- (void)escPrintCounter;

#pragma mark Printing Paper Commands

/**
 *  page 720. 纸张布局设置
 *
 *  @param p  (8~26)
 *  @param sm (0~3) mode
 *  @param sa (0),(284~1550)
 *  @param sb (-150,-1500)
 *  @param sc (-290,-50)
 *  @param sd (0,-15)
 *  @param se (-15,-15)
 *  @param sf (290,-600)
 */
- (void)escPaperLayoutSettingP:(NSInteger)p   SM:(NSInteger)sm SA:(NSInteger)sa
                            SB:(NSInteger)sb SC:(NSInteger)sc SD:(NSInteger)sd SE:(NSInteger)se SF:(NSInteger)sf;

/**
 *  page 729. 传递纸张布局设置
 *
 *  @param n (64,80)
 */
- (void)escPaperLayoutInformationTransmissionN:(NSInteger)n;

/**
 *  page 732. 传输当前位置信息
 *
 *  @param m 48
 */
- (void)escTransmitPositioningInformationM:(NSInteger)m;

/**
 *  pag 737. 从标签脱离位置走纸
 *
 *  @param m (48,49)
 */
- (void)escFeedPaperToLabelPeelingPositionM:(NSInteger)m;

/**
 *  page 740. 从剪纸位置走纸
 *
 *  @param m (48,49)
 */
- (void)escFeedPaperToCuttingPositionM:(NSInteger)m;

/**
 *  page 742. 从打印开始位置走纸
 *
 *  @param m (48,49,50)
 */
- (void)escFeedPaperToPrintStartingPositionM:(NSInteger)m;

/**
 *  page 744. 纸张布局误差设置
 *
 *  @param p  (2,3)
 *  @param sn (80)
 */
- (void)escPaperLayoutErrorSpecialMarginSettingP:(NSInteger)p SN:(NSInteger)sn;

@end
