//
//  EscCommand.h
//  Gprinter
//
//  Created by Wind on 14/12/22.
//  Copyright (c) 2014年 JiaBo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface EscCommand : NSObject

/**
 * 方法说明:打印UPCA条码
 * @param content 数据范围0-9,长度为11位
 */
-(void) addUPCAtest:(NSString*) content;

/**
 * 方法说明:插入文字
 * @param text 文本
 */
-(void) addText:(NSString*) text;

/**
 * 方法说明:获得打印命令
 * @return NSData*
 */
-(NSData*) getCommand;

/**
 * 方法说明:将字符串转成十六进制码
 * @param  str  命令字符串
 */
-(void) addStrToCommand:(NSString *) str;

/**
 * 方法说明:打印机初始化,必须是第一个打印命令0x1b,0x40
 */
-(void) addInitializePrinter;

/**
 * 方法说明:打印并且走纸多少行,默认为8行,打印完内容后发送
 * @param n 行数
 */
-(void) addPrintAndFeedLines:(int) n;

/**
 *  方法说明:换行
 */
-(void)addPrintAndLineFeed;

/**
 * 方法说明:设置打印模式,0x1B 0x21 n(0-255),根据n的值设置字符打印模式
 *@param n 二进制默认为00000000(0X0),10001000(0X88)表示下划线和加粗,00001000(0X08)表示加粗,10000000(0X80)表示下划线
 */
-(void) addPrintMode:(int) n;
/**
 * 方法说明:设置国际字符集,默认为美国0
 * @param n 字符集编号
 */
-(void) addSetInternationalCharacterSet:(int) n;
/**
 * 方法说明:设置字符是否旋转90°,默认为0
 * @param n 是否旋转
 */
-(void) addSet90ClockWiseRotatin:(int) n;

/**
 * 方法说明:设置对齐方式
 * @param n 左 中 右对齐,0左对齐,1中间对齐,2右对齐
 */
-(void) addSetJustification:(int) n;

/**
 * 方法说明:开钱箱
 * @param m  钱箱引脚号
 * @param t1          高电平时间
 * @param t2          低电平时间
 */
-(void) addOpenCashDawer:(int) m :(int) t1 :(int) t2;

/**
 * 方法说明:蜂鸣器
 * @param m  报警灯和鸣叫次数
 * @param t  时间
 * @param n  方式
 */
-(void) addSound:(int) m :(int) t :(int) n;

/**
 * 方法说明:设置行间距,不用设置,打印机默认为30
 * @param n  行间距高度,包含文字
 */
-(void) addLineSpacing:(int) n;

/**
 * 方法说明:设置倒置模式 选择/取消倒置打印模式。
 * @param n  是否倒置,默认为0, 0 ≤n ≤255 当n的最低位为0时,取消倒置打印模式。当n的最低位为1时,选择倒置打印模式。只有n的最低位有效;
 */
-(void) addSetUpsideDownMode:(int) n;

/**
 * 方法说明:设置字符放大,限制为不放大和放大2倍,n=0x11
 * @param n = width | height 宽度放大倍数,0 ≤n ≤255 (1 ≤ 纵向放大倍数 ≤8,1 ≤ 横向放达倍数 ≤8)[描述]   用0 到2 位选择字符高度,4 到7 位选择字符宽度
 */
-(void) addSetCharcterSize:(int) n;

/**
 * 方法说明:设置反白模式,黑白反显打印模式
 * @param n  是否反白,当n的最低位为0时,取消反显打印模式。当n的最低位为1时,选择反显打印模式。只有n的最低位有效;
 */
-(void) addSetReverseMode:(int) n;


/**
 * 方法说明:打印机实时状态请求
 * @param n  PRINTER_STATUS  打印机状态 1 ≤n ≤4
 *                PRINTER_OFFLINE 脱机状态
 *                PRINTER_ERROR   错误状态
 *                PRINTER_PAPER   纸张状态
 */
-(void) queryRealtimeStatus:(int) n;

/**
 * 方法说明:设置切纸后走纸
 * @param n  走纸距离
 */
-(void) addCutPaperAndFeed:(int) n;

/**
 * 方法说明:切纸 0全切纸,1是半切
 */
-(void) addCutPaper:(int) m;
/**
 * 方法说明:设置条码可识别字符,选择HRI字符的打印位置
 * @param n  可识别字符位置,0, 48  不打印 1, 49  条码上方 2, 50  条码下方 3, 51  条码上、下方都打印
 */
-(void) addSetBarcodeHRPosition:(int) n;

/**
 * 方法说明:设置条码字符种类,选择HRI使用字体
 */
-(void) addSetBarcodeHRIFont;
/**
 * 方法说明:设置条码高度
 * @param n 高度 条码高度为n点,默认为40
 */
-(void) addSetBarcodeHeight:(int) n;

/**
 * 方法说明:设置条码单元宽度,不用设置,使用打印机内部默认值
 * @param n 条码宽度 2 ≤n ≤6
 */
-(void) addSetBarcodeWidth:(int) n;

/**
 * 方法说明:打印EAN13码
 * @param content 数据范围0-9,长度为12位
 */
-(void) addEAN13:(NSString*) content;

/**
 * 方法说明:打印EAN8码
 * @param content 数据范围0-9,长度为7位
 */
-(void) addEAN8:(NSString*) content;

/**
 * 方法说明:打印UPCA条码
 * @param content 数据范围0-9,长度为11位
 */
-(void) addUPCA:(NSString*) content;

/**
 * 方法说明:打印ITF14条码
 * @param content 数据范围 0-9   数据长度   偶数个
 */
-(void) addITF:(NSString*) content;

/**
 * 方法说明:打印CODE39条码
 * @param content  数据范围0-9 A-Z SP $ % + - . / ,*为 (开始/结束字符)
 */
-(void) addCODE39:(NSString*) content;


/**
 * 方法说明:打印CODE128码
 * 采用的是1D 6B 49 n的命令格式,n为后面所有打印字符串的长度,包括了字符集的声明。默认使用CODEB字符集:  {B , 0x7B, 0x42
 * @param charset  ,CODEB字符集有 {A  {B  {C,charset默认值用B ,实际上,字符集可以插入到content中,一个content可以有多个字符集定义。
 * @param content 数据范围0x00-0x7f
 */
-(void) addCODE128:(char) charset :(NSString*) content;

/**
 * 方法说明:打印CODE128码支持混合{A {B {C打印,支持58mm纸打印超过14位的奇数数字,例如15位 17位 19位的数字串
 * 采用的是1D 6B 49 n的命令格式,n为后面所有打印字符串的长度,包括了字符集的声明。默认使用CODEB字符集:  {B , 0x7B, 0x42
 * CODEB字符集有 {A  {B  {C,默认值用B ,实际上,字符集可以插入到data中,一个data可以有多个字符集定义。
 * @param height 条码高度
 * @param width 条码宽度
 * @param data 数据范围0x00-0x7f,全部为16进制
 */
-(void) addCODE128ABC:(int) height :(int) width :(NSData*) data;


/**
 * 方法说明:addNVLOGO
 * @param n 序号,1<=n<=20 m默认为0
 */
-(void) addNVLOGO:(int) n :(int) m;

/*
 十六进制码 1D 76 30 m xL xH yL yH d1...dk
 0 ≤ m ≤ 3, 48 ≤ m ≤ 51
 0 ≤ xL ≤ 255
 0 ≤ xH ≤ 255
 0 ≤ yL ≤ 255
 0 ≤ yH ≤ 255
 0 ≤ d ≤ 255
 k = ( xL + xH × 256) × ( yL + yH × 256) ( k ≠ 0)
 参 数 说 明
 m 模式
 0, 48 正常
 1, 49 倍宽
 2, 50 倍高
 3, 51 倍宽、倍高
 xL、 xH表示水平方向位图字节数( xL+ xH × 256)
 yL、 yH表示垂直方向位图点数(  yL+ yH × 256)
 data 影像数据
 */
-(void) addESCBitmapwithM:(int) m withxL:(int) xL withxH:(int) xH withyL:(int) yL
                   withyH:(int) yH withData:(NSData*) data;

/**
 *  方法说明:打印光栅位图
 *  @param image 图片
 *  @param width 图片宽度
 */
-(void)addOriginrastBitImage:(UIImage *)image width:(int)width;

/**
 *  方法说明:打印光栅位图
 *  @param image 图片
 */
-(void)addOriginrastBitImage:(UIImage *)image;

/*
 正确的ESC指令下QRCode打印流程为四步:
 1、设定QRCode大小;(可以省略)
 2、设定纠错等级;(一般无需设定,忽略)
 3、将QRCode对应的文字信息存入打印机缓存中;(必须要有)
 4、发送打印QRCode命令。
 一共有四个命令对应上述四步。
 */
/*
 1、设定QRCode大小;(可以省略)
 [格式] ASCII码 GS ( K pL pH cn fn n
 十六进制码 1D 28 6B 03 00 31 43 n
 [范围] (pL+pH×256)=3 (pL=3,pH=0)
 cn=49
 fn=67
 1 ≤n≤16
 [默认值] n=3
 */
-(void) addQRCodeSizewithpL:(int) pL withpH:(int) pH withcn:(int) cn
                    withyfn:(int) fn withn:(int) n;

/*
 2、设定纠错等级;(一般无需设定,忽略)
 [格式] ASCII码 GS ( K pL pH cn fn m d1...dk
 十六进制码 1D 28 6B 03 00 31 45 n
 [范围] (pL+pH×256)=3 (pL=3,pH=0)
 cn=49
 fn=69
 48≤n≤51
 [默认值] n=48
 */
-(void) addQRCodeLevelwithpL:(int) pL withpH:(int) pH withcn:(int) cn
                     withyfn:(int) fn withn:(int) n;

/*
 3、将QRCode对应的文字信息存入打印机缓存中;(必须要有)
 [格式] ASCII码 GS ( K pL pH cn fn m d1...dk
 十六进制码 1D 28 6B pL pH 31 50 30 d1...dk
 [范围] 4≤(pL+pH×256)≤7092 (0≤pL≤255,0≤pH≤27)
 cn=49
 fn=80
 m=48
 k=(pL+pH×256)-3
 [描述] 存储QR CODE数据(d1...dk)到符号存储区
 [注释] • 将QRCode的数据存储到打印机中
 • 执行esc @或打印机掉电后,恢复默认值
 */
-(void) addQRCodeSavewithpL:(int) pL withpH:(int) pH withcn:(int) cn
                    withyfn:(int) fn withm:(int) m withData:(NSData*) data;

/*
 4、发送打印QRCode命令。
 [格式] ASCII码 GS ( K pL pH cn fn m
 十六进制码 1D 28 6B 03 00 31 51 m
 [范围] (pL+pH×256)=3 (pL=3,pH=0)
 cn=49
 fn=81
 m=48
 [描述] 打印QRCode条码,在发送此命令之前,需通过( K< Function 180)命令将QRCode数据存储在打印机中。
 */
-(void) addQRCodePrintwithpL:(int) pL withpH:(int) pH withcn:(int) cn
                     withyfn:(int) fn withm:(int) m;

/**
 * 方法说明:设置是否汉字字体
 * @param n  是否倍宽 是否倍高 是否下划线
 */
-(void) addSetKanjiFontMode:(int) n;

/**
 * 方法说明:设置汉字有效
 */
-(void) addSelectKanjiMode;

/**
 * 方法说明:设置汉字下划线
 * @param n 根据 n 的值,选择或取消汉字的下划线:
 * n     功能
 * 0, 48 取消汉字下划线
 * 1, 49 选择汉字下划线(1 点宽)
 * 2, 50 选择汉字下划线(2点宽)
 */
-(void)addSetKanjiUnderLine:(int) n;

