/// <summary>
        /// Default ctor
        /// </summary>
        public LocoIOConnectorConfigurationControl()
        {
            InitializeComponent();

            labels = new[] { lbPin1, lbPin2, lbPin3, lbPin4, lbPin5, lbPin6, lbPin7, lbPin8 };
            addressControls = new[] { tbAddr1, tbAddr2, tbAddr3, tbAddr4, tbAddr5, tbAddr6, tbAddr7, tbAddr8 };
            addresses = new AddressList(8);

            for (int i = 0; i < 8; i++)
            {
                var tbAddr = addressControls[i];
                tbAddr.Value = addresses[i];
                var index = i;
                tbAddr.GotFocus += (s, x) => {
                    tbAddr.Select(0, tbAddr.Value.ToString().Length);
                    oldAddress = (int)tbAddr.Value;
                };
                tbAddr.ValueChanged += (s, x) => {
                    addresses[index] = (int) tbAddr.Value;
                    var newAddress = (int)tbAddr.Value;
                    var tbNextAddr = (index + 1 < 8) ? addressControls[index + 1] : null;
                    if ((tbNextAddr != null) && (tbNextAddr.Value == oldAddress +1))
                    {
                        // Adjust next address
                        oldAddress = (int)tbNextAddr.Value;
                        tbNextAddr.Value = newAddress + 1;
                    }
                };
            }

            Connector = Connector.First;
            lvModes.Items.AddRange(ConnectorMode.All.Select(x => new ListViewItem(x.Name) { Tag = x }).ToArray());
            UpdateUI(true);
        }
        /// <summary>
        /// Use this mode to create a configuration using the
        /// given addresses for the given connector.
        /// </summary>
        public ConnectorConfig CreateConfig(Connector connector, AddressList addresses, int subMode)
        {
            var pinConfigs = new PinConfig[PinCount];
            var pinOffset  = GetPinOffset(subMode);

            for (int i = 0; i < PinCount; i++)
            {
                var pin = i + 1 + pinOffset;
                if (connector == Connector.Second)
                {
                    pin += 8;
                }
                pinConfigs[i] = new PinConfig(pin);
            }
            var result = new ConnectorConfig(pinConfigs);

            Configure(result, addresses, subMode);
            return(result);
        }
 /// <summary>
 /// Create a configuration from the settings found in this control.
 /// </summary>
 public ConnectorConfig CreateConfig()
 {
     var mode = SelectedMode ?? ConnectorMode.None;
     var pinOffset = mode.GetPinOffset(SelectedSubMode);
     var usedAddresses = new AddressList(8 - pinOffset);
     for (var i = pinOffset; i < 8; i++)
     {
         usedAddresses[i - pinOffset] = addresses[i];
     }
     return mode.CreateConfig(connector, usedAddresses, SelectedSubMode);
 }
 /// <summary>
 /// Use this mode to create a configuration using the
 /// given addresses for the given connector.
 /// </summary>
 public ConnectorConfig CreateConfig(Connector connector, AddressList addresses, int subMode)
 {
     var pinConfigs = new PinConfig[PinCount];
     var pinOffset = GetPinOffset(subMode);
     for (int i = 0; i < PinCount; i++)
     {
         var pin = i + 1 + pinOffset;
         if (connector == Connector.Second)
             pin += 8;
         pinConfigs[i] = new PinConfig(pin);
     }
     var result = new ConnectorConfig(pinConfigs);
     Configure(result, addresses, subMode);
     return result;
 }
 /// <summary>
 /// Use this mode to configure the given target.
 /// </summary>
 protected abstract void Configure(ConnectorConfig target, AddressList addresses, int subMode);
 /// <summary>
 /// Use this mode to configure the given target.
 /// </summary>
 protected abstract void Configure(ConnectorConfig target, AddressList addresses, int subMode);