package com.goodbaby.printermodule.utils;

import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;

import com.goodbaby.printermodule.entity.CashEntity;
import com.goodbaby.printermodule.entity.GoodEntity;
import com.goodbaby.printermodule.entity.OrderEntity;
import com.printer.sdk.PrinterConstants;
import com.printsdk.cmd.PrintCmd;
import com.printer.sdk.Table;
import com.printsdk.usbsdk.UsbDriver;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by limingguang on 2018/8/23.
 */

public class PrintUtil {

    private static UsbDriver mUsbDriver;
    private static UsbDevice mUSBDevice;
    private static UsbManager mUsbManager;
    private final static int PID11 = 8211;
    private final static int VENDORID = 1305;
    public static final String ACTION_USB_PERMISSION = "com.android.usb.USB_PERMISSION";

    /**
     * 1.销售小票
     * @param orderEntity
     */
    public static void printTicket(OrderEntity orderEntity){
        String noticeStr = "***特卖商品一经售出，恕不退换***";
        String welcomeStr = "***谢谢惠顾***";
        String rePrintStr = "***重印***";
        int iStatus = getPrinterStatus(mUSBDevice, mUsbDriver);
        if (checkStatus(iStatus) != 0)
            return;
        try {
            // Logo
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("GB好孩子", 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // 打印条形码
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.Print1Dbar(3, 50, 0, 0, 10, orderEntity.getNumId()),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            if(orderEntity.isRePrint()){
                // 重印标记
                mUsbDriver.write(PrintCmd.SetBold(1),mUSBDevice); // 0 不加粗、 1 加粗
                mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
                mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
                mUsbDriver.write(PrintCmd.PrintString(rePrintStr, 0),mUSBDevice);
                mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
                mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            }
            // 标题
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString(orderEntity.getUnitName(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 副标题
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString(orderEntity.getOrderType(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // 交易时间
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("交易时间："+orderEntity.getPayDateTime(), 0),mUSBDevice);
            // POS机号
            mUsbDriver.write(PrintCmd.PrintString("POS机号："+orderEntity.getClientId()+"("+orderEntity.getClientName()+")", 0),mUSBDevice);
            // 小票号码
            mUsbDriver.write(PrintCmd.PrintString("单号："+orderEntity.getNumId(), 0),mUSBDevice);
            // 收银员
            mUsbDriver.write(PrintCmd.PrintString("收银员："+orderEntity.getEmpeName(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
//            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // 打印购物清单
            printSaleTable(orderEntity.getItemList());
            // 打印横线
            printLine();
            // 数量合计
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("数量合计："+orderEntity.getItemList().size(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("金额合计："+orderEntity.getFamount(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("付款金额："+orderEntity.getPamount(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("找零："+orderEntity.getRamount(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("免收："+orderEntity.getMalingAmount(), 0),mUSBDevice);
            // 打印横线
            printLine();
            // 结算方式和金额
            for(int i =0; i < orderEntity.getCashList().size(); i++){
                CashEntity cashEntity = orderEntity.getCashList().get(i);
                if(cashEntity.isReturnCashSign()){
                    continue;
                }
                mUsbDriver.write(PrintCmd.PrintString(cashEntity.getPayType()+":"+cashEntity.getPayAmount(), 0),mUSBDevice);
            }
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 打印横线
            printLine();
            // 提醒
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString(welcomeStr, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString(noticeStr, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);

            // 走纸换行
            mUsbDriver.write(PrintCmd.PrintFeedline(3), mUSBDevice);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * 2.打印优惠信息
     * @param orderEntity
     */
    public static void printDeduct(OrderEntity orderEntity){
        int iStatus = getPrinterStatus(mUSBDevice, mUsbDriver);
        if (checkStatus(iStatus) != 0)
            return;
        try {
            if(orderEntity.getDeductList().size() == 0){
                return;
            }
            // 小票标题
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(1, 1),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("促销优惠信息", 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // 打印购物清单
            printDeductList(orderEntity.getDeductList());

            // 走纸换行
            mUsbDriver.write(PrintCmd.PrintFeedline(3), mUSBDevice);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * 3.打印提货存根联
     */
    public static void printPickUpStub(OrderEntity orderEntity) {
        int iStatus = getPrinterStatus(mUSBDevice, mUsbDriver);
        if (checkStatus(iStatus) != 0)
            return;
        try {
            if(orderEntity.getDeliveryItemList().size() == 0){
                return;
            }
            // 小票标题
            mUsbDriver.write(PrintCmd.SetBold(1),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(1, 1),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("提货存根联", 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(2));
            // POS机号
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("POS机号：" + orderEntity.getClientId(), 0),mUSBDevice);
            // 生成时间
            mUsbDriver.write(PrintCmd.PrintString("生成时间：" + orderEntity.getOrderCreateDate(), 0),mUSBDevice);
            // 小票号码
            mUsbDriver.write(PrintCmd.PrintString("小票号：" + orderEntity.getNumId(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // 打印购物清单
            printMSTable(orderEntity.getDeliveryItemList());
            // 打印横线
            printLine();

            // 走纸换行
            mUsbDriver.write(PrintCmd.PrintFeedline(3), mUSBDevice);
        } catch (Exception e) {
        }
    }

    /**
     * 4.打印提货单
     * @param orderEntity
     */
    public static void printPickUpBill(OrderEntity orderEntity, GoodEntity goodEntity){
        String noticeStr = "***凭此单提货，请妥善保管***";
        int iStatus = getPrinterStatus(mUSBDevice, mUsbDriver);
        if (checkStatus(iStatus) != 0)
            return;
        try {
            // 提醒
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString(noticeStr, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 小票标题
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(1, 1),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("提货单", 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // 打印条形码
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.Print1Dbar(3, 50, 0, 0, 10, goodEntity.getSerialNo()+""),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedDot(2));
            // 提货号
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString(goodEntity.getSerialNo()+"", 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // POS机号
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString("POS机号："+orderEntity.getClientId(), 0),mUSBDevice);
            // 生成时间
            mUsbDriver.write(PrintCmd.PrintString("生成时间："+orderEntity.getOrderCreateDate(), 0),mUSBDevice);
            // 小票号码
            mUsbDriver.write(PrintCmd.PrintString("小票号："+orderEntity.getNumId(), 0),mUSBDevice);
            // 库位
            mUsbDriver.write(PrintCmd.PrintString("库位："+goodEntity.getLocName(), 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            // 走纸
            mUsbDriver.write(PrintCmd.PrintFeedline(1));
            // 打印购物清单
            printPickupTable(goodEntity);
            // 提醒
            mUsbDriver.write(PrintCmd.SetBold(0),mUSBDevice); // 0 不加粗、 1 加粗
            mUsbDriver.write(PrintCmd.SetAlignment(1),mUSBDevice); // 0 左、1 居中、2 右
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.PrintString(noticeStr, 0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetAlignment(0),mUSBDevice);
            mUsbDriver.write(PrintCmd.SetSizetext(0, 0),mUSBDevice);

            // 走纸换行
            mUsbDriver.write(PrintCmd.PrintFeedline(3), mUSBDevice);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * 提货单存根明细
     * @param goods
     */
    private static void printMSTable(List<GoodEntity> goods) {
        String column = "货号;数量;品名;条码";
        Table table = null;
        table = new Table(column, ";", new int[]{15, 8, 12, 15});
        for (int i = 0; i < goods.size(); i++) {
            GoodEntity goodBean = goods.get(i);
            table.addRow(goodBean.getItemId() + ";" + goodBean.getQty() + ";" + goodBean.getItemName() + ";" + goodBean.getBarcode());
        }
        mUsbDriver.write(PrintCmd.PrintString(table.getTableText(), 0), mUSBDevice); // 0换行 1不换行
    }

    /**
     * 提货单明细
     * @param good
     */
    private static void printPickupTable(GoodEntity good) {
        String column = "货号;数量;品名;条码";
        Table table = null;
        table = new Table(column, ";", new int[]{15, 8, 12, 15});
        table.addRow(good.getItemId() + ";" + good.getQty() + ";" + good.getItemName() + ";" + good.getBarcode());
        mUsbDriver.write(PrintCmd.PrintString(table.getTableText(), 0), mUSBDevice); // 0换行 1不换行
    }

    /**
     * 销售小票详情
     * @param goods
     */
    private static void printSaleTable(List<GoodEntity> goods){
        String column = "货号;数量;单价;品名;金额";
        Table table = null;
        table = new Table(column, ";", new int[]{15, 8, 7, 12, 8});

        for (int i = 0; i < goods.size(); i++) {
            GoodEntity goodBean = goods.get(i);
            table.addRow(goodBean.getItemId() + ";" + goodBean.getQty() + ";" + goodBean.getTradePrice()
                    + ";" + goodBean.getItemName() + ";" + goodBean.getTradeAmount());
        }
        mUsbDriver.write(PrintCmd.PrintString(table.getTableText(), 0), mUSBDevice); // 0换行 1不换行
    }

    /**
     * 优惠信息详情
     * @param goods
     */
    private static void printDeductList(List<GoodEntity> goods){
        String column = "货号;数量;优惠金额";
        Table table = null;
        int totalQty = 0;
        double totalAmount = 0d;
        table = new Table(column, ";", new int[]{20, 10, 20});

        for (int i = 0; i < goods.size(); i++) {
            GoodEntity goodBean = goods.get(i);
            totalQty += goodBean.getQty();
            totalAmount += goodBean.getDeductAmount();
            table.addRow(goodBean.getItemId() + ";" + goodBean.getQty() + ";" + goodBean.getDeductAmount());
        }
        table.addRow("合计：;" + totalQty + ";" + totalAmount);
        mUsbDriver.write(PrintCmd.PrintString(table.getTableText(), 0), mUSBDevice); // 0换行 1不换行
    }

    private static void printLine(){
        StringBuffer sb = new StringBuffer();
        mUsbDriver.write(PrintCmd.SetBold(0), mUSBDevice); // 0不加粗 1加粗
        mUsbDriver.write(PrintCmd.SetAlignment(0), mUSBDevice); // 字符对其：0左 1中 2右
        mUsbDriver.write(PrintCmd.SetSizetext(0, 0), mUSBDevice); // 放大高度 放大宽度（0-8）

        if (PrinterConstants.paperWidth == 384) {
            sb.append("------------------------------");
        } else if (PrinterConstants.paperWidth == 576) {
            sb.append("----------------------------------------------");

        } else if (PrinterConstants.paperWidth == 724) {
            sb.append("----------------------------------------------------------------");
        }
        System.out.println(PrinterConstants.paperWidth);

        mUsbDriver.write(PrintCmd.PrintString(sb.toString(), 0), mUSBDevice); // 0换行 1不换行
        mUsbDriver.write(PrintCmd.SetAlignment(0), mUSBDevice);
        mUsbDriver.write(PrintCmd.SetSizetext(0, 0), mUSBDevice);
    }

    public static void getUsbDriverService(Context context) {
        mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
        mUsbDriver = new UsbDriver(mUsbManager, context);
        PendingIntent permissionIntent1 = PendingIntent.getBroadcast(context, 0,
                new Intent(ACTION_USB_PERMISSION), 0);
        mUsbDriver.setPermissionIntent(permissionIntent1);
        // 请求USB权限
        for (UsbDevice device : mUsbManager.getDeviceList().values()) {
            if (device.getProductId() == PID11 && device.getVendorId() == VENDORID) {
                if (!mUsbManager.hasPermission(device)){
                    mUsbManager.requestPermission(device, permissionIntent1);
                    break;
                }
            }
        }

        // Broadcast listen for new devices
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_USB_PERMISSION);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        context.registerReceiver(mUsbReceiver, filter);
    }

    // 检测打印机状态
    private static int getPrinterStatus(UsbDevice mUSBDevice, UsbDriver mUsbDriver) {
        int iRet = -1;

        byte[] bRead1 = new byte[1];
        byte[] bWrite1 = PrintCmd.GetStatus1();
        if (mUsbDriver!=null && mUsbDriver.read(bRead1, bWrite1, mUSBDevice) > 0) {
            iRet = PrintCmd.CheckStatus1(bRead1[0]);
        }

        if (iRet != 0)
            return iRet;

        byte[] bRead2 = new byte[1];
        byte[] bWrite2 = PrintCmd.GetStatus2();
        if (mUsbDriver.read(bRead2, bWrite2, mUSBDevice) > 0) {
            iRet = PrintCmd.CheckStatus2(bRead2[0]);
        }

        if (iRet != 0)
            return iRet;

        byte[] bRead3 = new byte[1];
        byte[] bWrite3 = PrintCmd.GetStatus3();
        if (mUsbDriver.read(bRead3, bWrite3, mUSBDevice) > 0) {
            iRet = PrintCmd.CheckStatus3(bRead3[0]);
        }

        if (iRet != 0)
            return iRet;

        byte[] bRead4 = new byte[1];
        byte[] bWrite4 = PrintCmd.GetStatus4();
        if (mUsbDriver.read(bRead4, bWrite4, mUSBDevice) > 0) {
            iRet = PrintCmd.CheckStatus4(bRead4[0]);
        }

        return iRet;
    }

    private static int checkStatus(int iStatus) {
        int iRet = -1;

        StringBuilder sMsg = new StringBuilder();


        //0 打印机正常 、1 打印机未连接或未上电、2 打印机和调用库不匹配
        //3 打印头打开 、4 切刀未复位 、5 打印头过热 、6 黑标错误 、7 纸尽 、8 纸将尽
        switch (iStatus) {
            case 0:
                sMsg.append("正常");       // 正常
                iRet = 0;
                break;
            case 8:
                sMsg.append("纸将尽"); // 纸将尽
                iRet = 0;
                break;
            case 3:
                sMsg.append("打印头打开"); //打印头打开
                break;
            case 4:
                sMsg.append("切刀未复位");
                break;
            case 5:
                sMsg.append("打印头过热");
                break;
            case 6:
                sMsg.append("黑标错误");
                break;
            case 7:
                sMsg.append("缺纸");     // 纸尽==缺纸
                break;
            case 1:
                sMsg.append("打印机未连接");
                break;
            default:
                sMsg.append("异常");     // 异常
                break;
        }
        System.out.println(sMsg.toString());
        return iRet;
    }

    /**
     * 检测打印机是否连接
     * @return
     */
    public static boolean printConnStatus(Context context) {

        boolean blnRtn = false;
        try {
            if (!mUsbDriver.isConnected()) {
//				UsbManager m_UsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
                // USB线已经连接
                for (UsbDevice device : mUsbManager.getDeviceList().values()) {
                    if (device.getProductId() == PID11 && device.getVendorId() == VENDORID) {
                        if (!mUsbManager.hasPermission(device)) {
                            break;
                        }
                        blnRtn = mUsbDriver.usbAttached(device);
                        System.out.println("attach:"+blnRtn);
                        if (blnRtn == false) {
                            break;
                        }
                        blnRtn = mUsbDriver.openUsbDevice(device);
                        System.out.println("open:"+blnRtn);
                        // 打开设备
                        if (blnRtn) {
                            if (device.getProductId() == PID11) {
                                mUSBDevice = device;
                                System.out.println("mUSBDevice:"+mUSBDevice);
                            }
                            setClean();// 清理缓存，初始化
                            System.out.println("USB driver success");
                            break;
                        } else {
                            System.out.println("USB driver failed");
                            break;
                        }
                    }
                }
            } else {
                blnRtn = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return blnRtn;
    }

    // 走纸换行、切纸、清理缓存
    public static void setFeedCut(int iMode) {
        mUsbDriver.write(PrintCmd.PrintFeedline(3), mUSBDevice);      // 走纸换行
        mUsbDriver.write(PrintCmd.PrintCutpaper(iMode), mUSBDevice);  // 切纸类型
    }

    // 常规设置
    private static void setClean() {
        mUsbDriver.write(PrintCmd.SetClean());// 清除缓存,初始化
    }

    static BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
                if(mUsbDriver.usbAttached(intent))
                {
                    UsbDevice device = (UsbDevice) intent
                            .getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (device.getProductId() == PID11 && device.getVendorId() == VENDORID)
                    {
                        if(mUsbDriver.openUsbDevice(device))
                        {
                            if(device.getProductId()==PID11){
                                mUSBDevice = device;
                            }
                        }
                    }
                }
            } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                UsbDevice device = (UsbDevice) intent
                        .getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (device.getProductId() == PID11 && device.getVendorId() == VENDORID)
                {
                    mUsbDriver.closeUsbDevice(device);
                    if(device.getProductId()==PID11){
                        mUSBDevice = null;
                    }
                }
            } else if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (device.getProductId() == PID11 && device.getVendorId() == VENDORID) {
                            mUsbDriver.usbAttached(intent);
                            if(mUsbDriver.openUsbDevice(device)) {
                                mUSBDevice = device;
                            }
                        }
                    }
                    else {
                        System.out.println("permission denied for device");
                    }
                }
            }
        }
    };
}
