Commit 836424f9 authored by Andrey's avatar Andrey

Bluetooth manager : using PosPrintResult for error handling.

parent 78cbb375
...@@ -17,6 +17,8 @@ class PosPrintResult { ...@@ -17,6 +17,8 @@ class PosPrintResult {
static const timeout = PosPrintResult._internal(2); static const timeout = PosPrintResult._internal(2);
static const printerNotSelected = PosPrintResult._internal(3); static const printerNotSelected = PosPrintResult._internal(3);
static const ticketEmpty = PosPrintResult._internal(4); static const ticketEmpty = PosPrintResult._internal(4);
static const printInProgress = PosPrintResult._internal(5);
static const scanInProgress = PosPrintResult._internal(6);
static String msg(PosPrintResult val) { static String msg(PosPrintResult val) {
if (val == PosPrintResult.success) { if (val == PosPrintResult.success) {
...@@ -27,6 +29,10 @@ class PosPrintResult { ...@@ -27,6 +29,10 @@ class PosPrintResult {
return 'Error. Printer not selected'; return 'Error. Printer not selected';
} else if (val == PosPrintResult.ticketEmpty) { } else if (val == PosPrintResult.ticketEmpty) {
return 'Error. Ticket is empty'; return 'Error. Ticket is empty';
} else if (val == PosPrintResult.printInProgress) {
return 'Error. Another print in progress';
} else if (val == PosPrintResult.scanInProgress) {
return 'Error. Printer scanning in progress';
} else { } else {
return 'Unknown error'; return 'Unknown error';
} }
......
...@@ -69,16 +69,16 @@ class PrinterBluetoothManager { ...@@ -69,16 +69,16 @@ class PrinterBluetoothManager {
_selectedPrinter = printer; _selectedPrinter = printer;
} }
Future<void> writeBytes(List<int> bytes) async { Future<PosPrintResult> writeBytes(List<int> bytes) async {
final Completer<PosPrintResult> completer = Completer();
const int timeout = 5; const int timeout = 5;
if (_selectedPrinter == null) { if (_selectedPrinter == null) {
throw Exception('Print failed (Select a printer first)'); return Future<PosPrintResult>.value(PosPrintResult.printerNotSelected);
} } else if (_isScanning.value) {
if (_isScanning.value) { return Future<PosPrintResult>.value(PosPrintResult.scanInProgress);
throw Exception('Print failed (scanning in progress)'); } else if (_isPrinting) {
} return Future<PosPrintResult>.value(PosPrintResult.printInProgress);
if (_isPrinting) {
throw Exception('Print failed (another printing in progress)');
} }
_isPrinting = true; _isPrinting = true;
...@@ -97,7 +97,7 @@ class PrinterBluetoothManager { ...@@ -97,7 +97,7 @@ class PrinterBluetoothManager {
// To avoid double call // To avoid double call
if (!_isConnected) { if (!_isConnected) {
await _bluetoothManager.writeData(bytes); await _bluetoothManager.writeData(bytes);
// TODO Notify data sent completer.complete(PosPrintResult.success);
} }
// TODO sending disconnect signal should be event-based // TODO sending disconnect signal should be event-based
_runDelayed(3).then((dynamic v) async { _runDelayed(3).then((dynamic v) async {
...@@ -118,17 +118,17 @@ class PrinterBluetoothManager { ...@@ -118,17 +118,17 @@ class PrinterBluetoothManager {
_runDelayed(timeout).then((dynamic v) async { _runDelayed(timeout).then((dynamic v) async {
if (_isPrinting) { if (_isPrinting) {
_isPrinting = false; _isPrinting = false;
throw Exception('Print failed (timeout)'); completer.complete(PosPrintResult.timeout);
} }
}); });
return completer.future;
} }
Future<void> printTicket(Ticket ticket) async { Future<PosPrintResult> printTicket(Ticket ticket) async {
if (ticket != null && ticket.bytes.isNotEmpty) { if (ticket == null || ticket.bytes.isEmpty) {
final Future<void> res = writeBytes(ticket.bytes); return Future<PosPrintResult>.value(PosPrintResult.ticketEmpty);
return res;
} else {
throw Exception('Print failed (ticket is empty)');
} }
return writeBytes(ticket.bytes);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment