Skip to content

Instantly share code, notes, and snippets.

@dorsamet
Created December 28, 2020 10:40
Show Gist options
  • Save dorsamet/67a1686231f7ad62fb6d0091f1e5a1b4 to your computer and use it in GitHub Desktop.
Save dorsamet/67a1686231f7ad62fb6d0091f1e5a1b4 to your computer and use it in GitHub Desktop.
A printer implementation over StarIO interface
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