/**
 * 方法说明:设置汉字无效
 */
-(void) addCancelKanjiMode;

/**
 * 方法说明:设置字符右间距
 * @param  n  间距长度
 * 0 ≤ n≤255
 * [描述] 设置字符的右间距为[n×横向移动单位或纵向移动单位]英寸。
 * [注释] • 当字符放大时,右间距随之放大相同的倍数。
 * • 此命令设置的值在页模式和标准模式下是相互独立的。
 * • 横向或纵向移动单位由GS P指定。改变横向或纵向移动单位不改变当前右间距。
 * • GS P 命令可改变水平(和垂直)运动单位。但是该值不得小于最小水平移动量,
 * 并且必须为最小水平移动量的偶数单位。
 * • 标准模式下,使用横向移动单位。
 * • 最大右间距是31 .91 毫米(255/203 英寸) 。 任何超过这个值的设置都自动转换为最
 * 大右间距。
 * [默认值] n = 0
 */
-(void) addSetCharacterRightSpace:(int) n;

/**
 * 方法说明:设置汉字左右间距
 * @param n1  左间距 0 ≤ n1 ≤ 255
 * @param n2 右间距 0 ≤ n2 ≤ 255
 */
-(void) addSetKanjiLefttandRightSpace:(int) n1 :(int) n2;


/**
 * 方法说明:设置加粗模式
 * @param n  是否加粗
 * 0 ≤ n ≤ 255
 * [描述] 选择或取消加粗模式
 * 当n的最低位为0时,取消加粗模式。
 * 当n的最低位为1 时,选择加粗模式。
 * [注释] • n只有最低位有效。
 * • ESC ! 同样可以选择/取消加粗模式,最后接收的命令有效。
 * [默认值] n = 0
 */
-(void) addTurnEmphasizedModeOnOrOff:(int) n;

/**
 * 方法说明:设置加重模式
 * @param n  是否加重
 * 0 ≤ n ≤ 255
 * [描述] 选择/取消双重打印模式。
 * • 当n的最低位为0时,取消双重打印模式。
 * • 当n的最低位为1 时,选择双重打印模式。
 * [注释] • n只有最低位有效。
 * • 该命令与加粗打印效果相同。
 * [默认值] n = 0
 */
-(void) addTurnDoubleStrikeOnOrOff:(int) n;

/**
 * 方法说明:发送16进制数据,例如data=0x0A或data=0x0D
 */
-(void) addNSDataToCommand:(NSData*) data;

/**
 *  方法说明:设置水平和垂直单位距离
 *  @param x    水平单位
 *  @param y    垂直单位
 */
-(void)addSetHorAndVerMotionUnitsX:(int)x Y:(int)y;

/**
 *  方法说明:设置绝对打印位置
 *  @param n    与起始打印位置距离
 */
-(void)addSetAbsolutePrintPosition:(int)n;

/**
 * 方法说明:设置打印宽度
 *
 * @param width
 *            打印宽度
 */
-(void)addSetPrintingAreaWidth:(int)width;


/**
 *  方法说明: 票据默认倍高(重启不失效)
 *  @param n1 宽      默认为0,翻倍为1
 *  @param n2 高      默认为0,翻倍为1
 *  @param n3 汉字宽   默认为0,翻倍为1
 *  @param n4 汉字高   默认为0,翻倍为1
 */
-(void)receiptDoubleHeightOrDefaultPrintN1:(int)n1 N2:(int)n2 N3:(int)n3 N4:(int)n4;

/**
 *  方法说明: 设置默认代码页
 *  @param n 代码页 n的参数范围为(0-10,16-32,50-89)
 */
-(void)setDefaultCodePage:(int)n;

/**
 *  方法说明: 波特率
 *  @param baudRate 波特率
 */
-(void)setBaudRate:(int)baudRate;

/**
 *  方法说明: 查询打印机电量。
 *  <p>返回值:  31(低电量);32 (中电量);33 (高电量);35 (正在充电)</p>
 *
 */
-(void)queryElectricity;
@end