internal DeviceController(ITerminalConfiguration settings) { _settings = settings; _connector = ConfigureConnector(); _connector.OnMessageSent += (message) => { OnMessageSent?.Invoke(message); }; _connector.OnBroadcastMessage += (code, message) => { OnBroadcastMessage?.Invoke(code, message); }; _connector.OnPayAtTableRequest += (request) => { OnPayAtTableRequest?.Invoke(request); }; }
internal DeviceInterface(T controller) { _controller = controller; _controller.OnMessageSent += (message) => { OnMessageSent?.Invoke(message); }; _controller.OnBroadcastMessage += (code, message) => { OnBroadcastMessage?.Invoke(code, message); }; _controller.OnPayAtTableRequest += (request) => { OnPayAtTableRequest?.Invoke(request); }; _requestIdProvider = _controller.RequestIdProvider; }
private async void AnalyzeReceivedData() { try { var headerBuffer = new byte[2]; while (_readData) { // Pay@Table functionalities handling. if (_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) { byte[] buffer = new byte[8192]; int bytesReceived = _stream.ReadAsync(buffer, 0, buffer.Length).Result; if (bytesReceived > 0) { byte[] readBuffer = buffer.SubArray(0, bytesReceived); string raw = Encoding.UTF8.GetString(readBuffer); string dataETX = raw.Substring(1, raw.Length - 2); byte[] bufferLRC = TerminalUtilities.CalculateLRC(raw.Substring(raw.Length - 1)); string receivedLRC = BitConverter.ToString(bufferLRC); byte[] calculateLRC = TerminalUtilities.CalculateLRC(dataETX); string calculatedLRC = BitConverter.ToString(calculateLRC); if (receivedLRC.Equals(calculatedLRC)) { string data = raw.Substring(1, raw.Length - 3); byte[] patRequest = Encoding.UTF8.GetBytes(data); OnPayAtTableRequest?.Invoke(new PATRequest(patRequest)); } } } else { // Standard functionalities handling _stream.Read(headerBuffer, 0, headerBuffer.Length); if (!_readData) { throw new Exception(); } int dataLength = await Task.Run(() => TerminalUtilities.HeaderLength(headerBuffer)); if (dataLength > 0) { byte[] dataBuffer = new byte[dataLength]; var incomplete = true; int offset = 0; int tempLength = dataLength; do { // Read data int bytesReceived = _stream.Read(dataBuffer, offset, tempLength); if (!_readData) { throw new Exception(); } if (bytesReceived != tempLength) { offset += bytesReceived; tempLength -= bytesReceived; } else { incomplete = false; } } while (incomplete); var readBuffer = new byte[dataLength]; Array.Copy(dataBuffer, readBuffer, dataLength); if (isBroadcast(readBuffer)) { _broadcastMessage = new BroadcastMessage(readBuffer); OnBroadcastMessage?.Invoke(_broadcastMessage.Code, _broadcastMessage.Message); } else if (isKeepAlive(readBuffer) && INGENICO_GLOBALS.KeepAlive) { _isKeepAlive = true; if (_isKeepAlive && !_isKeepAliveRunning) { _stream.ReadTimeout = _settings.Timeout; _isKeepAliveRunning = true; } var keepAliveRep = KeepAliveResponse(readBuffer); _stream.WriteAsync(keepAliveRep, 0, keepAliveRep.Length).Wait(); } else // Receiving request response data. { _termResponse = readBuffer; } } else { _receivingException = new ApiException("No data received."); } } } } catch (Exception ex) { if (_settings.ConnectionMode != ConnectionModes.PAY_AT_TABLE) { if (_isResponseNeeded || _isKeepAlive) { _receivingException = ex; _stream.ReadTimeout = -1; _isKeepAlive = false; } if (_readData) { AnalyzeReceivedData(); } else { _disposable = true; } } } }