RDS decoder module for GNU Radio, that decodes multiple stations simultaneously
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

193 lines
6.6 KiB

#!/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
from gnuradio import gr
import code,pmt,functools
from PyQt4 import Qt, QtCore, QtGui
import pprint
pp = pprint.PrettyPrinter()
from PyQt4.QtCore import QObject, pyqtSignal
class rds_table_qt_Signals(QObject):
DataUpdateEvent = QtCore.pyqtSignal(dict)
def __init__(self, parent=None):
super(QtCore.QObject, self).__init__()
class rds_table_qt(gr.sync_block):
"""
docstring for block qtguitest
"""
def __init__(self,signals,nPorts):
#QObject.__init__()
gr.sync_block.__init__(self,
name="RDS Table",
in_sig=None,
out_sig=None)
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))
#self.message_port_register_in(pmt.intern('in1'))
#self.message_port_register_in(pmt.intern('in2'))
#self.set_msg_handler(pmt.intern('in1'), functools.partial(self.handle_msg, port=1))
#self.set_msg_handler(pmt.intern('in2'), functools.partial(self.handle_msg, port=2))
#code.interact(local=locals())
self.signals=signals
#/* type 0 = PI
#* type 1 = PS
#* type 2 = PTY
#* type 3 = flagstring: TP, TA, MuSp, MoSt, AH, CMP, stPTY
#* type 4 = RadioText
#* type 5 = ClockTime
#* type 6 = Alternative Frequencies
#* type 7 = decode errors int (out of 50), 51 == no_sync */
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.signals.DataUpdateEvent.emit({'col':0,'row':port,'string':m})
#self.PI=m
#self.stations[str(port)+"PI"]=m
elif(t==1):
self.signals.DataUpdateEvent.emit({'col':2,'row':port,'string':m})
#self.PS=m
#self.stations[str(port)+"PS"]=m
elif(t==4):
self.signals.DataUpdateEvent.emit({'col':5,'row':port,'string':m})
#self.RT=m
#self.stations[str(port)+"RT"]=m
elif(t==6):#alt freq
#print("################alt freqs##################")
#freqspmt=pmt.tuple_ref(msg, 1)
#print(m)
#pp.pprint(pmt.to_python(freqspmt)
self.signals.DataUpdateEvent.emit({'col':3,'row':port,'string':m})
elif(t==5):#time
self.signals.DataUpdateEvent.emit({'col':4,'row':port,'string':m})
#def handle_msg(self, msg):
# self.signals.DataUpdateEvent.emit({'string':pmt.to_python(msg)})
# print(msg)
class rds_table_qt_Widget(QtGui.QWidget):
def __init__(self, signals,label):
print("gui initializing")
self.signals = signals
self.signals.DataUpdateEvent.connect(self.display_data)
""" Creates the QT Range widget """
QtGui.QWidget.__init__(self)
layout = Qt.QVBoxLayout()
self.label = Qt.QLabel(label)
layout.addWidget(self.label)
self.setLayout(layout)
self.table=QtGui.QTableWidget(self)
self.table.setRowCount(5)
self.table.setColumnCount(7)
self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) #disallow editing
#Data
self.data = {'ID':range(1,6),
'freq':['','','',''],
'name':['','','',''],
'AF':['','','',''],
'time':['','','',''],
'text':['','','',''],
'buttons':[]}
#Enter data onto Table
horHeaders = []
for n, key in enumerate(['ID','freq','name','AF','time','text','buttons']):
#for n, key in enumerate(sorted(self.data.keys())):
horHeaders.append(key)
for m, item in enumerate(self.data[key]):
if type(item)==int:#convert ints to strings
newitem = QtGui.QTableWidgetItem(str(item))
else:
newitem = QtGui.QTableWidgetItem(item)
self.table.setItem(m, n, newitem)
for i in range(0,4):
button=QtGui.QPushButton("play")
self.table.setCellWidget(i,self.table.columnCount()-1,button)
button.clicked.connect(self.onCLick)
#Add Header
self.table.setHorizontalHeaderLabels(horHeaders)
layout.addWidget(self.label)
layout.addWidget(self.table)
self.button = QtGui.QPushButton("i am a button")
layout.addWidget(self.button)
def display_data(self, event):
#pp.pprint(event)
if type(event)==dict:
if type(event['row']) == int and type(event['col']) == int:
item=self.table.item(event['row'],event['col'])
if event['col']==0 and event['string']!=item.text(): #clear data if PI changed
for col in range(1,self.table.columnCount()-1):
self.table.item(event['row'],col).setText('')
if item.text()==event['string']:
item.setTextColor(QtCore.Qt.black)
else:
item.setTextColor(QtCore.Qt.green)
item.setText(event['string'])
item.setFont(QtGui.QFont("Courier New"))
#print("table updated")
self.table.resizeColumnsToContents()
else:
self.table.currentItem().setText(event['string'])
def reset_color(self):
for i in range(0,self.table.rowCount()):
for j in range(0,self.table.columnCount()):
item = self.table.item(i,j)
#code.interact(local=locals())
#print(item.type())
if item != '':
try:
item.setTextColor(QtCore.Qt.black)
except:
pass
#for item in self.table.items():
#item.setTextColor(QtCore.Qt.black)
def onCLick(self):
print("button clicked")
self.reset_color()
#pp.pprint(event)
if __name__ == "__main__":
from PyQt4 import Qt
import sys
# def valueChanged(frequency):
# print("Value updated - " + str(frequency))
app = Qt.QApplication(sys.argv)
# widget = RangeWidget(Range(0, 100, 10, 1, 100), valueChanged, "Test", "counter_slider", int)
mainobj= rds_table_qt_Signals()
#mainobj=None
widget = rds_table_qt_Widget(mainobj,"TestLabel")
widget.show()
widget.setWindowTitle("Test Qt gui")
widget.setGeometry(200,200,600,300)
#code.interact(local=locals())
sys.exit(app.exec_())
widget = None