예제 #1
0
        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);
            };
        }
예제 #2
0
        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;
                    }
                }
            }
        }