From 7301730258dec57f02a03f70ee89ee86e7de32dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 28 Sep 2023 19:36:10 +0000 Subject: [PATCH 01/31] Increase build version --- android/build.gradle | 2 +- .../com/ovatu/starxpand/StarxpandPlugin.kt | 38 ++++++ example/android/build.gradle | 2 +- example/pubspec.lock | 118 +++++++++++------- pubspec.yaml | 2 +- 5 files changed, 117 insertions(+), 45 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 305f41d..332c135 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -47,5 +47,5 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.starmicronics:stario10:1.3.0' + implementation 'com.starmicronics:stario10:1.4.0' } diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 295f28a..13b9c1b 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -190,6 +190,44 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { // Callback for discovery finished. (option) override fun onDiscoveryFinished() { + + // TODO Remove this + // foundPrinters.get(0).connectionSettings + val settings = foundPrinters.get(0).connectionSettings + val printer = StarPrinter(settings, activity) + + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + + scope.launch { + try { + val builder = StarXpandCommandBuilder() + builder.addDocument( + DocumentBuilder() + .addDrawer( + DrawerBuilder() + .actionOpen(OpenParameter() + .setChannel(Channel.No1) + ) + ) + ) + + val commands = builder.getCommands() + + printer.openAsync().await() + printer.printAsync(commands).await() + + Log.d("Printing", "Success") + } catch (e: StarIO10NotFoundException) { + // Printer not found. + // This may be due to the printer not being turned on or incorrect connection information. + } catch (e: Exception) { + Log.d("Printing", "Error: ${e}") + } finally { + printer.closeAsync().await() + } + } + result.success(mutableMapOf( "printers" to foundPrinters.map { mutableMapOf( diff --git a/example/android/build.gradle b/example/android/build.gradle index 4256f91..0a2d6a1 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/example/pubspec.lock b/example/pubspec.lock index 1d74766..95e7a4d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,63 +5,72 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" source: hosted version: "1.3.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: "1989d917fbe8e6b39806207df5a3fdd3d816cbd090fac2ce26fb45e9a71476e5" + url: "https://pub.dev" source: hosted version: "1.0.4" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" flutter: @@ -73,7 +82,8 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + url: "https://pub.dev" source: hosted version: "1.0.4" flutter_test: @@ -85,51 +95,66 @@ packages: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "2ed163531e071c2c6b7c659635112f24cb64ecbebf6af46b550d536c0b1aa112" + url: "https://pub.dev" source: hosted version: "0.13.4" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 + url: "https://pub.dev" source: hosted version: "4.0.0" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" source: hosted version: "1.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.15" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" sky_engine: dependency: transitive description: flutter @@ -139,72 +164,81 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" starxpand: dependency: "direct main" description: path: ".." relative: true source: path - version: "0.0.2" + version: "0.0.4" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.5.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" + url: "https://pub.dev" source: hosted version: "1.3.0" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: "2469694ad079893e3b434a627970c33f2fa5adc46dfe03c9617546969a9a8afc" + url: "https://pub.dev" source: hosted version: "3.0.6" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" sdks: - dart: ">=2.17.0 <3.0.0" + dart: ">=3.0.0-0 <4.0.0" flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 511f476..b43cf28 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper around the Star Micronics StarXpand API. -version: 0.0.3 +version: 0.0.4 repository: https://github.com/ovatu/starxpand_flutter homepage: https://ovatu.com/us From 437eb9bd265a4eb9bc4d37919125ad7bc31c2def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 2 Nov 2023 10:25:23 +0000 Subject: [PATCH 02/31] <:o) --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 38 ---------------- example/lib/main.dart | 45 +++++-------------- 2 files changed, 12 insertions(+), 71 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 13b9c1b..295f28a 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -190,44 +190,6 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { // Callback for discovery finished. (option) override fun onDiscoveryFinished() { - - // TODO Remove this - // foundPrinters.get(0).connectionSettings - val settings = foundPrinters.get(0).connectionSettings - val printer = StarPrinter(settings, activity) - - val job = SupervisorJob() - val scope = CoroutineScope(Dispatchers.Default + job) - - scope.launch { - try { - val builder = StarXpandCommandBuilder() - builder.addDocument( - DocumentBuilder() - .addDrawer( - DrawerBuilder() - .actionOpen(OpenParameter() - .setChannel(Channel.No1) - ) - ) - ) - - val commands = builder.getCommands() - - printer.openAsync().await() - printer.printAsync(commands).await() - - Log.d("Printing", "Success") - } catch (e: StarIO10NotFoundException) { - // Printer not found. - // This may be due to the printer not being turned on or incorrect connection information. - } catch (e: Exception) { - Log.d("Printing", "Error: ${e}") - } finally { - printer.closeAsync().await() - } - } - result.success(mutableMapOf( "printers" to foundPrinters.map { mutableMapOf( diff --git a/example/lib/main.dart b/example/lib/main.dart index 831de96..7004c06 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -61,56 +61,35 @@ class _MyAppState extends State { "123 Star Road\n" "City, State 12345\n"); - printDoc.style(alignment: StarXpandStyleAlignment.left); - printDoc.actionPrintText("Date:MM/DD/YYYY Time:HH:MM PM\n" - "--------------------------------\n"); + + + printDoc.style(alignment: StarXpandStyleAlignment.center); + printDoc.actionPrintText("Time:HH:MM PM"); + printDoc + ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 0.0, horizontalPositionTo: 2.0) + ..actionPrintText("Date:MM/DD/YYYY") + ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 2.0, horizontalPositionTo: 36.0) + ..actionPrintText("DUDU") + ; printDoc.add(StarXpandDocumentPrint() ..style(bold: true) ..actionPrintText("SALE\n")); - printDoc.actionPrintText("SKU Description Total\n" - "--------------------------------\n" - "300678566 PLAIN T-SHIRT 10.99\n" - "300692003 BLACK DENIM 29.99\n" - "300651148 BLUE DENIM 29.99\n" - "300642980 STRIPED DRESS 49.99\n" - "300638471 BLACK BOOTS 35.99\n" - "Subtotal 156.95\n" - "Tax 0.00\n" - "--------------------------------\n"); - printDoc.actionPrintText("Total "); printDoc.add(StarXpandDocumentPrint() ..style(magnification: StarXpandStyleMagnification(2, 2)) ..actionPrintText(" \$156.95\n")); - printDoc.actionPrintText("--------------------------------\n" - "Charge\n" - "156.95\n" - "Visa XXXX-XXXX-XXXX-0123\n"); - - printDoc.add(StarXpandDocumentPrint() - ..style(invert: true) - ..actionPrintText("Refunds and Exchanges\n")); - - printDoc.actionPrintText("Within "); - - printDoc.add(StarXpandDocumentPrint() - ..style(underLine: true) - ..actionPrintText("30 days")); - - printDoc.actionPrintText(" with receipt\n"); - printDoc.actionPrintText("And tags attached\n\n"); - printDoc.style(alignment: StarXpandStyleAlignment.center); printDoc.actionPrintBarcode("0123456", symbology: StarXpandBarcodeSymbology.jan8, barDots: 3, height: 5, - printHri: true); + printHri: true + ); printDoc.actionFeedLine(1); From 83a46c98847e54b429a75570c7b122638f95177a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 2 Nov 2023 14:48:50 +0000 Subject: [PATCH 03/31] New version and try setOnTime(0) --- .../main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt | 2 +- pubspec.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 295f28a..e9ca4c6 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -334,7 +334,7 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { "no2" -> Channel.No2 else -> Channel.No1 } - return DrawerBuilder().actionOpen(OpenParameter().setChannel(channel)) + return DrawerBuilder().actionOpen(OpenParameter().setChannel(channel).setOnTime(0)) } private fun getPrinterBuilder(data: Map<*, *>): PrinterBuilder { diff --git a/pubspec.yaml b/pubspec.yaml index b43cf28..e601d3a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,8 +1,8 @@ name: starxpand -description: A flutter wrapper around the Star Micronics StarXpand API. -version: 0.0.4 -repository: https://github.com/ovatu/starxpand_flutter -homepage: https://ovatu.com/us +description: A flutter wrapper for the Star Micronics StarXpand API +version: 0.1.0 +repository: https://github.com/dineouticeland/starxpand_flutter +homepage: https://github.com/dineouticeland environment: sdk: ">=2.17.0 <3.0.0" From c30df0177d649660d4af221a5dc325684b22e151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 2 Nov 2023 14:56:20 +0000 Subject: [PATCH 04/31] OnTime 1 --- android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt | 2 +- example/android/gradle/wrapper/gradle-wrapper.properties | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index e9ca4c6..7c1c7cb 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -334,7 +334,7 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { "no2" -> Channel.No2 else -> Channel.No1 } - return DrawerBuilder().actionOpen(OpenParameter().setChannel(channel).setOnTime(0)) + return DrawerBuilder().actionOpen(OpenParameter().setOnTime(1).setChannel(channel)) } private fun getPrinterBuilder(data: Map<*, *>): PrinterBuilder { diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index bc6a58a..ffed3a2 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Jun 23 08:50:38 CEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip From 876ed2b72cd8d4d9a3fa5ab91e1d03da1ab89815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Mon, 13 Nov 2023 11:28:33 +0000 Subject: [PATCH 05/31] Add display commands to the starxpand flutter package. --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 47 +++++++- example/android/build.gradle | 2 +- example/lib/main.dart | 109 +++++++++--------- example/pubspec.lock | 34 +++--- lib/models/starxpand_document.dart | 2 + lib/models/starxpand_document_display.dart | 51 ++++++++ lib/starxpand.dart | 5 + 7 files changed, 175 insertions(+), 75 deletions(-) create mode 100644 lib/models/starxpand_document_display.dart diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 7c1c7cb..7d60a35 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -11,6 +11,7 @@ import androidx.core.app.ActivityCompat.requestPermissions import androidx.core.content.ContextCompat.checkSelfPermission import com.starmicronics.stario10.* import com.starmicronics.stario10.starxpandcommand.* +import com.starmicronics.stario10.starxpandcommand.display.Contrast import com.starmicronics.stario10.starxpandcommand.drawer.Channel import com.starmicronics.stario10.starxpandcommand.drawer.OpenParameter import com.starmicronics.stario10.starxpandcommand.printer.* @@ -305,6 +306,9 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { "print" -> { docBuilder.addPrinter(getPrinterBuilder(data)) } + "display" -> { + docBuilder.addDisplay(getDisplayBuilder(data)) + } } } @@ -334,7 +338,48 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { "no2" -> Channel.No2 else -> Channel.No1 } - return DrawerBuilder().actionOpen(OpenParameter().setOnTime(1).setChannel(channel)) + return DrawerBuilder().actionOpen(OpenParameter().setOnTime(0).setChannel(channel)) + } + + private fun getDisplayBuilder(data: Map<*, *>): DisplayBuilder { + val displayBuilder = DisplayBuilder() + val actions = data["actions"] as Collection<*> + + Log.d("display", "display actions: $actions") + + for (action in actions) { + if (action !is Map<*, *>) continue + + when (action["action"] as String) { + "showText" -> { + displayBuilder.actionShowText(action["data"] as String) + } + "clearAll" -> { + displayBuilder.actionClearAll() + } + "clearLine" -> { + displayBuilder.actionClearLine() + } + "setContrast" -> { + displayBuilder.actionSetContrast(when(action["data"]) { + "minus3" -> Contrast.Minus3 + "minus2" -> Contrast.Minus2 + "minus1" -> Contrast.Minus1 + "plus1" -> Contrast.Plus1 + "plus2" -> Contrast.Plus2 + "plus3" -> Contrast.Plus3 + else -> Contrast.Default + }) + } + "showImage" -> { + val image = action["image"] as ByteArray + val bmp = BitmapFactory.decodeByteArray(image, 0, image.size) + displayBuilder.actionShowImage(com.starmicronics.stario10.starxpandcommand.display.ImageParameter(bmp)) + } + } + } + + return displayBuilder } private fun getPrinterBuilder(data: Map<*, *>): PrinterBuilder { diff --git a/example/android/build.gradle b/example/android/build.gradle index 0a2d6a1..63deb8f 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:7.0.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/example/lib/main.dart b/example/lib/main.dart index 7004c06..a65f603 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -4,6 +4,7 @@ import 'dart:async'; import 'package:http/http.dart' as http; import 'package:flutter/services.dart'; +import 'package:starxpand/models/starxpand_document_display.dart'; import 'package:starxpand/starxpand.dart'; void main() { @@ -47,61 +48,65 @@ class _MyAppState extends State { var doc = StarXpandDocument(); var printDoc = StarXpandDocumentPrint(); - http.Response response = await http.get( - Uri.parse('https://ovatu.com/marketing/images/ovatu/logo-large-navy.png'), - ); - - printDoc.actionPrintImage(response.bodyBytes, 350); - - printDoc.style( - internationalCharacter: StarXpandStyleInternationalCharacter.usa, - characterSpace: 0.0, - alignment: StarXpandStyleAlignment.center); - printDoc.actionPrintText("Star Clothing Boutique\n" - "123 Star Road\n" - "City, State 12345\n"); - - - - printDoc.style(alignment: StarXpandStyleAlignment.center); - printDoc.actionPrintText("Time:HH:MM PM"); - printDoc - ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 0.0, horizontalPositionTo: 2.0) - ..actionPrintText("Date:MM/DD/YYYY") - ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 2.0, horizontalPositionTo: 36.0) - ..actionPrintText("DUDU") - ; - - printDoc.add(StarXpandDocumentPrint() - ..style(bold: true) - ..actionPrintText("SALE\n")); - - printDoc.actionPrintText("Total "); - - printDoc.add(StarXpandDocumentPrint() - ..style(magnification: StarXpandStyleMagnification(2, 2)) - ..actionPrintText(" \$156.95\n")); - - printDoc.style(alignment: StarXpandStyleAlignment.center); - - printDoc.actionPrintBarcode("0123456", - symbology: StarXpandBarcodeSymbology.jan8, - barDots: 3, - height: 5, - printHri: true - ); - - printDoc.actionFeedLine(1); - - printDoc.actionPrintQRCode("Hello, World\n", - level: StarXpandQRCodeLevel.l, cellSize: 8); - - printDoc.actionCut(StarXpandCutType.partial); + // http.Response response = await http.get( + // Uri.parse('https://ovatu.com/marketing/images/ovatu/logo-large-navy.png'), + // ); + // + // printDoc.actionPrintImage(response.bodyBytes, 350); + // + // printDoc.style( + // internationalCharacter: StarXpandStyleInternationalCharacter.usa, + // characterSpace: 0.0, + // alignment: StarXpandStyleAlignment.center); + // printDoc.actionPrintText("Star Clothing Boutique\n" + // "123 Star Road\n" + // "City, State 12345\n"); + // + // + // + // printDoc.style(alignment: StarXpandStyleAlignment.center); + // printDoc.actionPrintText("Time:HH:MM PM"); + // printDoc + // ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 0.0, horizontalPositionTo: 2.0) + // ..actionPrintText("Date:MM/DD/YYYY") + // ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 2.0, horizontalPositionTo: 36.0) + // ..actionPrintText("DUDU") + // ; + // + // printDoc.add(StarXpandDocumentPrint() + // ..style(bold: true) + // ..actionPrintText("SALE\n")); + // + // printDoc.actionPrintText("Total "); + // + // printDoc.add(StarXpandDocumentPrint() + // ..style(magnification: StarXpandStyleMagnification(2, 2)) + // ..actionPrintText(" \$156.95\n")); + // + // printDoc.style(alignment: StarXpandStyleAlignment.center); + // + // printDoc.actionPrintBarcode("0123456", + // symbology: StarXpandBarcodeSymbology.jan8, + // barDots: 3, + // height: 5, + // printHri: true + // ); + // + // printDoc.actionFeedLine(1); + // + // printDoc.actionPrintQRCode("Hello, World\n", + // level: StarXpandQRCodeLevel.l, cellSize: 8); + // + // printDoc.actionCut(StarXpandCutType.partial); + // + // doc.addPrint(printDoc); + var displayDoc = StarXpandDocumentDisplay()..actionShowText("Hello world"); + doc.addDisplay(displayDoc); - doc.addPrint(printDoc); doc.addDrawer(StarXpandDocumentDrawer()); StarXpand.printDocument(printer, doc); + StarXpand.updateDisplay(printer, displayDoc); } @override @@ -116,7 +121,7 @@ class _MyAppState extends State { if (printers != null) for (var p in printers!) ListTile( - onTap: () => _print(p), + onTap: () => _openDrawer(p), title: Text(p.model.label), subtitle: Text(p.identifier), trailing: Text(p.interface.name)) diff --git a/example/pubspec.lock b/example/pubspec.lock index 95e7a4d..5de640d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -25,14 +25,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - charcode: - dependency: transitive - description: - name: charcode - sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 - url: "https://pub.dev" - source: hosted - version: "1.3.1" clock: dependency: transitive description: @@ -53,18 +45,18 @@ packages: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: "1989d917fbe8e6b39806207df5a3fdd3d816cbd090fac2ce26fb45e9a71476e5" + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.6" fake_async: dependency: transitive description: @@ -95,18 +87,18 @@ packages: dependency: "direct main" description: name: http - sha256: "2ed163531e071c2c6b7c659635112f24cb64ecbebf6af46b550d536c0b1aa112" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.4" + version: "0.13.6" http_parser: dependency: transitive description: name: http_parser - sha256: e362d639ba3bc07d5a71faebb98cde68c05bfbcfbbb444b60b6f60bb67719185 + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.2" js: dependency: transitive description: @@ -182,7 +174,7 @@ packages: path: ".." relative: true source: path - version: "0.0.4" + version: "0.1.0" stream_channel: dependency: transitive description: @@ -219,18 +211,18 @@ packages: dependency: transitive description: name: typed_data - sha256: "53bdf7e979cfbf3e28987552fd72f637e63f3c8724c9e56d9246942dc2fa36ee" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.2" uuid: dependency: transitive description: name: uuid - sha256: "2469694ad079893e3b434a627970c33f2fa5adc46dfe03c9617546969a9a8afc" + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" vector_math: dependency: transitive description: diff --git a/lib/models/starxpand_document.dart b/lib/models/starxpand_document.dart index 28fbb7b..26d20db 100644 --- a/lib/models/starxpand_document.dart +++ b/lib/models/starxpand_document.dart @@ -1,3 +1,4 @@ +import 'package:starxpand/models/starxpand_document_display.dart'; import 'package:starxpand/starxpand.dart'; class StarXpandDocument { @@ -5,6 +6,7 @@ class StarXpandDocument { addPrint(StarXpandDocumentPrint print) => _contents.add(print); addDrawer(StarXpandDocumentDrawer drawer) => _contents.add(drawer); + addDisplay(StarXpandDocumentDisplay display) => _contents.add(display); Map toMap() { return {"contents": _contents.map((e) => e.toMap()).toList()}; diff --git a/lib/models/starxpand_document_display.dart b/lib/models/starxpand_document_display.dart new file mode 100644 index 0000000..40bce3f --- /dev/null +++ b/lib/models/starxpand_document_display.dart @@ -0,0 +1,51 @@ +import 'dart:typed_data'; + +import 'package:starxpand/models/starxpand_document.dart'; +import 'package:starxpand/starxpand.dart'; + +enum Contrast { + minus3, + minus2, + minus1, + Default, + plus1, + plus2, + plus3, +} + +class StarXpandDocumentDisplay extends StarXpandDocumentContent { + final List _actions = []; + + StarXpandDocumentDisplay(); + + @override + String get type => 'display'; + + actionShowText(String data) { + _actions.add({'action': 'showText', 'data': data}); + } + + actionClearAll() { + _actions.add({'action': 'clearAll'}); + } + + actionClearLine() { + _actions.add({'action': 'clearLine'}); + } + + actionShowImage(Uint8List image) { + _actions.add({'action': 'showImage', 'image': image }); + } + + actionSetContrast(Contrast contrast) { + _actions.add({ + 'action': 'setContrast', + 'content': contrast.name, + }); + } + + @override + Map getData() { + return {"actions": _actions}; + } +} diff --git a/lib/starxpand.dart b/lib/starxpand.dart index c8e63fb..91d223f 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:starxpand/models/starxpand_document_display.dart'; import 'package:uuid/uuid.dart'; import 'package:flutter/services.dart'; @@ -88,6 +89,10 @@ class StarXpand { {"printer": printer.toMap(), "document": document.toMap()}); } + static Future updateDisplay( + StarXpandPrinter printer, StarXpandDocumentDisplay display) => + printDocument(printer, StarXpandDocument()..addDisplay(display)); + static Future startInputListener(StarXpandPrinter printer, StarXpandCallback callback) async { var guid = _addCallbackHandler( From 8cf11b3299c57c06b055804dda3b275f20a2063e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Mon, 13 Nov 2023 11:48:29 +0000 Subject: [PATCH 06/31] Cleanup and add the updateDisplay method call --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 1 + example/lib/main.dart | 167 +++++++++++------- 2 files changed, 104 insertions(+), 64 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 7d60a35..77d6f47 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -83,6 +83,7 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { when (call.method) { "findPrinters" -> findPrinters(call.arguments as Map<*, *>, result) "printDocument" -> printDocument(call.arguments as Map<*, *>, result) + "updateDisplay" -> printDocument(call.arguments as Map<*, *>, result) "startInputListener" -> startInputListener(call.arguments as Map<*, *>, result) "stopInputListener" -> stopInputListener(call.arguments as Map<*, *>, result) else -> result.notImplemented() diff --git a/example/lib/main.dart b/example/lib/main.dart index a65f603..eed3e31 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,9 +1,7 @@ -import 'package:flutter/material.dart'; import 'dart:async'; +import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; - -import 'package:flutter/services.dart'; import 'package:starxpand/models/starxpand_document_display.dart'; import 'package:starxpand/starxpand.dart'; @@ -48,64 +46,96 @@ class _MyAppState extends State { var doc = StarXpandDocument(); var printDoc = StarXpandDocumentPrint(); - // http.Response response = await http.get( - // Uri.parse('https://ovatu.com/marketing/images/ovatu/logo-large-navy.png'), - // ); - // - // printDoc.actionPrintImage(response.bodyBytes, 350); - // - // printDoc.style( - // internationalCharacter: StarXpandStyleInternationalCharacter.usa, - // characterSpace: 0.0, - // alignment: StarXpandStyleAlignment.center); - // printDoc.actionPrintText("Star Clothing Boutique\n" - // "123 Star Road\n" - // "City, State 12345\n"); - // - // - // - // printDoc.style(alignment: StarXpandStyleAlignment.center); - // printDoc.actionPrintText("Time:HH:MM PM"); - // printDoc - // ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 0.0, horizontalPositionTo: 2.0) - // ..actionPrintText("Date:MM/DD/YYYY") - // ..style(alignment: StarXpandStyleAlignment.left, horizontalPositionBy: 2.0, horizontalPositionTo: 36.0) - // ..actionPrintText("DUDU") - // ; - // - // printDoc.add(StarXpandDocumentPrint() - // ..style(bold: true) - // ..actionPrintText("SALE\n")); - // - // printDoc.actionPrintText("Total "); - // - // printDoc.add(StarXpandDocumentPrint() - // ..style(magnification: StarXpandStyleMagnification(2, 2)) - // ..actionPrintText(" \$156.95\n")); - // - // printDoc.style(alignment: StarXpandStyleAlignment.center); - // - // printDoc.actionPrintBarcode("0123456", - // symbology: StarXpandBarcodeSymbology.jan8, - // barDots: 3, - // height: 5, - // printHri: true - // ); - // - // printDoc.actionFeedLine(1); - // - // printDoc.actionPrintQRCode("Hello, World\n", - // level: StarXpandQRCodeLevel.l, cellSize: 8); - // - // printDoc.actionCut(StarXpandCutType.partial); - // - // doc.addPrint(printDoc); - var displayDoc = StarXpandDocumentDisplay()..actionShowText("Hello world"); - doc.addDisplay(displayDoc); - - doc.addDrawer(StarXpandDocumentDrawer()); + http.Response response = await http.get( + Uri.parse('https://ovatu.com/marketing/images/ovatu/logo-large-navy.png'), + ); + + printDoc.actionPrintImage(response.bodyBytes, 350); + + printDoc.style( + internationalCharacter: StarXpandStyleInternationalCharacter.usa, + characterSpace: 0.0, + alignment: StarXpandStyleAlignment.center); + printDoc.actionPrintText("Star Clothing Boutique\n" + "123 Star Road\n" + "City, State 12345\n"); + + printDoc.style(alignment: StarXpandStyleAlignment.left); + printDoc.actionPrintText("Date:MM/DD/YYYY Time:HH:MM PM\n" + "--------------------------------\n"); + + printDoc.add(StarXpandDocumentPrint() + ..style(bold: true) + ..actionPrintText("SALE\n")); + + printDoc.actionPrintText("SKU Description Total\n" + "--------------------------------\n" + "300678566 PLAIN T-SHIRT 10.99\n" + "300692003 BLACK DENIM 29.99\n" + "300651148 BLUE DENIM 29.99\n" + "300642980 STRIPED DRESS 49.99\n" + "300638471 BLACK BOOTS 35.99\n" + "Subtotal 156.95\n" + "Tax 0.00\n" + "--------------------------------\n"); + + printDoc.actionPrintText("Total "); + + printDoc.add(StarXpandDocumentPrint() + ..style(magnification: StarXpandStyleMagnification(2, 2)) + ..actionPrintText(" \$156.95\n")); + + printDoc.actionPrintText("--------------------------------\n" + "Charge\n" + "156.95\n" + "Visa XXXX-XXXX-XXXX-0123\n"); + + printDoc.add(StarXpandDocumentPrint() + ..style(invert: true) + ..actionPrintText("Refunds and Exchanges\n")); + printDoc.actionPrintText("Within "); + + printDoc.add(StarXpandDocumentPrint() + ..style(underLine: true) + ..actionPrintText("30 days")); + + printDoc.actionPrintText(" with receipt\n"); + printDoc.actionPrintText("And tags attached\n\n"); + + printDoc.style(alignment: StarXpandStyleAlignment.center); + + printDoc.actionPrintBarcode("0123456", + symbology: StarXpandBarcodeSymbology.jan8, + barDots: 3, + height: 5, + printHri: true); + + printDoc.actionFeedLine(1); + + printDoc.actionPrintQRCode("Hello, World\n", + level: StarXpandQRCodeLevel.l, cellSize: 8); + + printDoc.actionCut(StarXpandCutType.partial); + + doc.addPrint(printDoc); StarXpand.printDocument(printer, doc); + } + + int displayCounterText = 0; + + /** + * Can also be added to a normal printDocument via + * doc.addDisplay(StarXpandDocumentDisplay display) + */ + void _updateDisplayText(StarXpandPrinter printer) { + var displayDoc = StarXpandDocumentDisplay() + ..actionClearAll() + ..actionClearLine() + ..actionShowText("StarXpand\n") + ..actionClearLine() + ..actionShowText("Updated ${++displayCounterText} times"); + StarXpand.updateDisplay(printer, displayDoc); } @@ -114,17 +144,26 @@ class _MyAppState extends State { return MaterialApp( home: Scaffold( appBar: AppBar( - title: const Text('Plugin example app'), + title: const Text('StarXpand SDK - Example app'), ), body: Column(children: [ - TextButton(child: Text('FInd'), onPressed: () => _find()), + TextButton(child: Text('Search for devices'), onPressed: () => _find()), if (printers != null) for (var p in printers!) ListTile( - onTap: () => _openDrawer(p), - title: Text(p.model.label), + onTap: () => _print(p), + title: Text(p.model.label + "(${p.interface.name})"), subtitle: Text(p.identifier), - trailing: Text(p.interface.name)) + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + OutlinedButton(onPressed: () => _print(p), child: Text("Print")), + Container(width: 4), + OutlinedButton(onPressed: () => _openDrawer(p), child: Text("Open drawer")), + Container(width: 4), + OutlinedButton(onPressed: () => _updateDisplayText(p), child: Text("Update display")), + ], + )) ]), ), ); From f4e267496c113a347ca127bddb6a77eb39b1fe5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Mon, 13 Nov 2023 15:09:29 +0000 Subject: [PATCH 07/31] Upgrade the version number --- README.md | 15 ++++++++++++++- pubspec.yaml | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 874b839..91d9e09 100644 --- a/README.md +++ b/README.md @@ -90,11 +90,24 @@ doc.addDrawer(StarXpandDocumentDrawer()); StarXpand.printDocument(printer, doc); ``` +Display: + +```dart +var displayDoc = StarXpandDocumentDisplay() + ..actionClearAll() + ..actionClearLine() + ..actionShowText("StarXpand says:\n") + ..actionClearLine() + ..actionShowText("Hello world!"); + +StarXpand.updateDisplay(printer, displayDoc); +``` + ## Available APIs ```dart StarXpand.findPrinters(interfaces, timeout, callback); - +StarXpand.updateDisplay(printer, stringData); StarXpand.openDrawer(printer); StarXpand.printDocument(printer, document); StarXpand.startInputListener(printer); diff --git a/pubspec.yaml b/pubspec.yaml index e601d3a..3496e61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper for the Star Micronics StarXpand API -version: 0.1.0 +version: 0.1.1 repository: https://github.com/dineouticeland/starxpand_flutter homepage: https://github.com/dineouticeland From 7fb435ef1bb7eb89c5a3f812e7e52330ec122b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Tue, 14 Nov 2023 14:34:05 +0000 Subject: [PATCH 08/31] Implement GetStatus --- README.md | 1 + .../com/ovatu/starxpand/StarxpandPlugin.kt | 58 +++++++++++++++ example/lib/main.dart | 27 +++++-- example/pubspec.lock | 2 +- lib/models/starxpand_status.dart | 70 +++++++++++++++++++ lib/starxpand.dart | 18 +++-- pubspec.yaml | 2 +- 7 files changed, 166 insertions(+), 12 deletions(-) create mode 100644 lib/models/starxpand_status.dart diff --git a/README.md b/README.md index 91d9e09..9ed41c4 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ StarXpand.updateDisplay(printer, displayDoc); ## Available APIs ```dart +StarXpand.getStatus(printer); StarXpand.findPrinters(interfaces, timeout, callback); StarXpand.updateDisplay(printer, stringData); StarXpand.openDrawer(printer); diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 77d6f47..7a9d773 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -81,6 +81,7 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { Log.d(tag, "onMethodCall: ${call.method} - ${call.arguments}") when (call.method) { + "getStatus" -> getStatus(call.arguments as Map<*, *>, result) "findPrinters" -> findPrinters(call.arguments as Map<*, *>, result) "printDocument" -> printDocument(call.arguments as Map<*, *>, result) "updateDisplay" -> printDocument(call.arguments as Map<*, *>, result) @@ -90,6 +91,56 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { } } + private fun getStatus(@NonNull args: Map<*, *>, result: Result) { + val printer = getPrinter(args["printer"] as Map<*, *>) + + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + scope.launch { + if (openPrinter(printer)) { + try { + Log.d("status", "GetPrinterStatus $printer") + + val status = printer.getStatusAsync().await(); + result.success( + mutableMapOf( + "hasError" to status.hasError, + "coverOpen" to status.coverOpen, + "drawerOpenCloseSignal" to status.drawerOpenCloseSignal, + "paperEmpty" to status.paperEmpty, + "paperNearEmpty" to status.paperNearEmpty, + "reserved" to status.reserved, + "detail" to mutableMapOf( + "cleaningNotification" to status.detail.cleaningNotification, + "cutterError" to status.detail.cutterError, + "detectedPaperWidth" to status.detail.detectedPaperWidth, + "drawer1OpenCloseSignal" to status.detail.drawer1OpenCloseSignal, + "drawer1OpenedMethod" to status.detail.drawer1OpenedMethod?.value(), + "drawer2OpenCloseSignal" to status.detail.drawer2OpenCloseSignal, + "drawer2OpenedMethod" to status.detail.drawer2OpenedMethod?.value(), + "drawerOpenError" to status.detail.drawerOpenError, + "externalDevice1Connected" to status.detail.externalDevice1Connected, + "externalDevice2Connected" to status.detail.externalDevice2Connected, + "paperJamError" to status.detail.paperJamError, + "paperPresent" to status.detail.paperPresent, + "paperSeparatorError" to status.detail.paperSeparatorError, + "partsReplacementNotification" to status.detail.partsReplacementNotification, + "printUnitOpen" to status.detail.printUnitOpen, + "rollPositionError" to status.detail.rollPositionError, + ), + ) + ) + } catch (e: java.lang.Exception) { + Log.d("status", "GetStatusError $e") + Log.d("status", e.localizedMessage) + result.error("error", e.localizedMessage, e) + } finally { + closePrinter(printer) + } + } + } + } + private fun getPrinter(map: Map<*, *>): StarPrinter { val connection = StarConnectionSettings(interfaceTypeFromValue(map["interface"] as String)!!, map["identifier"] as String) @@ -647,6 +698,13 @@ fun InterfaceType.value() : String { } } +fun DrawerOpenedMethod.value() : String { + return when (this) { + DrawerOpenedMethod.ByHand -> "byHand" + DrawerOpenedMethod.ByCommand -> "byCommand" + } +} + fun interfaceTypeFromValue(value: String) : InterfaceType? { return when (value) { "lan" -> InterfaceType.Lan diff --git a/example/lib/main.dart b/example/lib/main.dart index eed3e31..3ea1a23 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -139,6 +139,15 @@ class _MyAppState extends State { StarXpand.updateDisplay(printer, displayDoc); } + void _getStatus(StarXpandPrinter printer) async { + try { + var status = await StarXpand.getStatus(printer); + print("Got status ${status.toString()}"); + } catch (e) { + print(e.toString()); + } + } + @override Widget build(BuildContext context) { return MaterialApp( @@ -147,7 +156,8 @@ class _MyAppState extends State { title: const Text('StarXpand SDK - Example app'), ), body: Column(children: [ - TextButton(child: Text('Search for devices'), onPressed: () => _find()), + TextButton( + child: Text('Search for devices'), onPressed: () => _find()), if (printers != null) for (var p in printers!) ListTile( @@ -157,11 +167,20 @@ class _MyAppState extends State { trailing: Row( mainAxisSize: MainAxisSize.min, children: [ - OutlinedButton(onPressed: () => _print(p), child: Text("Print")), + OutlinedButton( + onPressed: () => _print(p), child: Text("Print")), + Container(width: 4), + OutlinedButton( + onPressed: () => _openDrawer(p), + child: Text("Open drawer")), Container(width: 4), - OutlinedButton(onPressed: () => _openDrawer(p), child: Text("Open drawer")), + OutlinedButton( + onPressed: () => _updateDisplayText(p), + child: Text("Update display")), Container(width: 4), - OutlinedButton(onPressed: () => _updateDisplayText(p), child: Text("Update display")), + OutlinedButton( + onPressed: () => _getStatus(p), + child: Text("Get Status")), ], )) ]), diff --git a/example/pubspec.lock b/example/pubspec.lock index 5de640d..eae3b90 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -174,7 +174,7 @@ packages: path: ".." relative: true source: path - version: "0.1.0" + version: "0.1.2" stream_channel: dependency: transitive description: diff --git a/lib/models/starxpand_status.dart b/lib/models/starxpand_status.dart new file mode 100644 index 0000000..9e6dac0 --- /dev/null +++ b/lib/models/starxpand_status.dart @@ -0,0 +1,70 @@ +enum DrawerOpenedMethod { + byHand, + byCommand; + + static DrawerOpenedMethod fromName(String name) => + DrawerOpenedMethod.values.where((e) => e.name == name).first; +} + +class StarPrinterStatusDetail { + bool? cleaningNotification; + bool? cutterError; + int? detectedPaperWidth; + bool? drawer1OpenCloseSignal; + DrawerOpenedMethod? drawer1OpenedMethod; + bool? drawer2OpenCloseSignal; + DrawerOpenedMethod? drawer2OpenedMethod; + bool? drawerOpenError; + bool? externalDevice1Connected; + bool? externalDevice2Connected; + bool? paperJamError; + bool? paperPresent; + bool? paperSeparatorError; + bool? partsReplacementNotification; + bool? printUnitOpen; + bool? rollPositionError; + + StarPrinterStatusDetail.fromMap(Map data) + : cleaningNotification = data['cleaningNotification'], + cutterError = data['cutterError'], + detectedPaperWidth = data['detectedPaperWidth'], + drawer1OpenCloseSignal = data['drawer1OpenCloseSignal'], + drawer1OpenedMethod = (data['drawer1OpenedMethod'] as String?) != null + ? DrawerOpenedMethod.fromName(data['drawer1OpenedMethod']) + : null, + drawer2OpenCloseSignal = data['drawer2OpenCloseSignal'], + drawer2OpenedMethod = (data['drawer2OpenedMethod'] as String?) != null + ? DrawerOpenedMethod.fromName(data['drawer2OpenedMethod']) + : null, + drawerOpenError = data['drawerOpenError'], + externalDevice1Connected = data['externalDevice1Connected'], + externalDevice2Connected = data['externalDevice2Connected'], + paperJamError = data['paperJamError'], + paperPresent = data['paperPresent'], + paperSeparatorError = data['paperSeparatorError'], + partsReplacementNotification = data['partsReplacementNotification'], + printUnitOpen = data['printUnitOpen'], + rollPositionError = data['rollPositionError']; +} + +class StarXpandStatus { + bool? hasError = false; + bool? coverOpen = false; + bool? drawerOpenCloseSignal = false; + bool? paperEmpty = false; + bool? paperNearEmpty = false; + Map? reserved = {}; + StarPrinterStatusDetail detail; + + StarXpandStatus.fromMap(Map response) + : hasError = response['hasError'], + coverOpen = response['coverOpen'], + drawerOpenCloseSignal = response['drawerOpenCloseSignal'], + paperEmpty = response['paperEmpty'], + paperNearEmpty = response['paperNearEmpty'], + reserved = (response['reserved'] as Map?) != null + ? (response['reserved'] as Map).cast() + : {}, + detail = StarPrinterStatusDetail.fromMap( + (response['detail'] as Map).cast()); +} diff --git a/lib/starxpand.dart b/lib/starxpand.dart index 91d223f..a5bdee7 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -1,19 +1,19 @@ import 'dart:async'; -import 'package:starxpand/models/starxpand_document_display.dart'; -import 'package:uuid/uuid.dart'; - import 'package:flutter/services.dart'; import 'package:starxpand/models/starxpand_callbacks.dart'; import 'package:starxpand/models/starxpand_document.dart'; -import 'package:starxpand/models/starxpand_printer.dart'; +import 'package:starxpand/models/starxpand_document_display.dart'; import 'package:starxpand/models/starxpand_document_drawer.dart'; +import 'package:starxpand/models/starxpand_printer.dart'; +import 'package:starxpand/models/starxpand_status.dart'; +import 'package:uuid/uuid.dart'; export 'package:starxpand/models/starxpand_callbacks.dart'; -export 'package:starxpand/models/starxpand_printer.dart'; export 'package:starxpand/models/starxpand_document.dart'; -export 'package:starxpand/models/starxpand_document_print.dart'; export 'package:starxpand/models/starxpand_document_drawer.dart'; +export 'package:starxpand/models/starxpand_document_print.dart'; +export 'package:starxpand/models/starxpand_printer.dart'; class StarXpand { static final MethodChannel _channel = const MethodChannel('starxpand') @@ -93,6 +93,12 @@ class StarXpand { StarXpandPrinter printer, StarXpandDocumentDisplay display) => printDocument(printer, StarXpandDocument()..addDisplay(display)); + static Future getStatus(StarXpandPrinter printer) async { + var result = Map.from( + await _channel.invokeMethod('getStatus', {"printer": printer.toMap()})); + return StarXpandStatus.fromMap(result.cast()); + } + static Future startInputListener(StarXpandPrinter printer, StarXpandCallback callback) async { var guid = _addCallbackHandler( diff --git a/pubspec.yaml b/pubspec.yaml index 3496e61..b3dcd82 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper for the Star Micronics StarXpand API -version: 0.1.1 +version: 0.1.2 repository: https://github.com/dineouticeland/starxpand_flutter homepage: https://github.com/dineouticeland From 6aa2f50a13c0ec883ea52a173c6fcbb8d876bf5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 15 Nov 2023 10:18:30 +0000 Subject: [PATCH 09/31] Add print line --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 19 +++++++++++++++++++ lib/models/starxpand_document_print.dart | 14 ++++++++++++++ pubspec.yaml | 2 +- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 7a9d773..8e098ea 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -576,6 +576,25 @@ class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { val text = action["text"] as String printerBuilder.actionPrintText(text) } + "printRuledLine" -> { + val ruleLineWidth = action["width"] as Double + val parameters = RuledLineParameter(ruleLineWidth) + + if (action["thickness"] != null) { + parameters.setThickness(action["thickness"] as Double) + } + + if (action["lineStyle"] != null) { + val lineStyle = when (action["lineStyle"] as String) { + "double" -> LineStyle.Double + else -> LineStyle.Single + } + + parameters.setLineStyle(lineStyle) + } + + printerBuilder.actionPrintRuledLine(parameters) + } "printLogo" -> { val keyCode = action["keyCode"] as String printerBuilder.actionPrintLogo(LogoParameter(keyCode)) diff --git a/lib/models/starxpand_document_print.dart b/lib/models/starxpand_document_print.dart index 9515518..44ef131 100644 --- a/lib/models/starxpand_document_print.dart +++ b/lib/models/starxpand_document_print.dart @@ -33,6 +33,8 @@ enum StarXpandPdf417Level { enum StarXpandQRCodeModel { model1, model2 } enum StarXpandQRCodeLevel { l, m, q, h } +enum StarXpandLineStyle { double, single } + enum StarXpandStyleAlignment { left, center, right } enum StarXpandStyleFontType { a, b } enum StarXpandStyleInternationalCharacter { @@ -192,6 +194,18 @@ class StarXpandDocumentPrint extends StarXpandDocumentContent { }..trim()); } + actionPrintRuledLine(double width, { + required double? thickness, + StarXpandLineStyle lineStyle = StarXpandLineStyle.single, + }) { + _actions.add({ + 'action': 'printRuledLine', + 'width': width, + 'thickness': thickness, + 'lineStyle': lineStyle.name, + }); + } + actionPrintImage(Uint8List image, int width) { _actions.add({'action': 'printImage', 'image': image, 'width': width}); } diff --git a/pubspec.yaml b/pubspec.yaml index b3dcd82..c2a0e54 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper for the Star Micronics StarXpand API -version: 0.1.2 +version: 0.1.3 repository: https://github.com/dineouticeland/starxpand_flutter homepage: https://github.com/dineouticeland From 1769620fd674a88c47fb1e05a3a97699b3091046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 15 Nov 2023 10:31:26 +0000 Subject: [PATCH 10/31] Add the commented width to the enum? --- lib/models/starxpand_printer.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/models/starxpand_printer.dart b/lib/models/starxpand_printer.dart index 47c5d98..afdc268 100644 --- a/lib/models/starxpand_printer.dart +++ b/lib/models/starxpand_printer.dart @@ -10,14 +10,15 @@ enum StarXpandInterface { } enum StarXpandPrinterPaper { - mm58('58mm'), // 385 - mm76('76mm'), // 530 - mm80('80mm'), // 567 - mm112('112mm'); + mm58('58mm', 385), // 385 + mm76('76mm', 530), // 530 + mm80('80mm', 567), // 567 + mm112('112mm', 1093); final String label; + final int width; - const StarXpandPrinterPaper(this.label); + const StarXpandPrinterPaper(this.label, this.width); } enum StarXpandPrinterModel { From e1199350b9e3463da2e0d8a2992d7a3657615741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 15 Nov 2023 10:35:42 +0000 Subject: [PATCH 11/31] Increase version for the cacheeeeeeeeeeeeeeeeee --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c2a0e54..0260907 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper for the Star Micronics StarXpand API -version: 0.1.3 +version: 0.1.4 repository: https://github.com/dineouticeland/starxpand_flutter homepage: https://github.com/dineouticeland From 976804af13ab294ad40d4a5c07143fd317ae3581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Tue, 21 Nov 2023 15:16:42 +0000 Subject: [PATCH 12/31] 0.1.5 --- example/pubspec.lock | 2 +- lib/models/starxpand_document_print.dart | 4 ++++ pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index eae3b90..8a2ab15 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -174,7 +174,7 @@ packages: path: ".." relative: true source: path - version: "0.1.2" + version: "0.1.5" stream_channel: dependency: transitive description: diff --git a/lib/models/starxpand_document_print.dart b/lib/models/starxpand_document_print.dart index 44ef131..08f76e6 100644 --- a/lib/models/starxpand_document_print.dart +++ b/lib/models/starxpand_document_print.dart @@ -210,6 +210,10 @@ class StarXpandDocumentPrint extends StarXpandDocumentContent { _actions.add({'action': 'printImage', 'image': image, 'width': width}); } + List getActions() { + return _actions; + } + @override Map getData() { return {"actions": _actions}; diff --git a/pubspec.yaml b/pubspec.yaml index 0260907..eba3d89 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper for the Star Micronics StarXpand API -version: 0.1.4 +version: 0.1.5 repository: https://github.com/dineouticeland/starxpand_flutter homepage: https://github.com/dineouticeland From 68185068e22910b6c78f20688f30e41c141f6b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Tue, 21 Nov 2023 15:28:29 +0000 Subject: [PATCH 13/31] Revert the repo/homepage changes --- pubspec.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index eba3d89..f76357a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,8 +1,8 @@ name: starxpand -description: A flutter wrapper for the Star Micronics StarXpand API +description: A flutter wrapper around for Star Micronics StarXpand API. version: 0.1.5 -repository: https://github.com/dineouticeland/starxpand_flutter -homepage: https://github.com/dineouticeland +repository: https://github.com/ovatu/starxpand_flutter +homepage: https://ovatu.com/us environment: sdk: ">=2.17.0 <3.0.0" From 9bfbb64af5233b685c5ff1c964eca519ddaba699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Tue, 19 Dec 2023 15:10:08 +0000 Subject: [PATCH 14/31] Update stario10 version and more controlled printer connections --- android/build.gradle | 2 +- .../com/ovatu/starxpand/StarxpandPlugin.kt | 1407 +++++++++-------- lib/models/starxpand_printer.dart | 8 +- lib/starxpand.dart | 10 + pubspec.yaml | 2 +- 5 files changed, 778 insertions(+), 651 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 332c135..ffa1a63 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -47,5 +47,5 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.starmicronics:stario10:1.4.0' + implementation 'com.starmicronics:stario10:1.5.0' } diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 8e098ea..10c0495 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -29,732 +29,845 @@ import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch /** StarxpandPlugin */ -class StarxpandPlugin: FlutterPlugin, MethodCallHandler, ActivityAware { - private val tag = "StarxpandPlugin" - - /// The MethodChannel that will the communication between Flutter and native Android - /// - /// This local reference serves to register the plugin with the Flutter Engine and unregister it - /// when the Flutter Engine is detached from the Activity - private lateinit var channel: MethodChannel - private lateinit var activity: Activity - - private var _manager: StarDeviceDiscoveryManager? = null - private var _printers: MutableMap = mutableMapOf() - private var _permissionCallback: ((requestCode: Int, permissions: Array, grantResults: IntArray)->Unit)? = null - - override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - channel = MethodChannel(flutterPluginBinding.binaryMessenger, "starxpand") - channel.setMethodCallHandler(this) - } - - override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { - channel.setMethodCallHandler(null) - } - - override fun onAttachedToActivity(binding: ActivityPluginBinding) { - Log.d(tag, "onAttachedToActivity") - activity = binding.activity - binding.addRequestPermissionsResultListener { requestCode, permissions, grantResults -> callPermissionCallbacks(requestCode, permissions, grantResults) } - } - - private fun callPermissionCallbacks(requestCode: Int, permissions: Array, grantResults: IntArray): Boolean { - Log.d(tag, "callPermissionCallbacks") - _permissionCallback?.invoke(requestCode, permissions, grantResults) - - return true - } - - override fun onDetachedFromActivityForConfigChanges() { - Log.d(tag, "onDetachedFromActivityForConfigChanges") - } - - override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { - Log.d(tag, "onReattachedToActivityForConfigChanges") - } - - override fun onDetachedFromActivity() { - Log.d(tag, "onDetachedFromActivity") - } - - override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { - Log.d(tag, "onMethodCall: ${call.method} - ${call.arguments}") - - when (call.method) { - "getStatus" -> getStatus(call.arguments as Map<*, *>, result) - "findPrinters" -> findPrinters(call.arguments as Map<*, *>, result) - "printDocument" -> printDocument(call.arguments as Map<*, *>, result) - "updateDisplay" -> printDocument(call.arguments as Map<*, *>, result) - "startInputListener" -> startInputListener(call.arguments as Map<*, *>, result) - "stopInputListener" -> stopInputListener(call.arguments as Map<*, *>, result) - else -> result.notImplemented() +class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { + private val tag = "StarxpandPlugin" + + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private lateinit var channel: MethodChannel + private lateinit var activity: Activity + + private var connectedPrinter: StarPrinter? = null + + private var _manager: StarDeviceDiscoveryManager? = null + private var _printers: MutableMap = mutableMapOf() + private var _permissionCallback: ((requestCode: Int, permissions: Array, grantResults: IntArray) -> Unit)? = + null + + override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + channel = MethodChannel(flutterPluginBinding.binaryMessenger, "starxpand") + channel.setMethodCallHandler(this) } - } - private fun getStatus(@NonNull args: Map<*, *>, result: Result) { - val printer = getPrinter(args["printer"] as Map<*, *>) + override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) + } - val job = SupervisorJob() - val scope = CoroutineScope(Dispatchers.Default + job) - scope.launch { - if (openPrinter(printer)) { - try { - Log.d("status", "GetPrinterStatus $printer") - - val status = printer.getStatusAsync().await(); - result.success( - mutableMapOf( - "hasError" to status.hasError, - "coverOpen" to status.coverOpen, - "drawerOpenCloseSignal" to status.drawerOpenCloseSignal, - "paperEmpty" to status.paperEmpty, - "paperNearEmpty" to status.paperNearEmpty, - "reserved" to status.reserved, - "detail" to mutableMapOf( - "cleaningNotification" to status.detail.cleaningNotification, - "cutterError" to status.detail.cutterError, - "detectedPaperWidth" to status.detail.detectedPaperWidth, - "drawer1OpenCloseSignal" to status.detail.drawer1OpenCloseSignal, - "drawer1OpenedMethod" to status.detail.drawer1OpenedMethod?.value(), - "drawer2OpenCloseSignal" to status.detail.drawer2OpenCloseSignal, - "drawer2OpenedMethod" to status.detail.drawer2OpenedMethod?.value(), - "drawerOpenError" to status.detail.drawerOpenError, - "externalDevice1Connected" to status.detail.externalDevice1Connected, - "externalDevice2Connected" to status.detail.externalDevice2Connected, - "paperJamError" to status.detail.paperJamError, - "paperPresent" to status.detail.paperPresent, - "paperSeparatorError" to status.detail.paperSeparatorError, - "partsReplacementNotification" to status.detail.partsReplacementNotification, - "printUnitOpen" to status.detail.printUnitOpen, - "rollPositionError" to status.detail.rollPositionError, - ), + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + Log.d(tag, "onAttachedToActivity") + activity = binding.activity + binding.addRequestPermissionsResultListener { requestCode, permissions, grantResults -> + callPermissionCallbacks( + requestCode, + permissions, + grantResults ) - ) - } catch (e: java.lang.Exception) { - Log.d("status", "GetStatusError $e") - Log.d("status", e.localizedMessage) - result.error("error", e.localizedMessage, e) - } finally { - closePrinter(printer) } - } } - } - private fun getPrinter(map: Map<*, *>): StarPrinter { - val connection = StarConnectionSettings(interfaceTypeFromValue(map["interface"] as String)!!, map["identifier"] as String) + private fun callPermissionCallbacks( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ): Boolean { + Log.d(tag, "callPermissionCallbacks") + _permissionCallback?.invoke(requestCode, permissions, grantResults) - if (!_printers.containsKey(connection.toString())) { - val printer = StarPrinter(connection, activity) - _printers[connection.toString()] = printer + return true } - return _printers[connection.toString()]!! - } - - private fun sendCallback(guid: String, type: String, payload: Map<*, *>) { - Log.d(tag, "sendCallback: $guid - $payload") - - activity.runOnUiThread { - channel.invokeMethod( - "callback", mutableMapOf( - "guid" to guid, - "type" to type, - "data" to payload - ) - ) + override fun onDetachedFromActivityForConfigChanges() { + Log.d(tag, "onDetachedFromActivityForConfigChanges") } - } - private var _findPrintersResult: Result? = null - private var _findPrintersArgs: Map<*, *>? = null + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + Log.d(tag, "onReattachedToActivityForConfigChanges") + } - private fun hasBluetoothPermission(): Boolean { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - return true + override fun onDetachedFromActivity() { + Log.d(tag, "onDetachedFromActivity") } - return checkSelfPermission(activity, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED - } - - private fun findPrinters(@NonNull args: Map<*, *>, result: Result, requestBluetooth: Boolean = true) { - Log.d("Discovery", "findPrinters") - _findPrintersResult = result - _findPrintersArgs = args - - val callbackGuid = args["callback"] as String? - val timeout = args["timeout"] as Int - val interfaces = args["interfaces"] as List<*> - - try { - val foundPrinters: MutableList = mutableListOf() - - // Specify your printer interface types. - val interfaceTypes: List = (interfaces.map { - when (it as String?) { - "lan" -> InterfaceType.Lan - "bluetooth" -> InterfaceType.Bluetooth - "bluetoothLE" -> InterfaceType.Bluetooth - "usb" -> InterfaceType.Usb - else -> InterfaceType.Unknown + override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { + Log.d(tag, "onMethodCall: ${call.method} - ${call.arguments}") + + when (call.method) { + "openConnection" -> openPrinterConnection(call.arguments as Map<*, *>, result) + "closeConnection" -> closePrinterConnection(call.arguments as Map<*, *>, result) + "getStatus" -> getStatus(call.arguments as Map<*, *>, result) + "findPrinters" -> findPrinters(call.arguments as Map<*, *>, result) + "printDocument" -> printDocument(call.arguments as Map<*, *>, result) + "updateDisplay" -> printDocument(call.arguments as Map<*, *>, result) + "startInputListener" -> startInputListener(call.arguments as Map<*, *>, result) + "stopInputListener" -> stopInputListener(call.arguments as Map<*, *>, result) + else -> result.notImplemented() } - }).toList() + } + + private fun openPrinterConnection(@NonNull args: Map<*, *>, result: Result) { + val printer = getPrinter(args["printer"] as Map<*, *>) - if (interfaceTypes.contains(InterfaceType.Bluetooth)) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !hasBluetoothPermission() && requestBluetooth) { - _permissionCallback = { requestCode, _, grantResults -> - if (requestCode == 1000 && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - findPrinters(args, result, false) + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + scope.launch { + if (openPrinter(printer)) { + connectedPrinter = printer + result.success(true) } else { - result.error("error", "Bluetooth permission denied", null) + connectedPrinter = null + result.success(false) } - } - - requestPermissions(activity, - arrayOf( - Manifest.permission.BLUETOOTH_CONNECT, - ), 1000 - ) + } + } - Log.d("Discovery", "requesting bluetooth permission") + private fun closePrinterConnection(@NonNull args: Map<*, *>, result: Result) { + val printer = getPrinter(args["printer"] as Map<*, *>) - return - } - } - - _manager = StarDeviceDiscoveryManagerFactory.create( - interfaceTypes, - activity - ) - - _manager?.discoveryTime = timeout - _manager?.callback = object : StarDeviceDiscoveryManager.Callback { - // Callback for printer found. - override fun onPrinterFound(printer: StarPrinter) { - foundPrinters.add(printer) - if (callbackGuid != null) { - sendCallback(callbackGuid, "printerFound", mutableMapOf( - "model" to printer.information?.model?.value(), - "identifier" to printer.connectionSettings.identifier, - "interface" to printer.connectionSettings.interfaceType.value() - )) - } + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + scope.launch { + if (connectedPrinter != null) { + result.success(closePrinter(printer)); + } else { + connectedPrinter = null + result.success(true) + } } + } - // Callback for discovery finished. (option) - override fun onDiscoveryFinished() { - result.success(mutableMapOf( - "printers" to foundPrinters.map { - mutableMapOf( - "model" to it.information?.model?.value(), - "identifier" to it.connectionSettings.identifier, - "interface" to it.connectionSettings.interfaceType.value() + private fun getStatus(@NonNull args: Map<*, *>, result: Result) { + val printer = getPrinter(args["printer"] as Map<*, *>) + + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + scope.launch { + if (openPrinter(printer)) { + try { + Log.d("status", "GetPrinterStatus $printer") + + val status = printer.getStatusAsync().await(); + result.success( + mutableMapOf( + "hasError" to status.hasError, + "coverOpen" to status.coverOpen, + "drawerOpenCloseSignal" to status.drawerOpenCloseSignal, + "paperEmpty" to status.paperEmpty, + "paperNearEmpty" to status.paperNearEmpty, + "reserved" to status.reserved, + "detail" to mutableMapOf( + "cleaningNotification" to status.detail.cleaningNotification, + "cutterError" to status.detail.cutterError, + "detectedPaperWidth" to status.detail.detectedPaperWidth, + "drawer1OpenCloseSignal" to status.detail.drawer1OpenCloseSignal, + "drawer1OpenedMethod" to status.detail.drawer1OpenedMethod?.value(), + "drawer2OpenCloseSignal" to status.detail.drawer2OpenCloseSignal, + "drawer2OpenedMethod" to status.detail.drawer2OpenedMethod?.value(), + "drawerOpenError" to status.detail.drawerOpenError, + "externalDevice1Connected" to status.detail.externalDevice1Connected, + "externalDevice2Connected" to status.detail.externalDevice2Connected, + "paperJamError" to status.detail.paperJamError, + "paperPresent" to status.detail.paperPresent, + "paperSeparatorError" to status.detail.paperSeparatorError, + "partsReplacementNotification" to status.detail.partsReplacementNotification, + "printUnitOpen" to status.detail.printUnitOpen, + "rollPositionError" to status.detail.rollPositionError, + ), + ) ) - } - )) + } catch (e: java.lang.Exception) { + Log.d("status", "GetStatusError $e") + Log.d("status", e.localizedMessage) + result.error("error", e.localizedMessage, e) + } finally { + closePrinter(printer) + } + } } - } - - _manager?.startDiscovery() - } catch (e: Exception) { - // Exception. - Log.d("Discovery", "${e.message}") - result.error("error", e.localizedMessage, e) } - } - private fun stopInputListener(@NonNull args: Map<*, *>, result: Result) { - Log.d("Discovery", "startInputListener. ${args["printer"]}") - val printer = getPrinter(args["printer"] as Map<*, *>) + private fun getPrinter(map: Map<*, *>): StarPrinter { + val connection = StarConnectionSettings( + interfaceTypeFromValue(map["interface"] as String)!!, + map["identifier"] as String + ) - val job = SupervisorJob() - val scope = CoroutineScope(Dispatchers.Default + job) - scope.launch { - closePrinter(printer) + if (!_printers.containsKey(connection.toString())) { + val printer = StarPrinter(connection, activity) + _printers[connection.toString()] = printer + } - result.success(true) + return _printers[connection.toString()]!! } - } - private fun startInputListener(@NonNull args: Map<*, *>, result: Result) { - Log.d("Discovery", "startInputListener. ${args["printer"]}") - val callbackGuid = args["callback"] as String + private fun sendCallback(guid: String, type: String, payload: Map<*, *>) { + Log.d(tag, "sendCallback: $guid - $payload") - val printer = getPrinter(args["printer"] as Map<*, *>) + activity.runOnUiThread { + channel.invokeMethod( + "callback", mutableMapOf( + "guid" to guid, + "type" to type, + "data" to payload + ) + ) + } + } - printer.inputDeviceDelegate = object : InputDeviceDelegate() { - override fun onDataReceived(data: List) { - super.onDataReceived(data) + private var _findPrintersResult: Result? = null + private var _findPrintersArgs: Map<*, *>? = null - val string = String(data.toByteArray()) + private fun hasBluetoothPermission(): Boolean { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + return true + } - sendCallback(callbackGuid, "dataReceived", mutableMapOf( - "data" to data.toByteArray(), - "string" to string - )) - } + return checkSelfPermission( + activity, + Manifest.permission.BLUETOOTH_CONNECT + ) == PackageManager.PERMISSION_GRANTED } - val job = SupervisorJob() - val scope = CoroutineScope(Dispatchers.Default + job) - scope.launch { - try { - closePrinter(printer) - openPrinter(printer) - - result.success(true) - } catch (e: Exception) { - result.error("error", e.localizedMessage, e) - } - } - } - - private suspend fun openPrinter(printer: StarPrinter): Boolean { - return try { - printer.openAsync().await() - true - } catch (e: Exception) { - e is StarIO10InvalidOperationException - } - } + private fun findPrinters( + @NonNull args: Map<*, *>, + result: Result, + requestBluetooth: Boolean = true + ) { + Log.d("Discovery", "findPrinters") + _findPrintersResult = result + _findPrintersArgs = args + val callbackGuid = args["callback"] as String? + val timeout = args["timeout"] as Int + val interfaces = args["interfaces"] as List<*> - private suspend fun closePrinter(printer: StarPrinter): Boolean { - return try { - printer.closeAsync().await() - true - } catch (e: Exception) { - false - } - } + try { + val foundPrinters: MutableList = mutableListOf() + + // Specify your printer interface types. + val interfaceTypes: List = (interfaces.map { + when (it as String?) { + "lan" -> InterfaceType.Lan + "bluetooth" -> InterfaceType.Bluetooth + "bluetoothLE" -> InterfaceType.Bluetooth + "usb" -> InterfaceType.Usb + else -> InterfaceType.Unknown + } + }).toList() + + if (interfaceTypes.contains(InterfaceType.Bluetooth)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !hasBluetoothPermission() && requestBluetooth) { + _permissionCallback = { requestCode, _, grantResults -> + if (requestCode == 1000 && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + findPrinters(args, result, false) + } else { + result.error("error", "Bluetooth permission denied", null) + } + } + + requestPermissions( + activity, + arrayOf( + Manifest.permission.BLUETOOTH_CONNECT, + ), 1000 + ) - private fun printDocument(@NonNull args: Map<*, *>, result: Result) { - Log.d("print", "print. ${args["printer"]}") + Log.d("Discovery", "requesting bluetooth permission") - val printer = getPrinter(args["printer"] as Map<*, *>) - val document = args["document"] as Map<*, *> - val contents = document["contents"] as Collection<*> + return + } + } - Log.d("print", "document: $document") + _manager = StarDeviceDiscoveryManagerFactory.create( + interfaceTypes, + activity + ) - val job = SupervisorJob() - val scope = CoroutineScope(Dispatchers.Default + job) - scope.launch { - if (openPrinter(printer)) { - try { - val builder = StarXpandCommandBuilder() - val docBuilder = DocumentBuilder() - - for (content in contents) { - if (content !is Map<*, *>) continue - - val type = content["type"] as String - val data = content["data"] as Map<*, *> - - when (type) { - "drawer" -> { - docBuilder.addDrawer(getDrawerBuilder(data)) - } - "print" -> { - docBuilder.addPrinter(getPrinterBuilder(data)) - } - "display" -> { - docBuilder.addDisplay(getDisplayBuilder(data)) - } + _manager?.discoveryTime = timeout + _manager?.callback = object : StarDeviceDiscoveryManager.Callback { + // Callback for printer found. + override fun onPrinterFound(printer: StarPrinter) { + foundPrinters.add(printer) + if (callbackGuid != null) { + sendCallback( + callbackGuid, "printerFound", mutableMapOf( + "model" to printer.information?.model?.value(), + "identifier" to printer.connectionSettings.identifier, +// "ipAddress" to printer.information + "interface" to printer.connectionSettings.interfaceType.value() + ) + ) + } + } + + // Callback for discovery finished. (option) + override fun onDiscoveryFinished() { + result.success(mutableMapOf( + "printers" to foundPrinters.map { + mutableMapOf( + "model" to it.information?.model?.value(), + "identifier" to it.connectionSettings.identifier, + "interface" to it.connectionSettings.interfaceType.value() + ) + } + )) + } } - } - builder.addDocument(docBuilder) + _manager?.startDiscovery() + } catch (e: Exception) { + // Exception. + Log.d("Discovery", "${e.message}") + result.error("error", e.localizedMessage, e) + } + } - // Get printing data from StarXpandCommandBuilder object. - val commands = builder.getCommands() + private fun stopInputListener(@NonNull args: Map<*, *>, result: Result) { + Log.d("Discovery", "startInputListener. ${args["printer"]}") + val printer = getPrinter(args["printer"] as Map<*, *>) - Log.d("print", "commands $commands") + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + scope.launch { + closePrinter(printer) - // Print. - printer.printAsync(commands).await() - result.success(true) - } catch (e: java.lang.Exception) { - Log.d("print", "commands $e") - result.error("error", e.localizedMessage, e) - } finally { - closePrinter(printer) + result.success(true) } - } } - } - private fun getDrawerBuilder(data: Map<*, *>): DrawerBuilder { - val channel = when (data["channel"]) { - "no1" -> Channel.No1 - "no2" -> Channel.No2 - else -> Channel.No1 - } - return DrawerBuilder().actionOpen(OpenParameter().setOnTime(0).setChannel(channel)) - } + private fun startInputListener(@NonNull args: Map<*, *>, result: Result) { + Log.d("Discovery", "startInputListener. ${args["printer"]}") + val callbackGuid = args["callback"] as String - private fun getDisplayBuilder(data: Map<*, *>): DisplayBuilder { - val displayBuilder = DisplayBuilder() - val actions = data["actions"] as Collection<*> + val printer = getPrinter(args["printer"] as Map<*, *>) - Log.d("display", "display actions: $actions") + printer.inputDeviceDelegate = object : InputDeviceDelegate() { + override fun onDataReceived(data: List) { + super.onDataReceived(data) - for (action in actions) { - if (action !is Map<*, *>) continue + val string = String(data.toByteArray()) - when (action["action"] as String) { - "showText" -> { - displayBuilder.actionShowText(action["data"] as String) - } - "clearAll" -> { - displayBuilder.actionClearAll() - } - "clearLine" -> { - displayBuilder.actionClearLine() + sendCallback( + callbackGuid, "dataReceived", mutableMapOf( + "data" to data.toByteArray(), + "string" to string + ) + ) + } } - "setContrast" -> { - displayBuilder.actionSetContrast(when(action["data"]) { - "minus3" -> Contrast.Minus3 - "minus2" -> Contrast.Minus2 - "minus1" -> Contrast.Minus1 - "plus1" -> Contrast.Plus1 - "plus2" -> Contrast.Plus2 - "plus3" -> Contrast.Plus3 - else -> Contrast.Default - }) + + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + scope.launch { + try { + closePrinter(printer) + openPrinter(printer) + + result.success(true) + } catch (e: Exception) { + result.error("error", e.localizedMessage, e) + } } - "showImage" -> { - val image = action["image"] as ByteArray - val bmp = BitmapFactory.decodeByteArray(image, 0, image.size) - displayBuilder.actionShowImage(com.starmicronics.stario10.starxpandcommand.display.ImageParameter(bmp)) + } + + private suspend fun openPrinter(printer: StarPrinter): Boolean { + return try { + printer.openAsync().await() + true + } catch (e: Exception) { + e is StarIO10InvalidOperationException } - } } - return displayBuilder - } - private fun getPrinterBuilder(data: Map<*, *>): PrinterBuilder { - val printerBuilder = PrinterBuilder() + private suspend fun closePrinter(printer: StarPrinter): Boolean { + return try { + printer.closeAsync().await() + true + } catch (e: Exception) { + false + } + } - val actions = data["actions"] as Collection<*> + private fun printDocument(@NonNull args: Map<*, *>, result: Result) { + Log.d("print", "print. ${args["printer"]}") - Log.d("print", "print actions: $actions") +// val printer = getPrinter(args["printer"] as Map<*, *>) + val document = args["document"] as Map<*, *> + val contents = document["contents"] as Collection<*> - for (action in actions) { - if (action !is Map<*, *>) continue + Log.d("print", "document: $document") - when (action["action"] as String) { - "add" -> { - printerBuilder.add(getPrinterBuilder(action["data"] as Map<*, *>)) - } - "style" -> { - if (action["alignment"] != null) { - printerBuilder.styleAlignment(when (action["alignment"]) { - "left" -> Alignment.Left - "center" -> Alignment.Center - "right" -> Alignment.Right - else -> Alignment.Left - }) - } - - if (action["fontType"] != null) { - printerBuilder.styleFont(when (action["fontType"]) { - "a" -> FontType.A - "b" -> FontType.B - else -> FontType.A - }) - } - - if (action["bold"] != null) { - printerBuilder.styleBold(action["bold"] as Boolean) - } - - if (action["invert"] != null) { - printerBuilder.styleInvert(action["invert"] as Boolean) - } - - if (action["underLine"] != null) { - printerBuilder.styleUnderLine(action["underLine"] as Boolean) - } - - if (action["magnification"] != null) { - val magnification = action["magnification"] as Map<*, *> - - printerBuilder.styleMagnification(MagnificationParameter(magnification["width"] as Int, magnification["height"] as Int)) - } - - if (action["characterSpace"] != null) { - printerBuilder.styleCharacterSpace(action["characterSpace"] as Double) - } - - if (action["lineSpace"] != null) { - printerBuilder.styleLineSpace(action["lineSpace"] as Double) - } - - if (action["horizontalPositionTo"] != null) { - printerBuilder.styleHorizontalPositionTo(action["horizontalPositionTo"] as Double) - } - - if (action["horizontalPositionBy"] != null) { - printerBuilder.styleHorizontalPositionBy(action["horizontalPositionBy"] as Double) - } - - if (action["horizontalTabPosition"] != null) { - printerBuilder.styleHorizontalTabPositions((action["horizontalTabPosition"] as List<*>).map { it as Int }) - } - - if (action["internationalCharacter"] != null) { - printerBuilder.styleInternationalCharacter(when (action["internationalCharacter"]) { - "usa" -> InternationalCharacterType.Usa - "france" -> InternationalCharacterType.France - "germany" -> InternationalCharacterType.Germany - "uk" -> InternationalCharacterType.UK - "denmark" -> InternationalCharacterType.Denmark - "sweden" -> InternationalCharacterType.Sweden - "italy" -> InternationalCharacterType.Italy - "spain" -> InternationalCharacterType.Spain - "japan" -> InternationalCharacterType.Japan - "norway" -> InternationalCharacterType.Norway - "denmark2" -> InternationalCharacterType.Denmark2 - "spain2" -> InternationalCharacterType.Spain2 - "latinAmerica" -> InternationalCharacterType.LatinAmerica - "korea" -> InternationalCharacterType.Korea - "ireland" -> InternationalCharacterType.Ireland - "slovenia" -> InternationalCharacterType.Slovenia - "croatia" -> InternationalCharacterType.Croatia - "china" -> InternationalCharacterType.China - "vietnam" -> InternationalCharacterType.Vietnam - "arabic" -> InternationalCharacterType.Arabic - "legal" -> InternationalCharacterType.Legal - else -> InternationalCharacterType.Usa - }) - } - - if (action["secondPriorityCharacterEncoding"] != null) { - printerBuilder.styleSecondPriorityCharacterEncoding(when (data["secondPriorityCharacterEncoding"]) { - "japanese" -> CharacterEncodingType.Japanese - "simplifiedChinese" -> CharacterEncodingType.SimplifiedChinese - "traditionalChinese" -> CharacterEncodingType.TraditionalChinese - "korean" -> CharacterEncodingType.Korean - "codePage" -> CharacterEncodingType.CodePage - else -> CharacterEncodingType.CodePage - }) - } - - if (action["cjkCharacterPriority"] != null) { - printerBuilder.styleCjkCharacterPriority((action["cjkCharacterPriority"] as List<*>).map { - when (it as String?) { - "japanese" -> CjkCharacterType.Japanese - "simplifiedChinese" -> CjkCharacterType.SimplifiedChinese - "traditionalChinese" -> CjkCharacterType.TraditionalChinese - "korean" -> CjkCharacterType.Korean - else -> CjkCharacterType.Japanese - } - }) - } - } - "cut" -> { - val cutType = when (action["type"]) { - "full" -> CutType.Full - "partial" -> CutType.Partial - "fullDirect" -> CutType.FullDirect - "partialDirect" -> CutType.PartialDirect - else -> CutType.Partial - } - printerBuilder.actionCut(cutType) - } - "feed" -> { - val height = (action["height"] as Double?) ?: 10.0 - printerBuilder.actionFeed(height) - } - "feedLine" -> { - val lines = (action["lines"] as Int?) ?: 1 - printerBuilder.actionFeedLine(lines) - } - "printText" -> { - val text = action["text"] as String - printerBuilder.actionPrintText(text) + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + + if (connectedPrinter == null) { + Log.d("print", "Error printing: No connection available") + result.error("error", "No active printer connection", null) + return } - "printRuledLine" -> { - val ruleLineWidth = action["width"] as Double - val parameters = RuledLineParameter(ruleLineWidth) - - if (action["thickness"] != null) { - parameters.setThickness(action["thickness"] as Double) - } - - if (action["lineStyle"] != null) { - val lineStyle = when (action["lineStyle"] as String) { - "double" -> LineStyle.Double - else -> LineStyle.Single - } - parameters.setLineStyle(lineStyle) - } + scope.launch { +// if (openPrinter(printer)) { + try { + val builder = StarXpandCommandBuilder() + val docBuilder = DocumentBuilder() - printerBuilder.actionPrintRuledLine(parameters) - } - "printLogo" -> { - val keyCode = action["keyCode"] as String - printerBuilder.actionPrintLogo(LogoParameter(keyCode)) - } - "printBarcode" -> { - val barcodeContent = action["content"] as String - val symbology = when (action["symbology"] as String) { - "upcE" -> BarcodeSymbology.UpcE - "upcA" -> BarcodeSymbology.UpcA - "jan8" -> BarcodeSymbology.Jan8 - "ean8" -> BarcodeSymbology.Ean8 - "jan13" -> BarcodeSymbology.Jan13 - "ean13" -> BarcodeSymbology.Ean13 - "code39" -> BarcodeSymbology.Code39 - "itf" -> BarcodeSymbology.Itf - "code128" -> BarcodeSymbology.Code128 - "code93" -> BarcodeSymbology.Code93 - "nw7" -> BarcodeSymbology.NW7 - else -> BarcodeSymbology.UpcE - } - - val param = BarcodeParameter(barcodeContent, symbology) - if (action["printHri"] != null) { - param.setPrintHri(action["printHri"] as Boolean) - } - if (action["barDots"] != null) { - param.setBarDots(action["barDots"] as Int) - } - if (action["barRatioLevel"] != null) { - param.setBarRatioLevel(when (action["barRatioLevel"] as String) { - "levelPlus1" -> BarcodeBarRatioLevel.LevelPlus1 - "level0" -> BarcodeBarRatioLevel.Level0 - "levelMinus1" -> BarcodeBarRatioLevel.LevelMinus1 - else -> BarcodeBarRatioLevel.Level0 - }) - } - if (action["height"] != null) { - param.setHeight(action["height"] as Double) - } - - printerBuilder.actionPrintBarcode(param) + for (content in contents) { + if (content !is Map<*, *>) continue + + val type = content["type"] as String + val data = content["data"] as Map<*, *> + + when (type) { + "drawer" -> { + docBuilder.addDrawer(getDrawerBuilder(data)) + } + + "print" -> { + docBuilder.addPrinter(getPrinterBuilder(data)) + } + + "display" -> { + docBuilder.addDisplay(getDisplayBuilder(data)) + } + } + } + + builder.addDocument(docBuilder) + + // Get printing data from StarXpandCommandBuilder object. + val commands = builder.getCommands() + + Log.d("print", "commands $commands") + + // Print. + connectedPrinter?.printAsync(commands)?.await() + result.success(true) + } catch (e: java.lang.Exception) { + Log.d("print", "commands $e") + result.error("error", e.localizedMessage, e) + } finally { +// closePrinter(printer) + } +// } } - "printPdf417" -> { - val pdf417Content = action["content"] as String - val param = Pdf417Parameter(pdf417Content) - - if (action["column"] != null) { - param.setColumn(action["column"] as Int) - } - if (action["line"] != null) { - param.setLine(action["line"] as Int) - } - if (action["module"] != null) { - param.setModule(action["module"] as Int) - } - if (action["aspect"] != null) { - param.setAspect(action["aspect"] as Int) - } - if (action["level"] != null) { - param.setLevel(when (action["level"] as String) { - "ecc0" -> Pdf417Level.Ecc0 - "ecc1" -> Pdf417Level.Ecc1 - "ecc2" -> Pdf417Level.Ecc2 - "ecc3" -> Pdf417Level.Ecc3 - "ecc4" -> Pdf417Level.Ecc4 - "ecc5" -> Pdf417Level.Ecc5 - "ecc6" -> Pdf417Level.Ecc6 - "ecc7" -> Pdf417Level.Ecc7 - "ecc8" -> Pdf417Level.Ecc8 - else -> Pdf417Level.Ecc0 - }) - } - - printerBuilder.actionPrintPdf417(param) + } + + private fun getDrawerBuilder(data: Map<*, *>): DrawerBuilder { + val channel = when (data["channel"]) { + "no1" -> Channel.No1 + "no2" -> Channel.No2 + else -> Channel.No1 } - "printQRCode" -> { - val qrContent = action["content"] as String - val param = QRCodeParameter(qrContent) - - if (action["model"] != null) { - param.setModel(when (action["model"] as String) { - "model1" -> QRCodeModel.Model1 - "model2" -> QRCodeModel.Model2 - else -> QRCodeModel.Model1 - }) - } - if (action["level"] != null) { - param.setLevel(when (action["level"] as String) { - "l" -> QRCodeLevel.L - "m" -> QRCodeLevel.M - "q" -> QRCodeLevel.Q - "h" -> QRCodeLevel.H - else -> QRCodeLevel.L - }) - } - if (action["cellSize"] != null) { - param.setCellSize(action["cellSize"] as Int) - } - - printerBuilder.actionPrintQRCode(param) + return DrawerBuilder().actionOpen(OpenParameter().setOnTime(0).setChannel(channel)) + } + + private fun getDisplayBuilder(data: Map<*, *>): DisplayBuilder { + val displayBuilder = DisplayBuilder() + val actions = data["actions"] as Collection<*> + + Log.d("display", "display actions: $actions") + + for (action in actions) { + if (action !is Map<*, *>) continue + + when (action["action"] as String) { + "showText" -> { + displayBuilder.actionShowText(action["data"] as String) + } + + "clearAll" -> { + displayBuilder.actionClearAll() + } + + "clearLine" -> { + displayBuilder.actionClearLine() + } + + "setContrast" -> { + displayBuilder.actionSetContrast( + when (action["data"]) { + "minus3" -> Contrast.Minus3 + "minus2" -> Contrast.Minus2 + "minus1" -> Contrast.Minus1 + "plus1" -> Contrast.Plus1 + "plus2" -> Contrast.Plus2 + "plus3" -> Contrast.Plus3 + else -> Contrast.Default + } + ) + } + + "showImage" -> { + val image = action["image"] as ByteArray + val bmp = BitmapFactory.decodeByteArray(image, 0, image.size) + displayBuilder.actionShowImage( + com.starmicronics.stario10.starxpandcommand.display.ImageParameter( + bmp + ) + ) + } + } } - "printImage" -> { - val image = action["image"] as ByteArray - val width = action["width"] as Int - val bmp = BitmapFactory.decodeByteArray(image, 0, image.size) - printerBuilder.actionPrintImage(ImageParameter(bmp, width)) + + return displayBuilder + } + + private fun getPrinterBuilder(data: Map<*, *>): PrinterBuilder { + val printerBuilder = PrinterBuilder() + + val actions = data["actions"] as Collection<*> + + Log.d("print", "print actions: $actions") + + for (action in actions) { + if (action !is Map<*, *>) continue + + when (action["action"] as String) { + "add" -> { + printerBuilder.add(getPrinterBuilder(action["data"] as Map<*, *>)) + } + + "style" -> { + if (action["alignment"] != null) { + printerBuilder.styleAlignment( + when (action["alignment"]) { + "left" -> Alignment.Left + "center" -> Alignment.Center + "right" -> Alignment.Right + else -> Alignment.Left + } + ) + } + + if (action["fontType"] != null) { + printerBuilder.styleFont( + when (action["fontType"]) { + "a" -> FontType.A + "b" -> FontType.B + else -> FontType.A + } + ) + } + + if (action["bold"] != null) { + printerBuilder.styleBold(action["bold"] as Boolean) + } + + if (action["invert"] != null) { + printerBuilder.styleInvert(action["invert"] as Boolean) + } + + if (action["underLine"] != null) { + printerBuilder.styleUnderLine(action["underLine"] as Boolean) + } + + if (action["magnification"] != null) { + val magnification = action["magnification"] as Map<*, *> + + printerBuilder.styleMagnification( + MagnificationParameter( + magnification["width"] as Int, + magnification["height"] as Int + ) + ) + } + + if (action["characterSpace"] != null) { + printerBuilder.styleCharacterSpace(action["characterSpace"] as Double) + } + + if (action["lineSpace"] != null) { + printerBuilder.styleLineSpace(action["lineSpace"] as Double) + } + + if (action["horizontalPositionTo"] != null) { + printerBuilder.styleHorizontalPositionTo(action["horizontalPositionTo"] as Double) + } + + if (action["horizontalPositionBy"] != null) { + printerBuilder.styleHorizontalPositionBy(action["horizontalPositionBy"] as Double) + } + + if (action["horizontalTabPosition"] != null) { + printerBuilder.styleHorizontalTabPositions((action["horizontalTabPosition"] as List<*>).map { it as Int }) + } + + if (action["internationalCharacter"] != null) { + printerBuilder.styleInternationalCharacter( + when (action["internationalCharacter"]) { + "usa" -> InternationalCharacterType.Usa + "france" -> InternationalCharacterType.France + "germany" -> InternationalCharacterType.Germany + "uk" -> InternationalCharacterType.UK + "denmark" -> InternationalCharacterType.Denmark + "sweden" -> InternationalCharacterType.Sweden + "italy" -> InternationalCharacterType.Italy + "spain" -> InternationalCharacterType.Spain + "japan" -> InternationalCharacterType.Japan + "norway" -> InternationalCharacterType.Norway + "denmark2" -> InternationalCharacterType.Denmark2 + "spain2" -> InternationalCharacterType.Spain2 + "latinAmerica" -> InternationalCharacterType.LatinAmerica + "korea" -> InternationalCharacterType.Korea + "ireland" -> InternationalCharacterType.Ireland + "slovenia" -> InternationalCharacterType.Slovenia + "croatia" -> InternationalCharacterType.Croatia + "china" -> InternationalCharacterType.China + "vietnam" -> InternationalCharacterType.Vietnam + "arabic" -> InternationalCharacterType.Arabic + "legal" -> InternationalCharacterType.Legal + else -> InternationalCharacterType.Usa + } + ) + } + + if (action["secondPriorityCharacterEncoding"] != null) { + printerBuilder.styleSecondPriorityCharacterEncoding( + when (data["secondPriorityCharacterEncoding"]) { + "japanese" -> CharacterEncodingType.Japanese + "simplifiedChinese" -> CharacterEncodingType.SimplifiedChinese + "traditionalChinese" -> CharacterEncodingType.TraditionalChinese + "korean" -> CharacterEncodingType.Korean + "codePage" -> CharacterEncodingType.CodePage + else -> CharacterEncodingType.CodePage + } + ) + } + + if (action["cjkCharacterPriority"] != null) { + printerBuilder.styleCjkCharacterPriority((action["cjkCharacterPriority"] as List<*>).map { + when (it as String?) { + "japanese" -> CjkCharacterType.Japanese + "simplifiedChinese" -> CjkCharacterType.SimplifiedChinese + "traditionalChinese" -> CjkCharacterType.TraditionalChinese + "korean" -> CjkCharacterType.Korean + else -> CjkCharacterType.Japanese + } + }) + } + } + + "cut" -> { + val cutType = when (action["type"]) { + "full" -> CutType.Full + "partial" -> CutType.Partial + "fullDirect" -> CutType.FullDirect + "partialDirect" -> CutType.PartialDirect + else -> CutType.Partial + } + printerBuilder.actionCut(cutType) + } + + "feed" -> { + val height = (action["height"] as Double?) ?: 10.0 + printerBuilder.actionFeed(height) + } + + "feedLine" -> { + val lines = (action["lines"] as Int?) ?: 1 + printerBuilder.actionFeedLine(lines) + } + + "printText" -> { + val text = action["text"] as String + printerBuilder.actionPrintText(text) + } + + "printRuledLine" -> { + val ruleLineWidth = action["width"] as Double + val parameters = RuledLineParameter(ruleLineWidth) + + if (action["thickness"] != null) { + parameters.setThickness(action["thickness"] as Double) + } + + if (action["lineStyle"] != null) { + val lineStyle = when (action["lineStyle"] as String) { + "double" -> LineStyle.Double + else -> LineStyle.Single + } + + parameters.setLineStyle(lineStyle) + } + + printerBuilder.actionPrintRuledLine(parameters) + } + + "printLogo" -> { + val keyCode = action["keyCode"] as String + printerBuilder.actionPrintLogo(LogoParameter(keyCode)) + } + + "printBarcode" -> { + val barcodeContent = action["content"] as String + val symbology = when (action["symbology"] as String) { + "upcE" -> BarcodeSymbology.UpcE + "upcA" -> BarcodeSymbology.UpcA + "jan8" -> BarcodeSymbology.Jan8 + "ean8" -> BarcodeSymbology.Ean8 + "jan13" -> BarcodeSymbology.Jan13 + "ean13" -> BarcodeSymbology.Ean13 + "code39" -> BarcodeSymbology.Code39 + "itf" -> BarcodeSymbology.Itf + "code128" -> BarcodeSymbology.Code128 + "code93" -> BarcodeSymbology.Code93 + "nw7" -> BarcodeSymbology.NW7 + else -> BarcodeSymbology.UpcE + } + + val param = BarcodeParameter(barcodeContent, symbology) + if (action["printHri"] != null) { + param.setPrintHri(action["printHri"] as Boolean) + } + if (action["barDots"] != null) { + param.setBarDots(action["barDots"] as Int) + } + if (action["barRatioLevel"] != null) { + param.setBarRatioLevel( + when (action["barRatioLevel"] as String) { + "levelPlus1" -> BarcodeBarRatioLevel.LevelPlus1 + "level0" -> BarcodeBarRatioLevel.Level0 + "levelMinus1" -> BarcodeBarRatioLevel.LevelMinus1 + else -> BarcodeBarRatioLevel.Level0 + } + ) + } + if (action["height"] != null) { + param.setHeight(action["height"] as Double) + } + + printerBuilder.actionPrintBarcode(param) + } + + "printPdf417" -> { + val pdf417Content = action["content"] as String + val param = Pdf417Parameter(pdf417Content) + + if (action["column"] != null) { + param.setColumn(action["column"] as Int) + } + if (action["line"] != null) { + param.setLine(action["line"] as Int) + } + if (action["module"] != null) { + param.setModule(action["module"] as Int) + } + if (action["aspect"] != null) { + param.setAspect(action["aspect"] as Int) + } + if (action["level"] != null) { + param.setLevel( + when (action["level"] as String) { + "ecc0" -> Pdf417Level.Ecc0 + "ecc1" -> Pdf417Level.Ecc1 + "ecc2" -> Pdf417Level.Ecc2 + "ecc3" -> Pdf417Level.Ecc3 + "ecc4" -> Pdf417Level.Ecc4 + "ecc5" -> Pdf417Level.Ecc5 + "ecc6" -> Pdf417Level.Ecc6 + "ecc7" -> Pdf417Level.Ecc7 + "ecc8" -> Pdf417Level.Ecc8 + else -> Pdf417Level.Ecc0 + } + ) + } + + printerBuilder.actionPrintPdf417(param) + } + + "printQRCode" -> { + val qrContent = action["content"] as String + val param = QRCodeParameter(qrContent) + + if (action["model"] != null) { + param.setModel( + when (action["model"] as String) { + "model1" -> QRCodeModel.Model1 + "model2" -> QRCodeModel.Model2 + else -> QRCodeModel.Model1 + } + ) + } + if (action["level"] != null) { + param.setLevel( + when (action["level"] as String) { + "l" -> QRCodeLevel.L + "m" -> QRCodeLevel.M + "q" -> QRCodeLevel.Q + "h" -> QRCodeLevel.H + else -> QRCodeLevel.L + } + ) + } + if (action["cellSize"] != null) { + param.setCellSize(action["cellSize"] as Int) + } + + printerBuilder.actionPrintQRCode(param) + } + + "printImage" -> { + val image = action["image"] as ByteArray + val width = action["width"] as Int + val bmp = BitmapFactory.decodeByteArray(image, 0, image.size) + printerBuilder.actionPrintImage(ImageParameter(bmp, width)) + } + } } - } + return printerBuilder } - return printerBuilder - } } -fun InterfaceType.value() : String { - return when (this) { - InterfaceType.Lan -> "lan" - InterfaceType.Bluetooth -> "bluetooth" - InterfaceType.Usb -> "usb" - else -> "unknown" - } +fun InterfaceType.value(): String { + return when (this) { + InterfaceType.Lan -> "lan" + InterfaceType.Bluetooth -> "bluetooth" + InterfaceType.Usb -> "usb" + else -> "unknown" + } } -fun DrawerOpenedMethod.value() : String { - return when (this) { - DrawerOpenedMethod.ByHand -> "byHand" - DrawerOpenedMethod.ByCommand -> "byCommand" - } +fun DrawerOpenedMethod.value(): String { + return when (this) { + DrawerOpenedMethod.ByHand -> "byHand" + DrawerOpenedMethod.ByCommand -> "byCommand" + } } -fun interfaceTypeFromValue(value: String) : InterfaceType? { - return when (value) { - "lan" -> InterfaceType.Lan - "bluetooth" -> InterfaceType.Bluetooth - "usb" -> InterfaceType.Usb - else -> null - } +fun interfaceTypeFromValue(value: String): InterfaceType? { + return when (value) { + "lan" -> InterfaceType.Lan + "bluetooth" -> InterfaceType.Bluetooth + "usb" -> InterfaceType.Usb + else -> null + } } -fun StarPrinterModel.value() : String { - return when (this) { - StarPrinterModel.TSP650II -> "tsp650II" - StarPrinterModel.TSP700II -> "tsp700II" - StarPrinterModel.TSP800II -> "tsp800II" - StarPrinterModel.TSP100IIU_Plus -> "tsp100IIUPlus" - StarPrinterModel.TSP100IIIW -> "tsp100IIIW" - StarPrinterModel.TSP100IIILAN -> "tsp100IIILAN" - StarPrinterModel.TSP100IIIBI -> "tsp100IIIBI" - StarPrinterModel.TSP100IIIU -> "tsp100IIIU" - StarPrinterModel.TSP100IV -> "tsp100IV" - StarPrinterModel.mPOP -> "mPOP" - StarPrinterModel.mC_Print2 -> "mCPrint2" - StarPrinterModel.mC_Print3 -> "mCPrint3" - StarPrinterModel.SM_S210i -> "smS210i" - StarPrinterModel.SM_S230i -> "smS230i" - StarPrinterModel.SM_T300 -> "smT300" - StarPrinterModel.SM_T300i -> "smT300i" - StarPrinterModel.SM_T400i -> "smT400i" - StarPrinterModel.SM_L200 -> "smL200" - StarPrinterModel.SM_L300 -> "smL300" - StarPrinterModel.SP700 -> "sp700" - else -> "unknown" - } +fun StarPrinterModel.value(): String { + return when (this) { + StarPrinterModel.TSP650II -> "tsp650II" + StarPrinterModel.TSP700II -> "tsp700II" + StarPrinterModel.TSP800II -> "tsp800II" + StarPrinterModel.TSP100IIU_Plus -> "tsp100IIUPlus" + StarPrinterModel.TSP100IIIW -> "tsp100IIIW" + StarPrinterModel.TSP100IIILAN -> "tsp100IIILAN" + StarPrinterModel.TSP100IIIBI -> "tsp100IIIBI" + StarPrinterModel.TSP100IIIU -> "tsp100IIIU" + StarPrinterModel.TSP100IV -> "tsp100IV" + StarPrinterModel.mPOP -> "mPOP" + StarPrinterModel.mC_Print2 -> "mCPrint2" + StarPrinterModel.mC_Print3 -> "mCPrint3" + StarPrinterModel.SM_S210i -> "smS210i" + StarPrinterModel.SM_S230i -> "smS230i" + StarPrinterModel.SM_T300 -> "smT300" + StarPrinterModel.SM_T300i -> "smT300i" + StarPrinterModel.SM_T400i -> "smT400i" + StarPrinterModel.SM_L200 -> "smL200" + StarPrinterModel.SM_L300 -> "smL300" + StarPrinterModel.SP700 -> "sp700" + else -> "unknown" + } } \ No newline at end of file diff --git a/lib/models/starxpand_printer.dart b/lib/models/starxpand_printer.dart index afdc268..de4a969 100644 --- a/lib/models/starxpand_printer.dart +++ b/lib/models/starxpand_printer.dart @@ -48,6 +48,7 @@ enum StarXpandPrinterModel { final List paper; const StarXpandPrinterModel(this.label, this.paper); + static StarXpandPrinterModel fromName(String name) => StarXpandPrinterModel.values.where((e) => e.name == name).first; } @@ -57,24 +58,27 @@ class StarXpandPrinter { StarXpandPrinter.fromMap(Map response) : model = StarXpandPrinterModel.fromName(response['model']), identifier = response['identifier'], + ipAddress = response['ipAddress'], interface = StarXpandInterface.fromName(response['interface']); // Name of the called method StarXpandPrinterModel model; String identifier; + String? ipAddress; StarXpandInterface interface; /// Render a string repesentation of the response @override String toString() { - return 'model: $model, identifier: $identifier, interface: $interface'; + return 'model: $model, identifier: $identifier, ipAddress: $ipAddress, interface: $interface'; } Map toMap() { return { 'model': model.name, 'identifier': identifier, - 'interface': interface.name + 'interface': interface.name, + 'ipAddress': ipAddress, }; } } diff --git a/lib/starxpand.dart b/lib/starxpand.dart index a5bdee7..c3283de 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -83,6 +83,16 @@ class StarXpand { static Future openDrawer(StarXpandPrinter printer) => printDocument( printer, StarXpandDocument()..addDrawer(StarXpandDocumentDrawer())); + static Future openPrinterConnection(StarXpandPrinter printer) async { + return await _channel.invokeMethod('openConnection', { + {"printer": printer.toMap()} + }); + } + + static Future closePrinterConnection(StarXpandPrinter printer) async { + return await _channel.invokeMethod('closeConnection', {}); + } + static Future printDocument( StarXpandPrinter printer, StarXpandDocument document) async { return await _channel.invokeMethod('printDocument', diff --git a/pubspec.yaml b/pubspec.yaml index f76357a..bfb0fa4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper around for Star Micronics StarXpand API. -version: 0.1.5 +version: 0.1.6 repository: https://github.com/ovatu/starxpand_flutter homepage: https://ovatu.com/us From 1b226413d406c8fab0dbda3e3f48a0313f40ce83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 20 Dec 2023 09:19:58 +0000 Subject: [PATCH 15/31] UnTshhh --- .../src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt | 1 - lib/models/starxpand_printer.dart | 5 +---- pubspec.yaml | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 10c0495..01afa4d 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -294,7 +294,6 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { callbackGuid, "printerFound", mutableMapOf( "model" to printer.information?.model?.value(), "identifier" to printer.connectionSettings.identifier, -// "ipAddress" to printer.information "interface" to printer.connectionSettings.interfaceType.value() ) ) diff --git a/lib/models/starxpand_printer.dart b/lib/models/starxpand_printer.dart index de4a969..29b4c1b 100644 --- a/lib/models/starxpand_printer.dart +++ b/lib/models/starxpand_printer.dart @@ -58,19 +58,17 @@ class StarXpandPrinter { StarXpandPrinter.fromMap(Map response) : model = StarXpandPrinterModel.fromName(response['model']), identifier = response['identifier'], - ipAddress = response['ipAddress'], interface = StarXpandInterface.fromName(response['interface']); // Name of the called method StarXpandPrinterModel model; String identifier; - String? ipAddress; StarXpandInterface interface; /// Render a string repesentation of the response @override String toString() { - return 'model: $model, identifier: $identifier, ipAddress: $ipAddress, interface: $interface'; + return 'model: $model, identifier: $identifier, interface: $interface'; } Map toMap() { @@ -78,7 +76,6 @@ class StarXpandPrinter { 'model': model.name, 'identifier': identifier, 'interface': interface.name, - 'ipAddress': ipAddress, }; } } diff --git a/pubspec.yaml b/pubspec.yaml index bfb0fa4..375017c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper around for Star Micronics StarXpand API. -version: 0.1.6 +version: 0.1.7 repository: https://github.com/ovatu/starxpand_flutter homepage: https://ovatu.com/us From 42e633830cb0a91be503b24f96163ace5a05597b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 20 Dec 2023 09:27:22 +0000 Subject: [PATCH 16/31] UnTshhh2 --- lib/starxpand.dart | 5 ++--- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/starxpand.dart b/lib/starxpand.dart index c3283de..0b7f670 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -84,9 +84,8 @@ class StarXpand { printer, StarXpandDocument()..addDrawer(StarXpandDocumentDrawer())); static Future openPrinterConnection(StarXpandPrinter printer) async { - return await _channel.invokeMethod('openConnection', { - {"printer": printer.toMap()} - }); + return await _channel + .invokeMethod('openConnection', {"printer": printer.toMap()}); } static Future closePrinterConnection(StarXpandPrinter printer) async { diff --git a/pubspec.yaml b/pubspec.yaml index 375017c..8e47ae3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper around for Star Micronics StarXpand API. -version: 0.1.7 +version: 0.1.8 repository: https://github.com/ovatu/starxpand_flutter homepage: https://ovatu.com/us From eb80e83282256129cb8d4ed998bd7ebb6a8941d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 20 Dec 2023 14:02:57 +0000 Subject: [PATCH 17/31] Monitor --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 97 +++++++++++++------ lib/starxpand.dart | 4 + pubspec.yaml | 2 +- 3 files changed, 74 insertions(+), 29 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 01afa4d..bb8a9fc 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -39,8 +39,6 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private lateinit var channel: MethodChannel private lateinit var activity: Activity - private var connectedPrinter: StarPrinter? = null - private var _manager: StarDeviceDiscoveryManager? = null private var _printers: MutableMap = mutableMapOf() private var _permissionCallback: ((requestCode: Int, permissions: Array, grantResults: IntArray) -> Unit)? = @@ -94,6 +92,7 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { Log.d(tag, "onMethodCall: ${call.method} - ${call.arguments}") when (call.method) { + "monitor" -> monitor(call.arguments as Map<*, *>, result) "openConnection" -> openPrinterConnection(call.arguments as Map<*, *>, result) "closeConnection" -> closePrinterConnection(call.arguments as Map<*, *>, result) "getStatus" -> getStatus(call.arguments as Map<*, *>, result) @@ -106,19 +105,74 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } } + private fun monitor(@NonNull args: Map<*, *>, result: Result) { + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + val printer = getPrinter(args["printer"] as Map<*, *>) + + scope.launch { + // Callback for printer state changed. + printer.printerDelegate = object : PrinterDelegate() { + override fun onReady() { + super.onReady() + Log.d("Monitor", "Printer: Ready") + } + + override fun onCommunicationError(e: StarIO10Exception) { + super.onCommunicationError(e) + Log.d("OnCommunicationError", "Printer: Communication issue...") + } + // ... + // Please refer to document for other callback. + } + + printer.drawerDelegate = object : DrawerDelegate() { + override fun onOpenCloseSignalSwitched(openCloseSignal: Boolean) { + super.onOpenCloseSignalSwitched(openCloseSignal) + Log.d("Monitor", "Drawer: Open Close Signal Switched: ${openCloseSignal}") + } + + // ... + // Please refer to document for other callback. + } + + printer.inputDeviceDelegate = object : InputDeviceDelegate() { + override fun onDataReceived(data: List) { + super.onDataReceived(data) + Log.d("Monitor", "Input Device: DataReceived ${data}") + } + + // ... + // Please refer to document for other callback. + } + + printer.displayDelegate = object : DisplayDelegate() { + override fun onConnected() { + super.onConnected() + Log.d("Monitor", "Display: Connected") + } + + // ... + // Please refer to document for other callback. + } + + try { + // Connect to the printer. + printer.openAsync().await() + } catch (e: Exception) { + // Exception. + Log.d("Monitor", "${e.message}") + } + } + } + private fun openPrinterConnection(@NonNull args: Map<*, *>, result: Result) { val printer = getPrinter(args["printer"] as Map<*, *>) val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) scope.launch { - if (openPrinter(printer)) { - connectedPrinter = printer - result.success(true) - } else { - connectedPrinter = null - result.success(false) - } + result.success(openPrinter(printer)); } } @@ -128,12 +182,7 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) scope.launch { - if (connectedPrinter != null) { - result.success(closePrinter(printer)); - } else { - connectedPrinter = null - result.success(true) - } + result.success(closePrinter(printer)); } } @@ -392,23 +441,18 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private fun printDocument(@NonNull args: Map<*, *>, result: Result) { Log.d("print", "print. ${args["printer"]}") -// val printer = getPrinter(args["printer"] as Map<*, *>) + val printer = getPrinter(args["printer"] as Map<*, *>) val document = args["document"] as Map<*, *> val contents = document["contents"] as Collection<*> - Log.d("print", "document: $document") - val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) - if (connectedPrinter == null) { - Log.d("print", "Error printing: No connection available") - result.error("error", "No active printer connection", null) - return - } + Log.d("Printer OpenTimeout Int", printer.openTimeout.toString()) + Log.d("Printer StatusTimeout", printer.getStatusTimeout.toString()) scope.launch { -// if (openPrinter(printer)) { + try { val builder = StarXpandCommandBuilder() val docBuilder = DocumentBuilder() @@ -442,15 +486,12 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { Log.d("print", "commands $commands") // Print. - connectedPrinter?.printAsync(commands)?.await() + printer.printAsync(commands).await() result.success(true) } catch (e: java.lang.Exception) { Log.d("print", "commands $e") result.error("error", e.localizedMessage, e) - } finally { -// closePrinter(printer) } -// } } } diff --git a/lib/starxpand.dart b/lib/starxpand.dart index 0b7f670..c74b4c0 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -83,6 +83,10 @@ class StarXpand { static Future openDrawer(StarXpandPrinter printer) => printDocument( printer, StarXpandDocument()..addDrawer(StarXpandDocumentDrawer())); + static Future monitor(StarXpandPrinter printer) async { + return await _channel.invokeMethod('monitor', {"printer": printer.toMap()}); + } + static Future openPrinterConnection(StarXpandPrinter printer) async { return await _channel .invokeMethod('openConnection', {"printer": printer.toMap()}); diff --git a/pubspec.yaml b/pubspec.yaml index 8e47ae3..b240a2b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper around for Star Micronics StarXpand API. -version: 0.1.8 +version: 0.1.9 repository: https://github.com/ovatu/starxpand_flutter homepage: https://ovatu.com/us From 0a6d47cbff490233f4f5dbeb251580cceaa8f9e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 21 Dec 2023 10:03:13 +0000 Subject: [PATCH 18/31] Event callbacks --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 42 +++++++++++++-- lib/models/starxpand_callbacks.dart | 29 +++++++++++ lib/starxpand.dart | 51 ++++++++++++------- 3 files changed, 100 insertions(+), 22 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index bb8a9fc..81cb7d1 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -109,6 +109,7 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) val printer = getPrinter(args["printer"] as Map<*, *>) + val callbackGuid = args["callback"] as String scope.launch { // Callback for printer state changed. @@ -116,14 +117,36 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { override fun onReady() { super.onReady() Log.d("Monitor", "Printer: Ready") + sendCallback( + callbackGuid, "onReady", mutableMapOf( + "updateType" to "connected", + "message" to "Ready for printing" + ) + ) + } + + override fun onError() { + super.onError() + Log.d("Monitor", "Printer: Error") + sendCallback( + callbackGuid, "onError", mutableMapOf( + "updateType" to "error", + "message" to "Printer error, please check the printer." + ) + ) } override fun onCommunicationError(e: StarIO10Exception) { super.onCommunicationError(e) - Log.d("OnCommunicationError", "Printer: Communication issue...") + e.localizedMessage?.let { Log.d("OnCommunicationError", it) } + + sendCallback( + callbackGuid, "onCommunicationError", mutableMapOf( + "updateType" to "disconnected", + "message" to e.localizedMessage + ) + ) } - // ... - // Please refer to document for other callback. } printer.drawerDelegate = object : DrawerDelegate() { @@ -157,11 +180,20 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } try { - // Connect to the printer. + // Close if the printer was connected already. + printer.closeAsync().await() + + // Open the printer connection printer.openAsync().await() } catch (e: Exception) { // Exception. - Log.d("Monitor", "${e.message}") + e.localizedMessage?.let { Log.d("Monitor", it) } + sendCallback( + callbackGuid, "monitor", mutableMapOf( + "updateType" to "disconnected", + "message" to "Could not connect" + ) + ) } } } diff --git a/lib/models/starxpand_callbacks.dart b/lib/models/starxpand_callbacks.dart index 01b16e8..caa5e1e 100644 --- a/lib/models/starxpand_callbacks.dart +++ b/lib/models/starxpand_callbacks.dart @@ -52,6 +52,35 @@ class StarXpandPrinterPayload extends StarXpandCallbackPayload { } } +enum StarXpandPrinterStatusUpdateType { + connected, + disconnected, + error; + + static StarXpandPrinterStatusUpdateType fromName(String name) => + StarXpandPrinterStatusUpdateType.values.where((e) => e.name == name).first; +} + +class StarXpandPrinterStatusPayload extends StarXpandCallbackPayload { + late final StarXpandPrinterStatusUpdateType updateType; + late final String message; + + StarXpandPrinterStatusPayload(String type, Map payload) + : super(type, payload); + + @override + fromMap(Map data) { + updateType = StarXpandPrinterStatusUpdateType.fromName(data['updateType']); + message = data['message']; + } + + + @override + String toString() { + return "StarXpandStatusPayload: type($updateType) message($message)"; + } +} + class StarXpandInputPayload extends StarXpandCallbackPayload { late final String inputString; late final Uint8List inputData; diff --git a/lib/starxpand.dart b/lib/starxpand.dart index c74b4c0..0807889 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -57,16 +57,17 @@ class StarXpand { StarXpandInterface.bluetoothLE, StarXpandInterface.lan ], - int timeout = 3000, - StarXpandCallback? callback}) async { + int timeout = 3000, + StarXpandCallback? callback}) async { var guid = _addCallbackHandler( StarXpandCallbackHandler( - (payload) => callback?.call(payload), - (type, data) => StarXpandPrinterPayload( - type, Map.from(data)))); + (payload) => callback?.call(payload), + (type, data) => + StarXpandPrinterPayload( + type, Map.from(data)))); Map result = - Map.from(await _channel.invokeMethod('findPrinters', { + Map.from(await _channel.invokeMethod('findPrinters', { "callback": guid, "timeout": timeout, "interfaces": interfaces.map((e) => e.name).toList() @@ -80,11 +81,26 @@ class StarXpand { .toList(); } - static Future openDrawer(StarXpandPrinter printer) => printDocument( - printer, StarXpandDocument()..addDrawer(StarXpandDocumentDrawer())); + static Future openDrawer(StarXpandPrinter printer) => + printDocument( + printer, StarXpandDocument() + ..addDrawer(StarXpandDocumentDrawer())); - static Future monitor(StarXpandPrinter printer) async { - return await _channel.invokeMethod('monitor', {"printer": printer.toMap()}); + static Future monitor(StarXpandPrinter printer, + StarXpandCallback callback) async { + var guid = _addCallbackHandler( + StarXpandCallbackHandler( + (payload) => callback.call(payload), + (type, data) => + StarXpandPrinterStatusPayload( + type, Map.from(data)))); + + await _channel.invokeMethod('monitor', { + "printer": printer.toMap(), + "callback": guid + }); + + return guid; } static Future openPrinterConnection(StarXpandPrinter printer) async { @@ -96,15 +112,16 @@ class StarXpand { return await _channel.invokeMethod('closeConnection', {}); } - static Future printDocument( - StarXpandPrinter printer, StarXpandDocument document) async { + static Future printDocument(StarXpandPrinter printer, + StarXpandDocument document) async { return await _channel.invokeMethod('printDocument', {"printer": printer.toMap(), "document": document.toMap()}); } - static Future updateDisplay( - StarXpandPrinter printer, StarXpandDocumentDisplay display) => - printDocument(printer, StarXpandDocument()..addDisplay(display)); + static Future updateDisplay(StarXpandPrinter printer, + StarXpandDocumentDisplay display) => + printDocument(printer, StarXpandDocument() + ..addDisplay(display)); static Future getStatus(StarXpandPrinter printer) async { var result = Map.from( @@ -116,8 +133,8 @@ class StarXpand { StarXpandCallback callback) async { var guid = _addCallbackHandler( StarXpandCallbackHandler( - (payload) => callback.call(payload), - (type, data) => + (payload) => callback.call(payload), + (type, data) => StarXpandInputPayload(type, Map.from(data)))); await _channel.invokeMethod( From ac0ca826b42e76b9ae1e3d8b8f36e31588454b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 21 Dec 2023 14:46:16 +0000 Subject: [PATCH 19/31] Just in case the user gets Bad state: No element. (Supporting backward models from another Star micronics package) --- lib/models/starxpand_printer.dart | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/models/starxpand_printer.dart b/lib/models/starxpand_printer.dart index 29b4c1b..338ff69 100644 --- a/lib/models/starxpand_printer.dart +++ b/lib/models/starxpand_printer.dart @@ -49,8 +49,15 @@ enum StarXpandPrinterModel { const StarXpandPrinterModel(this.label, this.paper); - static StarXpandPrinterModel fromName(String name) => - StarXpandPrinterModel.values.where((e) => e.name == name).first; + static StarXpandPrinterModel fromName(String name) { + try { + return StarXpandPrinterModel.values + .where((e) => e.name.toLowerCase() == name.toLowerCase()) + .first; + } catch (e) { + return StarXpandPrinterModel.unknown; + } + } } class StarXpandPrinter { From 16737ffe64180bbc5b4ee8e029ec7a26073ffc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 21 Dec 2023 16:01:28 +0000 Subject: [PATCH 20/31] Just in case the user gets Bad state: No element. (Supporting backward models from another Star micronics package) --- android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 81cb7d1..41a0798 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -180,6 +180,9 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } try { + + Log.d("Monitor", "Printer: $printer") + // Close if the printer was connected already. printer.closeAsync().await() From 95bed45fe793f88458869a97043b5c7b9176cf5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Fri, 22 Dec 2023 10:15:11 +0000 Subject: [PATCH 21/31] Close TCP connections so we don't fill the printer. --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 41a0798..5c62ea7 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -111,6 +111,16 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val printer = getPrinter(args["printer"] as Map<*, *>) val callbackGuid = args["callback"] as String + if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { + sendCallback( + callbackGuid, "monitor", mutableMapOf( + "updateType" to "connected", + "message" to "Not a bluetooth device, no need to continue." + ) + ) + return result.success(true) + } + scope.launch { // Callback for printer state changed. printer.printerDelegate = object : PrinterDelegate() { @@ -180,7 +190,6 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } try { - Log.d("Monitor", "Printer: $printer") // Close if the printer was connected already. @@ -223,13 +232,13 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private fun getStatus(@NonNull args: Map<*, *>, result: Result) { val printer = getPrinter(args["printer"] as Map<*, *>) + Log.d("status", "GetPrinterStatus $printer") val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) scope.launch { if (openPrinter(printer)) { try { - Log.d("status", "GetPrinterStatus $printer") val status = printer.getStatusAsync().await(); result.success( @@ -262,7 +271,6 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { ) } catch (e: java.lang.Exception) { Log.d("status", "GetStatusError $e") - Log.d("status", e.localizedMessage) result.error("error", e.localizedMessage, e) } finally { closePrinter(printer) @@ -483,11 +491,7 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) - Log.d("Printer OpenTimeout Int", printer.openTimeout.toString()) - Log.d("Printer StatusTimeout", printer.getStatusTimeout.toString()) - scope.launch { - try { val builder = StarXpandCommandBuilder() val docBuilder = DocumentBuilder() @@ -526,6 +530,10 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } catch (e: java.lang.Exception) { Log.d("print", "commands $e") result.error("error", e.localizedMessage, e) + } finally { + if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { + printer.closeAsync().await() + } } } } From 8349f40a4f8c81dbcbddd37072728fd0a6245da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Fri, 22 Dec 2023 10:23:23 +0000 Subject: [PATCH 22/31] Close LAN/USB connections to prevent max pooling --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index b240a2b..69d9db5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: starxpand description: A flutter wrapper around for Star Micronics StarXpand API. -version: 0.1.9 +version: 0.2.0 repository: https://github.com/ovatu/starxpand_flutter homepage: https://ovatu.com/us From 3f5b5676a4fe9d31800231bce6e3d067cc55bf7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Fri, 22 Dec 2023 16:24:09 +0000 Subject: [PATCH 23/31] BYTES --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 5c62ea7..47b8016 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -98,6 +98,7 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { "getStatus" -> getStatus(call.arguments as Map<*, *>, result) "findPrinters" -> findPrinters(call.arguments as Map<*, *>, result) "printDocument" -> printDocument(call.arguments as Map<*, *>, result) + "printRawBytes" -> printRawBytes(call.arguments as Map<*, *>, result) "updateDisplay" -> printDocument(call.arguments as Map<*, *>, result) "startInputListener" -> startInputListener(call.arguments as Map<*, *>, result) "stopInputListener" -> stopInputListener(call.arguments as Map<*, *>, result) @@ -481,6 +482,30 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } } + private fun printRawBytes(@NonNull args: Map<*, *>, result: Result) { + val printer = getPrinter(args["printer"] as Map<*, *>) + val bytes = args["bytes"] as? ByteArray + + val job = SupervisorJob() + val scope = CoroutineScope(Dispatchers.Default + job) + + scope.launch { + try { + printer.openAsync().await() + if (bytes != null) { + printer.printRawDataAsync(bytes.toList()).await() + } + } catch (e: java.lang.Exception) { + Log.d("print", "commands $e") + result.error("error", e.localizedMessage, e) + } finally { + if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { + printer.closeAsync().await() + } + } + } + } + private fun printDocument(@NonNull args: Map<*, *>, result: Result) { Log.d("print", "print. ${args["printer"]}") From c973721de369204ef7f369c07a35a891540dd358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Fri, 22 Dec 2023 16:24:48 +0000 Subject: [PATCH 24/31] Bytes baby --- lib/starxpand.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/starxpand.dart b/lib/starxpand.dart index 0807889..21a7fbd 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -112,6 +112,13 @@ class StarXpand { return await _channel.invokeMethod('closeConnection', {}); } + static Future printRawBytes(StarXpandPrinter printer, Uint8List bytes) async { + return await _channel.invokeMethod('printRawBytes', { + 'printer': printer.toMap(), + 'bytes': bytes + }); + } + static Future printDocument(StarXpandPrinter printer, StarXpandDocument document) async { return await _channel.invokeMethod('printDocument', From de68f32ae7073c9a43a90f78240247cae78825ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Thu, 18 Jan 2024 13:58:19 +0000 Subject: [PATCH 25/31] send the printer hehe --- lib/starxpand.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/starxpand.dart b/lib/starxpand.dart index 21a7fbd..b56612d 100644 --- a/lib/starxpand.dart +++ b/lib/starxpand.dart @@ -109,7 +109,7 @@ class StarXpand { } static Future closePrinterConnection(StarXpandPrinter printer) async { - return await _channel.invokeMethod('closeConnection', {}); + return await _channel.invokeMethod('closeConnection', {"printer": printer.toMap()}); } static Future printRawBytes(StarXpandPrinter printer, Uint8List bytes) async { From b227ad0c0fd962d99312114be99c25545e373576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 24 Jan 2024 11:32:01 +0000 Subject: [PATCH 26/31] Retry logic in the printCommands method --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 47b8016..ddf5214 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -97,9 +97,9 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { "closeConnection" -> closePrinterConnection(call.arguments as Map<*, *>, result) "getStatus" -> getStatus(call.arguments as Map<*, *>, result) "findPrinters" -> findPrinters(call.arguments as Map<*, *>, result) - "printDocument" -> printDocument(call.arguments as Map<*, *>, result) "printRawBytes" -> printRawBytes(call.arguments as Map<*, *>, result) - "updateDisplay" -> printDocument(call.arguments as Map<*, *>, result) + "printDocument" -> printDocument(call.arguments as Map<*, *>, result, 1) + "updateDisplay" -> printDocument(call.arguments as Map<*, *>, result, 1) "startInputListener" -> startInputListener(call.arguments as Map<*, *>, result) "stopInputListener" -> stopInputListener(call.arguments as Map<*, *>, result) else -> result.notImplemented() @@ -506,8 +506,8 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } } - private fun printDocument(@NonNull args: Map<*, *>, result: Result) { - Log.d("print", "print. ${args["printer"]}") + private fun printDocument(@NonNull args: Map<*, *>, result: Result, attempt: Int) { + Log.d("print", "${args["printer"]}") val printer = getPrinter(args["printer"] as Map<*, *>) val document = args["document"] as Map<*, *> @@ -549,15 +549,36 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { Log.d("print", "commands $commands") + // UNCOMMENT TO TEST Retry logic + // If (i == 1) throw not opened to test the retry function + if (attempt == 1 && printer.connectionSettings.interfaceType == InterfaceType.Bluetooth) { + closePrinter(printer) + } + // Print. + if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { + openPrinter(printer) + } + printer.printAsync(commands).await() + result.success(true) } catch (e: java.lang.Exception) { - Log.d("print", "commands $e") - result.error("error", e.localizedMessage, e) + // Retry once if any exception occurs and the interface is Bluetooth. + if (printer.connectionSettings.interfaceType == InterfaceType.Bluetooth && attempt < 2) { + Log.d("print", "Retrying because of a Bluetooth device exception.", e) + // Close & Open + closePrinter(printer) + openPrinter(printer) + // Retry one more time (Add +1 to the attempt count) + return@launch printDocument(args, result, attempt + 1) + } else { + Log.d("print", "commands $e") + result.error("error", e.localizedMessage, e) + } } finally { if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { - printer.closeAsync().await() + closePrinter(printer) } } } From efd1f58a6881f123a0c9cad67837d7d5bf2cbbb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 24 Jan 2024 11:39:12 +0000 Subject: [PATCH 27/31] Remove the debug test --- .../src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index ddf5214..65f7fab 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -551,9 +551,9 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { // UNCOMMENT TO TEST Retry logic // If (i == 1) throw not opened to test the retry function - if (attempt == 1 && printer.connectionSettings.interfaceType == InterfaceType.Bluetooth) { - closePrinter(printer) - } +// if (attempt == 1 && printer.connectionSettings.interfaceType == InterfaceType.Bluetooth) { +// closePrinter(printer) +// } // Print. if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { From ce329624574de81ba2b0dd10b6d0fd93dd9171a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Mon, 12 Feb 2024 11:22:41 +0000 Subject: [PATCH 28/31] Revert to default functionality --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 65f7fab..3dd6c93 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -217,7 +217,17 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) scope.launch { - result.success(openPrinter(printer)); + + printer.openTimeout = 3000 + val res = openPrinter(printer) + + + Log.d( + "OpenPrinterConnection", + "Opening printer connection to ${printer.connectionSettings.identifier}" + ) + + result.success(res); } } @@ -556,30 +566,30 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { // } // Print. - if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { - openPrinter(printer) - } +// if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { + openPrinter(printer) +// } printer.printAsync(commands).await() result.success(true) } catch (e: java.lang.Exception) { // Retry once if any exception occurs and the interface is Bluetooth. - if (printer.connectionSettings.interfaceType == InterfaceType.Bluetooth && attempt < 2) { - Log.d("print", "Retrying because of a Bluetooth device exception.", e) - // Close & Open - closePrinter(printer) - openPrinter(printer) - // Retry one more time (Add +1 to the attempt count) - return@launch printDocument(args, result, attempt + 1) - } else { - Log.d("print", "commands $e") - result.error("error", e.localizedMessage, e) - } +// if (printer.connectionSettings.interfaceType == InterfaceType.Bluetooth && attempt < 2) { +// Log.d("print", "Retrying because of a Bluetooth device exception.", e) +// // Close & Open +// closePrinter(printer) +// openPrinter(printer) +// // Retry one more time (Add +1 to the attempt count) +// return@launch printDocument(args, result, attempt + 1) +// } else { + Log.d("print", "commands $e") + result.error("error", e.localizedMessage, e) +// } } finally { - if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { - closePrinter(printer) - } +// if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { + closePrinter(printer) +// } } } } From c1ec6bc5324754074154c15f01ab6a0616952eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Mon, 12 Feb 2024 14:32:11 +0000 Subject: [PATCH 29/31] Original functionality. Lets se how this works. --- .../com/ovatu/starxpand/StarxpandPlugin.kt | 30 +------------------ 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt index 3dd6c93..d84b6aa 100644 --- a/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt +++ b/android/src/main/kotlin/com/ovatu/starxpand/StarxpandPlugin.kt @@ -217,16 +217,12 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) scope.launch { - - printer.openTimeout = 3000 val res = openPrinter(printer) - Log.d( "OpenPrinterConnection", "Opening printer connection to ${printer.connectionSettings.identifier}" ) - result.success(res); } } @@ -556,40 +552,16 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { // Get printing data from StarXpandCommandBuilder object. val commands = builder.getCommands() - Log.d("print", "commands $commands") - // UNCOMMENT TO TEST Retry logic - // If (i == 1) throw not opened to test the retry function -// if (attempt == 1 && printer.connectionSettings.interfaceType == InterfaceType.Bluetooth) { -// closePrinter(printer) -// } - - // Print. -// if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { openPrinter(printer) -// } - printer.printAsync(commands).await() - result.success(true) } catch (e: java.lang.Exception) { - // Retry once if any exception occurs and the interface is Bluetooth. -// if (printer.connectionSettings.interfaceType == InterfaceType.Bluetooth && attempt < 2) { -// Log.d("print", "Retrying because of a Bluetooth device exception.", e) -// // Close & Open -// closePrinter(printer) -// openPrinter(printer) -// // Retry one more time (Add +1 to the attempt count) -// return@launch printDocument(args, result, attempt + 1) -// } else { Log.d("print", "commands $e") result.error("error", e.localizedMessage, e) -// } } finally { -// if (printer.connectionSettings.interfaceType != InterfaceType.Bluetooth) { closePrinter(printer) -// } } } } @@ -600,7 +572,7 @@ class StarxpandPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { "no2" -> Channel.No2 else -> Channel.No1 } - return DrawerBuilder().actionOpen(OpenParameter().setOnTime(0).setChannel(channel)) + return DrawerBuilder().actionOpen(OpenParameter().setChannel(channel)) } private fun getDisplayBuilder(data: Map<*, *>): DisplayBuilder { From 065dac5f323cdec784b57636ccf847dfc27ec67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 31 Jul 2024 15:03:19 +0000 Subject: [PATCH 30/31] Namespace --- android/build.gradle | 3 ++- pubspec.yaml | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index ffa1a63..37b528f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -25,7 +25,8 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdkVersion 31 + namespace 'com.ovatu.starxpand' + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/pubspec.yaml b/pubspec.yaml index 69d9db5..f4b6a36 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,11 +1,11 @@ name: starxpand description: A flutter wrapper around for Star Micronics StarXpand API. -version: 0.2.0 +version: 0.3.0 repository: https://github.com/ovatu/starxpand_flutter homepage: https://ovatu.com/us environment: - sdk: ">=2.17.0 <3.0.0" + sdk: '>=3.2.6 <4.0.0' flutter: ">=2.5.0" dependencies: From 2f6c64a4abda5196ed1806c5bae1c7724262def4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Vi=C3=B0arsson?= Date: Wed, 31 Jul 2024 15:25:12 +0000 Subject: [PATCH 31/31] Lfg --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f4b6a36..15002e8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ environment: dependencies: flutter: sdk: flutter - uuid: ^3.0.6 + uuid: ^4.4.2 dev_dependencies: flutter_test: