Created
December 28, 2020 10:40
-
-
Save dorsamet/67a1686231f7ad62fb6d0091f1e5a1b4 to your computer and use it in GitHub Desktop.
A printer implementation over StarIO interface
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Printer { | |
public func print(_ call: FlutterMethodCall, result: @escaping FlutterResult) { | |
let arguments = call.arguments as! Dictionary<String, AnyObject> | |
let portName = arguments["portName"] as! String | |
let emulation = arguments["emulation"] as! String | |
let printCommands = arguments["printCommands"] as! Array<Dictionary<String,Any>> | |
let portSettings :String = Common.getPortSettingsOption(emulation) | |
let starEmulation : StarIoExtEmulation = Common.getEmulation(emulation) | |
let builder:ISCBBuilder = StarIoExt.createCommandBuilder(starEmulation) | |
builder.beginDocument() | |
appendCommands(builder: builder, printCommands: printCommands) | |
builder.endDocument() | |
sendCommand(portName: portName, portSetting: portSettings, command: [UInt8](builder.commands),result: result) | |
} | |
private func appendCommands(builder: ISCBBuilder,printCommands: Array<Dictionary<AnyHashable,Any>>) { | |
var encoding:String.Encoding = .ascii | |
for command in printCommands { | |
if (command["appendInternational"] != nil) { | |
builder.append(Common.getInternational(command["appendInternational"] as? String)) | |
} else if (command["appendCharacterSpace"] != nil) { | |
builder.appendCharacterSpace(command["appendCharacterSpace"] as! Int) | |
} else if (command["appendEncoding"] != nil) { | |
encoding = Common.getEncoding(command["appendEncoding"] as? String) | |
} else if (command["appendCodePage"] != nil) { | |
builder.append(Common.getCodePageType(command["appendCodePage"] as? String)) | |
} else if (command["append"] != nil) { | |
builder.append((command["append"] as! String).data(using: encoding)) | |
} else if (command["appendRaw"] != nil) { | |
builder.appendRawData((command["appendRaw"] as! String).data(using: encoding)) | |
} else if (command["appendEmphasis"] != nil) { | |
builder.appendData(withEmphasis: (command["appendEmphasis"] as! String).data(using: encoding)) | |
} else if (command["enableEmphasis"] != nil) { | |
builder.appendEmphasis(command["enableEmphasis"] as! Bool) | |
} else if (command["appendInvert"] != nil) { | |
builder.appendData(withInvert: (command["appendInvert"] as! String).data(using: encoding)) | |
} else if (command["enableInvert"] != nil) { | |
builder.appendInvert(command["enableInvert"] as! Bool) | |
} else if (command["appendUnderline"] != nil) { | |
builder.appendData(withUnderLine: (command["appendUnderline"] as! String).data(using: encoding)) | |
} else if (command["enableUnderline"] != nil) { | |
builder.appendUnderLine(command["enableUnderline"] as! Bool) | |
} else if (command["appendLineFeed"] != nil) { | |
builder.appendLineFeed(command["appendLineFeed"] as! Int) | |
} else if (command["appendUnitFeed"] != nil) { | |
builder.appendUnitFeed(command["appendUnitFeed"] as! Int) | |
} else if (command["appendLineSpace"] != nil) { | |
builder.appendUnitFeed(command["appendLineSpace"] as! Int) | |
} else if (command["appendFontStyle"] != nil) { | |
builder.append(Common.getFont(command["appendFontStyle"] as? String)) | |
} else if (command["appendCutPaper"] != nil) { | |
builder.appendCutPaper(Common.getCutPaperAction(command["appendCutPaper"] as? String)) | |
} else if (command["openCashDrawer"] != nil) { | |
builder.appendPeripheral(Common.getPeripheralChannel(command["openCashDrawer"] as? NSNumber)) | |
} else if (command["appendBlackMark"] != nil) { | |
builder.append(Common.getBlackMarkType(command["appendBlackMark"] as? String)) | |
} else if (command["appendBytes"] != nil) { | |
let byteArray = Data((command["appendBytes"] as! FlutterStandardTypedData).data) | |
builder.appendBytes([UInt8](byteArray), length: UInt([UInt8](byteArray).count)) | |
} else if (command["appendRawBytes"] != nil) { | |
let byteArray = Data((command["appendRawBytes"] as! FlutterStandardTypedData).data) | |
builder.appendRawBytes([UInt8](byteArray), length: UInt([UInt8](byteArray).count)) | |
} else if (command["appendAbsolutePosition"] != nil) { | |
if (command["data"] != nil) { | |
builder.appendData(withAbsolutePosition: (command["data"] as! String).data(using: encoding), position: command["appendAbsolutePosition"] as! Int) | |
} else { | |
builder.appendAbsolutePosition(command["appendAbsolutePosition"] as! Int) | |
} | |
} else if (command["appendAlignment"] != nil) { | |
if (command["data"] != nil) { | |
builder.appendData(withAlignment: (command["data"] as! String).data(using: encoding), position: Common.getAlignment(command["appendAlignment"] as? String)) | |
} else { | |
builder.appendAlignment(Common.getAlignment(command["appendAlignment"] as? String)) | |
} | |
} else if (command["appendHorizontalTabPosition"] != nil) { | |
builder.appendHorizontalTabPosition(command["appendHorizontalTabPosition"] as? Array<NSNumber>) | |
} else if (command["appendMultiple"] != nil) { | |
let width = command["width"] != nil ? command["width"] as! Int : 2 | |
let height = command["height"] != nil ? command["height"] as! Int : 2 | |
builder.appendData(withMultiple: (command["appendMultiple"] as! String).data(using: encoding), width: width, height: height) | |
} else if (command["enableMultiple"] != nil) { | |
let width = command["width"] != nil ? command["width"] as! Int : 1 | |
let height = command["height"] != nil ? command["height"] as! Int : 1 | |
if ( command["enableMultiple"] as! Bool) == true { | |
builder.appendMultiple(width, height: height) | |
} else { | |
builder.appendMultiple(1, height: 1) | |
} | |
} else if (command["appendLogo"] != nil) { | |
if (command["logoSize"] != nil) { | |
builder.appendLogo(Common.getLogoSize(command["logoSize"] as? String), number: command["appendLogo"] as! Int) | |
} else { | |
builder.appendLogo(SCBLogoSize.normal, number: command["appendLogo"] as! Int) | |
} | |
} else if (command["appendBarcode"] != nil) { | |
let barcodeSymbology :SCBBarcodeSymbology = Common.getBarcodeSymbology(command["BarcodeSymbology"] as? String) | |
let barcodeWidth :SCBBarcodeWidth = Common.getBarcodeWidth(command["BarcodeWidth"] as? String) | |
let height = command["height"] != nil ? command["height"] as! Int : 40 | |
let hri = command["hri"] != nil ? command["hri"] as! Bool : true | |
if (command["absolutePosition"] != nil) { | |
builder.appendBarcodeData(withAbsolutePosition: (command["appendBarcode"] as! String).data(using: encoding), symbology: barcodeSymbology, width: barcodeWidth, height: height, hri: hri, position: command["absolutePosition"] as! Int) | |
} else if (command["alignment"] != nil) { | |
builder.appendBarcodeData(withAlignment: (command["appendBarcode"] as! String).data(using: encoding), symbology: barcodeSymbology, width: barcodeWidth, height: height, hri: hri, position: Common.getAlignment(command["alignment"] as? String)) | |
} else { | |
builder.appendBarcodeData((command["appendBarcode"] as! String).data(using: encoding), symbology: barcodeSymbology, width: barcodeWidth, height: height, hri: hri) | |
} | |
} else if (command["appendQrCode"] != nil) { | |
let qrCodeModel = Common.getQrCodeModel(command["QrCodeModel"] as? String) | |
let qrCodeLevel = Common.getQrCodeLevel(command["QrCodeLevel"] as? String) | |
let cell = command["cell"] != nil ? command["cell"] as! Int : 4 | |
if (command["absolutePosition"] != nil) { | |
builder.appendQrCodeData(withAbsolutePosition: (command["appendQrCode"] as! String).data(using: encoding), model: qrCodeModel, level: qrCodeLevel, cell: cell, position: command["absolutePosition"] as! Int) | |
} else if (command["alignment"] != nil){ | |
builder.appendQrCodeData(withAlignment: (command["appendQrCode"] as! String).data(using: encoding), model: qrCodeModel, level: qrCodeLevel, cell: cell, position: Common.getAlignment(command["alignment"] as? String)) | |
} else { | |
builder.appendQrCodeData((command["appendQrCode"] as! String).data(using: encoding), model: qrCodeModel, level: qrCodeLevel, cell: cell) | |
} | |
} else if (command["appendBitmap"] != nil) { | |
guard let filePath = command["appendBitmap"] as? String, | |
let image = UIImage(contentsOfFile: filePath) else { | |
continue | |
} | |
builder.appendBitmap(image, | |
diffusion: true, | |
width: 576, | |
bothScale: true) | |
try? FileManager.default.removeItem(atPath: filePath) | |
} else if (command["appendBitmapText"] != nil) { | |
let text:String = command["appendBitmapText"] as! String | |
let width = command["width"] != nil ? command["width"] as! Int : 576 | |
let fontName = command["font"] != nil ? command["font"] as! String : "Menlo" | |
let fontSize = command["fontSize"] != nil ? command["fontSize"] as! Int : 12 | |
let bothScale = command["bothScale"] != nil ? command["bothScale"] as! Bool : true | |
let rotation = SCBBitmapConverterRotation.normal; | |
let font:UIFont = UIFont(name:fontName,size:CGFloat(fontSize*2))! | |
let image = Common.imageWithString(string: text, font: font, width: CGFloat(width)) | |
if (command["alignment"] != nil) { | |
builder.appendBitmap(withAlignment: image, diffusion: false, width: width, bothScale: bothScale, rotation: rotation, position: Common.getAlignment(command["alignment"] as? String)) | |
} else { | |
builder.appendBitmap(image, diffusion: false) | |
} | |
} | |
} | |
} | |
func sendCommand(portName:String,portSetting:String,command:[UInt8],result: FlutterResult){ | |
var port :SMPort | |
var status: StarPrinterStatus_2 = StarPrinterStatus_2() | |
do { | |
port = try SMPort.getPort(portName: portName, portSettings: portSetting, ioTimeoutMillis: 10000) | |
defer { | |
SMPort.release(port) | |
} | |
usleep(200000) | |
try port.beginCheckedBlock(starPrinterStatus: &status, level: 2) | |
if status.offline == SM_TRUESHARED { | |
result( | |
FlutterError.init(code: "STARIO_PRINT_EXCEPTION", message: "printer is offline", details: nil) | |
) | |
} | |
var total: UInt32 = 0 | |
while total < UInt32(command.count) { | |
var written: UInt32 = 0 | |
try port.write(writeBuffer: command, offset: total, size: UInt32(command.count) - total, numberOfBytesWritten: &written) | |
total += written | |
} | |
try port.endCheckedBlock(starPrinterStatus: &status, level: 2) | |
result("Success") | |
} catch { | |
result( | |
FlutterError.init(code: "STARIO_PRINT_EXCEPTION", message: error.localizedDescription, details: nil) | |
) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment