/// <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); }
/// <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; }
/// <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; }