diff --git a/lib/modbus.dart b/lib/modbus.dart index 0a990e2..2288cd2 100644 --- a/lib/modbus.dart +++ b/lib/modbus.dart @@ -95,9 +95,13 @@ ModbusClient createClient(TcpConnector connector, {int unitId = 1}) => ModbusClientImpl(connector, unitId); ModbusClient createTcpClient(address, - {int port = 502, - ModbusMode mode = ModbusMode.rtu, - int unitId = 1, - Duration? timeout}) => + { + int port = 502, + ModbusMode mode = ModbusMode.rtu, + int unitId = 1, + Duration? connectionTimeout, + Duration? requestTimeout, + Function(dynamic error, dynamic stackTrace)? onConnectionError + }) => ModbusClientImpl( - TcpConnector(address, port, mode, timeout: timeout), unitId); + TcpConnector(address, port, mode, timeout: connectionTimeout), unitId, onConnectionError: onConnectionError, requestTimeout: requestTimeout); diff --git a/lib/src/client.dart b/lib/src/client.dart index 877490d..d9f5ba5 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -20,11 +20,15 @@ class ModbusClientImpl extends ModbusClient { Map _pendingMap = HashMap(); Map _waitingMap = HashMap(); Queue _waitingQueue = DoubleLinkedQueue(); + Duration? _requestTimeout; + Function(dynamic error, dynamic stackTrace)? _onConnectionError; - ModbusClientImpl(this._connector, int unitId) { + ModbusClientImpl(this._connector, int unitId, { Function(dynamic error, dynamic stackTrace)? onConnectionError, Duration? requestTimeout = const Duration(milliseconds: 6000) }) { _connector.onResponse = _onConnectorData; _connector.onError = _onConnectorError; _connector.onClose = _onConnectorClose; + _onConnectionError = onConnectionError; + _requestTimeout = requestTimeout; _connector.setUnitId(unitId); } @@ -67,6 +71,7 @@ class ModbusClientImpl extends ModbusClient { _pendingMap.clear(); _waitingMap.clear(); // _completer?.completeError(error, stackTrace); + if(_onConnectionError != null) _onConnectionError!(error, stackTrace); throw ModbusConnectException("Connector Error: ${error}"); } @@ -171,7 +176,8 @@ class ModbusClientImpl extends ModbusClient { } else { completer!.complete(responseData); } - }); + }) + .timeout(_requestTimeout!); } @override