1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2020 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
#
from PyQt5 import Qt
from gnuradio import gr
import pmt
class ToggleButton(gr.sync_block, Qt.QPushButton):
"""
This block creates a variable toggle button. Leave the label
blank to use the variable id as the label. A toggle button
selects between two values of similar type, but will stay
depressed until clicked again. The variable will take on one
value or the other depending on whether the button is pressed
or released. This button will also produce a state message
matching the set values.
"""
def __init__(self, callback, lbl, pressedReleasedDict, initPressed, outputmsgname='value'):
gr.sync_block.__init__(self, name="ToggleButton", in_sig=None, out_sig=None)
Qt.QPushButton.__init__(self, lbl)
self.setCheckable(True)
self.lbl = lbl
self.callback = callback
self.pressReleasedDict = pressedReleasedDict
self.outputmsgname = outputmsgname
self.relBackColor = 'default'
self.relFontColor = 'default'
self.pressBackColor = 'default'
self.pressFontColor = 'default'
self.message_port_register_out(pmt.intern("state"))
if initPressed:
self.setChecked(True)
self.state = 1
else:
self.state = 0
self.clicked[bool].connect(self.onToggleClicked)
def setColors(self, relBackColor, relFontColor, pressBackColor, pressFontColor):
self.relBackColor = relBackColor
self.relFontColor = relFontColor
self.pressBackColor = pressBackColor
self.pressFontColor = pressFontColor
self.setColor()
def setColor(self):
if self.state:
styleStr = ""
if self.pressBackColor != 'default':
styleStr = "background-color: " + self.pressBackColor + "; "
if self.pressFontColor:
styleStr += "color: " + self.pressFontColor + "; "
self.setStyleSheet(styleStr)
else:
styleStr = ""
if self.relBackColor != 'default':
styleStr = "background-color: " + self.relBackColor + "; "
if self.relFontColor:
styleStr += "color: " + self.relFontColor + "; "
self.setStyleSheet(styleStr)
def onToggleClicked(self, pressed):
if pressed:
self.state = 1
self.callback(self.pressReleasedDict['Pressed'])
else:
self.state = 0
self.callback(self.pressReleasedDict['Released'])
self.setColor()
if pressed:
if type(self.pressReleasedDict['Pressed']) == bool:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.from_bool(self.pressReleasedDict['Pressed'])))
elif type(self.pressReleasedDict['Pressed']) == int:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.from_long(self.pressReleasedDict['Pressed'])))
elif type(self.pressReleasedDict['Pressed']) == float:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.from_double(self.pressReleasedDict['Pressed'])))
else:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.intern(self.pressReleasedDict['Pressed'])))
else:
if type(self.pressReleasedDict['Released']) == bool:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.from_bool(self.pressReleasedDict['Released'])))
elif type(self.pressReleasedDict['Released']) == int:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.from_long(self.pressReleasedDict['Released'])))
elif type(self.pressReleasedDict['Released']) == float:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.from_double(self.pressReleasedDict['Released'])))
else:
self.message_port_pub(pmt.intern("state"),
pmt.cons(pmt.intern(self.outputmsgname),
pmt.intern(self.pressReleasedDict['Released'])))
|