Beispiel #1
0
        /// <summary>
        /// Meldet eine relative Nummer einer Quellgruppe bezüglich dieser Auswahl.
        /// </summary>
        /// <param name="group">Die zu prüfende Quellgruppe.</param>
        /// <returns>Eine bei 0 beginnenden laufende Nummer, die in eine Farbcodierung umgesetzt wird.</returns>
        public override int GetSubGroupIndex(SourceGroup group)
        {
            // Convert
            CableGroup cab = (CableGroup)group;

            // Check mode
            switch (cab.Modulation)
            {
            case CableModulations.QAM64: return(0);

            case CableModulations.QAM256: return(1);

            default: return(2);
            }
        }
 /// <summary>
 /// Erzeugt eine neue Auswahlinstanz.
 /// </summary>
 /// <param name="source">Die zu betrachtende Quelle.</param>
 public CableGroupSelector( SourceSelection source )
 {
     // Remember
     m_Group = (CableGroup) source.Group;
 }
        /// <summary>
        /// Wählt eine Quellgruppe an.
        /// </summary>
        /// <param name="group">Die Daten zur Quellgruppe.</param>
        /// <returns>Gesetzt, wenn es sich um eine DVB-C Quellgruppe handelt.</returns>
        private Channel_C?Tune(CableGroup group)
        {
            // Not us
            if (group == null)
            {
                return(null);
            }

            // Validate
            if (FrontendType != FrontendType.Cable)
            {
                throw new DVBException("Expected " + FrontendType.ToString() + " Channel");
            }

            // Helper
            var data =
                new Channel_C
            {
                Frequency  = group.Frequency,
                SymbolRate = group.SymbolRate,
            };

            // Spectrum inversion
            switch (group.SpectrumInversion)
            {
            case SpectrumInversions.On: data.Inversion = SpectrumInversion.On; break;

            case SpectrumInversions.Off: data.Inversion = SpectrumInversion.Off; break;

            case SpectrumInversions.Auto: data.Inversion = SpectrumInversion.Auto; break;

            default: data.Inversion = SpectrumInversion.Auto; break;
            }

            // Modulation
            switch (group.Modulation)
            {
            case CableModulations.QAM16: data.Qam = Qam.Qam16; break;

            case CableModulations.QAM32: data.Qam = Qam.Qam32; break;

            case CableModulations.QAM64: data.Qam = Qam.Qam64; break;

            case CableModulations.QAM128: data.Qam = Qam.Qam128; break;

            case CableModulations.QAM256: data.Qam = Qam.Qam256; break;

            default: data.Qam = Qam.Qam64; break;
            }

            // Check supported modes
            switch (group.Bandwidth)
            {
            case Bandwidths.Six: data.Bandwidth = BandwidthType.Six; break;

            case Bandwidths.Seven: data.Bandwidth = BandwidthType.Seven; break;

            case Bandwidths.Eight: data.Bandwidth = BandwidthType.Eight; break;

            case Bandwidths.NotDefined: data.Bandwidth = BandwidthType.None; break;

            default: data.Bandwidth = BandwidthType.Auto; break;
            }

            // Process
            return(data.SetChannel(this));
        }
Beispiel #4
0
        /// <summary>
        /// Wählt eine Quellgruppe an.
        /// </summary>
        /// <param name="group">Die Daten zur Quellgruppe.</param>
        /// <returns>Gesetzt, wenn es sich um eine DVB-C Quellgruppe handelt.</returns>
        private bool SendChannel(CableGroup group)
        {
            // Not us
            if (group == null)
            {
                return(false);
            }

            // Validate
            if (FrontendType != FrontendType.Cable)
            {
                throw new DVBException("Expected " + FrontendType.ToString() + " Channel");
            }

            // Helper
            var channel =
                new Channel_C
            {
                Frequency  = group.Frequency,
                SymbolRate = group.SymbolRate,
            };

            // Spectrum inversion
            switch (group.SpectrumInversion)
            {
            case SpectrumInversions.On: channel.Inversion = SpectrumInversion.On; break;

            case SpectrumInversions.Off: channel.Inversion = SpectrumInversion.Off; break;

            case SpectrumInversions.Auto: channel.Inversion = SpectrumInversion.Auto; break;

            default: channel.Inversion = SpectrumInversion.Auto; break;
            }

            // Modulation
            switch (group.Modulation)
            {
            case CableModulations.QAM16: channel.Qam = Qam.Qam16; break;

            case CableModulations.QAM32: channel.Qam = Qam.Qam32; break;

            case CableModulations.QAM64: channel.Qam = Qam.Qam64; break;

            case CableModulations.QAM128: channel.Qam = Qam.Qam128; break;

            case CableModulations.QAM256: channel.Qam = Qam.Qam256; break;

            default: channel.Qam = Qam.Qam64; break;
            }

            // Check supported modes
            switch (group.Bandwidth)
            {
            case Bandwidths.Six: channel.Bandwidth = BandwidthType.Six; break;

            case Bandwidths.Seven: channel.Bandwidth = BandwidthType.Seven; break;

            case Bandwidths.Eight: channel.Bandwidth = BandwidthType.Eight; break;

            case Bandwidths.NotDefined: channel.Bandwidth = BandwidthType.None; break;

            default: channel.Bandwidth = BandwidthType.Auto; break;
            }

            // Process
            CheckChannel(CDVBFrontend_SetChannel(m_Class.ClassPointer, channel, false));

            // Check up for synchronisation
            Channel_C val1, val2;

            // Get channel twice
            CheckChannel(CDVBFrontend_GetChannel(m_Class.ClassPointer, out val1));
            CheckChannel(CDVBFrontend_GetChannel(m_Class.ClassPointer, out val2));

            // Did it
            return(true);
        }
        /// <summary>
        /// Analysiert die aktuelle Konfiguration des Suchlaufs auf Basis
        /// der DVB <i>Network Information Table (NIT)</i> Informationen.
        /// </summary>
        private void AnalyserThread()
        {
            // Be safe
            try
            {
                // Configure language
                UserProfile.ApplyLanguage();

                // Uses hardware manager
                using (HardwareManager.Open())
                {
                    // Attach to the hardware itself
                    Hardware device = HardwareManager.OpenHardware(Profile);

                    // Reset counters
                    TotalLocations  = m_Locations.Count;
                    CurrentLocation = 0;

                    // Last inversion used
                    SpectrumInversions lastInversion = SpectrumInversions.On;

                    // Process all transponders
                    foreach (GroupLocation location in m_Locations)
                    {
                        // Update counter
                        ++CurrentLocation;

                        // Reset
                        CurrentLocationGroupsPending = 0;
                        CurrentLocationGroup         = 0;

                        // Check caller
                        if (!LocationStart(location))
                        {
                            return;
                        }

                        // Groups found on this location
                        Dictionary <SourceGroup, bool> found = new Dictionary <SourceGroup, bool>();

                        // Groups with valid network information - only those are considered
                        List <SourceGroup> nitAvailable = new List <SourceGroup>();

                        // Load counter
                        CurrentLocationGroupsPending = location.Groups.Count;

                        // Process all groups
                        foreach (SourceGroup group in location.Groups)
                        {
                            // Get the expected type
                            Type groupType = group.GetType();

                            // Clone the group
                            SourceGroup newGroup = SourceGroup.FromString <SourceGroup>(group.ToString());

                            // Count up
                            --CurrentLocationGroupsPending;
                            ++CurrentLocationGroup;

                            // See if this is already processed
                            if (null != found.Keys.FirstOrDefault(p => p.CompareTo(newGroup, true)))
                            {
                                continue;
                            }

                            // Check for external termination
                            if (null == m_Worker)
                            {
                                return;
                            }

                            // Not supported
                            if (!Profile.SupportsGroup(newGroup) || !device.CanHandle(newGroup))
                            {
                                // Remember
                                m_UnhandledGroups.Add(newGroup);

                                // Next
                                continue;
                            }

                            // Check caller
                            if (!GroupStart(location, newGroup))
                            {
                                return;
                            }

                            // Attach to the group
                            if (null != SelectGroup(device, location, newGroup, ref lastInversion))
                            {
                                // See if we are a cable group
                                CableGroup cableGroup = newGroup as CableGroup;

                                // Attach to the NIT
                                var nit = device.GetLocationInformation(15000);
                                if (null != nit)
                                {
                                    // Remember
                                    nitAvailable.Add(newGroup);

                                    // Process
                                    foreach (SourceGroup other in nit.Groups)
                                    {
                                        if (other.GetType() == groupType)
                                        {
                                            // See if this is a cable group
                                            CableGroup otherCable = other as CableGroup;

                                            // Update inversion
                                            if (null != otherCable)
                                            {
                                                // Other must be cable, too
                                                if (null == cableGroup)
                                                {
                                                    continue;
                                                }

                                                // Use same parameters
                                                otherCable.SpectrumInversion = cableGroup.SpectrumInversion;
                                                otherCable.Bandwidth         = cableGroup.Bandwidth;
                                            }

                                            // Report
                                            if (ScannerTraceSwitch.Level >= TraceLevel.Info)
                                            {
                                                Trace.WriteLine(string.Format(Properties.Resources.Trace_Scanner_NIT, other), ScannerTraceSwitch.DisplayName);
                                            }

                                            // Mark it
                                            found[other] = true;
                                        }
                                    }
                                }
                            }

                            // Check caller
                            if (!GroupDone(location, newGroup))
                            {
                                return;
                            }
                        }

                        // Create a brand new scan location
                        ScanLocation scan = location.ToScanLocation();

                        // Try to update
                        foreach (SourceGroup group in nitAvailable)
                        {
                            // Try to find the full qualified name
                            SourceGroup nitGroup = found.Keys.FirstOrDefault(p => p.CompareTo(group, true));

                            // Update
                            if (null == nitGroup)
                            {
                                scan.Groups.Add(group);
                            }
                            else
                            {
                                scan.Groups.Add(nitGroup);
                            }
                        }

                        // Just remember
                        m_AnalyseResult[location] = scan;

                        // Check caller
                        if (!LocationDone(location))
                        {
                            return;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                // Remember
                m_ThreadException = e;
            }
        }
Beispiel #6
0
 /// <summary>
 /// Erzeugt eine neue Auswahlinstanz.
 /// </summary>
 /// <param name="source">Die zu betrachtende Quelle.</param>
 public CableGroupSelector(SourceSelection source)
 {
     // Remember
     m_Group = (CableGroup)source.Group;
 }