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
7.2 KiB
193 lines
7.2 KiB
#!/usr/bin/env python3 |
|
# -*- 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
|
|
|