// TODO -- This is something like a callback. Maybe a callback is better.
        private void SubGet_Complete(object sender, AsyncComplete status)
        {
            AsyncIO p = (AsyncIO)sender;

            if (status.Type == AsyncIO.TaskType.Substitutions)
            {
                // Cancel the notification
                p.Complete   -= SubGet_Complete;
                getInProgress = false;
                // Get the substitution from the packet
                Src src = (Src)cbSource.SelectedIndex;
                Subs[(int)src] = status.substitution;
                // post the data retrieved
                clearSubstitutions();
                loadSubstitutions(Subs[(int)src]);
                SetButtonEnables();
            }
        }
        /// <summary>
        /// Starts this EnityPoller.
        /// </summary>
        /// <exception cref="System.InvalidOperationException">Already polling</exception>
        public void Start()
        {
            var worker      = new AsyncWorker(Poll);
            var completed   = new AsyncCallback(PollComplete);
            var onCompleted = new AsyncComplete(OnEntity);

            lock (_sync)
            {
                if (_polling)
                {
                    throw new InvalidOperationException("Already polling");
                }

                var operation = AsyncOperationManager.CreateOperation(onCompleted);
                worker.BeginInvoke(completed, operation);
                _polling = true;
            }
        }
        private void AsyncIO_Complete(object sender, AsyncComplete status)
        {
            switch (status.Type)
            {
            case AsyncIO.TaskType.Connect:
                if (status.Success)
                {
                    cmdGetStatus_Click(null, null);
                }
                break;

            case AsyncIO.TaskType.Disconnect:
                txtPrinterStatus.Text = "Unknown";
                txtAnalysis.Text      = "Unknown";
                break;

            case AsyncIO.TaskType.Send:
                DisplayLogTree(status.Resp2);
                break;

            case AsyncIO.TaskType.Retrieve:
                LoadXmlToDisplay(status.Resp1);
                DisplayLogTree(status.Resp2);
                break;

            case AsyncIO.TaskType.WriteData:

                break;

            case AsyncIO.TaskType.ReadData:
                txtData.Text = MB.byte_to_string(status.DataA);
                break;

            case AsyncIO.TaskType.IssueccIJP:

                break;

            case AsyncIO.TaskType.GetStatus:
                txtPrinterStatus.Text = status.Resp1;
                txtAnalysis.Text      = status.Resp2;
                break;

            case AsyncIO.TaskType.GetMessages:
                dgMessages.Rows.Clear();
                foreach (string s in status.MultiLine)
                {
                    dgMessages.Rows.Add(s.Split(','));
                }
                break;

            case AsyncIO.TaskType.GetErrors:
                lbErrors.Items.Clear();
                lbErrors.Items.Add($"There are {status.Value} errors to report!");
                lbErrors.Items.AddRange(status.MultiLine);
                break;

            case AsyncIO.TaskType.Exit:
                break;

            default:
                break;
            }
            SetButtonEnables();
        }