Beispiel #1
0
        public IConfigDeviceViewModel CreateConfigDeviceViewModel(IConfigLogicalDevice configLogicalDevice)
        {
            IConfigDeviceViewModel configDeviceViewModel = _container.Resolve <IConfigDeviceViewModel>();

            configDeviceViewModel.Model = configLogicalDevice;
            return(configDeviceViewModel);
        }
        /// <summary>
        ///     Сохраняет новый номер позиции устройства в хранилище
        /// </summary>
        /// <param name="device">Устройство</param>
        /// <returns>задача</returns>
        public async Task UpdateDevicePositionAsync(IConfigLogicalDevice device, int newNumber)
        {
            var context = await this._persistanceService.GetDevicePersistableContextAsync(device.DeviceId);

            device.CreateMomento().State.DeviceNumber = newNumber;
            context.SaveDeviceMomentoAsync(device.CreateMomento());
        }
        /// <summary>
        ///     Updates an instance of <see cref="IConfiguratedDeviceSchemeTable"/> in <see cref="IConfigLogicalDevice" /> in the system registry asynchronously
        /// Асинхронно обновляет схему устройства
        /// </summary>
        /// <param name="device">An instance of <see cref="LogicalDeviceInformation" /> to update.
        /// Устройство в котором будет обновляться схема</param>
        /// <param name="scheme">New scheme. Instance of <see cref="IConfiguratedDeviceSchemeTable"/>
        /// Новая схема для устройства</param>
        /// <returns>An instance of System.Threading.Tasks.Task that represents current asynchronous operation</returns>
        public async Task UpdateDeviceSchemeAsync(IConfigLogicalDevice device, IConfiguratedDeviceSchemeTable scheme)
        {
            var context = await this._persistanceService.GetDevicePersistableContextAsync(device.DeviceId);

            device.CreateMomento().State.SchemeTable = scheme;
            context.SaveDeviceMomentoAsync(device.CreateMomento());
        }
Beispiel #4
0
        /// <summary>
        ///     Maps the <see cref="IConfigLogicalDevice" /> to <see cref="DeviceModel" />
        ///     Конвертирует <see cref="IConfigLogicalDevice" /> в <see cref="DeviceModel" />
        /// </summary>
        /// <param name="device">
        ///     An instance of <see cref="IConfigLogicalDevice" /> to map to <see cref="DeviceModel" />
        /// </param>
        /// <returns>
        ///     Resulted instance of <see cref="DeviceModel" />
        /// </returns>
        public static DeviceModel ToDeviceModel(this IConfigLogicalDevice device)
        {
            DeviceModel deviceModel = new DeviceModel();


            deviceModel.DeviceFactoryTypeName = device.CreateMomento().State.DeviceType;
            deviceModel.Name                  = device.DeviceName;
            deviceModel.Description           = device.DeviceDescription;
            deviceModel.AnalogMeterTypeName   = device.CreateMomento().State.AnalogMeterType;
            deviceModel.DriverFactoryTypeName = "TCP_MB";
            deviceModel.StarterDescriptions   =
                new List <string>(3)
            {
                device.CreateMomento().State.Starter1Description,
                                       device.CreateMomento().State.Starter2Description,
                                       device.CreateMomento().State.Starter3Description
            };
            deviceModel.TransformKoefA          = device.CreateMomento().State.TransformKoefA;
            deviceModel.TransformKoefB          = device.CreateMomento().State.TransformKoefB;
            deviceModel.TransformKoefC          = device.CreateMomento().State.TransformKoefC;
            deviceModel.ChannelNumberOfStarter1 = device.CreateMomento().State.ChannelNumberOfStarter1;
            deviceModel.ChannelNumberOfStarter2 = device.CreateMomento().State.ChannelNumberOfStarter2;
            deviceModel.ChannelNumberOfStarter3 = device.CreateMomento().State.ChannelNumberOfStarter3;
            var fiders = device.CreateMomento().State.CustomDeviceSchemeTable?.FidersTable
                         .GetEnumeratorObjects();

            if (fiders != null)
            {
                deviceModel.CustomFidersOnDevice.AddRange(fiders);
            }
            var signals = device.CreateMomento().State.CustomDeviceSchemeTable?.SignalsTable.GetEnumeratorObjects();

            if (signals != null)
            {
                deviceModel.CustomSignalsOnDevice.AddRange(signals);
            }
            var inds = device.CreateMomento().State.CustomDeviceSchemeTable?.IndicatorsTable.GetEnumeratorObjects();

            if (inds != null)
            {
                deviceModel.CustomIndicatorsOnDevice.AddRange(inds);
            }
            var cascades = device.CreateMomento().State.CustomDeviceSchemeTable?.CascadeIndicatorsTable.GetEnumeratorObjects();

            if (cascades != null)
            {
                deviceModel.CascadeIndicatorsOnDevice.AddRange(cascades);
            }
            return(deviceModel);
        }
        private async void OnCreateNewDevice(DeviceModel deviceModel)
        {
            var busyToken = this.InteractWithBusy();

            try
            {
                IConfigLogicalDevice resultedDevice = await this._configService.CreateDeviceAsync(deviceModel.ToLogicalDeviceInfo());

                this.Devices.Add(_configDeviceViewModelFactory.CreateConfigDeviceViewModel(resultedDevice));
                this.SaveNewWidgetPosition();
            }
            catch (Exception error)
            {
                busyToken.Dispose();
                this.InteractWithError(error);
            }
            busyToken.Dispose();
        }
        /// <summary>
        ///     Removes an instance of <see cref="IConfigLogicalDevice" /> from the system asynchronously
        /// Асинхронно Удаляет устройство из xml
        /// </summary>
        /// <param name="device">
        ///     An instance of <see cref="IConfigLogicalDevice" /> to remove. Use DeviceId only.
        ///     Сущность конфиг устройства, которая будет удалена.(Вместе с драйвером этого устройства)
        /// </param>
        /// <returns>An instance of System.Threading.Tasks.Task that represents current asynchronous operation</returns>
        public async Task RemoveDeviceAsync(IConfigLogicalDevice device)
        {
            this.ThrowIfDisposed();
            await this.Initialization;
            try
            {
                await this._persistanceService.RemoveDevicePersistanbleContextAsync(device.DeviceId);

                var stringDriverId = device.CreateMomento().State.RelatedDriverId;
                await this._driversService.RemoveDriverAsync(Guid.Parse(stringDriverId));

                this._devicesCache.Remove(device.DeviceId);
            }
            catch (Exception tException)
            {
                throw tException; //new LogicalDeviceException();
            }
        }
        /// <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);
        }