Printing.kt 4.82 KB
package com.printer.sdk.serial

import android.bluetooth.BluetoothDevice
import android.content.Context
import android.hardware.usb.UsbDevice
import android.os.Handler
import android.os.Looper
import android.util.Log
import etelligens.com.foodsafety.PrintLabel.PrintClasses.DeviceCallback
import java.io.File

class Printing(private var printer: Printer, val context: Context) {
    private lateinit var printables: List<Printable>
    private lateinit var messages:String
    // 将字符串转换为字节数组
    private val byteArray = messages.toByteArray()
    private var serialPort = SerialPort(context);
    var printingCallback: PrintingCallback? = null
    var extraLinesAtEnd: Byte = 0

    init {
        initSerialCallback()
        initDeviceCallback()
    }

    private fun initSerialCallback() {
        serialPort.setSerialPortCallback(object : SerialPortCallback {
            override fun onSerialPortTurningOn() {}

            override fun onSerialPortOn() {
                serialPort.connectToAddress()
            }

            override fun onSerialPortTurningOff() {}

            override fun onSerialPortOff() {}

            override fun onUserDeniedActivation() {}
        })
    }

    private fun initDeviceCallback() {
        serialPort.setDeviceCallback(object : DeviceCallback {
            override fun onDeviceConnected(device: BluetoothDevice) {

            }

            override fun onDeviceDisconnected(device: BluetoothDevice, message: String) {}

            override fun onMessage(message: String) {
            }

            override fun onError(message: String) {
            }

            override fun onConnectError(device: BluetoothDevice, message: String) {
            }

            override fun onSerialDeviceConnected(device: File) {
                sendMessage()
                printPrintables()
                printingCallback?.printingOrderSentSuccessfully()
            }

            override fun onSerialDeviceDisconnected(device: File, message: String) {
                TODO("Not yet implemented")
            }

            override fun onSerialMessage(message: String) {
                printingCallback?.onMessage(message)
            }

            override fun onSerialError(message: String) {
                printingCallback?.onError(message)
            }

            override fun onSerialConnectError(device: File, message: String) {
                printingCallback?.connectionFailed(message)
            }

            override fun onUsbDeviceConnected(device: UsbDevice) {
                TODO("Not yet implemented")
            }

            override fun onUsbDeviceDisconnected(device: UsbDevice, message: String) {
                TODO("Not yet implemented")
            }

            override fun onUsbMessage(message: String) {
                TODO("Not yet implemented")
            }

            override fun onUsbError(message: String) {
                TODO("Not yet implemented")
            }

            override fun onUsbConnectError(device: UsbDevice, message: String) {
                TODO("Not yet implemented")
            }
        })
    }

    private fun sendMessage() {
        serialPort.send(printer.initPrinterCommand) // init printer
        // send message
        serialPort.send(byteArray)
        //Feed 2 lines to cut the paper
        if (extraLinesAtEnd > 0) {
            serialPort.send(printer.feedLineCommand.plus(extraLinesAtEnd))
        }
        Handler(Looper.getMainLooper()).postDelayed({
            serialPort.disconnect()
        }, 300)
    }


    private fun printPrintables() {
        serialPort.send(printer.initPrinterCommand) // init printer
        this.printables.forEach {
            it.getPrintableByteArray(printer).forEach { ops ->
                serialPort.send(ops)
            }
        }

        //Feed 2 lines to cut the paper
        if (extraLinesAtEnd > 0) {
            serialPort.send(printer.feedLineCommand.plus(extraLinesAtEnd))
        }

        Handler(Looper.getMainLooper()).postDelayed({
            serialPort.disconnect()
        }, 300)
    }

    fun printMessage(messageStr: String) {
        this.messages = messageStr
        printingCallback?.connectingWithPrinter()
        if (!serialPort.isEnabled) {
            serialPort.enable();
        }
        else{
            serialPort.connectToAddress();
        }
        //serialPort.onStart()
    }

    fun print(printables: ArrayList<Printable>) {
        this.printables = printables
        printingCallback?.connectingWithPrinter()
        if (!serialPort.isEnabled) serialPort.enable() else serialPort.connectToAddress()
        //serialPort.onStart()
    }

    fun cutPaper() {
        var cutData = byteArrayOf(0x1d, 0x56, 0x00)

        try {
            if (serialPort.isEnabled) serialPort.send(cutData);
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}