private void UpdateOptions()
        {
            int addressCount = _sequenceItem.Addresses.Count;

            if (addressCount == 0)
            {
                Commands   = new Dictionary <ELLDeviceSequence.ELLCommands, string>();
                Directions = new Dictionary <ELLBaseDevice.DeviceDirection, string>();
            }
            else if (addressCount == 1)
            {
                char address = _sequenceItem.Addresses.First();
                DeviceID.DeviceTypes deviceType = (_owner.DeviceTypes.ContainsKey(address)) ? _owner.DeviceTypes[address] : DeviceID.DeviceTypes.Shutter;
                Commands   = _deviceCommands[deviceType].ToDictionary(i => i, i => i.GetStringValue());
                Directions = _deviceDirections[deviceType];
                if ((Commands.Count != 0) && (Directions.Count != 0))
                {
                    if (!Commands.ContainsKey(_sequenceItem.Command))
                    {
                        _sequenceItem.Command = Commands.First().Key;
                    }
                    if (!Directions.ContainsKey(_sequenceItem.Parameter2))
                    {
                        _sequenceItem.Parameter2 = Directions.Any() ? Directions.First().Key : ELLBaseDevice.DeviceDirection.Linear;
                    }
                }
            }
            else
            {
                List <ELLDeviceSequence.ELLCommands> synchCommands = new List <ELLDeviceSequence.ELLCommands>(_synchroDeviceCommands);
                List <DeviceID.DeviceTypes>          deviceTypes   = _sequenceItem.Addresses.Select(c => _owner.DeviceTypes[c]).Distinct().ToList();
                foreach (DeviceID.DeviceTypes deviceType in deviceTypes)
                {
                    List <ELLDeviceSequence.ELLCommands> synchCommands2 = new List <ELLDeviceSequence.ELLCommands>(synchCommands);
                    foreach (ELLDeviceSequence.ELLCommands cmd in synchCommands2)
                    {
                        if (!_deviceCommands[deviceType].Contains(cmd))
                        {
                            synchCommands.Remove(cmd);
                        }
                    }
                }
                Commands   = synchCommands.ToDictionary(i => i, i => i.GetStringValue());
                Directions = _deviceDirections[deviceTypes[0]];
                if (!Commands.ContainsKey(_sequenceItem.Command))
                {
                    _sequenceItem.Command = Commands.First().Key;
                }
                if (!Directions.ContainsKey(_sequenceItem.Parameter2))
                {
                    _sequenceItem.Parameter2 = Directions.Any() ? Directions.First().Key : ELLBaseDevice.DeviceDirection.Linear;
                }
            }
            UpdateAllowZero();
            _owner?.OnUpdate();
        }
예제 #2
0
        private void ConnectEx()
        {
            if (ELLDevicePort.IsConnected)
            {
                DisconnectEx();
            }
            else
            {
                bool connected;
                try
                {
                    connected = ELLDevicePort.Connect(SelectedPort);
                }
                catch (Exception ex)
                {
                    OutputUpdate(ex.Message, OutputItem.OutputItemType.Error);
                    connected = false;
                }
                IsConnected = ELLDevicePort.IsConnected;
                if (!connected)
                {
                    return;
                }
                if (MinSearchLimit > MaxSearchLimit)
                {
                    MaxSearchLimit = MinSearchLimit;
                }
                ELLDevicePort.DataSent     = DataSent;
                ELLDevicePort.DataReceived = DataReceived;
                _deviceViewModels.Clear();
                _ellDevice.ClearDevices();
                List <string> devices = _ellDevice.ScanAddresses(MinSearchLimit, MaxSearchLimit);
                if (devices.Count > 0)
                {
                    foreach (string deviceID in devices)
                    {
                        _ellDevice.Configure(deviceID);
                        _ellDevice.Connect();
                        char address = deviceID[0];
                        ELLDeviceBaseViewModel vm         = null;
                        DeviceID.DeviceTypes   deviceType = _ellDevice.AddressedDevice(address).DeviceInfo.DeviceType;
                        if (deviceType == DeviceID.DeviceTypes.Paddle)
                        {
                            ELLPaddlePolariser device = _ellDevice.AddressedDevice(address) as ELLPaddlePolariser;
                            vm = new ELLPaddlePolariserViewModel(this, device);
                        }
                        else
                        {
                            ELLDevice device = _ellDevice.AddressedDevice(address) as ELLDevice;
                            switch (deviceType)
                            {
                            case DeviceID.DeviceTypes.Actuator:
                                vm = new ELLActuatorViewModel(this, device);
                                break;

                            case DeviceID.DeviceTypes.Shutter:
                                vm = new ELLShutterViewModel(this, device, 2);
                                break;

                            case DeviceID.DeviceTypes.Shutter4:
                                vm = new ELLShutterViewModel(this, device, 4);
                                break;

                            case DeviceID.DeviceTypes.Rotator:
                                vm = new ELLStageViewModel(this, device, 2, true, true, false);
                                break;

                            case DeviceID.DeviceTypes.OpticsRotator:
                                vm = new ELLStageViewModel(this, device, 2, true, true, true);
                                break;

                            case DeviceID.DeviceTypes.RotaryStage18:
                                vm = new ELLStageViewModel(this, device, 2, true, false, true);
                                break;

                            case DeviceID.DeviceTypes.RotaryStage:
                                vm = new ELLStageViewModel(this, device, 2, true, false, false);
                                break;

                            case DeviceID.DeviceTypes.LinearStage:
                            case DeviceID.DeviceTypes.LinearStage2:
                                vm = new ELLStageViewModel(this, device, 2, false, false, false);
                                break;

                            case DeviceID.DeviceTypes.LinearStage17:
                            case DeviceID.DeviceTypes.LinearStage20:
                                vm = new ELLStageViewModel(this, device, 2, false, false, true);
                                break;
                            }
                        }
                        if (vm != null)
                        {
                            _deviceViewModels[address] = vm;
                            foreach (ELLMotorViewModel motor in vm.Motors)
                            {
                                motor.GetMotorInfoDirect();
                            }
                            vm.InitializeViewModel();
                        }
                        _sequenceViewModel.DeviceTypes = _deviceViewModels.ToDictionary(item => item.Key, item => item.Value.Device.DeviceInfo.DeviceType);
                    }
                }
                else
                {
                    DisconnectEx();
                }
            }
        }