private void getData(BDAGraph graph, DumpParameters dumpParameters, BackgroundWorker worker)
        {
            Logger.Instance.Write(string.Format("Starting dump to {0}", dumpParameters.FileName));

            int[] newPids;

            if (dumpParameters.PidList != null && dumpParameters.PidList.Count != 0)
            {
                newPids = new int[dumpParameters.PidList.Count];
                for (int index = 0; index < dumpParameters.PidList.Count; index++)
                {
                    newPids[index] = dumpParameters.PidList[index];
                }
            }
            else
            {
                newPids    = new int[1];
                newPids[0] = -1;
            }

            graph.ChangePidMapping(newPids);

            DateTime startTime = DateTime.Now;

            int lastSize = 0;

            while (!worker.CancellationPending)
            {
                Thread.Sleep(100);

                int increment = 5;
                if (dumpParameters.PidList != null && dumpParameters.PidList.Count != 0)
                {
                    increment = 1;
                }

                int buffer_space = graph.BufferSpaceUsed / (1024 * 1024);
                if (buffer_space > 40)
                {
                    graph.clear_buffer();
                }


                int size = graph.DumpFileSize / (1024 * 1024);
                if (size >= lastSize + increment)
                {
                    Logger.Instance.Write("Record/Buffer sizes: (" + size + "/" + buffer_space + ")");
                    worker.ReportProgress((int)size);


                    lastSize = size;
                }
            }

            finalSize = graph.DumpFileSize;
            Logger.Instance.Write("Dump completed - file size now " + finalSize + " bytes");
        }
        private DumpParameters getDumpParameters()
        {
            DumpParameters dumpParameters = new DumpParameters();

            dumpParameters.Tuners            = frequencySelectionControl.Tuners;
            dumpParameters.ScanningFrequency = frequencySelectionControl.SelectedFrequency;

            if (dumpParameters.ScanningFrequency as SatelliteFrequency != null)
            {
                SatelliteFrequency satelliteFrequency = (SatelliteFrequency)dumpParameters.ScanningFrequency;
                satelliteFrequency.SatelliteDish = new SatelliteDish();
                satelliteFrequency.SatelliteDish.LNBLowBandFrequency  = frequencySelectionControl.LNBLowBandFrequency;
                satelliteFrequency.SatelliteDish.LNBHighBandFrequency = frequencySelectionControl.LNBHighBandFrequency;
                satelliteFrequency.SatelliteDish.LNBSwitchFrequency   = frequencySelectionControl.LNBSwitchFrequency;
                satelliteFrequency.SatelliteDish.DiseqcSwitch         = frequencySelectionControl.DiseqcSwitch;
            }

            dumpParameters.UseSignalPresent      = frequencySelectionControl.UseSignalPresent;
            dumpParameters.SwitchAfterPlay       = frequencySelectionControl.SwitchAfterPlay;
            dumpParameters.RepeatDiseqc          = frequencySelectionControl.RepeatDiseqc;
            dumpParameters.SignalLockTimeout     = (int)nudSignalLockTimeout.Value;
            dumpParameters.DataCollectionTimeout = (int)nudDataCollectionTimeout.Value;
            dumpParameters.PidList = pidList;
            string newFilePath = string.Format("{0}\\tsdump-{1}.ts", Path.GetPathRoot(txtOutputFile.Text),
                                               DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond);

            try
            {
                if (before_recording_complete_script_path.Text != null)
                {
                    string val = ScriptRunner.run_before_start(newFilePath, get_active_tuner_idx(), before_recording_complete_script_path.Text);

                    //MessageBox.Show(val);
                    if (val != null)
                    {
                        newFilePath = val;
                    }
                }
            } catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }

            dumpParameters.FileName = newFilePath;

            return(dumpParameters);
        }
        private void start_dump()
        {
            ChangeControlStatus(false);

            lblScanning.Text     = "File size: 0Mb";
            lblScanning.Visible  = true;
            pbarProgress.Visible = true;
            pbarProgress.Enabled = true;



            workerDump = new BackgroundWorker();
            workerDump.WorkerReportsProgress      = true;
            workerDump.WorkerSupportsCancellation = true;
            workerDump.DoWork += new DoWorkEventHandler(doDump);


            workerDump.RunWorkerCompleted += new RunWorkerCompletedEventHandler(runWorkerCompleted);
            workerDump.ProgressChanged    += new ProgressChangedEventHandler(progressChanged);

            last_dump_parameters = getDumpParameters();
            workerDump.RunWorkerAsync(last_dump_parameters);
        }
        private void start_dump()
        {
            ChangeControlStatus(false);

            lblScanning.Text = "File size: 0Mb";
            lblScanning.Visible = true;
            pbarProgress.Visible = true;
            pbarProgress.Enabled = true;

            workerDump = new BackgroundWorker();
            workerDump.WorkerReportsProgress = true;
            workerDump.WorkerSupportsCancellation = true;
            workerDump.DoWork += new DoWorkEventHandler(doDump);

            workerDump.RunWorkerCompleted += new RunWorkerCompletedEventHandler(runWorkerCompleted);
            workerDump.ProgressChanged += new ProgressChangedEventHandler(progressChanged);

            last_dump_parameters = getDumpParameters();
            workerDump.RunWorkerAsync(last_dump_parameters);
        }
        private DumpParameters getDumpParameters()
        {
            DumpParameters dumpParameters = new DumpParameters();

            dumpParameters.Tuners = frequencySelectionControl.Tuners;
            dumpParameters.ScanningFrequency = frequencySelectionControl.SelectedFrequency;

            if (dumpParameters.ScanningFrequency as SatelliteFrequency != null)
            {
                SatelliteFrequency satelliteFrequency = (SatelliteFrequency)dumpParameters.ScanningFrequency;
                satelliteFrequency.SatelliteDish = new SatelliteDish();
                satelliteFrequency.SatelliteDish.LNBLowBandFrequency = frequencySelectionControl.LNBLowBandFrequency;
                satelliteFrequency.SatelliteDish.LNBHighBandFrequency = frequencySelectionControl.LNBHighBandFrequency;
                satelliteFrequency.SatelliteDish.LNBSwitchFrequency = frequencySelectionControl.LNBSwitchFrequency;
                satelliteFrequency.SatelliteDish.DiseqcSwitch = frequencySelectionControl.DiseqcSwitch;
            }

            dumpParameters.UseSignalPresent = frequencySelectionControl.UseSignalPresent;
            dumpParameters.SwitchAfterPlay = frequencySelectionControl.SwitchAfterPlay;
            dumpParameters.RepeatDiseqc = frequencySelectionControl.RepeatDiseqc;
            dumpParameters.SignalLockTimeout = (int)nudSignalLockTimeout.Value;
            dumpParameters.DataCollectionTimeout = (int)nudDataCollectionTimeout.Value;
            dumpParameters.PidList = pidList;
            string newFilePath = string.Format("{0}\\tsdump-{1}.ts", Path.GetPathRoot(txtOutputFile.Text),
                                               DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond);
            try
            {
                if (before_recording_complete_script_path.Text != null)
                {

                    string val = ScriptRunner.run_before_start(newFilePath, get_active_tuner_idx(), before_recording_complete_script_path.Text);

                    //MessageBox.Show(val);
                    if (val != null)
                        newFilePath = val;
                }
            } catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }

            dumpParameters.FileName = newFilePath;

            return (dumpParameters);
        }
        private void getData(BDAGraph graph, DumpParameters dumpParameters, BackgroundWorker worker)
        {
            Logger.Instance.Write(string.Format("Starting dump to {0}",dumpParameters.FileName));

            int[] newPids;

            if (dumpParameters.PidList != null && dumpParameters.PidList.Count != 0)
            {
                newPids = new int[dumpParameters.PidList.Count];
                for (int index = 0; index < dumpParameters.PidList.Count; index++)
                    newPids[index] = dumpParameters.PidList[index];
            }
            else
            {
                newPids = new int[1];
                newPids[0] = -1;
            }

            graph.ChangePidMapping(newPids);

            DateTime startTime = DateTime.Now;

            int lastSize = 0;

            while (!worker.CancellationPending)
            {
                Thread.Sleep(100);

                int increment = 5;
                if (dumpParameters.PidList != null && dumpParameters.PidList.Count != 0)
                    increment = 1;

                int buffer_space = graph.BufferSpaceUsed/(1024*1024);
                if (buffer_space > 40)
                {
                    graph.clear_buffer();

                }

                int size = graph.DumpFileSize / (1024 * 1024);
                if (size >= lastSize + increment)
                {
                    Logger.Instance.Write("Record/Buffer sizes: (" + size + "/"+buffer_space+")");
                    worker.ReportProgress((int)size);

                    lastSize = size;
                }
            }

            finalSize = graph.DumpFileSize;
            Logger.Instance.Write("Dump completed - file size now " + finalSize + " bytes");
        }
        private string checkTuning(BDAGraph graph, DumpParameters dumpParameters, BackgroundWorker worker)
        {
            TimeSpan timeout = new TimeSpan();
            bool done = false;
            bool locked = false;
            int frequencyRetries = 0;

            while (!done)
            {
                if (worker.CancellationPending)
                {
                    Logger.Instance.Write("Dump abandoned by user");
                    return (null);
                }

                locked = graph.SignalLocked;
                if (!locked)
                {
                    int signalQuality = graph.SignalQuality;
                    if (signalQuality > 0)
                    {
                        Logger.Instance.Write("Signal not locked but signal quality > 0");
                        locked = true;
                        done = true;
                    }
                    else
                    {
                        if (!dumpParameters.UseSignalPresent)
                        {
                            Logger.Instance.Write("Signal not locked and signal quality not > 0");
                            Thread.Sleep(1000);
                            timeout = timeout.Add(new TimeSpan(0, 0, 1));
                            done = (timeout.TotalSeconds == dumpParameters.SignalLockTimeout);
                        }
                        else
                        {
                            bool signalPresent = graph.SignalPresent;
                            if (signalPresent)
                            {
                                Logger.Instance.Write("Signal present");
                                locked = true;
                                done = true;
                            }
                            else
                            {
                                Logger.Instance.Write("Signal not present");
                                Thread.Sleep(1000);
                                timeout = timeout.Add(new TimeSpan(0, 0, 1));
                                done = (timeout.TotalSeconds == dumpParameters.SignalLockTimeout);
                            }
                        }

                        if (done)
                        {
                            done = (frequencyRetries == 2);
                            if (done)
                                Logger.Instance.Write("<e> Failed to acquire signal");
                            else
                            {
                                Logger.Instance.Write("Retrying frequency");
                                timeout = new TimeSpan();
                                frequencyRetries++;
                            }
                        }
                    }
                }
                else
                {
                    Logger.Instance.Write("Signal acquired: lock is " + graph.SignalLocked + " quality is " + graph.SignalQuality + " strength is " + graph.SignalStrength);
                    done = true;
                }
            }

            if (locked)
                return (null);
            else
                return ("<e> The tuner failed to acquire a signal for frequency " + dumpParameters.ScanningFrequency.ToString());
        }
        private string checkTuning(BDAGraph graph, DumpParameters dumpParameters, BackgroundWorker worker)
        {
            TimeSpan timeout          = new TimeSpan();
            bool     done             = false;
            bool     locked           = false;
            int      frequencyRetries = 0;

            while (!done)
            {
                if (worker.CancellationPending)
                {
                    Logger.Instance.Write("Dump abandoned by user");
                    return(null);
                }

                locked = graph.SignalLocked;
                if (!locked)
                {
                    int signalQuality = graph.SignalQuality;
                    if (signalQuality > 0)
                    {
                        Logger.Instance.Write("Signal not locked but signal quality > 0");
                        locked = true;
                        done   = true;
                    }
                    else
                    {
                        if (!dumpParameters.UseSignalPresent)
                        {
                            Logger.Instance.Write("Signal not locked and signal quality not > 0");
                            Thread.Sleep(1000);
                            timeout = timeout.Add(new TimeSpan(0, 0, 1));
                            done    = (timeout.TotalSeconds == dumpParameters.SignalLockTimeout);
                        }
                        else
                        {
                            bool signalPresent = graph.SignalPresent;
                            if (signalPresent)
                            {
                                Logger.Instance.Write("Signal present");
                                locked = true;
                                done   = true;
                            }
                            else
                            {
                                Logger.Instance.Write("Signal not present");
                                Thread.Sleep(1000);
                                timeout = timeout.Add(new TimeSpan(0, 0, 1));
                                done    = (timeout.TotalSeconds == dumpParameters.SignalLockTimeout);
                            }
                        }

                        if (done)
                        {
                            done = (frequencyRetries == 2);
                            if (done)
                            {
                                Logger.Instance.Write("<e> Failed to acquire signal");
                            }
                            else
                            {
                                Logger.Instance.Write("Retrying frequency");
                                timeout = new TimeSpan();
                                frequencyRetries++;
                            }
                        }
                    }
                }
                else
                {
                    Logger.Instance.Write("Signal acquired: lock is " + graph.SignalLocked + " quality is " + graph.SignalQuality + " strength is " + graph.SignalStrength);
                    done = true;
                }
            }

            if (locked)
            {
                return(null);
            }
            else
            {
                return("<e> The tuner failed to acquire a signal for frequency " + dumpParameters.ScanningFrequency.ToString());
            }
        }
        private void doDump(object sender, DoWorkEventArgs e)
        {
            finalSize = -1;

            DumpParameters dumpParameters = e.Argument as DumpParameters;

            TunerNodeType tunerNodeType;
            TuningSpec    tuningSpec;

            SatelliteFrequency satelliteFrequency = dumpParameters.ScanningFrequency as SatelliteFrequency;

            if (satelliteFrequency != null)
            {
                tunerNodeType = TunerNodeType.Satellite;
                tuningSpec    = new TuningSpec((Satellite)satelliteFrequency.Provider, satelliteFrequency);
            }
            else
            {
                TerrestrialFrequency terrestrialFrequency = dumpParameters.ScanningFrequency as TerrestrialFrequency;
                if (terrestrialFrequency != null)
                {
                    tunerNodeType = TunerNodeType.Terrestrial;
                    tuningSpec    = new TuningSpec(terrestrialFrequency);
                }
                else
                {
                    CableFrequency cableFrequency = dumpParameters.ScanningFrequency as CableFrequency;
                    if (cableFrequency != null)
                    {
                        tunerNodeType = TunerNodeType.Cable;
                        tuningSpec    = new TuningSpec(cableFrequency);
                    }
                    else
                    {
                        AtscFrequency atscFrequency = dumpParameters.ScanningFrequency as AtscFrequency;
                        if (atscFrequency != null)
                        {
                            if (atscFrequency.TunerType == TunerType.ATSC)
                            {
                                tunerNodeType = TunerNodeType.ATSC;
                            }
                            else
                            {
                                tunerNodeType = TunerNodeType.Cable;
                            }
                            tuningSpec = new TuningSpec(atscFrequency);
                        }
                        else
                        {
                            ClearQamFrequency clearQamFrequency = dumpParameters.ScanningFrequency as ClearQamFrequency;
                            if (clearQamFrequency != null)
                            {
                                tunerNodeType = TunerNodeType.Cable;
                                tuningSpec    = new TuningSpec(clearQamFrequency);
                            }
                            else
                            {
                                ISDBSatelliteFrequency isdbSatelliteFrequency = dumpParameters.ScanningFrequency as ISDBSatelliteFrequency;
                                if (isdbSatelliteFrequency != null)
                                {
                                    tunerNodeType = TunerNodeType.ISDBS;
                                    tuningSpec    = new TuningSpec((Satellite)satelliteFrequency.Provider, isdbSatelliteFrequency);
                                }
                                else
                                {
                                    ISDBTerrestrialFrequency isdbTerrestrialFrequency = dumpParameters.ScanningFrequency as ISDBTerrestrialFrequency;
                                    if (isdbTerrestrialFrequency != null)
                                    {
                                        tunerNodeType = TunerNodeType.ISDBT;
                                        tuningSpec    = new TuningSpec(isdbTerrestrialFrequency);
                                    }
                                    else
                                    {
                                        throw (new InvalidOperationException("Tuning frequency not recognized"));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            Tuner currentTuner = null;
            bool  finished     = false;

            while (!finished)
            {
                if ((sender as BackgroundWorker).CancellationPending)
                {
                    Logger.Instance.Write("Scan abandoned by user");
                    e.Cancel = true;
                    resetEvent.Set();
                    return;
                }

                BDAGraph graph = BDAGraph.FindTuner(dumpParameters.Tuners,
                                                    tunerNodeType, tuningSpec, currentTuner, dumpParameters.RepeatDiseqc, dumpParameters.SwitchAfterPlay, dumpParameters.FileName);
                if (graph == null)
                {
                    Logger.Instance.Write("<e> No tuner able to tune frequency " + dumpParameters.ScanningFrequency.ToString());

                    frequencySelectionControl.Invoke(new ShowMessage(showMessage), "No tuner able to tune frequency " + dumpParameters.ScanningFrequency.ToString(),
                                                     MessageBoxButtons.OK, MessageBoxIcon.Error);
                    finished = true;
                }
                else
                {
                    string tuneReply = checkTuning(graph, dumpParameters, sender as BackgroundWorker);

                    if ((sender as BackgroundWorker).CancellationPending)
                    {
                        Logger.Instance.Write("Scan abandoned by user");
                        graph.Dispose();
                        e.Cancel = true;
                        resetEvent.Set();
                        return;
                    }

                    if (tuneReply == null)
                    {
                        try
                        {
                            getData(graph, dumpParameters, sender as BackgroundWorker);
                        }
                        catch (IOException ex)
                        {
                            Logger.Instance.Write("<e> Failed to create dump file");
                            Logger.Instance.Write("<e> " + ex.Message);
                            frequencySelectionControl.Invoke(new ShowMessage(showMessage), "Failed to create dump file." +
                                                             Environment.NewLine + Environment.NewLine + ex.Message,
                                                             MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }


                        graph.Dispose();



                        finished = true;
                    }
                    else
                    {
                        Logger.Instance.Write("Failed to tune frequency " + dumpParameters.ScanningFrequency.ToString());
                        graph.Dispose();
                        currentTuner = graph.Tuner;
                    }
                }
            }
            e.Cancel = true;
            resetEvent.Set();
        }
        private void cmdScan_Click(object sender, EventArgs e)
        {
            if (cmdScan.Text == "Stop Dump")
            {
                Logger.Instance.Write("Stop dump requested");
                workerDump.CancelAsync();
                resetEvent.WaitOne(new TimeSpan(0, 0, 45));
                cmdScan.Text         = "Start Dump";
                lblScanning.Visible  = false;
                pbarProgress.Visible = false;
                pbarProgress.Enabled = false;


                if (last_dump_parameters != null)
                {
                    string val = ScriptRunner.run_after_finish(last_dump_parameters.FileName, get_active_tuner_idx(), after_recording_complete_script_path.Text);
                }


                ChangeControlStatus(true);


                return;
            }

            if (!checkData())
            {
                return;
            }



            DateTime st_time = DateTime.ParseExact(start_hour_textbox.Text, "HH:mm", CultureInfo.InvariantCulture);
            int      hour    = st_time.Hour;
            int      minute  = st_time.Minute;
            int      second  = 0;

            int current_second = -1;
            int current_minute = -1;
            int current_hour   = -1;

            DumpParameters dp = getDumpParameters();

            restart_times.Clear();

            while (!(current_hour == hour && current_minute == minute && current_second == second))
            {
                st_time        = st_time.AddSeconds(dp.DataCollectionTimeout);
                current_hour   = st_time.Hour;
                current_minute = st_time.Minute;
                current_second = st_time.Second;

                restart_times.Add(st_time.ToString("HHmmss"));
                // Logger.Instance.Write(string.Format("restart time: {0}",calc_time.ToString()));
            }

            Logger.Instance.Write("Dump started");

            cmdScan.Text = "Stop Dump";

            start_dump();
        }