/// <summary>
        /// Данные ответа:
        /// байт[0]= InputData
        /// байт[1]= 0x03
        /// байт[2]= кол-во байт  (0x06)
        /// байт[3]= Статутс Ст.
        /// байт[4]= Статутс  Мл.
        /// байт[5]= Счетчик обработанных клиентов Ст.
        /// байт[6]= Счетчик обработанных клиентов Мл.
        /// байт[7]= № билета 0-9бит (0-1023) - номер билета
        /// байт[8]= № билета 0-9бит (0-1023) - номер билета
        /// байт[9]= CRC Мл.
        /// байт[10]= CRC Ст.
        ///
        /// Статус (байт[4])
        /// бит 0: Станция в работе
        /// бит 1: Запрос нового пасажира от сервера
        /// бит 2: Идет обработка пассажира
        /// бит 3: Последний пассажир обработанн
        /// бит 4: Результат обработки - успешно
        /// бит 5: Результат обработки - отсутсвует (обратно в очередь)
        /// бит 6: Запрос нового пасажира от сервера ПОЛУЧЕНН.
        /// </summary>
        public bool SetDataByte(byte[] data)
        {
            if (data == null || data.Length != CountSetDataByte)
            {
                IsOutDataValid = false;
                return(false);
            }

            byte[] dataBuffer = null;
            if (data[0] == InputData &&
                data[1] == 0x03 &&
                data[2] == (NReadRegister * 2) &&
                Crc16.CheckCrc(data))
            {
                dataBuffer = data.Skip(3).Take((NReadRegister * 2)).ToArray();
            }

            if (dataBuffer != null)
            {
                OutputData = new CashierOutData {
                    IsWork = (dataBuffer[1] & 0x01) != 0x00, Handling = CashierHandling.IsNotHandling
                };

                if ((dataBuffer[1] & 0x04) == 0x00)        // НЕ идет обработка пассажира
                {
                    if ((dataBuffer[1] & 0x02) != 0x00)
                    {
                        OutputData.Handling = CashierHandling.IsStartHandling;                      // приглашен новый пассажир.

                        if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x10) != 0x00)       //приглашен новый пассажир + Последний пассажир обработан и обработанн успешно
                        {
                            OutputData.Handling = CashierHandling.IsSuccessfulAndStartHandling;
                        }
                        else if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x20) != 0x00)  //приглашен новый пассажир + Последний пассажир обработан и обработанн НЕ успешно
                        {
                            OutputData.Handling = CashierHandling.IsErrorAndStartHandling;
                        }
                    }
                    else
                    {
                        if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x10) != 0x00)        //Последний пассажир обработан и обработанн успешно
                        {
                            OutputData.Handling = CashierHandling.IsSuccessfulHandling;
                        }
                        else if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x20) != 0x00)  //Последний пассажир обработан и обработанн НЕ успешно
                        {
                            OutputData.Handling = CashierHandling.IsErrorHandling;
                        }
                    }
                }


                IsOutDataValid = true;
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Обработка ответа на данные записи информации о билете (функц 0x10):
        /// байт[0]= InputData.Сashbox
        /// байт[1]= 0x10
        /// байт[2]= Адр. Ст.
        /// байт[3]= Адр. Мл.
        /// байт[4]= Кол-во. рег. Ст.
        /// байт[5]= Кол-во. рег. Мл.
        /// байт[6]= CRC Мл.
        /// байт[7]= CRC Ст.
        /// </summary>
        public bool SetDataByte(byte[] data)
        {
            if (data == null || data.Length != CountSetDataByte)
            {
                IsOutDataValid = false;
                return(false);
            }

            if (data[0] == InputData.Сashbox &&
                data[1] == 0x10 &&
                Crc16.CheckCrc(data))
            {
                IsOutDataValid = true;
                return(true);
            }

            IsOutDataValid = false;
            return(false);
        }
