public DeviceConfigPanel(DeviceType deviceType, [CanBeNull] TemplateWithArgs <DeviceTemplate> device,
                                 [CanBeNull] IEnumerable <TemplateWithArgs <ConsumerTemplate> > consumers)
        {
            InitializeComponent();

            _deviceType = deviceType;

            _deviceViewModel = new DeviceConfigViewModel(DeviceConfigContainer, GetDeviceList(_deviceType));
            _deviceViewModel.ComboBox.SelectionChanged += DeviceComboBox_OnSelectionChanged;
            _deviceViewModel.ComboBox.FindAndSelectFirstByString(device?.Template.Identifier, 0);
            _deviceViewModel.ParamPanel.Context        = device?.Args ?? EmptyContext.Instance;
            _deviceViewModel.ParamPanel.LayoutChanged += ConfigurationPanel_OnLayoutChanged;
            _deviceViewModel.Current = device?.Template;

            if (consumers != null)
            {
                foreach (var consumer in consumers)
                {
                    if (string.IsNullOrWhiteSpace(consumer?.Template.Identifier))
                    {
                        continue;
                    }
                    AppendConsumerConfig(consumer);
                }
            }

            if (!_consumerViewModels.Any())
            {
                AppendConsumerConfig();
            }
        }
 public DeviceConfigWindow(DeviceType deviceType, [CanBeNull] TemplateWithArgs <DeviceTemplate> device,
                           [CanBeNull] IEnumerable <TemplateWithArgs <ConsumerTemplate> > consumers)
 {
     InitializeComponent();
     Title = $"{deviceType.DisplayName} Configuration";
     DockPanel.Children.Add(DeviceConfigPanel = new DeviceConfigPanel(deviceType, device, consumers));
     DeviceConfigPanel.DeviceChanged         += DeviceChanged;
     DeviceConfigPanel.ConsumerChanged       += ConsumerChanged;
 }
        public bool ShowDialog([CanBeNull] out TemplateWithArgs <DeviceTemplate> device, [NotNull] out IReadOnlyList <TemplateWithArgs <ConsumerTemplate> > consumers)
        {
            device    = null;
            consumers = EmptyArray <TemplateWithArgs <ConsumerTemplate> > .Instance;
            var dialogResult = ShowDialog() ?? false;

            if (!dialogResult)
            {
                return(false);
            }
            device    = _device;
            consumers = _consumers;
            return(true);
        }
        private void AppendConsumerConfig(TemplateWithArgs <ConsumerTemplate> consumer = null)
        {
            var viewModel = new ConsumerConfigViewModel(GetConsumerList(_deviceType));

            viewModel.ComboBox.SelectionChanged += ConsumerComboBox_OnSelectionChanged;
            viewModel.ComboBox.FindAndSelectFirstByString(consumer?.Template.Identifier, 0);
            viewModel.ParamPanel.Context        = consumer?.Args ?? EmptyContext.Instance;
            viewModel.ParamPanel.LayoutChanged += ConfigurationPanel_OnLayoutChanged;
            _consumerViewModels.AddLast(viewModel);
            ConsumersStackPanel.Children.Add(viewModel.Container);
            if (_consumerViewModels.Count >= MaxConsumerCount)
            {
                AppendConsumerButton.IsEnabled = false;
                AppendConsumerButton.Content   = "MAX";
            }
        }
Beispiel #5
0
        public static IDictionary <DeviceType, IDevice> InitiateDevices(IEnumerable <DeviceType> deviceTypes, IDictionary <DeviceType, DeviceConfig> devices)
        {
            var deviceLookups = new Dictionary <DeviceType, TemplateWithArgs <DeviceTemplate> >();

            foreach (var deviceType in deviceTypes)
            {
                if (!devices.TryGetValue(deviceType, out var entity) || entity.Device.Id == null)
                {
                    if (deviceType.IsRequired)
                    {
                        throw new ArgumentException($"Device type '{deviceType.DisplayName}' is required.");
                    }
                    continue;
                }
                if (!App.Instance.Registries.Registry <DeviceTemplate>().LookUp(entity.Device.Id, out var deviceTemplate))
                {
                    throw new ArgumentException($"Cannot find device by id: {entity.Device.Id}");
                }
                deviceLookups[deviceType] = TemplateWithArgs <DeviceTemplate> .OfNullable(deviceTemplate, deviceTemplate.DeserializeArgs(entity.Device.Args));
            }
            var deviceInstances = new Dictionary <DeviceType, IDevice>();
            var success         = false;

            try
            {
                foreach (var entry in deviceLookups)
                {
                    System.Diagnostics.Debug.Assert(entry.Value.Template != null, "entry.Value.Template != null");
                    deviceInstances[entry.Key] = entry.Value.Template.NewInstance(entry.Value.Args);
                }

                success = true;
            }
            finally
            {
                if (!success)
                {
                    foreach (var device in deviceInstances.Values)
                    {
                        device.Dispose();
                    }
                }
            }
            return(deviceInstances);
        }
        /// <summary>
        /// Get device config and consumer configs.
        /// </summary>
        /// <param name="device"></param>
        /// <param name="consumers"></param>
        /// <exception cref="InvalidParametersException"></exception>
        public void GetDeviceAndConsumers(out TemplateWithArgs <DeviceTemplate> device, out IReadOnlyList <TemplateWithArgs <ConsumerTemplate> > consumers)
        {
            var invalidDeviceParams        = _deviceViewModel.ParamPanel.GetInvalidParams().ToArray();
            var invalidConsumerParamsArray = _consumerViewModels.Select(vm => vm.ParamPanel.GetInvalidParams().ToArray()).ToArray();

            if (invalidDeviceParams.Any() || (invalidConsumerParamsArray.Sum(p => (int?)p.Length) ?? 0) > 0)
            {
                throw new InvalidParametersException(invalidDeviceParams, invalidConsumerParamsArray);
            }
            device = TemplateWithArgs <DeviceTemplate> .OfNullable(_deviceViewModel.Current, _deviceViewModel.ParamPanel.Context);

            var consumerList = new List <TemplateWithArgs <ConsumerTemplate> >(_consumerViewModels.Count);

            consumerList.AddRange(from viewModel in _consumerViewModels
                                  where viewModel.Current != null
                                  select new TemplateWithArgs <ConsumerTemplate>(viewModel.Current, viewModel.ParamPanel.Context));
            consumers = consumerList;
        }