Пример #1
0
        async Task updateAwailablePortsLoop(CancellationToken cancellation)
        {
            await ThreadingUtils.ContinueAtDedicatedThread(cancellation);

            var period = new PeriodDelay(1000);

            while (true)
            {
                try
                {
                    using (await Locker.AcquireAsync())
                    {
                        var devices = getAllDevices();
                        PortNames = devices.Length.Range().Select(i => PORT_PREFIX + i);
                    }
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    Logger.LogError(null, $"Ошибка обновления списка устройств", ex);
                }

                await period.WaitTimeLeftAsync(cancellation);
            }
        }
Пример #2
0
        async void openStateCheckingAsyncLoop()
        {
            await ThreadingUtils.ContinueAtDedicatedThread(CancellationToken.None);

            var period = new PeriodDelay(1000);

            while (true)
            {
                if (_openedDevice != null)
                {
                    try
                    {
                        var devices = getAllDevices();
                        var exists  = devices.FirstOrDefault(d => d.LocId == _openedDevice.LocId &&
                                                             d.SerialNumber == _openedDevice.SerialNumber &&
                                                             d.Description == _openedDevice.Description) != null;
                        if (!exists)
                        {
                            Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.LogError(null, "Ошибка ", ex);
                    }
                }

                await period.WaitTimeLeftAsync();
            }
        }
Пример #3
0
        public override async Task <BurnResult> BurnAsync(Command request, IEnumerable <IDataEntity> entities, DeviceOperationScope scope, AsyncOperationInfo cancellation)
        {
            var baseResult = await base.BurnAsync(request, entities, scope, cancellation);

            if (baseResult.Status == BurnStatus.OK &&
                request.GetInfo().WriteResponse == Attributes.WriteResponse.RICH)
            {
                var richResponse = new RichResponse(baseResult.ResponseSections[SalachovProtocol.BODY_SECTION_KEY]);
                if (richResponse.Type == RichResponseType.OPERATION_STATUS)
                {
                    if (richResponse.StatusResponseData != null)
                    {
                        switch (richResponse.StatusResponseData.Status)
                        {
                        case LastWriteRequestStatus.EXECUTED:
                            return(baseResult);

                        case LastWriteRequestStatus.ERROR:
                            return(new BurnResult(BurnStatus.ERROR_ON_DEVICE, baseResult.Response, baseResult.ResponseSections));

                        case LastWriteRequestStatus.PROCESSING:
                        {
                            var result = await waitTillReadyAsync();

                            return(new BurnResult(result, baseResult.Response, baseResult.ResponseSections));
                        }

                        case LastWriteRequestStatus.BUSY:
                        {
                            var result = await waitTillReadyAsync();

                            if (result == BurnStatus.OK)
                            {
                                return(await BurnAsync(request, entities, scope, cancellation));
                            }
                        }
                        break;

                        default:
                            throw new NotSupportedException();
                        }
                    }
                }
            }

            return(baseResult);

            async Task <BurnStatus> waitTillReadyAsync()
            {
                var isCheckSupported = SupportedCommands.Contains(Command.PING);

                if (isCheckSupported)
                {
                    var period = new PeriodDelay(PING_SEND_PERIOD);
                    while (true)
                    {
                        await period.WaitTimeLeftAsync(cancellation);

                        var pingResult = await ReadAsync(Command.PING, scope, cancellation);

                        if (pingResult.Status == ReadStatus.OK)
                        {
                            var status = new RichResponse(pingResult.AnswerSections[SalachovProtocol.BODY_SECTION_KEY]).StatusResponseData;
                            if (status.Status.IsOneOf(LastWriteRequestStatus.BUSY, LastWriteRequestStatus.PROCESSING))
                            {
                                continue;
                            }
                            else if (status.Status == LastWriteRequestStatus.EXECUTED)
                            {
                                return(BurnStatus.OK);
                            }
                            else
                            {
                                return(BurnStatus.COULD_NOT_COMPLETE_WAIT_OPERATION);
                            }
                        }
                        else
                        {
                            return(BurnStatus.COULD_NOT_COMPLETE_WAIT_OPERATION);
                        }
                    }
                }
                else
                {
                    return(BurnStatus.COULD_NOT_COMPLETE_WAIT_OPERATION);
                }
            }
        }