Ejemplo n.º 3
0
        public bool SetSlaveMode()
        {
            DetectedSlaveAddress = 0; //redundant,only for notification

            _logger.Log("SetSlaveMode...");

            if (IsSlaveModeActive())
            {
                _logger.Log("Already in slave mode");
                return(true);
            }

            _logger.Log("RX: " + Convertor.ConvertByteArrayToHexString(_recievedPacket));

            if (!Crc16.CheckCrc(_recievedPacket))
            {
                return(false);
            }

            byte[] packetToSend = { _recievedPacket[0], (byte)(_recievedPacket[1] + 0x80), (byte)0x05 };
            Crc16.AddCrc(ref packetToSend);
            if (!SendPacket(packetToSend))
            {
                return(false);
            }

            _logger.Log("TX: " + Convertor.ConvertByteArrayToHexString(packetToSend));

            try
            {
                Thread.Sleep(2000);
                _logger.Log("TX: <ReadHoldingRegisters>");
                _modbusSerial.ReadHoldingRegisters(_recievedPacket[0], RegisterMappingOffsets.PasswordRegisterOffset, 1);
            }
            catch (Exception)
            {
                return(false);
            }
            _logger.Log("SetSlaveMode - OK");
            DetectedSlaveAddress = _recievedPacket[0];
            return(true);
        }
        /// <summary>
        /// Обработка ответа на данные записи информации о билете (функц 0x10):
        /// байт[0]= _addressDevice
        /// байт[1]= 0x10
        /// байт[2]= Адр. Ст.
        /// байт[3]= Адр. Мл.
        /// байт[4]= Кол-во. рег. Ст.
        /// байт[5]= Кол-во. рег. Мл.
        /// байт[6]= CRC Мл.
        /// байт[7]= CRC Ст.
        /// </summary>
        public bool SetDataByte(byte[] data)
        {
            if (data == null || data.Length != CountSetDataByte)
            {
                _loggerCashierInfo.Info($"Ответ на Запись в планшет БИЛЕТА: НЕ валиден");
                IsOutDataValid = false;
                return(false);
            }

            if (data[0] == _addressDevice &&
                data[1] == 0x10 &&
                Crc16.CheckCrc(data))
            {
                _loggerCashierInfo.Info($"Ответ на Запись в планшет БИЛЕТА: ВАЛИДЕН");
                IsOutDataValid = true;
                return(true);
            }

            _loggerCashierInfo.Info($"Ответ на Запись в планшет БИЛЕТА: НЕ верно CRC:  \"{data.ConertByteArray2String()}\"");
            IsOutDataValid = false;
            return(false);
        }
        /// <summary>
        /// Данные ответа:
        /// байт[0]= _addressDevice
        /// байт[1]= 0x03
        /// байт[2]= кол-во байт  (0x06)
        /// байт[3]= Статутс Ст.
        /// байт[4]= Статутс  Мл.
        /// байт[5]= Счетчик обработанных клиентов Ст.
        /// байт[6]= Счетчик обработанных клиентов Мл.
        /// байт[7]= № билета 0-9бит (0-1023) - номер билета
        /// байт[8]= № билета 0-9бит (0-1023) - номер билета
        /// байт[9]= CRC Мл.
        /// байт[10]= CRC Ст.
        ///
        /// Статус (байт[4])
        /// бит 0: Станция в работе
        /// бит 1: Запрос нового пасажира от сервера
        /// бит 2: Идет обработка пассажира
        /// бит 3: Последний пассажир обработанн
        /// бит 4: Результат обработки - успешно
        /// бит 5: Результат обработки - отсутсвует (обратно в очередь)
        /// бит 6: Запрос нового пасажира от сервера ПОЛУЧЕНН.
        /// бит 7: Результат обработки - перенаправленн на Админа
        /// </summary>
        public bool SetDataByte(byte[] data)
        {
            if (data == null || data.Length != CountSetDataByte)
            {
                _loggerCashierInfo.Info("Ответ на чтение: Данные не валидны !!!!!!!!!!!!!!");
                IsOutDataValid = false;
                return(false);
            }

            _loggerCashierInfo.Info($"Ответ на чтение: \"{data.ConertByteArray2String()}\"");


            byte[] dataBuffer = null;
            if (data[0] == _addressDevice &&
                data[1] == 0x03 &&
                data[2] == (NReadRegister * 2) &&
                Crc16.CheckCrc(data))
            {
                dataBuffer = data.Skip(3).Take((NReadRegister * 2)).ToArray();
            }

            if (dataBuffer != null)
            {
                OutputData = new CashierOutData {
                    IsWork = (dataBuffer[1] & 0x01) != 0x00, Handling = CashierHandling.IsNotHandling
                };

                //Статутс Мл.Байт
                if ((dataBuffer[1] & 0x04) == 0x00)        // (== 0x00) НЕ идет обработка пассажира
                {
                    if ((dataBuffer[1] & 0x02) != 0x00)
                    {
                        OutputData.Handling = CashierHandling.IsStartHandling;                      //Приглашен новый пассажир.

                        if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x10) != 0x00)       //Приглашен новый пассажир + Последний пассажир обработан и обработанн успешно
                        {
                            OutputData.Handling = CashierHandling.IsSuccessfulAndStartHandling;
                        }
                        else if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x20) != 0x00)  //Приглашен новый пассажир + Последний пассажир обработан и обработанн НЕ успешно
                        {
                            OutputData.Handling = CashierHandling.IsErrorAndStartHandling;
                        }
                        // бит 7: перенаправление на АДМИНА
                        else if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x80) != 0x00)   //Приглашен новый пассажир + Последний пассажир обработан и перенаправлен на АДМИНА
                        {
                            OutputData.Handling = CashierHandling.IsRedirectAndStartHandling;
                        }
                    }
                    else
                    {
                        if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x10) != 0x00)        //Последний пассажир обработан и обработанн успешно
                        {
                            OutputData.Handling = CashierHandling.IsSuccessfulHandling;
                        }
                        else if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x20) != 0x00)   //Последний пассажир обработан и обработанн НЕ успешно
                        {
                            OutputData.Handling = CashierHandling.IsErrorHandling;
                        }
                        // бит 7: перенаправление на АДМИНА
                        else if ((dataBuffer[1] & 0x08) != 0x00 && (dataBuffer[1] & 0x80) != 0x00)   //Последний пассажир обработан и перенаправлен на АДМИНА
                        {
                            OutputData.Handling = CashierHandling.IsRedirectHandling;
                        }
                    }
                }

                _loggerCashierInfo.Info($"Ответ на чтение (OutputData объект): \" IsWork= {OutputData.IsWork}\"    \" Handling= {OutputData.Handling}\"");

                IsOutDataValid = true;
                return(true);
            }

            return(false);
        }