Ejemplo n.º 1
0
        /// <summary>
        ///     Maps the <see cref="DeviceModel" /> to the <see cref="LogicalDeviceInformation" />
        ///     Конвертирует <see cref="DeviceModel" /> в <see cref="LogicalDeviceInformation" />
        /// </summary>
        /// <param name="model">
        ///     An instance of <see cref="DeviceModel" /> to map to <see cref="LogicalDeviceInformation" />
        /// </param>
        /// <returns>
        ///     Resulted instance of <see cref="LogicalDeviceInformation" />
        /// </returns>
        public static LogicalDeviceInformation ToLogicalDeviceInfo(this DeviceModel model)
        {
            LogicalDeviceInformation logicalDeviceInformation = new LogicalDeviceInformation
            {
                DeviceName                = model.Name,
                DeviceDescription         = model.Description,
                DeviceTypeName            = model.DeviceFactoryTypeName,
                DriverTypeName            = model.DriverFactoryTypeName,
                DriverTcpAddress          = model.TcpAddress,
                DriverTcpPort             = model.TcpPort,
                AnalogMeterTypeName       = model.AnalogMeterTypeName,
                CustomFidersOnDevice      = model.CustomFidersOnDevice,
                CustomIndicatorsOnDevice  = model.CustomIndicatorsOnDevice,
                CustomSignalsOnDevice     = model.CustomSignalsOnDevice,
                CascadeIndicatorsOnDevice = model.CascadeIndicatorsOnDevice,
                TransformKoefA            = model.TransformKoefA,
                TransformKoefB            = model.TransformKoefB,
                TransformKoefC            = model.TransformKoefC,
                ChannelNumberOfStarter1   = model.ChannelNumberOfStarter1,
                ChannelNumberOfStarter2   = model.ChannelNumberOfStarter2,
                ChannelNumberOfStarter3   = model.ChannelNumberOfStarter3,
                StarterDescriptions       = model.StarterDescriptions,
            };

            return(logicalDeviceInformation);
        }
        /// <summary>
        ///     Создает устройство на основе данных о нем
        /// </summary>
        /// <param name="deviceInfo">Инфа о устростве</param>
        /// <param name="driverId">Id-шник драйвера данного устройства устройства (Если есть)</param>
        /// <returns></returns>
        private async Task <IConfigLogicalDevice> CreateLogicalDeviceInternalAsync(LogicalDeviceInformation deviceInfo,
                                                                                   Guid?driverId = null)
        {
            if ((await this.GetAllDevicesAsync()).Any(a => a.DeviceName.Equals(deviceInfo.DeviceName)))
            {
                throw new LogicalDeviceAlreadyExistsException(deviceInfo);
            }

            var deviceFactory = _container.Resolve <ILogicalDeviceViewModelFactory>(deviceInfo.DeviceTypeName);

            if (deviceFactory == null)
            {
                throw new UnknownLogicalDeviceTypeException(deviceInfo.DeviceTypeName);
            }

            var logicalDevice = deviceFactory.CreateConfigLogicalDevice();

            if (logicalDevice == null)
            {
                throw new LogicalDeviceException(deviceInfo);
            }

            try
            {
                var deviceContextBuilder = new AomDeviceContextEntityBuilder();
                deviceContextBuilder.SetDeviceName(deviceInfo.DeviceName);
                deviceContextBuilder.SetDeviceDescription(deviceInfo.DeviceDescription);
                deviceContextBuilder.SetDeviceType(deviceInfo.DeviceTypeName);
                deviceContextBuilder.SeAnalogMeterType(deviceInfo.AnalogMeterTypeName);
                deviceContextBuilder.SetCustomFiders(deviceInfo.CustomFidersOnDevice);
                deviceContextBuilder.SetCustomIndicators(deviceInfo.CustomIndicatorsOnDevice);
                deviceContextBuilder.SetCustomSignals(deviceInfo.CustomSignalsOnDevice);
                deviceContextBuilder.SetCustomCascade(deviceInfo.CascadeIndicatorsOnDevice);
                deviceContextBuilder.SetAnalogMeterKoefs(deviceInfo.TransformKoefA, deviceInfo.TransformKoefB, deviceInfo.TransformKoefC);

                if (driverId.HasValue)
                {
                    deviceContextBuilder.SetDriverId(driverId.Value.ToString());
                }

                await logicalDevice.InitializeAsync(deviceContextBuilder.Build());

                logicalDevice.DeviceId = Guid.NewGuid();
            }
            catch (Exception error)
            {
                throw new LogicalDeviceException(deviceInfo, innerException: error);
            }

            return(logicalDevice);
        }
 /// <summary>
 ///     Creates an instance of <see cref="LogicalDeviceAlreadyExistsException" />
 /// </summary>
 /// <param name="deviceInfo">
 ///     An instance of <see cref="LogicalDeviceInformation" /> that represents the failed deviceViewModel information
 /// </param>
 public LogicalDeviceAlreadyExistsException(LogicalDeviceInformation deviceInfo)
 {
     this.DeviceInfo = deviceInfo;
 }
        /// <summary>
        ///     Updates an instance of <see cref="IConfigLogicalDevice" /> in the system registry asynchronously
        /// Обновит данное устройство.
        /// </summary>
        /// <param name="deviceInfo">
        ///     An instance of <see cref="LogicalDeviceInformation" /> with data to update
        /// Новые данные для обновляемого устройства
        /// </param>
        /// <param name="editingDevice">
        ///     An instance of <see cref="IConfigLogicalDevice" /> to update
        /// Устройство, которое будет обновляться
        /// </param>
        /// <returns>An instance of System.Threading.Tasks.Task that represents current asynchronous operation</returns>
        public async Task <IConfigLogicalDevice> UpdateDeviceAsync(LogicalDeviceInformation deviceInfo,
                                                                   IConfigLogicalDevice editingDevice)
        {
            this.ThrowIfDisposed();
            await this.Initialization;

            Guard.AgainstNullReference(deviceInfo, "deviceInfo");

            var drivers = await this._driversService.GetAllDriversAsync();

            if (!editingDevice.DeviceName.Equals(deviceInfo.DeviceName) &&
                this._devicesCache.Any(dev => dev.Value.DeviceName.Equals(deviceInfo.DeviceName)))
            {
                throw new InvalidOperationException("Устройство с таким именем уже существует");
            }
            var editingDriver =
                await this._driversService.GetDriverById(Guid.Parse(
                                                             editingDevice.CreateMomento().State.RelatedDriverId));

            if (!editingDriver.CreateMomento().State.GetTcpAddress().Equals(deviceInfo.DriverTcpAddress) &&
                drivers.Any(dr => dr.CreateMomento().State.GetTcpAddress().Equals(deviceInfo.DriverTcpAddress)))
            {
                throw new InvalidOperationException("Устройство с таким IP-адресом уже существует");
            }

            await this.RemoveDeviceAsync(editingDevice);

            IConfigLogicalDevice logicalDevice = null;
            Guid?driverId = null;

            if (!string.IsNullOrEmpty(deviceInfo.DriverTypeName))
            {
                try
                {
                    var driver = await this._driversService.CreateDriverAsync(new LogicalDriverInformation
                    {
                        DriverType       = deviceInfo.DriverTypeName,
                        DriverTcpPort    = deviceInfo.DriverTcpPort,
                        DriverTcpAddress = deviceInfo.DriverTcpAddress
                    });

                    driverId = driver.DriverId;

                    logicalDevice = await this.CreateLogicalDeviceInternalAsync(deviceInfo, driverId);

                    logicalDevice.CreateMomento().State.Starter1Description = deviceInfo.StarterDescriptions[0];
                    logicalDevice.CreateMomento().State.Starter2Description = deviceInfo.StarterDescriptions[1];
                    logicalDevice.CreateMomento().State.Starter3Description = deviceInfo.StarterDescriptions[2];
                    logicalDevice.CreateMomento().State.TransformKoefA = deviceInfo.TransformKoefA;
                    logicalDevice.CreateMomento().State.TransformKoefB = deviceInfo.TransformKoefB;
                    logicalDevice.CreateMomento().State.TransformKoefC = deviceInfo.TransformKoefC;
                    logicalDevice.CreateMomento().State.ChannelNumberOfStarter1 = deviceInfo.ChannelNumberOfStarter1;
                    logicalDevice.CreateMomento().State.ChannelNumberOfStarter2 = deviceInfo.ChannelNumberOfStarter2;
                    logicalDevice.CreateMomento().State.ChannelNumberOfStarter3 = deviceInfo.ChannelNumberOfStarter3;
                    var context =
                        await this._persistanceService.GetDevicePersistableContextAsync(logicalDevice.DeviceId);

                    logicalDevice.CreateMomento().State.SchemeTable = editingDevice.CreateMomento().State.SchemeTable;
                    int number = editingDevice.CreateMomento().State.DeviceNumber;
                    logicalDevice.CreateMomento().State.DeviceNumber = number;

                    context.SaveDeviceMomentoAsync(logicalDevice.CreateMomento());
                    this._devicesCache.Remove(logicalDevice.DeviceId);
                    this._devicesCache.Add(logicalDevice.DeviceId, logicalDevice);
                }
                catch (Exception ex)
                {
                    throw new LogicalDeviceException("Редактирование невозможно", ex);
                }
            }

            return(logicalDevice);
        }
        /// <summary>
        ///     Creates an instance of <see cref="IConfigLogicalDevice" /> asynchronously
        /// Создает новое устройство на основе информации о нём полученной в параметрах
        /// </summary>
        /// <returns>An instance of System.Threading.Tasks.Task that represents current asynchronous operation</returns>
        public async Task <IConfigLogicalDevice> CreateDeviceAsync(LogicalDeviceInformation deviceInfo)
        {
            this.ThrowIfDisposed();
            await this.Initialization;
            Guard.AgainstNullReference(deviceInfo, "deviceInfo");
            Guid?driverId = null;

            if (!string.IsNullOrEmpty(deviceInfo.DriverTypeName))
            {
                try
                {
                    var driver = await this._driversService.CreateDriverAsync(new LogicalDriverInformation
                    {
                        DriverType       = deviceInfo.DriverTypeName,
                        DriverTcpPort    = deviceInfo.DriverTcpPort,
                        DriverTcpAddress = deviceInfo.DriverTcpAddress
                    });

                    driverId = driver.DriverId;
                }
                catch (Exception exception)
                {
                    throw new Exception(exception.Message);
                }
            }

            IConfigLogicalDevice logicalDevice = null;

            try
            {
                logicalDevice = await this.CreateLogicalDeviceInternalAsync(deviceInfo, driverId);

                int number = 0;
                if (this._devicesCache.Count > 0)
                {
                    var numbers = this._devicesCache.Values.Select(
                        device => device.CreateMomento().State.DeviceNumber).ToList();
                    for (int i = 0; i < 104; i++)
                    {
                        if (!numbers.Contains(i))
                        {
                            number = i;
                            break;
                        }
                    }
                }
                logicalDevice.CreateMomento().State.AnalogMeterType = deviceInfo.AnalogMeterTypeName;
                logicalDevice.CreateMomento().State.DeviceType = deviceInfo.DeviceTypeName;
                logicalDevice.CreateMomento().State.DeviceNumber = number;
                logicalDevice.CreateMomento().State.Starter1Description = deviceInfo.StarterDescriptions[0];
                logicalDevice.CreateMomento().State.Starter2Description = deviceInfo.StarterDescriptions[1];
                logicalDevice.CreateMomento().State.Starter3Description = deviceInfo.StarterDescriptions[2];

                logicalDevice.CreateMomento().State.TransformKoefA = deviceInfo.TransformKoefA;
                logicalDevice.CreateMomento().State.TransformKoefB = deviceInfo.TransformKoefB;
                logicalDevice.CreateMomento().State.TransformKoefC = deviceInfo.TransformKoefC;

                logicalDevice.CreateMomento().State.ChannelNumberOfStarter1 = deviceInfo.ChannelNumberOfStarter1;
                logicalDevice.CreateMomento().State.ChannelNumberOfStarter2 = deviceInfo.ChannelNumberOfStarter2;
                logicalDevice.CreateMomento().State.ChannelNumberOfStarter3 = deviceInfo.ChannelNumberOfStarter3;
            }
            catch (Exception ex)
            {
                if (driverId.HasValue)
                {
                    this.RemoveDriver(driverId.Value);
                }
                throw ex;
            }

            try
            {
                var context = await this._persistanceService.GetDevicePersistableContextAsync(logicalDevice.DeviceId);

                context.SaveDeviceMomentoAsync(logicalDevice.CreateMomento());
                this._devicesCache.Add(logicalDevice.DeviceId, logicalDevice);
            }
            catch (Exception error)
            {
                if (driverId.HasValue)
                {
                    this._driversService.RemoveDriverAsync(driverId.Value).Start();
                }
                throw new LogicalDeviceException(deviceInfo, innerException: error);
            }

            return(logicalDevice);
        }
Ejemplo n.º 6
0
 /// <summary>
 ///     Creates an instance of <see cref="LogicalDeviceException" />
 /// </summary>
 /// <param name="message">An optional parameter that represents the message of the exception</param>
 /// <param name="innerException">
 ///     An instance of <see cref="Exception" /> that represents inner exception information
 /// </param>
 public LogicalDeviceException(string message           = null,
                               Exception innerException = null)
     : base(message, innerException)
 {
     this.DeviceInfo = null;
 }
Ejemplo n.º 7
0
 /// <summary>
 ///     Creates an instance of <see cref="LogicalDeviceException" />
 /// </summary>
 /// <param name="deviceInfo">
 ///     An instance of <see cref="LogicalDeviceInformation" /> to use
 /// </param>
 /// <param name="message">An optional parameter that represents the message of the exception</param>
 /// <param name="innerException">
 ///     An instance of <see cref="Exception" /> that represents inner exception information
 /// </param>
 public LogicalDeviceException(LogicalDeviceInformation deviceInfo, string message = null,
                               Exception innerException = null) : base(message, innerException)
 {
     this.DeviceInfo = deviceInfo;
 }