Ejemplo n.º 1
0
        public async Task <StatusReadResult> TryReadStatusAsync(DeviceOperationScope scope, AsyncOperationInfo cancellation)
        {
            await ThreadingUtils.ContinueAtThreadPull(cancellation);

            using (Logger.Indent)
            {
                Logger.LogInfo(null, $"Чтение статуса прибора \"{Name}\"...");

                var result = await ReadAsync(Command.STATUS, scope, cancellation);

                if (result.Status == ReadStatus.OK)
                {
                    var flagsEntity     = result.Entities.ElementAt(0);
                    var numOfStatusBits = flagsEntity.Descriptor.Length.Length * 8;
                    var flags           = (uint)(dynamic)flagsEntity.Value;
                    var serial          = (ushort)result.Entities.ElementAt(1).Value;
                    var status          = new DeviceStatusInfo.StatusInfo(numOfStatusBits, flags);

                    Logger.LogInfo(null, $"Статус: {status.ToBinString()}");

                    return(new StatusReadResult(result, new DeviceStatusInfo(Id, serial, status)));
                }
                else
                {
                    return(new StatusReadResult(result, null));
                }
            }
        }
Ejemplo n.º 2
0
        public override async Task <ReadResult> ReadAsync(Command request, DeviceOperationScope scope, AsyncOperationInfo cancellation)
        {
            var result = await base.ReadAsync(request, scope, cancellation);

            if (result.Status == ReadStatus.OK)
            {
                var statusField = result.Entities
                                  ?.Where(e => e.Descriptor.Name == STATUS_MNEMONIC)
                                  ?.FirstOrDefault()
                                  ?.Value;
                if (statusField != null && statusField.GetType().IsOneOf(typeof(ushort), typeof(uint)))
                {
                    var size           = Marshal.SizeOf(statusField) * 8;
                    var bits           = Convert.ChangeType(statusField, TypeCode.UInt32).To <uint>();
                    var statusBitsInfo = new DeviceStatusInfo.StatusInfo(size, bits);
                    var statusInfo     = new DeviceStatusInfo(Id, null, statusBitsInfo);
                    _feature.FireStatusAcquired(statusInfo);
                }
            }

            return(result);
        }