コード例 #1
0
ファイル: Vkt5Console.cs プロジェクト: Werzet/plugins
        /// <summary>
        /// Отправка запроса прибору
        /// </summary>
        /// <param name="request"></param>
        /// <param name="responseLength"></param>
        /// <param name="readHandler"></param>
        private void SendRequest(byte[] request, int responseLength, VktDataReadEventHandler readHandler)
        {
            CommandSettings cmd = new CommandSettings("", 1000, responseLength, 10);

            this.handlers.AddLast(readHandler);

            this.responseLength = responseLength;

            this.remoteConsole.SendCommandAsync(request, cmd, 0, DataReadCallback, null);
        }
コード例 #2
0
ファイル: Vkt5Console.cs プロジェクト: Werzet/plugins
        private void remoteConsole_DeviceDataReceived(object sender, DeviceDataEventArgs args)
        {
            // Проверим, что консоль подключена к прибору
            if (!this.remoteConsole.IsConnected)
            {
                return;
            }

            // Получаем обработчик запроса
            VktDataReadEventHandler currentHandler = this.handlers.First.Value;

            this.handlers.RemoveFirst();

            // Проверим длину считанного пакета
            if (args.Response.Length < 5)
            {
                // Повторяем запрос
                LogError("Неверная длина ответа прибора. Ожидалось не менее 5 байт, получено " + args.Response.Length);

                CallRequestError();

                // Отключаемся
                try
                {
                    this.remoteConsole.DisconnectAsync(null, null);
                }
                catch (Lers.PermissionDeniedException exc)
                {
                    LogError("Ошибка отключения удалённого пульта. " + exc.Message);
                }

                return;
            }

            // Проверим контрольную сумму
            ushort calcCs  = ModBusCrc.Calc(args.Response, 0, args.Response.Length - 2);
            ushort recvCrc = BitConverter.ToUInt16(args.Response, args.Response.Length - 2);

            if (calcCs != recvCrc)
            {
                LogWarning("Не сходится контрольная сумма ответа");

                // Повторяем запрос
                SendRequest(args.Request, this.responseLength, currentHandler);

                return;
            }

            // Проверим сетевой адрес
            if (args.Response[0] != (byte)this.NetworkAddress)
            {
                LogWarning("В ответе указан неверный контрольный адрес");

                // Повторяем запрос
                SendRequest(args.Request, this.responseLength, currentHandler);

                return;
            }

            // Возвращаем считанные прибором данные
            if (currentHandler != null)
            {
                byte[] rspData = new byte[args.Response.Length - 5];
                Array.Copy(args.Response, 3, rspData, 0, rspData.Length);
                currentHandler(rspData);
            }
        }
コード例 #3
0
ファイル: Vkt5Console.cs プロジェクト: Werzet/plugins
 /// <summary>
 /// Отправляет в устройство команду нажатия клавишы
 /// </summary>
 /// <param name="key"></param>
 /// <param name="readHandler"></param>
 public void SendKeyCode(Vkt5Key key, VktDataReadEventHandler readHandler)
 {
     byte[] rq = PackRequest(new byte[] { 0x10, 0x0D, 0x00, 0x00, 0x01, 0x01, (byte)key });
     SendRequest(rq, 8, readHandler);
 }
コード例 #4
0
ファイル: Vkt5Console.cs プロジェクト: Werzet/plugins
 /// <summary>
 /// Отправляет команду на чтение буфера экрана устройства
 /// </summary>
 /// <param name="readHandler"></param>
 public void ReadScreenBuffer(VktDataReadEventHandler readHandler)
 {
     byte[] rq = PackRequest(new byte[] { 0x03, 0x0C, 0x00, 0x00, 0x00 });
     SendRequest(rq, 38, readHandler);
 }