package com.ZMPrinter.Demo;

import com.ZMPrinter.*;
import com.ZMPrinter.UsbUtility.UsbConnection;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PrintViaUSB_Demo_UHF {
    public static void main(String[] args){

        //region 定义打印机对象（接口类型、分辨率、打印黑度及速度）
        zmprinter thiszmprinter = new zmprinter();//定义打印机对象
        thiszmprinter.printerinterface= printerstyle.RFID_USB;//打印机接口类型
        thiszmprinter.printerdpi = 300;//打印机分辨率，203dpi、300dpi或600dpi
        thiszmprinter.printSpeed=4;//打印速度，
        thiszmprinter.printDarkness=12;//打印黑度
        //endregion

        //region 定义标签对象（尺寸）
        zmlabel thiszmlabel = new zmlabel();//定义标签对象
        thiszmlabel.labelwidth = 75;//标签的宽度，单位是mm
        thiszmlabel.labelheight = 35;//标签的高度，单位是mm
        thiszmlabel.labelrowgap = 2;//标签之间的行间距，单位是mm
        //endregion

        //region 定义标签内需要打印的各个对象（一个标签上可以有多个对象，如文字、一维条码、二维条码、线条、矩形、图片、RFID写入数据等）
        List<zmlabelobject> thiszmlabelobjectlist = new ArrayList<>();//定义标签上需要打印的对象列表

        zmlabelobject thiszmlabelobject01 = new zmlabelobject();
        thiszmlabelobject01.objectName = "truetype";//该对象是TrueType文字
        thiszmlabelobject01.objectdata = "资产编号：XXXXXXXX";//文字内容
        thiszmlabelobject01.Xposition = 5;//文字X坐标，单位mm
        thiszmlabelobject01.Yposition = 4;//文字Y坐标，单位mm
        thiszmlabelobject01.textfont = "黑体";//文字的字体
        thiszmlabelobject01.fontstyle = 1;//粗体
        thiszmlabelobject01.fontsize = 10;//文字的字号
        thiszmlabelobjectlist.add(thiszmlabelobject01);//将文字对象添加进对象列表

        zmlabelobject thiszmlabelobject02 = new zmlabelobject();
        thiszmlabelobject02.objectName = "truetype";//该对象是TrueType文字
        thiszmlabelobject02.objectdata = "资产名称：办公桌";//文字内容
        thiszmlabelobject02.Xposition = 5;//文字X坐标，单位mm
        thiszmlabelobject02.Yposition = 11;//文字Y坐标，单位mm
        thiszmlabelobject02.textfont = "宋体";//文字的字体
        thiszmlabelobject02.fontstyle = 1;//粗体
        thiszmlabelobject02.fontsize = 10;//文字的大小
        thiszmlabelobjectlist.add(thiszmlabelobject02);//将文字对象添加进对象列表

        zmlabelobject thiszmlabelobject03 = new zmlabelobject();
        thiszmlabelobject03.objectName = "truetype";//该对象是TrueType文字
        thiszmlabelobject03.objectdata = "存放地点：信息部办公室";//文字内容
        thiszmlabelobject03.Xposition = 5;//文字X坐标，单位mm
        thiszmlabelobject03.Yposition = 18.5f;//文字Y坐标，单位mm
        thiszmlabelobject03.textfont = "宋体";//文字的字体
        thiszmlabelobject03.fontstyle = 1;//粗体
        thiszmlabelobject03.fontsize = 10;//文字的大小
        thiszmlabelobjectlist.add(thiszmlabelobject03);//将文字对象添加进对象列表

        zmlabelobject thiszmlabelobject04 = new zmlabelobject();
        thiszmlabelobject04.objectName = "truetype";//该对象是TrueType文字
        thiszmlabelobject04.objectdata = "使用部门：信息部";//文字内容
        thiszmlabelobject04.Xposition = 5;//文字X坐标，单位mm
        thiszmlabelobject04.Yposition = 26;//文字Y坐标，单位mm
        thiszmlabelobject04.textfont = "宋体";//文字的字体
        thiszmlabelobject04.fontstyle = 1;//粗体
        thiszmlabelobject04.fontsize = 10;//文字的大小
        thiszmlabelobjectlist.add(thiszmlabelobject04);//将文字对象添加进对象列表

        zmlabelobject thiszmlabelobject05 = new zmlabelobject();
        thiszmlabelobject05.objectName = "barcode";//该对象是条码
        thiszmlabelobject05.objectdata = "12345678";//条码内容
        thiszmlabelobject05.Xposition = 50;//条码X坐标，单位mm
        thiszmlabelobject05.Yposition = 10;//条码Y坐标，单位mm
        thiszmlabelobject05.barcodekind = barcodestyle.QR_Code;//条码的类型
        thiszmlabelobject05.barcodescale = 11;//条码的横向缩放系数，1~99，数字越大条码越宽
        thiszmlabelobjectlist.add(thiszmlabelobject05);//将条码对象添加进对象列表

        zmlabelobject thiszmlabelobject06 = new zmlabelobject();
        thiszmlabelobject06.objectName = "rfiduhf";//该对象是RFID写入
        thiszmlabelobject06.objectdata = "12345678";//RFID需要写入的内容
        thiszmlabelobject06.RFIDDatablock = 0;//写入区域，0为EPC，1为USER
        thiszmlabelobject06.RFIDDatatype = 1;//数据类型：0为文本，1为16进制
        thiszmlabelobject06.RFIDerrortimes = 1;//错误重试次数
        thiszmlabelobjectlist.add(thiszmlabelobject06);//将RFID对象添加进对象列表

/*        zmlabelobject thiszmlabelobject07 = new zmlabelobject();
        thiszmlabelobject07.objectName = "image";//该对象是图片
        thiszmlabelobject07.Xposition = 53;//X坐标，单位mm
        thiszmlabelobject07.Yposition = 4;//Y坐标，单位mm
        //region 读取图片文件并转为byte[]
        //读取图片文件
        BufferedImage img =null;
        try {
            img = ImageIO.read(new File("C:\\Users\\lkf\\Desktop\\ZMSYS.jpg"));//从文件中读取图片
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(img==null)
            return;
        //BufferedImage转byte[]
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            ImageIO.write(img, "png", out);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //endregion
        thiszmlabelobject07.imagedata = out.toByteArray();//添加图片的数据
        thiszmlabelobject07.hscale=0.3f;//图片的横向缩放比例，值为1则不缩放
        thiszmlabelobject07.vscale=0.3f;//图片的竖向缩放比例，值为1则不缩放
        thiszmlabelobjectlist.add(thiszmlabelobject07);//将图片对象添加进对象列表*/

        //endregion

        //region 创建USB打印机连接
        UsbConnection usbConnection =new UsbConnection();//建立USB连接
        if(!usbConnection.Open()){
            System.out.println("连接打印机失败，请检查。");
            return;
        }
        //endregion

        usbConnection.getPrinterName();

        //region 打印标签
        long barcodesn = 210900030001L;//文字、条码及EPC的数据
        printutility zmprintoperate = new printutility();//定义打印操作对象

        for(int pnum=1;pnum<=2;pnum++) {
            System.out.println("打印第"+pnum+"张");

            //region 查询打印机状态
            int trytimes=0;
            int printerstatuscode=usbConnection.getPrinterStatus();//查询打印机状态
            if(printerstatuscode!=0)//0为就绪状态
            {
                if (printerstatuscode == 4 || printerstatuscode == 1)//正在打印或语法错误，语法错误经常出现在打印机在重试的时候查询状态
                {
                    while (trytimes < 10)//重试10次
                    {
                        try {
                            Thread.sleep(1000);//暂停1秒
                        }
                        catch(Exception e)
                        {}
                        printerstatuscode=usbConnection.getPrinterStatus();//查询打印机状态
                        if (printerstatuscode != 4 && printerstatuscode != 1)
                            break;

                        trytimes++;
                    }
                    if(trytimes>=10)
                    {
                        System.out.println("打印机状态异常:"+printerstatuscode);
                        break;
                    }
                }
                else if (printerstatuscode == 96)//剥纸器正在等待取走标签
                {
                    System.out.println("剥纸器正在等待取走标签。");
                    while (true)
                    {
                        try {
                            Thread.sleep(1000);//暂停1秒
                        }
                        catch(Exception e)
                        {}
                        printerstatuscode=usbConnection.getPrinterStatus();//查询打印机状态
                        if (printerstatuscode != 96)
                            break;
                    }
                }
                else if (printerstatuscode == 88)//暂停
                {
                    System.out.println("打印机现在是暂停状态，按一下打印机的“暂停”按钮将会重新开始打印。");
                    while (true)
                    {
                        try {
                            Thread.sleep(1000);//暂停1秒
                        }
                        catch(Exception e)
                        {}
                        printerstatuscode=usbConnection.getPrinterStatus();//查询打印机状态
                        if (printerstatuscode != 88)
                            break;
                    }
                }
                else if (printerstatuscode == 81) {
                    System.out.println("主板硬件故障，请联系售后维修。");
                    break;
                }
                else if (printerstatuscode == 82) {
                    System.out.println("打印机的碳带探测出错啦，请检查是否安装好碳带！");
                    break;
                }
                else if (printerstatuscode == 83) {
                    System.out.println("打印机的标签探测出错啦，请检查是否安装好标签，更换不同大小标签后需要手动做一次纸张校准操作！");
                    break;
                }
                else if (printerstatuscode == 86) {
                    System.out.println("打印机的切刀检测出错啦，请检查是否启用了切刀功能！");
                    break;
                }
                else if (printerstatuscode == 89) {
                    System.out.println("标签纸用完了，请安装新标签！");
                    break;
                }
                else if (printerstatuscode == 90){
                    System.out.println("RFID标签读写错误！");
                    break;
                }
                else if (printerstatuscode == 91||printerstatuscode == 92) {
                    System.out.println("RFID标签信号校准错误！");
                    break;
                }
                else if (printerstatuscode == 120)//升级完成
                {
                    System.out.println("打印机完成了升级，请按升级工具提示操作。");
                    break;
                }
                else
                {
                    System.out.println("打印机状态异常："+printerstatuscode);
                    break;
                }
            }
            //endregion

            //region 更改标签内指定文字、条码或RFID写入数据的内容
            thiszmlabelobject01.objectdata="资产编号："+Long.toString(barcodesn);//更改thiszmlabelobject01对象的objectdata内容
            thiszmlabelobject05.objectdata="资产编号："+Long.toString(barcodesn);//更改thiszmlabelobject05对象的objectdata内容
            thiszmlabelobject06.objectdata="资产编号："+Long.toString(barcodesn);//更改thiszmlabelobject06对象的objectdata内容
            //endregion

            //region 根据标签上需要打印的对象列表生成打印数据
            byte[] zmpclecommand = zmprintoperate.CreateLabelCommand(thiszmprinter, thiszmlabel, thiszmlabelobjectlist);//生成标签数据
            if (zmpclecommand == null) {
                System.out.println("生成标签数据异常为空.");
                return;
            }
            //System.out.println("生成标签数据完成，长度：" + zmpclecommand.length);
            //endregion

            //region 发送打印数据给打印机
            usbConnection.write(zmpclecommand);//发送数据给打印机

            if(thiszmprinter.printerinterface==printerstyle.RFID_USB) {
                //如果是RFID打印机，则通过打印机USB端口读回状态，确定打印机收到数据并等待打印完成
                String returnmsg = usbConnection.read(512);//读取打印机数据
                if(!returnmsg.isEmpty())
                    System.out.println("打印机返回的数据：" + returnmsg);
                zmprintoperate.WaitPrintProcess(thiszmprinter, thiszmlabel);//等待打印完成
            }
            //endregion

            barcodesn++;//序号加1
        }
        //endregion

        //region 关闭USB打印机连接
        usbConnection.Close();//关闭USB连接
        //endregion

    }
}
