Merging qtdevel2 branch -r10565:10849. This adds a lot of fixes and capabilities...
[debian/gnuradio] / gr-qtgui / src / python / qt_digital.py
1 #!/usr/bin/env python
2
3 from gnuradio import gr, blks2
4 from gnuradio.qtgui import qtgui
5 from PyQt4 import QtGui, QtCore
6 import sys, sip
7 import scipy
8
9 class dialog_box(QtGui.QWidget):
10     def __init__(self, display_tx, display_rx, channel):
11         QtGui.QWidget.__init__(self, None)
12         self.setWindowTitle('Digital Signal Examples')
13
14         self.control = control_panel(channel, self)
15
16         hlayout = QtGui.QHBoxLayout()
17         hlayout.addWidget(display_tx)
18         hlayout.addWidget(display_rx)
19         hlayout.setGeometry(QtCore.QRect(0,0,100,100))
20
21         vlayout = QtGui.QVBoxLayout()
22         vlayout.addLayout(hlayout)
23         vlayout.addLayout(self.control.layout, -1)
24         #vlayout.addStretch(-1)
25
26         self.setLayout(vlayout)
27         self.resize(1000, 1000)
28
29 class control_panel(QtGui.QWidget):
30     def __init__(self, channel, parent=None):
31         QtGui.QWidget.__init__(self, parent)
32         self.setWindowTitle('Control Panel')
33
34         self.channel = channel
35         
36         self.layout = QtGui.QFormLayout()
37
38         # Set channel noise
39         self.noiseEdit = QtGui.QLineEdit(self)
40         self.layout.addRow("Noise Amplitude:", self.noiseEdit)
41         self.connect(self.noiseEdit, QtCore.SIGNAL("editingFinished()"),
42                      self.noiseEditText)
43
44         # Set channel frequency offset
45         self.freqEdit = QtGui.QLineEdit(self)
46         self.layout.addRow("Frequency Offset:", self.freqEdit)
47         self.connect(self.freqEdit, QtCore.SIGNAL("editingFinished()"),
48                      self.freqEditText)
49
50         # Set channel timing offset
51         self.timeEdit = QtGui.QLineEdit(self)
52         self.layout.addRow("Timing Offset:", self.timeEdit)
53         self.connect(self.timeEdit, QtCore.SIGNAL("editingFinished()"),
54                      self.timeEditText)
55
56         self.quit = QtGui.QPushButton('Close', self)
57         self.layout.addRow(self.quit)
58
59         self.connect(self.quit, QtCore.SIGNAL('clicked()'),
60                      QtGui.qApp, QtCore.SLOT('quit()'))
61
62     def set_noise(self, noise):
63         self.noise = noise
64         self.noiseEdit.setText(QtCore.QString("%1").arg(self.noise))
65
66     def set_frequency(self, freq):
67         self.freq = freq
68         self.freqEdit.setText(QtCore.QString("%1").arg(self.freq))
69
70     def set_time_offset(self, to):
71         self.timing_offset = to
72         self.timeEdit.setText(QtCore.QString("%1").arg(self.timing_offset))
73
74     def noiseEditText(self):
75         try:
76             noise = self.noiseEdit.text().toDouble()[0]
77             self.channel.noise.set_amplitude(noise)
78
79             self.noise = noise
80         except RuntimeError:
81             pass
82
83     def freqEditText(self):
84         try:
85             freq = self.freqEdit.text().toDouble()[0]
86             self.channel.freq_offset.set_frequency(freq)
87
88             self.freq = freq
89         except RuntimeError:
90             pass
91
92     def timeEditText(self):
93         try:
94             to = self.timeEdit.text().toDouble()[0]
95             self.channel.timing_offset.set_interp_ratio(to)
96
97             self.timing_offset = to
98         except RuntimeError:
99             pass
100
101
102 class my_top_block(gr.top_block):
103     def __init__(self):
104         gr.top_block.__init__(self)
105
106         self.qapp = QtGui.QApplication(sys.argv)
107
108         sps = 2
109         excess_bw = 0.35
110         gray_code = True
111         
112         fftsize = 2048
113
114         data = scipy.random.randint(0, 255, 1000)
115         src = gr.vector_source_b(data, True)
116         mod = blks2.dqpsk_mod(sps, excess_bw, gray_code, False, False)
117
118         rrctaps = gr.firdes.root_raised_cosine(1, sps, 1, excess_bw, 21)
119         rx_rrc = gr.fir_filter_ccf(sps, rrctaps)
120
121         noise = 1e-7
122         fo = 1e-6
123         to = 1.0
124         channel = blks2.channel_model(noise, fo, to)
125
126         thr = gr.throttle(gr.sizeof_gr_complex, 10*fftsize)
127         self.snk_tx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS, -1/2, 1/2,
128                                    "Tx", True, True, False, True, True)
129
130         self.snk_rx = qtgui.sink_c(fftsize, gr.firdes.WIN_BLACKMAN_hARRIS, -1/2, 1/2,
131                                    "Rx", True, True, False, True, True)
132
133         self.connect(src, mod, channel, self.snk_tx)
134         self.connect(channel, rx_rrc, thr, self.snk_rx)
135         
136         pyTxQt  = self.snk_tx.pyqwidget()
137         pyTx = sip.wrapinstance(pyTxQt, QtGui.QWidget)
138
139         pyRxQt  = self.snk_rx.pyqwidget()
140         pyRx = sip.wrapinstance(pyRxQt, QtGui.QWidget)
141
142         self.main_box = dialog_box(pyTx, pyRx, channel)
143         self.main_box.control.set_noise(noise)
144         self.main_box.control.set_frequency(fo)
145         self.main_box.control.set_time_offset(to)
146
147         self.main_box.show()
148     
149 if __name__ == "__main__":
150     tb = my_top_block();
151     tb.start()
152     tb.qapp.exec_()