/// <summary>
 /// Start reading loco IO's
 /// </summary>
 protected override void OnVisibleChanged(EventArgs e)
 {
     base.OnVisibleChanged(e);
     if (Visible && !started && (appState != null))
     {
         started = true;
         var list = appState.LocoNet.NewLocoIOs.ToList();
         progressBar1.Maximum = list.Count + 1;
         progressBar1.Minimum = 0;
         foreach (var io in list)
         {
             var index = list.IndexOf(io);
             var programmer = new Programmer(io.Address);
             var config = new LocoIOConfig();
             appState.LocoBuffer.BeginRequest(
                 x => programmer.Read(x, config),
                 x =>
                     {
                         if (!x.HasError)
                         {
                             appState.Configuration.LocoIOs[config.Address] = config;
                         }
                         progressBar1.Value = index + 1;
                         if (index == list.Count-1)
                         {
                             Close();
                         }
                     });
         }
     }
 }
        /// <summary>
        /// Read Single SV
        /// </summary>
        private void CmdReadClick(object sender, EventArgs e)
        {
            var programmer = new Programmer(new LocoNetAddress((byte)tbDstL.Value, (byte)tbDstH.Value));
            var configs = new[] { new SVConfig((int)tbSvAddress.Value) };

            lb.BeginRequest(x => programmer.Read(x, configs), x => {
                if (configs[0].Valid)
                {
                    MessageBox.Show("Value = " + configs[0].Value);
                }
                else
                {
                    MessageBox.Show("Cannot read SV");
                }
            });
        }