1
0
mirror of https://github.com/JvanKatwijk/qt-dab.git synced 2025-10-06 00:02:40 +02:00

showing the working segment of the TII data

This commit is contained in:
Jan
2025-01-03 13:10:35 +01:00
parent e649c8642f
commit 926eef4b16
11 changed files with 1773 additions and 540 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,624 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>configWidget</class>
<widget class="QWidget" name="configWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>428</width>
<height>535</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration and control</string>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Configuration and control widget.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QRadioButton" name="orderServiceIds">
<property name="text">
<string>serviceIds</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="orderAlfabetical">
<property name="text">
<string>alphabetically</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="ordersubChannelIds">
<property name="text">
<string>subchannelIds</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="smallPushButton" name="skinButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select one of a few &amp;quot;skin&amp;quot;s for the widgets in the program. Will be effective the next program invocation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>skin</string>
</property>
</widget>
</item>
<item>
<widget class="smallPushButton" name="pathButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The files containing slides - if being saved - will be saved in a folder/directory Qt-DAB-files in the home folder/directory. The tii files as well as the log file (both of caourse when enabled) are also stored in that folder/directory. The path can be altered by entering an EXISTING folder/directory in the menu that appears when the button is touched. That path will be effective the next program invocation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>path</string>
</property>
</widget>
</item>
<item>
<widget class="smallPushButton" name="audioSelectButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Choose between portaudio or Qt-audio as audio handler (will be effective next program invocation). Note that if no audio channels for the Qt_audio driver can be found, the default setting of portaudio is applied.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>audio</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="smallPushButton" name="fontButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The font for displaying the servicenames in the ensemble display can be set here.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>font</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="fontSizeSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The font size of the service lists (both the ensemble view and the favorites view) can be set.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>8</number>
</property>
<property name="maximum">
<number>15</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="smallPushButton" name="fontColorButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The color used to display the servicenames in the ensemblewidget can be selected here.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>font color</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The switch time - expressed in seconds - is the time the processor will wait before conclusing that there is no data detected in the channel.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>switch time (in sec)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="smallSpinBox" name="switchDelaySetting">
<property name="toolTip">
<string>Set here the delay, when searching for data in a channel, in seconds</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The mute time is the time, the audio will be suppressed when activating the mute function. It is expressed in minutes. Muting is controlled by the &amp;quot;speaker&amp;quot; symbol on the main widget.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>mute time (in min)</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="smallSpinBox" name="muteTimeSetting">
<property name="toolTip">
<string>Set here the mute time in minutes</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QSpinBox" name="tiiCollisions">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Collisions. It is obviously possible that one receives more than one mainId with a fiven subId. Setting this sponbox to a number indicating a subId, tells the software to look for all mainIds that use this subId.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="tiiFilter">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The tii filter is an additional filter to reduce the number of false positives that may be seen in RII detection when the tii threshold. The filter looks at the signal values representing the potential TII value (detected by looking at the signal strength) and looks whether or not the phases of the components of the potential TII value are reasonably wellformed.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>tiifilter</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QSpinBox" name="tiiThreshold_setter">
<property name="font">
<font>
<pointsize>13</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;TII threshold. The TII threshold is used in the detection of TII values in the NULL periods of the DAB frames. Signals with an strength lower than the threshold value are considered noise. Of course, the lower the value, the more chance there is to get false positive. The minimum value is set to 5 dB. Using a small antenna I use 10dB, with the filter set &amp;quot;on&amp;quot; and get very few false positives.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="suffix">
<string> dB</string>
</property>
<property name="minimum">
<number>6</number>
</property>
<property name="value">
<number>6</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>tii threshold</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="smallPushButton" name="resetButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Push this button to reset, i.e. restart synchronization.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>reset</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="smallPushButton" name="devicewidgetButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Cantarell</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;show or hide the widget for controlling the device.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>device</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="smallPushButton" name="scheduleButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Touching this button allows specifying an element for the scheduler&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>schedule</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="smallPushButton" name="snrButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Cantarell</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The snrViewer button controls a widget that - when enabled - will show the development of SNR over time. Parameters of the screen, height (the Y-axis) and the number of measurements (X-axis) can be set in the configuration widget.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>snr viewer</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="smallPushButton" name="dumpButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Push this button to save the raw input. Pushing will cause a menu to appear where a filename can be selected. Please note the big filesizes!&lt;/p&gt;&lt;p&gt;Push again to stop recording. You can reload it by using the file input (*.sdr) option. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Raw dump</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="smallPushButton" name="set_coordinatesButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Cantarell</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Touching this button shows a small menu where you can fill in the coordinates (in decimal notation) of your location.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>coordinates</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="smallPushButton" name="portSelector">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;touching this button allws you to select a port for communication with a webbrowser when showing a map.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>port</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="smallPushButton" name="dlTextButton">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Save the lines of text that appear as dynamic label&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>dlText</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="smallPushButton" name="loadTableButton">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Touching this button will instruct the software to load a fresh database. Note that this only works if either the software is precompiled or you have installed the small library as discussed in the installation instructions.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>load table</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="smallComboBox" name="decoderSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Decoding DAB means interpreting the output of the DPSK on the FFT output, the latter meaning taking the phase difference between corresponding carriers in subsequent FFT symbols.&lt;/p&gt;&lt;p&gt;Ideally these phases are a multiple of 90 degrees, in reality they are less precise. The decoders here all try to map the results of the previous phase onto &amp;quot;soft bits&amp;quot;, i.e. values between -127 and 127. Each &amp;quot;dot&amp;quot; is mapped onto two bits, one depending on the X coordinate, the other on the &amp;quot;Y&amp;quot; one&lt;/p&gt;&lt;p&gt;The differences between the decoders is the way they look at the way the measured values differ from the ideal ones. In general, the most simple one, here the &amp;quot;decoder_a&amp;quot;, gives the best results.&lt;/p&gt;&lt;p&gt;The quality can be seen by looking at the fic BER value, that shows the percentage of the input soft bits in FIC processing that are wrong (and needed to be repaired by the viterbi decoder)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="smallComboBox" name="streamoutSelector">
<property name="maximumSize">
<size>
<width>162</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select the audio channel, depends on the OS you are running on&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="smallComboBox" name="deviceSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a device. Devices appearing in the list here are configured in the Qt-DAB software. Note that the DAB software tries to load the required device interface functions dynamically, so a device appearing in this list is not automatically supported, you need to have installed a device driver&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_3">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The CPU load is an indication of the load when executing the program. The load tells the total load on the CPU, i.e. inclusing the load of other programs that might be running.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>CPU load</string>
</property>
</widget>
</item>
<item>
<widget class="QLCDNumber" name="loadDisplay">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The number tells the overall CPU load (so, not only the load caused by running Qt-DAB)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="frameShape">
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="closeDirect_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If you are bored with the explicit request to stop, touch this one, and stopping is direct&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>close direct</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="localBrowserSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set in the configuration that on starting the http service a browser will have to be started manually. Default is browser starts automatically. Effective immediately&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>start browser manually</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="utc_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If you want to see UTC in the logs select this one.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string> utc Selector</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="audioServices_only">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Many ensembles contain both audio and data services (e.g. TPEG, EPG). If selected here, only audio services and an EPG service - if in the ensemble - will be shown in the services list&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>audio services only</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="saveSlides">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If set, slides (pictures) appearing during transmissions are being saved&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>save slides</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="epg2xmlSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The EPG detector has two components, one collecting data to present as &amp;quot;time table&amp;quot; for today, the other one - using a library written by Julian Cable from the BBC - to generate textual xml.&lt;/p&gt;&lt;p&gt;If selected, the xml will be generated. Note howevet that we encountered at least one example where the library generating the textual xml causes a crash.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string> epg to xml</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="logger_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If set, a log file is maintained (as usual for windows in the folder in the home folder and for Linux in the directory /tmp in a folder/directory Qt-DAB-files) in a txt file :logFile.txt, in which activities such as selecting a device, channel, service, dump are written, preceded by the time of the activity.&lt;/p&gt;&lt;p&gt;The setting of the selector is maintained between program invocations.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string> logger</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="onTop">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set in the configuration whether or not the main widget should ALWAYS be op top. Note that setting will be applied the next time the program will start.&lt;/p&gt;&lt;p&gt;Note that in windows this may give roblems as e.g. a warning or selection widget may be hidden behind the main widget.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>main widget on top</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="correlationSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Synchronization of the receiver software with the incoming samplestream is done using a correlation technique. As the scope on the displaywidget often shows, there is more than a single peak in the correlation. Normally, the strongest peak is used, however, sometimes the difference in strength between peaks is so small, that the software changes its choice for the strongest (too) often. &lt;/p&gt;&lt;p&gt;Selecting this ensures that the software takes the first of the peaks that meers some strength criteria&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>first correlation</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="clearScan_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Setting the selector has effect when scanning. If set, the scan table is cleared whenever a new scan (mode &amp;quot;scan once&amp;quot;) is started.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>clear scan</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="etiActivated_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;eti files can be generated by Qt-DAB since version 5.x. Since generating an eti file from an ensemble seems incompatible with scanning, the scan button is replaced by an &amp;quot;eti&amp;quot; button when eti is activated.&lt;/p&gt;&lt;p&gt;Note that building up an eti file requires quite some resources.&lt;/p&gt;&lt;p&gt;If eti is activated, the scanButton is replaced by the etiButton. Touching that button shows a fileselection menu, after selecting a file the content of the ensemble is sent in eti format to the file. The eti session stops when (a) the eti button is touched again, (b) switching to another channel or (c) disabling eti by unchecking the checkbox.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>eti activated</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="epg_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When set, the software is instructed to start an EPG decoder in the backgrouns when an EPG sevice is detected on starting an ensemble.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>epg automatic</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="auto_http">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If this checkbox is set, then Qt-DAB will (try to) start up the http handler (i.e. the map handler) on the next invocation of the program.&lt;/p&gt;&lt;p&gt;Of course, it will only work if&lt;/p&gt;&lt;p&gt;(a) the local position is filled in, and &lt;/p&gt;&lt;p&gt;(b) the database with TII data is accessible&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>auto http</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="upload_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&amp;quot;upload enable&amp;quot; is a selector for - if configured - allowing some data to be uploaded to fmlist.org. When touching the ensemblename on top of the left part of the main widget, the current content of the ensemble is shown (in &amp;quot;.csv&amp;quot; format). If this selector is enabled - and if the feature is configured - you will be asked to accept (or deny) sending up the contents of the ensemble to &amp;quot;fmlist.org&amp;quot; (the site that is responsible for the database mapping the TII numbers to station names and station attributes.&lt;/p&gt;&lt;p&gt;The same for rh result of the single scan.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>upload enable</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>smallPushButton</class>
<extends>QPushButton</extends>
<header>smallpushbutton.h</header>
</customwidget>
<customwidget>
<class>smallComboBox</class>
<extends>QComboBox</extends>
<header>smallcombobox.h</header>
</customwidget>
<customwidget>
<class>smallSpinBox</class>
<extends>QSpinBox</extends>
<header location="global">smallspinbox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
<buttongroups>
<buttongroup name="buttonGroup"/>
</buttongroups>
</ui>

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>612</width>
<height>329</height>
<height>267</height>
</rect>
</property>
<property name="sizePolicy">
@@ -63,7 +63,7 @@
<x>0</x>
<y>0</y>
<width>224</width>
<height>153</height>
<height>91</height>
</rect>
</property>
</widget>
@@ -498,6 +498,9 @@
</item>
<item>
<widget class="smallPushButton" name="tiiButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This button controls the visibility of the so-called &amp;quot;dxDisplay&amp;quot;. If the dxScope is enabled - and the tii database is loaded (and your location is set), the dxDisplay shows the tii data, decoded in the current channel. This data encompasses not only the mainId and the subId, but also the name of the transmitter, and the distance from your specified location to that transmitter.&lt;/p&gt;&lt;p&gt;If the dxDisplay is NOT enabled, and the tii database is loaded, then the data on the transmitter whose data you are currently receiving is shown on the line to the left.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>tii disply</string>
</property>

View File

@@ -0,0 +1,612 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>configWidget</class>
<widget class="QWidget" name="configWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>527</width>
<height>378</height>
</rect>
</property>
<property name="windowTitle">
<string>Configuration and control</string>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Configuration and control widget.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QRadioButton" name="orderServiceIds">
<property name="text">
<string>serviceIds</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="orderAlfabetical">
<property name="text">
<string>alphabetically</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
<item>
<widget class="QRadioButton" name="ordersubChannelIds">
<property name="text">
<string>subchannelIds</string>
</property>
<attribute name="buttonGroup">
<string notr="true">buttonGroup</string>
</attribute>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QSpinBox" name="fontSizeSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The font size of the service lists (both the ensemble view and the favorites view) can be set.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>8</number>
</property>
<property name="maximum">
<number>15</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="smallPushButton" name="fontButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The font for displaying the servicenames in the ensemble display can be set here.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>font</string>
</property>
</widget>
</item>
<item>
<widget class="smallPushButton" name="fontColorButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The color used to display the servicenames in the ensemblewidget can be selected here.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>font color</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QSpinBox" name="tiiThreshold_setter">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;TII threshold. The TII threshold is used in the detection of TII values in the NULL periods of the DAB frames. Of course, the lower the value, the more chance there is to get false positives.&lt;/p&gt;&lt;p&gt;Minimum value is set to 6 dB.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="suffix">
<string> dB</string>
</property>
<property name="minimum">
<number>6</number>
</property>
<property name="value">
<number>6</number>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="tiiFilter">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;It shows that setting a lower threshold value allows (too) many false tii messages. A filter can be selected that inspects the potential tii values and blocks some of thoese that seem false.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>tii filter</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="tiiCollisions">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If setting a subId value different from 0, the software searches for ALL mainIds, associated with that subId.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="smallPushButton" name="audioSelectButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Choose between portaudio or Qt-audio as audio handler (will be effective next program invocation). Note that if no audio channels for the Qt_audio driver can be found, the default setting of portaudio is applied.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>audio</string>
</property>
</widget>
</item>
<item>
<widget class="smallPushButton" name="pathButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The files containing slides - if being saved - will be saved in a folder/directory Qt-DAB-files in the home folder/directory. The tii files as well as the log file (both of caourse when enabled) are also stored in that folder/directory. The path can be altered by entering an EXISTING folder/directory in the menu that appears when the button is touched. That path will be effective the next program invocation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>path</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_3">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The CPU load is an indication of the load when executing the program. The load tells the total load on the CPU, i.e. inclusing the load of other programs that might be running.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>CPU load</string>
</property>
</widget>
</item>
<item>
<widget class="QLCDNumber" name="loadDisplay">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The number tells the overall CPU load (so, not only the load caused by running Qt-DAB)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="frameShape">
<enum>QFrame::Shape::NoFrame</enum>
</property>
<property name="segmentStyle">
<enum>QLCDNumber::SegmentStyle::Flat</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The mute time is the time, the audio will be suppressed when activating the mute function.&lt;/p&gt;&lt;p&gt;It is expressed in minutes.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>mute time (in min)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="smallSpinBox" name="muteTimeSetting">
<property name="toolTip">
<string>Set here the mute time in minutes</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The switch time - expressed in seconds - is the time the processor will wait to see if there is&lt;/p&gt;&lt;p&gt;any data in a channel. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>switch time (in sec)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="smallSpinBox" name="switchDelaySetting">
<property name="toolTip">
<string>Set here the delay, when searching for data in a channel, in seconds</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="3" colspan="2">
<widget class="smallPushButton" name="loadTableButton">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Touching this button will instruct the software to load a fresh database. Note that this only works if either the software is precompiled or you have installed the small library as discussed in the installation instructions.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>load table</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="smallPushButton" name="devicewidgetButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Cantarell</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;show or hide the widget for controlling the device.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>device</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="smallPushButton" name="portSelector">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;touching this button allws you to select a port for communication with a webbrowser when showing a map.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>port</string>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="smallPushButton" name="dumpButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Push this button to save the raw input. Pushing will cause a menu to appear where a filename can be selected. Please note the big filesizes!&lt;/p&gt;&lt;p&gt;Push again to stop recording. You can reload it by using the file input (*.sdr) option. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Raw dump</string>
</property>
</widget>
</item>
<item row="0" column="2" colspan="2">
<widget class="smallPushButton" name="dlTextButton">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Save the lines of text that appear as dynamic label&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>dlText</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="smallPushButton" name="set_coordinatesButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Cantarell</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Touching this button shows a small menu where you can fill in the coordinates (in decimal notation) of your location.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>coordinates</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="smallPushButton" name="scheduleButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Touching this button allows specifying an element for the scheduler&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>schedule</string>
</property>
</widget>
</item>
<item row="0" column="4" colspan="2">
<widget class="smallPushButton" name="resetButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Push this button to reset, i.e. restart synchronization.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>reset</string>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="smallPushButton" name="skinButton">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select one of a few &amp;quot;skin&amp;quot;s for the widgets in the program. Will be effective the next program invocation.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>skin</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="smallPushButton" name="snrButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Cantarell</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The snrViewer button controls a widget that - when enabled - will show the development of SNR over time. Parameters of the screen, height (the Y-axis) and the number of measurements (X-axis) can be set in the configuration widget.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>snr viewer</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QCheckBox" name="upload_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&amp;quot;upload enable&amp;quot; is a selector for - if configured - allowing some data to be uploaded to fmlist.org. When touching the ensemblename on top of the left part of the main widget, the current content of the ensemble is shown (in &amp;quot;.csv&amp;quot; format). If this selector is enabled - and if the feature is configured - you will be asked to accept (or deny) sending up the contents of the ensemble to &amp;quot;fmlist.org&amp;quot; (the site that is responsible for the database mapping the TII numbers to station names and station attributes.&lt;/p&gt;&lt;p&gt;The same for the result of the single scan.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>upload enable</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="utc_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If you want to see UTC in the logs select this one.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string> utc Selector</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QCheckBox" name="epg2xmlSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The EPG detector has two components, one collecting data to present as &amp;quot;time table&amp;quot; for today,&lt;/p&gt;&lt;p&gt;the other one - using a library written by Julian Cable from the BBC - to generate textual xml.&lt;/p&gt;&lt;p&gt;If selected, the xml will be generated. Note howevet that we encountered at least one example&lt;/p&gt;&lt;p&gt;where the library generating the textual xml causes a crash.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string> epg to xml</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="closeDirect_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If you are bored with the explicit request to stop, touch this one, and stopping is direct&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>close without asking</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="epg_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When set, the software is instructed to start an EPG handler when an EPG sevice is detected on starting an ensemble.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>epg automatic</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="onTop">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set in the configuration whether or not the main widget should ALWAYS be op top. Note that setting will be applied the next time the program will start.&lt;/p&gt;&lt;p&gt;Note further that in Windows a problem may occur: a warning message might be invisible, hidden by the main widget op top.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>main widget on top</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="correlationSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Synchronization of the receiver software with the incoming samplestream is dome using a correlation algorithm. As the scope on the displaywidget often shows is that there is more than a single peak in the correlation. Normally, the strongest peak is used, however, sometimes the difference in stength between peaks is so small, that the &amp;quot;strongest&amp;quot; one changes quite often.&lt;/p&gt;&lt;p&gt;Selecting this ensures that the software takes the first of the peaks that meets some strength criteria&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>first correlation</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="etiActivated_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;eti files can be generated by Qt-DAB-5.x. Since generating an eti file from an ensemble seems incompatible with scanning, the scan button is replaced by an &amp;quot;eti&amp;quot; button when eti is activated.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Note that building up an eti file requires quite some resources.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If eti is activated, the scanButton is replaced by the etiButton. Touching that button shows a fileselection menu, after selecting a file the content of the ensemble is sent in eti format to the file. The eti session stops when (a) the eti button is touched again, (b) switching to another channel or (c) disabling eti by unchecking the checkbox.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>eti activated</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QCheckBox" name="localBrowserSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set in the configuration that on starting the http service a browser will have to be started manually. By default browser starts automaticall when the http button is set. Effective immediately&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>start browser manually</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="clearScan_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Setting the selector has effect when scanning. If set, the scan table is cleared whenever a new scan (mode &amp;quot;single scan&amp;quot;) is started.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>clear scan</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="saveSlides">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If set, slides (pictures) appearing during transmissions are being saved&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>save slides</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QCheckBox" name="audioServices_only">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Many ensembles contain both audio and data services (e.g. TPEG, EPG). If selected here, only audio services and the EPG service if part of the ensemble will be shown in the services list&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>audio services only</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="auto_http">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If this checkbox is set, then Qt-DAB will (try to) start up the http handler (i.e. the map handler) on the next invocation of the program.&lt;/p&gt;&lt;p&gt;Of course, it will only work if&lt;/p&gt;&lt;p&gt;(a) the local position is filled in, and &lt;/p&gt;&lt;p&gt;(b) the database with TII data is accessible&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>auto http</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="logger_selector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;If set, a log file is maintained (as usual for windows in the folder in the home folder and for Linux in the directory /tmp in a folder/directory Qt-DAB-files) in a txt file :logFile.txt, in which activities such as selecting a device, channel, service, dump are written, preceded by the time of the activity.&lt;/p&gt;&lt;p&gt;The setting of the selector is maintained between program invocations.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string> logger</string>
</property>
</widget>
</item>
<item>
<widget class="smallComboBox" name="decoderSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Decoding DAB means interpreting the output of the DPSK on the FFT output, the latter meaning taking the phase difference between corresponding carriers in subsequent FFT symbols.&lt;/p&gt;&lt;p&gt;Ideally these phases are a multiple of 90 degrees, in reality they are less precise. The decoders here all try to map the results of the previous phase onto &amp;quot;soft bits&amp;quot;, i.e. values between -127 and 127. Each &amp;quot;dot&amp;quot; is mapped onto two bits, one depending on the X coordinate, the other on the &amp;quot;Y&amp;quot; one&lt;/p&gt;&lt;p&gt;The differences between the decoders is the way they look at the way the measured values differ from the ideal ones. In general, the most simple one, here the &amp;quot;decoder_a&amp;quot;, gives the best results.&lt;/p&gt;&lt;p&gt;The quality can be seen by looking at the fic BER value, that shows the percentage of the input soft bits in FIC processing that are wrong (and needed to be repaired by the viterbi decoder)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="smallComboBox" name="streamoutSelector">
<property name="maximumSize">
<size>
<width>162</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select the audio channel, depends on the OS you are running on&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item>
<widget class="smallComboBox" name="deviceSelector">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a device. Devices appearing in the list here are configured in the Qt-DAB software. Note that the DAB software tries to load the required device interface functions dynamically, so a device appearing in this list is not automatically supported, you need to have installed a device driver&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>smallPushButton</class>
<extends>QPushButton</extends>
<header>smallpushbutton.h</header>
</customwidget>
<customwidget>
<class>smallComboBox</class>
<extends>QComboBox</extends>
<header>smallcombobox.h</header>
</customwidget>
<customwidget>
<class>smallSpinBox</class>
<extends>QSpinBox</extends>
<header location="global">smallspinbox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
<buttongroups>
<buttongroup name="buttonGroup"/>
</buttongroups>
</ui>

View File

@@ -44,7 +44,6 @@
theFFT (4 * 512, false),
dabSettings_p (dabSettings) {
(void)mr;
int sliderValue;
QString settingsHeader = DISPLAY_WIDGET_SETTINGS;
setupUi (&myFrame);
set_position_and_size (dabSettings_p, &myFrame,
@@ -64,7 +63,7 @@ int sliderValue;
correlationScope_p = new correlationScope (correlationDisplay,
256, dabSettings_p);
TII_Scope_p = new spectrumScope (tiiDisplay,
512, dabSettings_p);
192, dabSettings_p);
channelScope_p = new channelScope (channelPlot,
NR_TAPS,
dabSettings_p);
@@ -75,7 +74,7 @@ int sliderValue;
512, 50);
//
// and the settings for the sliders:
sliderValue = value_i (dabSettings_p,
int sliderValue = value_i (dabSettings_p,
DISPLAY_WIDGET_SETTINGS,
"spectrumSlider", 30);
spectrumSlider -> setValue (sliderValue);
@@ -117,9 +116,9 @@ int sliderValue;
setMarkers = value_i (dabSettings_p,
DISPLAY_WIDGET_SETTINGS,
"setMarkers", 0) != 0;
show_marksButton -> setStyleSheet ("color:yellow");
QString qss = QString ("background-color: QColor (Qt::yellow), QColor(Qt::black)");
show_marksButton -> setStyleSheet (qss);
show_marksButton ->
setStyleSheet (
"background-color : green; color: white");
if (setMarkers)
show_marksButton -> setText ("no markers");
else
@@ -214,11 +213,6 @@ static floatQwt avg [4 * 512];
freq / 1000);
}
std::vector<corrElement> sort (std::vector<corrElement> in) {
std::vector<corrElement> res;
return res;
}
// for "corr" we get a segment of 1024 float values,
// with as second parameter a list of indices with maximum values
// and a list of transmitters
@@ -230,6 +224,7 @@ std::vector<corrElement> showData;
if (currentTab != SHOW_CORRELATION)
return;
(void)maxVals;
for (auto &theTransm : theTr) {
corrElement t;
@@ -244,7 +239,7 @@ std::vector<corrElement> showData;
}
float max = 0;
int maxInd = -1;
for (int i = 0; i < showData. size (); i ++) {
for (uint16_t i = 0; i < showData. size (); i ++) {
if (showData [i]. strength > max) {
maxInd = i;
max = showData [i]. strength;
@@ -282,7 +277,7 @@ std::vector<corrElement> showData;
Y_value [i] *= 50.0 / MMax;
waterfallScope_p -> display (X_axis, Y_value,
waterfallSlider -> value (),
0.1 * waterfallSlider -> value (),
v. size () / 2);
}
// for "null" we get a segment of 1024 timedomain samples
@@ -316,35 +311,40 @@ void displayWidget::show_null (Complex *v, int amount,
// for "tii" we get a segment of 2048 time domain samples,
// we take an FFT, do some averaging and display
void displayWidget::show_tii (std::vector<Complex> v, int freq) {
int l = v. size ();
floatQwt X_axis [512];
floatQwt Y_value [512];
floatQwt Y_value [512];
static floatQwt avg [4 * 512];
if (currentTab != SHOW_TII)
return;
theFFT. fft (v);
for (int i = 0; i < (int)(v. size ()) / 2; i ++) {
avg [i] = 0.5 * avg [i] + 0.5 * abs (v [l / 2 + i]);
avg [l / 2 + i] = 0.5 * avg [l / 2 + i] + 0.5 * abs (v [i]);
//
// in the regular scope we just show the data the tii decoder will
// be working on
floatQwt resVec [192];
for (int i = 0; i < 192; i ++) {
resVec [i] = 0;
for (int j = 0; j < 4; j ++) {
int index = (1024 + 2 * i + j * 384) % 1024;
resVec [i] += abs (v [index] + v [index + 1]);
}
X_axis [i] = i;
}
TII_Scope_p -> display (X_axis, resVec, 96,
tiiSlider -> value ());
for (int i = 0; i < 512; i ++) {
X_axis [i] = (freq - 1536000 / 2 + i * 1536000.0 / 512) / 1000000.0;
Y_value [i] = 0;
for (int j = 0; j < 4; j ++)
Y_value [i] += avg [4 * i + j];
Y_value [i] = get_db (Y_value [i]);
int index = (int)((float)i / 512 * 192);
Y_value [i] = resVec [index];
X_axis [i] = index;
}
TII_Scope_p -> display (X_axis, Y_value, freq / 1000,
tiiSlider -> value ());
for (int i = 0; i < 512; i ++)
Y_value [i] = (Y_value [i] - get_db (0)) / 6;
Y_value [i] = 4 * (Y_value [i] - get_db (0)) / 8;
waterfallScope_p -> display (X_axis, Y_value,
waterfallSlider -> value (),
freq / 1000);
1.5 * waterfallSlider -> value (),
96);
}
void displayWidget::show_channel (const std::vector<Complex> Values) {
@@ -483,7 +483,7 @@ void displayWidget::show_cpuLoad (float use) {
void displayWidget::show_transmitters (std::vector<transmitterDesc> &tr) {
QString textList;
for (int i = 0; i < tr. size (); i ++) {
for (uint16_t i = 0; i < tr. size (); i ++) {
uint16_t mainId = tr [i]. theTransmitter. mainId;
uint16_t subId = tr [i]. theTransmitter. subId;
QString trId = QString ("(") + QString::number (mainId) +

View File

@@ -97,10 +97,10 @@ bool brush;
}
spectrumCurve. attach (plotgrid);
Marker = new QwtPlotMarker();
Marker -> setLineStyle (QwtPlotMarker::VLine);
Marker -> setLinePen (QPen (Qt::red));
Marker -> attach (plotgrid);
// Marker = new QwtPlotMarker();
// Marker -> setLineStyle (QwtPlotMarker::VLine);
// Marker -> setLinePen (QPen (Qt::red));
// Marker -> attach (plotgrid);
plotgrid -> enableAxis (QwtPlot::yLeft);
bitDepth = 12;
normalizer = valueFor (bitDepth);
@@ -108,7 +108,7 @@ bool brush;
spectrumScope::~spectrumScope () {
delete Marker;
// delete Marker;
delete grid;
}
@@ -116,7 +116,7 @@ void spectrumScope::display (floatQwt *X_axis,
floatQwt *Y_value,
int freq, int Amp) {
(void)freq;
float Max = Amp / 100.0 * (-get_db (0));
float Max = Amp / 50.0 * (-get_db (0));
plotgrid -> setAxisScale (QwtPlot::xBottom,
(floatQwt)X_axis [0],
X_axis [displaySize - 1]);
@@ -128,8 +128,8 @@ void spectrumScope::display (floatQwt *X_axis,
Y_value [0] = get_db (0);
Y_value [displaySize - 1] = get_db (0);
spectrumCurve. setSamples (X_axis, Y_value, 512);
Marker -> setXValue (0);
spectrumCurve. setSamples (X_axis, Y_value, displaySize);
// Marker -> setXValue (0);
plotgrid -> replot ();
}

View File

@@ -34,14 +34,18 @@
displaySize (displaySize_i),
rasterSize (rasterSize_i) {
colorMap = new QwtLinearColorMap (Qt::darkCyan, Qt::red);
colorMap -> addColorStop (0.1, Qt::cyan);
colorMap -> addColorStop (0.0, Qt::cyan);
// colorMap -> addColorStop (0.1, Qt::cyan);
colorMap -> addColorStop (0.4, Qt::green);
colorMap -> addColorStop (0.7, Qt::yellow);
colorMap -> addColorStop (0.6, Qt::yellow);
colorMap -> addColorStop (0.8, Qt::red);
rightAxis = plotgrid -> axisWidget (QwtPlot::yRight);
axisMap = new QwtLinearColorMap (Qt::darkCyan, Qt::red);
axisMap -> addColorStop (0.1, Qt::cyan);
axisMap -> addColorStop (0.0, Qt::cyan);
// axisMap -> addColorStop (0.1, Qt::cyan);
axisMap -> addColorStop (0.4, Qt::green);
axisMap -> addColorStop (0.7, Qt::yellow);
axisMap -> addColorStop (0.6, Qt::yellow);
axisMap -> addColorStop (0.8, Qt::red);
this -> setColorMap (colorMap);
this -> setDisplayMode (QwtPlotSpectrogram::ImageMode, true);
@@ -96,7 +100,7 @@ int width = (int)(X_axis [displaySize - 1] - orig);
width,
rasterSize,
displaySize,
amp / 2);
amp);
this -> setData (WaterfallData);
plotgrid -> setAxisScale (QwtPlot::xBottom,

View File

@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>774</width>
<width>780</width>
<height>607</height>
</rect>
</property>
@@ -36,7 +36,7 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The tabwidget here contains the tabs for the different scopes, supported by this Qt-DAB implementation&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="currentIndex">
<number>1</number>
<number>3</number>
</property>
<widget class="QWidget" name="spectr">
<attribute name="title">
@@ -167,7 +167,7 @@
<item>
<widget class="QwtPlot" name="tiiDisplay">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The TII is encoded in the NULL period of a DAB frame. The scope shows the spectrum, the small vertical hair-like projections are the &amp;quot;bins&amp;quot;. Their position in the spectrum and their mutial ditances define the TII value. With a database the TII can be mapped onto a transmittername and location.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The TII is encoded in the NULL period of a DAB frame. The NULL part is transformed into 1536 carriers, where the data is repeated 4 times, each time in a segment of 384 carriers. The data elements of the TII value are build up in 4 rods, each consisting on two subsequent carriers.&lt;/p&gt;&lt;p&gt;The scope shows the 192 elements of the collapsed data. The TII values are (in some cases) recognizable as 4 rods. The 4 rods are forming a 4 out of 8 code.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>

View File

@@ -203,7 +203,7 @@ char manufac [256], product [256], serial [256];
}
if (rtlsdr_set_tuner_bandwidth != nullptr)
rtlsdr_set_tuner_bandwidth (theDevice, KHz (1536));
rtlsdr_set_tuner_bandwidth (theDevice, KHz (1575));
rtlsdr_set_tuner_gain_mode (theDevice, 1);
//
// See what the saved values are and restore the GUI settings

View File

@@ -186,7 +186,7 @@ char manufac [256], product [256], serial [256];
}
rtlsdr_set_center_freq (theDevice, 220000000);
rtlsdr_set_tuner_bandwidth (theDevice, KHz (1536));
rtlsdr_set_tuner_bandwidth (theDevice, KHz (1575));
rtlsdr_set_tuner_gain_mode (theDevice, 1);
//
// See what the saved values are and restore the GUI settings

View File

@@ -249,6 +249,8 @@ QVector<tiiData> theResult; // results
float threshold = pow (10, (float)threshold_db / 10); // threshold above noise
int Teller = 0;
if (selected_subId > 0) // handling collisions
tiiFilter = false;
for (int32_t idx = -carriers / 2; idx < carriers / 2; idx += 2) {
const int32_t fftIdx = idx < 0 ? idx + T_u : idx + 1;
decodedBuffer [Teller++] +=