Compare commits
No commits in common. 'dev' and 'master' have entirely different histories.
44 changed files with 53207 additions and 28966 deletions
|
Before Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 326 KiB |
@ -1,66 +0,0 @@
|
||||
# Manual |
||||
This manual applies to the "fft-multi-decoder_fixed_hackrf.grc" flowgraph |
||||
|
||||
## graphs |
||||
 |
||||
### freq and volume sliders |
||||
freq_tune = frequency of SDR hardware |
||||
volumeLR = volume for left and right channel |
||||
volumeC = volume for center channel |
||||
freq1..9 = frequency of all channels |
||||
### scopes |
||||
spectrum of input signal |
||||
|
||||
spectrum of filtered input signal for single channel (first 6 channels) |
||||
spectrum of signal after FM demodulation (first 6 channels) |
||||
constellation after PSK decoder (first 6 channels) |
||||
### gain and loop_bw sliders |
||||
intermediate frequency-, baseband- and radio frequency gain of SDR hardware |
||||
|
||||
loop_bw = loop bandwidth of all PSK decoders |
||||
|
||||
|
||||
## RDS Table |
||||
 |
||||
### table |
||||
hint: hover over text to get more details e.g. time -> date, RT -> RT+ |
||||
click LCR buttons to hear this channel on left/right/center audio |
||||
|
||||
### buttons |
||||
code.interact |
||||
- launches interactive python console (inside "rds_parser_table_qt_Widget" instance) in the terminal window GRC was launched from |
||||
parser object accessible via "self.tableobj" variable |
||||
- can only be used, if GRC was launched from the terminal |
||||
- pauses execution of parser |
||||
- exit shell and resume execution with CTRL-D or "exit()" |
||||
|
||||
show IH data |
||||
- display InHouse (groupType 6A) data of all stations |
||||
|
||||
save |
||||
- save current state of parser to data directory |
||||
|
||||
print profile |
||||
- print profiler info (currently disabled) |
||||
|
||||
searchMode |
||||
- switch station_search block on/off |
||||
|
||||
### decoder info |
||||
- red/green : RDS decoder sync status |
||||
- overline/underline: symbol combiner status |
||||
|
||||
## TMC list |
||||
### event/location filters |
||||
enter = apply filter |
||||
### event list |
||||
scroll to bottom to follow new events |
||||
|
||||
## TMC map |
||||
open google_maps.html from /data in webbrowser |
||||
|
||||
- click on background = reload/update markers (closes all info windows) |
||||
- click on marker = open info window |
||||
- hover over text in info window to get more details (time-> date, event string -> raw MGM data) |
||||
- t-key = toggle (google) traffic layer on/off |
||||
- red lines from tmc event markers show extent of event |
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1 +0,0 @@
|
||||
put TMC location table (.DAT files) in this directory |
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,10 +1,10 @@
|
||||
<?xml version="1.0"?> |
||||
<block> |
||||
<name>station_search</name> |
||||
<key>multirds_station_search</key> |
||||
<name>max_freq</name> |
||||
<key>multirds_max_freq</key> |
||||
<category>[multirds]</category> |
||||
<import>import multirds</import> |
||||
<make>multirds.station_search($fft_len, $num_decoders, $center_freq, $samp_rate,$round_to,$debug)</make> |
||||
<make>multirds.max_freq($fft_len, $num_decoders, $center_freq, $samp_rate,$round_to,$debug)</make> |
||||
<!-- Make one 'param' node for every Parameter you want settable from the GUI. |
||||
Sub-nodes: |
||||
* name |
||||
@ -0,0 +1,38 @@
|
||||
<?xml version="1.0"?> |
||||
<block> |
||||
<name>Multi RDS Printer</name> |
||||
<key>multirds_multi_rds_printer</key> |
||||
<category>[multirds]</category> |
||||
<import>import multirds</import> |
||||
<make>multirds.multi_rds_printer($print_freq,$nPorts)</make> |
||||
<!-- Make one 'param' node for every Parameter you want settable from the GUI. |
||||
Sub-nodes: |
||||
* name |
||||
* key (makes the value accessible as $keyname, e.g. in the make node) |
||||
* type --> |
||||
<param> |
||||
<name>Print Frequency</name> |
||||
<key>print_freq</key> |
||||
<value>10</value> |
||||
<type>int</type> |
||||
</param> |
||||
|
||||
<!-- Make one 'sink' node per input. Sub-nodes: |
||||
* name (an identifier for the GUI) |
||||
* type |
||||
* vlen |
||||
* optional (set to 1 for optional inputs) --> |
||||
<param> |
||||
<name>Number of Ports</name> |
||||
<key>nPorts</key> |
||||
<value>2</value> |
||||
<type>int</type> |
||||
<hide>part</hide> |
||||
</param> |
||||
<sink> |
||||
<name>in</name> |
||||
<type>message</type> |
||||
<nports>$nPorts</nports> |
||||
<!--<optional>1</optional>--> |
||||
</sink> |
||||
</block> |
||||
@ -1,219 +0,0 @@
|
||||
<?xml version='1.0' encoding='utf-8'?> |
||||
<?grc format='1' created='3.7.11'?> |
||||
<flow_graph> |
||||
<timestamp>Thu Jun 8 13:29:17 2017</timestamp> |
||||
<block> |
||||
<key>options</key> |
||||
<param> |
||||
<key>author</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>window_size</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>category</key> |
||||
<value>[GRC Hier Blocks]</value> |
||||
</param> |
||||
<param> |
||||
<key>comment</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>description</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>_enabled</key> |
||||
<value>True</value> |
||||
</param> |
||||
<param> |
||||
<key>_coordinate</key> |
||||
<value>(8, 8)</value> |
||||
</param> |
||||
<param> |
||||
<key>_rotation</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>generate_options</key> |
||||
<value>qt_gui</value> |
||||
</param> |
||||
<param> |
||||
<key>hier_block_src_path</key> |
||||
<value>.:</value> |
||||
</param> |
||||
<param> |
||||
<key>id</key> |
||||
<value>top_block</value> |
||||
</param> |
||||
<param> |
||||
<key>max_nouts</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>qt_qss_theme</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>realtime_scheduling</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>run_command</key> |
||||
<value>{python} -u {filename}</value> |
||||
</param> |
||||
<param> |
||||
<key>run_options</key> |
||||
<value>prompt</value> |
||||
</param> |
||||
<param> |
||||
<key>run</key> |
||||
<value>True</value> |
||||
</param> |
||||
<param> |
||||
<key>thread_safe_setters</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>title</key> |
||||
<value></value> |
||||
</param> |
||||
</block> |
||||
<block> |
||||
<key>variable</key> |
||||
<param> |
||||
<key>comment</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>_enabled</key> |
||||
<value>True</value> |
||||
</param> |
||||
<param> |
||||
<key>_coordinate</key> |
||||
<value>(8, 160)</value> |
||||
</param> |
||||
<param> |
||||
<key>_rotation</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>id</key> |
||||
<value>samp_rate</value> |
||||
</param> |
||||
<param> |
||||
<key>value</key> |
||||
<value>32000</value> |
||||
</param> |
||||
</block> |
||||
<block> |
||||
<key>blocks_null_source</key> |
||||
<param> |
||||
<key>alias</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>bus_conns</key> |
||||
<value>[[0,],]</value> |
||||
</param> |
||||
<param> |
||||
<key>comment</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>affinity</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>_enabled</key> |
||||
<value>True</value> |
||||
</param> |
||||
<param> |
||||
<key>_coordinate</key> |
||||
<value>(471, 191)</value> |
||||
</param> |
||||
<param> |
||||
<key>_rotation</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>id</key> |
||||
<value>blocks_null_source_0</value> |
||||
</param> |
||||
<param> |
||||
<key>maxoutbuf</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>minoutbuf</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>num_outputs</key> |
||||
<value>1</value> |
||||
</param> |
||||
<param> |
||||
<key>type</key> |
||||
<value>byte</value> |
||||
</param> |
||||
<param> |
||||
<key>vlen</key> |
||||
<value>1</value> |
||||
</param> |
||||
</block> |
||||
<block> |
||||
<key>multirds_rds_decoder_redsea</key> |
||||
<param> |
||||
<key>alias</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>comment</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>affinity</key> |
||||
<value></value> |
||||
</param> |
||||
<param> |
||||
<key>debug</key> |
||||
<value>True</value> |
||||
</param> |
||||
<param> |
||||
<key>_enabled</key> |
||||
<value>True</value> |
||||
</param> |
||||
<param> |
||||
<key>_coordinate</key> |
||||
<value>(662, 111)</value> |
||||
</param> |
||||
<param> |
||||
<key>_rotation</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>id</key> |
||||
<value>multirds_rds_decoder_redsea_0</value> |
||||
</param> |
||||
<param> |
||||
<key>log</key> |
||||
<value>False</value> |
||||
</param> |
||||
<param> |
||||
<key>maxoutbuf</key> |
||||
<value>0</value> |
||||
</param> |
||||
<param> |
||||
<key>minoutbuf</key> |
||||
<value>0</value> |
||||
</param> |
||||
</block> |
||||
<connection> |
||||
<source_block_id>blocks_null_source_0</source_block_id> |
||||
<sink_block_id>multirds_rds_decoder_redsea_0</sink_block_id> |
||||
<source_key>0</source_key> |
||||
<sink_key>0</sink_key> |
||||
</connection> |
||||
</flow_graph> |
||||
Binary file not shown.
@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python |
||||
# -*- coding: utf-8 -*- |
||||
# |
||||
# Copyright 2016 <+YOU OR YOUR COMPANY+>. |
||||
# |
||||
# This is free software; you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation; either version 3, or (at your option) |
||||
# any later version. |
||||
# |
||||
# This software is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this software; see the file COPYING. If not, write to |
||||
# the Free Software Foundation, Inc., 51 Franklin Street, |
||||
# Boston, MA 02110-1301, USA. |
||||
# |
||||
|
||||
import numpy,pmt,functools |
||||
from gnuradio import gr |
||||
|
||||
class multi_rds_printer(gr.sync_block): |
||||
""" |
||||
docstring for block multi_rds_printer |
||||
""" |
||||
def __init__(self, print_freq,nPorts): |
||||
gr.sync_block.__init__(self, |
||||
name="multi_rds_printer", |
||||
in_sig=None, |
||||
out_sig=None) |
||||
self.PS="station name" |
||||
self.RT="radio text" |
||||
self.PI="C0FE" |
||||
self.stations = {} |
||||
self.print_freq = print_freq |
||||
self.print_count=print_freq |
||||
for i in range(0,nPorts): |
||||
self.message_port_register_in(pmt.intern('in%d'%i)) |
||||
self.set_msg_handler(pmt.intern('in%d'%i), functools.partial(self.handle_msg, port=i)) |
||||
def handle_msg(self, msg, port): |
||||
t = pmt.to_long(pmt.tuple_ref(msg, 0)) |
||||
m = pmt.symbol_to_string(pmt.tuple_ref(msg, 1)) |
||||
#code.interact(local=locals()) |
||||
if(t==0): |
||||
self.PI=m |
||||
self.stations[str(port)+"PI"]=m |
||||
elif(t==1): |
||||
self.PS=m |
||||
self.stations[str(port)+"PS"]=m |
||||
elif(t==4): |
||||
self.RT=m |
||||
self.stations[str(port)+"RT"]=m |
||||
self.print_count -= 1 |
||||
#print(self.stations) |
||||
if (self.print_count==0): |
||||
self.print_count=self.print_freq |
||||
print("########## stations ###########") |
||||
for key in sorted(self.stations): |
||||
print("%s: %s" % (key, self.stations[key])) |
||||
# def work(self, input_items, output_items): |
||||
# in0 = input_items[0] |
||||
# out = output_items[0] |
||||
# # <+signal processing here+> |
||||
# out[:] = in0 |
||||
# return len(output_items[0]) |
||||
|
||||
@ -1,44 +0,0 @@
|
||||
#!/usr/bin/env python |
||||
# -*- coding: utf-8 -*- |
||||
# |
||||
# Copyright 2017 <+YOU OR YOUR COMPANY+>. |
||||
# |
||||
# This is free software; you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation; either version 3, or (at your option) |
||||
# any later version. |
||||
# |
||||
# This software is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this software; see the file COPYING. If not, write to |
||||
# the Free Software Foundation, Inc., 51 Franklin Street, |
||||
# Boston, MA 02110-1301, USA. |
||||
# |
||||
|
||||
from gnuradio import gr, gr_unittest |
||||
from gnuradio import blocks |
||||
from multirds.rds_parser_table_qt import rds_parser_table_qt,rds_parser_table_qt_Signals |
||||
|
||||
class qa_rds_parser_table_qt (gr_unittest.TestCase): |
||||
def setUp (self): |
||||
self.tb = gr.top_block () |
||||
|
||||
def tearDown (self): |
||||
self.tb = None |
||||
def test_001_instantiation(self): |
||||
self.signals=rds_parser_table_qt_Signals() |
||||
freq_tune=98.8e6 |
||||
def set_freq_tune(self, freq_tune): |
||||
pass |
||||
self.parser_table = rds_parser_table_qt(self.signals,1,set_freq_tune,freq_tune,False, False,'../../data/',True) |
||||
# def test_001_t (self): |
||||
# set up fg |
||||
#self.tb.run () |
||||
# check data |
||||
#self.assertEqual("a", "as") |
||||
if __name__ == '__main__': |
||||
gr_unittest.run(qa_rds_parser_table_qt, "qa_rds_parser_table_qt.xml") |
||||
@ -1,45 +0,0 @@
|
||||
#!/usr/bin/env python |
||||
# -*- coding: utf-8 -*- |
||||
# |
||||
# Copyright 2017 <+YOU OR YOUR COMPANY+>. |
||||
# |
||||
# This is free software; you can redistribute it and/or modify |
||||
# it under the terms of the GNU General Public License as published by |
||||
# the Free Software Foundation; either version 3, or (at your option) |
||||
# any later version. |
||||
# |
||||
# This software is distributed in the hope that it will be useful, |
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
# GNU General Public License for more details. |
||||
# |
||||
# You should have received a copy of the GNU General Public License |
||||
# along with this software; see the file COPYING. If not, write to |
||||
# the Free Software Foundation, Inc., 51 Franklin Street, |
||||
# Boston, MA 02110-1301, USA. |
||||
# |
||||
|
||||
from gnuradio import gr, gr_unittest |
||||
from gnuradio import blocks |
||||
from rds_parser_table_qt import rds_parser_table_qt |
||||
import multirds |
||||
|
||||
class qa_tmc_parser (gr_unittest.TestCase): |
||||
|
||||
def setUp (self): |
||||
self.tb = gr.top_block () |
||||
|
||||
def tearDown (self): |
||||
self.tb = None |
||||
|
||||
def test_001_t (self): |
||||
# set up fg |
||||
self.tb.run () |
||||
# check data |
||||
#self.assertEqual("a", "as") |
||||
|
||||
#self.parser = multirds.tmc_parser("/home/clemens/forschungsarbeit/gr-multirds/data/", False, False, False,160) |
||||
#fails because tmc_parser tries to create gui object |
||||
if __name__ == '__main__': |
||||
gr_unittest.run(qa_tmc_parser, "qa_tmc_parser.xml") |
||||
|
||||
@ -1,105 +0,0 @@
|
||||
#!/usr/bin/env python2 |
||||
# -*- coding: utf-8 -*- |
||||
################################################## |
||||
# GNU Radio Python Flow Graph |
||||
# Title: Top Block |
||||
# Generated: Thu Jun 8 13:38:58 2017 |
||||
################################################## |
||||
|
||||
if __name__ == '__main__': |
||||
import ctypes |
||||
import sys |
||||
if sys.platform.startswith('linux'): |
||||
try: |
||||
x11 = ctypes.cdll.LoadLibrary('libX11.so') |
||||
x11.XInitThreads() |
||||
except: |
||||
print "Warning: failed to XInitThreads()" |
||||
|
||||
from PyQt4 import Qt |
||||
from gnuradio import blocks |
||||
from gnuradio import eng_notation |
||||
from gnuradio import gr |
||||
from gnuradio.eng_option import eng_option |
||||
from gnuradio.filter import firdes |
||||
from optparse import OptionParser |
||||
import multirds |
||||
import sys |
||||
from gnuradio import qtgui |
||||
|
||||
|
||||
class top_block(gr.top_block, Qt.QWidget): |
||||
|
||||
def __init__(self): |
||||
gr.top_block.__init__(self, "Top Block") |
||||
Qt.QWidget.__init__(self) |
||||
self.setWindowTitle("Top Block") |
||||
qtgui.util.check_set_qss() |
||||
try: |
||||
self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) |
||||
except: |
||||
pass |
||||
self.top_scroll_layout = Qt.QVBoxLayout() |
||||
self.setLayout(self.top_scroll_layout) |
||||
self.top_scroll = Qt.QScrollArea() |
||||
self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) |
||||
self.top_scroll_layout.addWidget(self.top_scroll) |
||||
self.top_scroll.setWidgetResizable(True) |
||||
self.top_widget = Qt.QWidget() |
||||
self.top_scroll.setWidget(self.top_widget) |
||||
self.top_layout = Qt.QVBoxLayout(self.top_widget) |
||||
self.top_grid_layout = Qt.QGridLayout() |
||||
self.top_layout.addLayout(self.top_grid_layout) |
||||
|
||||
self.settings = Qt.QSettings("GNU Radio", "top_block") |
||||
self.restoreGeometry(self.settings.value("geometry").toByteArray()) |
||||
|
||||
################################################## |
||||
# Variables |
||||
################################################## |
||||
self.samp_rate = samp_rate = 32000 |
||||
|
||||
################################################## |
||||
# Blocks |
||||
################################################## |
||||
self.multirds_rds_decoder_redsea_0 = multirds.rds_decoder_redsea(False, True) |
||||
self.blocks_null_source_0 = blocks.null_source(gr.sizeof_char*1) |
||||
|
||||
################################################## |
||||
# Connections |
||||
################################################## |
||||
self.connect((self.blocks_null_source_0, 0), (self.multirds_rds_decoder_redsea_0, 0)) |
||||
|
||||
def closeEvent(self, event): |
||||
self.settings = Qt.QSettings("GNU Radio", "top_block") |
||||
self.settings.setValue("geometry", self.saveGeometry()) |
||||
event.accept() |
||||
|
||||
def get_samp_rate(self): |
||||
return self.samp_rate |
||||
|
||||
def set_samp_rate(self, samp_rate): |
||||
self.samp_rate = samp_rate |
||||
|
||||
|
||||
def main(top_block_cls=top_block, options=None): |
||||
|
||||
from distutils.version import StrictVersion |
||||
if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): |
||||
style = gr.prefs().get_string('qtgui', 'style', 'raster') |
||||
Qt.QApplication.setGraphicsSystem(style) |
||||
qapp = Qt.QApplication(sys.argv) |
||||
|
||||
tb = top_block_cls() |
||||
tb.start() |
||||
tb.show() |
||||
|
||||
def quitting(): |
||||
tb.stop() |
||||
tb.wait() |
||||
qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) |
||||
qapp.exec_() |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
main() |
||||
Loading…
Reference in new issue