//
//  IvrJackService.h
//  IvrJack.RU01
//
//  Created by xminnov on 15/4/22.
//  Copyright (c) 2015年 xminnov. All rights reserved.
//

#import <Foundation/Foundation.h>

#pragma mark - 超高频小精灵API（型号RU01）

@protocol IvrJackDelegate;

/*!
 * @brief 音频接口服务
 * @discussion 音频接口服务调用流程如下：
 * 1.创建iOS应用工程，复制libIvrJack.a文件到工程目录下；
 * 2.在Xcode中APP项目的Build Phases里添加libIvrJack.a的引用；
 * 3.在Xcode中APP项目的Build Phases里导入三个框架：AudioToolbox.framework,AVFoundation.framework,MediaPlayer.framework；
 * 4.在APP的进入事件里面初始化IvrJackService服务，添加delegate属性监听回调事件，开启服务；
 * 5.在APP的退出事件里面关闭IvrJackService服务；
 * 6.调用读写器相关API执行标签操作，由于耗时较长，不要在UI线程直接调用，最好开启后台线程处理。
 */
@interface IvrJackService : NSObject

/*!
 *  音频接口事件代理
 */
@property (weak) id<IvrJackDelegate> delegate;

/*!
 *  开启音频接口服务
 */
- (void)open;

/*!
 *  关闭音频接口服务
 */
- (void)close;

/*!
 *  获取电量／蜂鸣器状态
 *
 *  @param battery 输出参数，保存电量百分比
 *  @param buzzer  输出参数，保存蜂鸣器状态：0－关闭；1－开启
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)getBatteryBuzzerStatus:(UInt8 *)battery buzzer:(UInt8 *)buzzer;

/*!
 *  设置蜂鸣器状态
 *
 *  @param status 0 － 关闭；1 － 打开
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)setBuzzerStatus:(UInt8)status;


/*!
 *  获取小精灵硬件版本号
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)getVersion:(NSData **)data;

/*!
 *  设置音频接口设备读取EPC状态
 *
 *  @param status 0 － 关闭；1 － 打开
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */

- (int)setReadEpcStatus:(UInt8)status;

/*!
 *  单次清点
 *
 */
- (int)inventory:(NSString **)epc rssi:(NSString **)rssi;

/*!
 *  写标签块数据
 *
 *  @param bank    内存块
 *  @param address 起始地址
 *  @param count   块长度
 *  @param data    待写数据
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)writeTag:(UInt8)bank address:(UInt16)address count:(UInt8)count data:(NSData *)data;

/*!
 *  读标签块数据
 *
 *  @param bank    内存块
 *  @param address 起始地址
 *  @param count   块长度
 *  @param data    输出参数，保存读到的标签块数据
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)readTag:(UInt8)bank address:(UInt16)address count:(UInt8)count data:(NSData **)data;


/*!
 *  锁定标签
 *
 *  @param accessPassword 访问密码
 *  @param mask           锁定对象（0 － EPC区；1 － USER区；2 － 访问密码；3 － 销毁密码）
 *  @param action         锁定动作（0 － 解锁；1 － 锁定；2 － 永久锁定）
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)lockTag:(NSData *)accessPassword mask:(UInt8)mask action:(UInt8)action;

/*!
 *  销毁标签
 *
 *  @param killPassword 销毁密码
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)killTag:(NSData *)killPassword;

/*!
 *  选择标签
 *
 *  @param accessPassword 访问密码
 *  @param epc            EPC数据
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)selectTag:(NSData *)accessPassword epc:(NSData *)epc;

/*!
 *  读EPC＋TID
 *
 *  @param accessPassword 访问密码
 *  @param epc            输出参数，保存读到的EPC数据
 *  @param tid            输出参数，保存读到的TID数据
 *
 *  @return 0 － 操作成功；非0 － 操作失败，见错误代码
 */
- (int)readEpcAndTid:(NSData *)accessPassword epc:(NSData **)epc tid:(NSData **)tid;

@end

/*!
 * @brief 音频接口状态
 */
typedef enum IvrJackStatus {
    
    /*!
     *  正在识别设备
     */
    ijsDetecting,
    
    /*!
     *  设备已识别
     */
    ijsRecognized,
    
    /*!
     *  设备未识别
     */
    ijsUnRecognized,
    
    /*!
     *  设备已拔出
     */
    ijsPlugout
    
} IvrJackStatus;

/*!
 * @brief 音频接口事件
 */
@protocol IvrJackDelegate

/*!
 *  音频接口连接成功时回调
 *
 *  @param deviceSN 音频接口设备序列号
 */
- (void)readerConnect:(NSString *)deviceSN;

/*!
 *  音频接口断开连接时回调
 */
- (void)readerDisconnect;

/*!
 *  音频接口状态发生变化时回调
 *
 *  @param status 音频接口状态
 */
- (void)readerStatusChange:(IvrJackStatus)status;

/*!
 *  音频接口设备读到标签EPC数据时回调
 *
 *  @param epc 标签EPC数据
 */
- (void)onReadEpc:(NSString *)epc rssi:(NSString *)rssi;

@end

/*!
 * @brief 音频通信错误代码
 */
typedef enum IvrJackError {
    
    /*!
     *  操作成功
     */
    STATUS_SUCCESS          = 0,
    
    /*!
     *  无效参数
     */
    INVALID_PARAMETER       = -101,
    
    /*!
     *  设备未开启
     */
    DEVICE_NOT_OPENED       = -201,
    
    /*!
     *  设备繁忙
     */
    DEVICE_BUSY             = -202,
    
    /*!
     *  设备错误应答
     */
    DEVICE_NOASK            = -203,
    
    /*!
     *  设备操作失败
     */
    DEVICE_FAILED           = -204,
    
    /*!
     *  设备电量不足
     */
    DEVICE_BATTERY_LOW      = -205,
    
    /*!
     *  音频通信超时
     */
    COMMUNICATE_TIMEOUT     = -301,
    
    /*!
     *  音频通信错误
     */
    COMMUNICATE_ERROR       = -302,
    
    /*!
     *  音频通信失败
     */
    COMMUNICATE_FAILED      = -303,
    
    /*!
     *  单次清点无标签响应
     */
    INVENTORY_NOTAG         = -401,
    
} IvrJackError;
