cfclient 2017.4__py3-none-any.whl → 2025.12.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. cfclient/__init__.py +16 -11
  2. cfclient/configs/config.json +4 -3
  3. cfclient/configs/input/Generic_OS_X.json +1 -0
  4. cfclient/configs/input/Joystick.json +1 -0
  5. cfclient/configs/input/PS3_Mode_1.json +1 -0
  6. cfclient/configs/input/PS3_Mode_2.json +1 -0
  7. cfclient/configs/input/PS3_Mode_3.json +1 -0
  8. cfclient/configs/input/PS4_Mode_1.json +1 -0
  9. cfclient/configs/input/PS4_Mode_2.json +1 -0
  10. cfclient/configs/input/PS4_shoulder_btns_yaw.json +1 -0
  11. cfclient/configs/input/xbox360_mode1.json +1 -0
  12. cfclient/configs/log/PID_tuning/Attitude.json +46 -0
  13. cfclient/configs/log/PID_tuning/Attitude_rate.json +46 -0
  14. cfclient/configs/log/PID_tuning/Position.json +46 -0
  15. cfclient/configs/log/PID_tuning/Velocity.json +46 -0
  16. cfclient/configs/log/PID_tuning_components/Pitch.json +22 -0
  17. cfclient/configs/log/PID_tuning_components/Pitch_rate.json +22 -0
  18. cfclient/configs/log/PID_tuning_components/Position_x.json +22 -0
  19. cfclient/configs/log/PID_tuning_components/Position_y.json +22 -0
  20. cfclient/configs/log/PID_tuning_components/Position_z.json +22 -0
  21. cfclient/configs/log/PID_tuning_components/Roll.json +22 -0
  22. cfclient/configs/log/PID_tuning_components/Roll_rate.json +22 -0
  23. cfclient/configs/log/PID_tuning_components/Velocity_x.json +22 -0
  24. cfclient/configs/log/PID_tuning_components/Velocity_y.json +22 -0
  25. cfclient/configs/log/PID_tuning_components/Velocity_z.json +22 -0
  26. cfclient/configs/log/PID_tuning_components/Yaw.json +22 -0
  27. cfclient/configs/log/PID_tuning_components/Yaw_rate.json +22 -0
  28. cfclient/gui.py +44 -9
  29. cfclient/headless.py +3 -12
  30. cfclient/resources/log_param_doc.json +1 -0
  31. cfclient/ui/connectivity_manager.py +198 -0
  32. cfclient/ui/dialogs/about.py +53 -36
  33. cfclient/ui/dialogs/about.ui +23 -3
  34. cfclient/ui/dialogs/anchor_position_dialog.py +252 -0
  35. cfclient/ui/dialogs/anchor_position_dialog.ui +138 -0
  36. cfclient/ui/dialogs/basestation_mode_dialog.py +185 -0
  37. cfclient/ui/dialogs/basestation_mode_dialog.ui +186 -0
  38. cfclient/ui/dialogs/bootloader.py +448 -85
  39. cfclient/ui/dialogs/bootloader.ui +387 -134
  40. cfclient/ui/dialogs/cf2config.py +4 -4
  41. cfclient/ui/dialogs/cf2config.ui +3 -4
  42. cfclient/ui/dialogs/inputconfigdialogue.py +24 -19
  43. cfclient/ui/dialogs/inputconfigdialogue.ui +53 -30
  44. cfclient/ui/dialogs/lighthouse_bs_geometry_dialog.py +220 -0
  45. cfclient/ui/dialogs/lighthouse_bs_geometry_dialog.ui +110 -0
  46. cfclient/ui/dialogs/lighthouse_system_type_dialog.py +93 -0
  47. cfclient/ui/dialogs/lighthouse_system_type_dialog.ui +121 -0
  48. cfclient/ui/dialogs/logconfigdialogue.py +401 -101
  49. cfclient/ui/dialogs/logconfigdialogue.ui +117 -72
  50. cfclient/ui/icons/bl.webp +0 -0
  51. cfclient/ui/icons/bolt.webp +0 -0
  52. cfclient/ui/icons/cf21.webp +0 -0
  53. cfclient/ui/icons/checkmark_black.png +0 -0
  54. cfclient/ui/icons/checkmark_white.png +0 -0
  55. cfclient/ui/icons/create.png +0 -0
  56. cfclient/ui/icons/delete.png +0 -0
  57. cfclient/ui/icons/flapper.webp +0 -0
  58. cfclient/ui/icons/tag.webp +0 -0
  59. cfclient/ui/main.py +328 -258
  60. cfclient/ui/main.ui +184 -80
  61. cfclient/ui/pluginhelper.py +7 -1
  62. cfclient/ui/pose_logger.py +116 -0
  63. cfclient/ui/tab_toolbox.py +208 -0
  64. cfclient/ui/tabs/ColorLEDTab.py +752 -0
  65. cfclient/ui/tabs/ConsoleTab.py +48 -13
  66. cfclient/ui/{toolboxes → tabs}/CrtpSharkToolbox.py +19 -34
  67. cfclient/ui/tabs/ExampleTab.py +9 -16
  68. cfclient/ui/tabs/FlightTab.py +437 -325
  69. cfclient/ui/tabs/GpsTab.py +14 -20
  70. cfclient/ui/tabs/LEDRingTab.py +277 -0
  71. cfclient/ui/tabs/LogBlockDebugTab.py +20 -27
  72. cfclient/ui/tabs/LogBlockTab.py +35 -35
  73. cfclient/ui/tabs/LogClientTab.py +85 -0
  74. cfclient/ui/tabs/LogTab.py +50 -27
  75. cfclient/ui/tabs/ParamTab.py +443 -57
  76. cfclient/ui/tabs/PlotTab.py +23 -25
  77. cfclient/ui/tabs/TuningTab.py +292 -0
  78. cfclient/ui/tabs/__init__.py +12 -2
  79. cfclient/ui/tabs/colorLEDTab.ui +624 -0
  80. cfclient/ui/tabs/consoleTab.ui +46 -0
  81. cfclient/ui/tabs/flightActionContainer.ui +103 -0
  82. cfclient/ui/tabs/flightTab.ui +724 -237
  83. cfclient/ui/tabs/{ledTab.ui → ledRingTab.ui} +63 -46
  84. cfclient/ui/tabs/lighthouse_tab.py +714 -0
  85. cfclient/ui/tabs/lighthouse_tab.ui +430 -0
  86. cfclient/ui/tabs/locopositioning_tab.py +606 -389
  87. cfclient/ui/tabs/locopositioning_tab.ui +370 -253
  88. cfclient/ui/tabs/logClientTab.ui +52 -0
  89. cfclient/ui/tabs/logTab.ui +1 -1
  90. cfclient/ui/tabs/paramTab.ui +204 -3
  91. cfclient/ui/tabs/tuningTab.ui +773 -0
  92. cfclient/ui/widgets/ai.py +37 -39
  93. cfclient/ui/widgets/hexspinbox.py +16 -10
  94. cfclient/ui/widgets/plotter.ui +39 -47
  95. cfclient/ui/widgets/plotwidget.py +57 -22
  96. cfclient/ui/widgets/super_slider.py +112 -0
  97. cfclient/ui/wizards/__init__.py +0 -0
  98. cfclient/ui/wizards/bslh_1.png +0 -0
  99. cfclient/ui/wizards/bslh_2.png +0 -0
  100. cfclient/ui/wizards/bslh_3.png +0 -0
  101. cfclient/ui/wizards/bslh_4.png +0 -0
  102. cfclient/ui/wizards/bslh_5.png +0 -0
  103. cfclient/ui/wizards/lighthouse_geo_bs_estimation_wizard.py +465 -0
  104. cfclient/utils/config_manager.py +5 -4
  105. cfclient/utils/input/__init__.py +77 -19
  106. cfclient/utils/input/inputinterfaces/wiimote.py +2 -2
  107. cfclient/utils/input/inputreaderinterface.py +17 -7
  108. cfclient/utils/input/inputreaders/__init__.py +17 -0
  109. cfclient/utils/logconfigreader.py +245 -25
  110. cfclient/utils/logdatawriter.py +3 -1
  111. cfclient/utils/periodictimer.py +1 -1
  112. cfclient/utils/ui.py +336 -0
  113. cfclient/utils/zmq_led_driver.py +5 -0
  114. cfclient/utils/zmq_param.py +6 -0
  115. cfclient/version.py +34 -1
  116. cfclient-2025.12.1.dist-info/METADATA +70 -0
  117. cfclient-2025.12.1.dist-info/RECORD +152 -0
  118. {cfclient-2017.4.dist-info → cfclient-2025.12.1.dist-info}/WHEEL +1 -1
  119. {cfclient-2017.4.dist-info → cfclient-2025.12.1.dist-info}/entry_points.txt +0 -1
  120. cfclient-2025.12.1.dist-info/licenses/LICENSE.txt +350 -0
  121. {cfclient-2017.4.dist-info → cfclient-2025.12.1.dist-info}/top_level.txt +1 -0
  122. cfconfig/Makefile +51 -0
  123. cfconfig/configblock.py +111 -0
  124. cfloader/__init__.py +41 -55
  125. cfzmq/__init__.py +22 -14
  126. cfclient/ui/dialogs/cf1config.py +0 -265
  127. cfclient/ui/dialogs/cf1config.ui +0 -260
  128. cfclient/ui/tab.py +0 -96
  129. cfclient/ui/tabs/LEDTab.py +0 -169
  130. cfclient/ui/toolboxes/ConsoleToolbox.py +0 -69
  131. cfclient/ui/toolboxes/DebugDriverToolbox.py +0 -107
  132. cfclient/ui/toolboxes/__init__.py +0 -45
  133. cfclient/ui/toolboxes/consoleToolbox.ui +0 -62
  134. cfclient/ui/toolboxes/debugDriverToolbox.ui +0 -86
  135. cfclient-2017.4.dist-info/DESCRIPTION.rst +0 -3
  136. cfclient-2017.4.dist-info/METADATA +0 -22
  137. cfclient-2017.4.dist-info/RECORD +0 -104
  138. cfclient-2017.4.dist-info/metadata.json +0 -1
  139. /cfclient/{icon-256.png → ui/icons/icon-256.png} +0 -0
  140. /cfclient/ui/{toolboxes → tabs}/crtpSharkToolbox.ui +0 -0
@@ -0,0 +1,138 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ui version="4.0">
3
+ <class>Form</class>
4
+ <widget class="QWidget" name="Form">
5
+ <property name="windowModality">
6
+ <enum>Qt::ApplicationModal</enum>
7
+ </property>
8
+ <property name="geometry">
9
+ <rect>
10
+ <x>0</x>
11
+ <y>0</y>
12
+ <width>443</width>
13
+ <height>558</height>
14
+ </rect>
15
+ </property>
16
+ <property name="windowTitle">
17
+ <string>Anchor position configuration</string>
18
+ </property>
19
+ <layout class="QVBoxLayout" name="verticalLayout_4">
20
+ <item>
21
+ <layout class="QVBoxLayout" name="verticalLayout">
22
+ <item>
23
+ <layout class="QHBoxLayout" name="horizontalLayout">
24
+ <item>
25
+ <widget class="QPushButton" name="_add_anchor_button">
26
+ <property name="text">
27
+ <string>Add anchor</string>
28
+ </property>
29
+ </widget>
30
+ </item>
31
+ <item>
32
+ <widget class="QPushButton" name="_remove_anchors_button">
33
+ <property name="text">
34
+ <string>Remove anchor(s)</string>
35
+ </property>
36
+ </widget>
37
+ </item>
38
+ <item>
39
+ <spacer name="horizontalSpacer_2">
40
+ <property name="orientation">
41
+ <enum>Qt::Horizontal</enum>
42
+ </property>
43
+ <property name="sizeHint" stdset="0">
44
+ <size>
45
+ <width>40</width>
46
+ <height>20</height>
47
+ </size>
48
+ </property>
49
+ </spacer>
50
+ </item>
51
+ </layout>
52
+ </item>
53
+ <item>
54
+ <widget class="QTableView" name="_table_view"/>
55
+ </item>
56
+ <item>
57
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
58
+ <item>
59
+ <widget class="QPushButton" name="_load_button">
60
+ <property name="text">
61
+ <string>Load from file...</string>
62
+ </property>
63
+ </widget>
64
+ </item>
65
+ <item>
66
+ <widget class="QPushButton" name="_save_button">
67
+ <property name="text">
68
+ <string>Save to file...</string>
69
+ </property>
70
+ </widget>
71
+ </item>
72
+ <item>
73
+ <spacer name="horizontalSpacer_3">
74
+ <property name="orientation">
75
+ <enum>Qt::Horizontal</enum>
76
+ </property>
77
+ <property name="sizeHint" stdset="0">
78
+ <size>
79
+ <width>40</width>
80
+ <height>20</height>
81
+ </size>
82
+ </property>
83
+ </spacer>
84
+ </item>
85
+ </layout>
86
+ </item>
87
+ <item>
88
+ <widget class="Line" name="line">
89
+ <property name="orientation">
90
+ <enum>Qt::Horizontal</enum>
91
+ </property>
92
+ </widget>
93
+ </item>
94
+ <item>
95
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
96
+ <item>
97
+ <widget class="QPushButton" name="_get_from_anchors_button">
98
+ <property name="text">
99
+ <string>Get from anchors</string>
100
+ </property>
101
+ </widget>
102
+ </item>
103
+ <item>
104
+ <widget class="QPushButton" name="_write_to_anchors_button">
105
+ <property name="text">
106
+ <string>Write to anchors</string>
107
+ </property>
108
+ </widget>
109
+ </item>
110
+ <item>
111
+ <spacer name="horizontalSpacer">
112
+ <property name="orientation">
113
+ <enum>Qt::Horizontal</enum>
114
+ </property>
115
+ <property name="sizeHint" stdset="0">
116
+ <size>
117
+ <width>40</width>
118
+ <height>20</height>
119
+ </size>
120
+ </property>
121
+ </spacer>
122
+ </item>
123
+ <item>
124
+ <widget class="QPushButton" name="_close_button">
125
+ <property name="text">
126
+ <string>Close</string>
127
+ </property>
128
+ </widget>
129
+ </item>
130
+ </layout>
131
+ </item>
132
+ </layout>
133
+ </item>
134
+ </layout>
135
+ </widget>
136
+ <resources/>
137
+ <connections/>
138
+ </ui>
@@ -0,0 +1,185 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # || ____ _ __
5
+ # +------+ / __ )(_) /_______________ _____ ___
6
+ # | 0xBC | / __ / / __/ ___/ ___/ __ `/_ / / _ \
7
+ # +------+ / /_/ / / /_/ /__/ / / /_/ / / /_/ __/
8
+ # || || /_____/_/\__/\___/_/ \__,_/ /___/\___/
9
+ #
10
+ # Copyright (C) 2011-2023 Bitcraze AB
11
+ #
12
+ # Crazyflie Nano Quadcopter Client
13
+ #
14
+ # This program is free software; you can redistribute it and/or
15
+ # modify it under the terms of the GNU General Public License
16
+ # as published by the Free Software Foundation; either version 2
17
+ # of the License, or (at your option) any later version.
18
+ #
19
+ # This program is distributed in the hope that it will be useful,
20
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
+ # GNU General Public License for more details.
23
+ # You should have received a copy of the GNU General Public License along with
24
+ # this program; if not, write to the Free Software Foundation, Inc.,
25
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26
+ """
27
+ Toolbox used to interact with the Basestation to set it in a certain channel
28
+ """
29
+
30
+ from PyQt6 import QtWidgets
31
+ from PyQt6 import uic
32
+ from PyQt6.QtCore import Qt
33
+
34
+ import io
35
+ import serial
36
+ from serial.tools.list_ports import comports
37
+ import cfclient
38
+ import time
39
+
40
+
41
+ __author__ = 'Bitcraze AB'
42
+ __all__ = ['LighthouseBsModeDialog']
43
+
44
+ (basestation_mode_widget_class, connect_widget_base_class) = uic.loadUiType(
45
+ cfclient.module_path + "/ui/dialogs/basestation_mode_dialog.ui")
46
+
47
+
48
+ class LighthouseBsModeDialog(QtWidgets.QWidget, basestation_mode_widget_class):
49
+
50
+ PID = 0x2500
51
+ VID = 0x28de
52
+
53
+ def __init__(self, helper, *args):
54
+ super(LighthouseBsModeDialog, self).__init__(*args)
55
+
56
+ self.setupUi(self)
57
+
58
+ self.helper = helper
59
+
60
+ self._set_basestation_button.pressed.connect(self._set_basestation_pressed)
61
+ self._set_channel_spinbox.valueChanged.connect(self._set_channel_number)
62
+ self._scan_basestation_button.pressed.connect(self._set_basestation_dev)
63
+
64
+ self._channel = 1
65
+ self._device = None
66
+
67
+ self._basestation_port_display.setText('No basestation found!')
68
+
69
+ self._basestation_port_display.setText(self._device)
70
+
71
+ def _set_basestation_dev(self):
72
+ self._device = self._find_basestation()
73
+ if self._device is None:
74
+ self._basestation_port_display.setText('No basestation found!')
75
+ self._set_basestation_button.setEnabled(False)
76
+ self._display_current_channel.setText('')
77
+ self._display_current_id.setText('')
78
+ else:
79
+ self._basestation_port_display.setText(self._device)
80
+ self._set_basestation_button.setEnabled(True)
81
+ self._check_current_mode()
82
+ self._check_current_id()
83
+
84
+ def _check_current_mode(self):
85
+ dev = self._device
86
+ ser = serial.Serial(dev, timeout=0.4)
87
+ sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
88
+ sio.write("\r\nmode \r\n")
89
+ sio.flush()
90
+ mode_confirm_lines = sio.readlines()
91
+ for line in mode_confirm_lines:
92
+ if line.startswith('Current mode: '):
93
+ parts = line.split()
94
+ confirm_mode = int(parts[2])
95
+ if confirm_mode == 0:
96
+ self._display_current_channel.setText('0 (not supported)')
97
+ else:
98
+ self._display_current_channel.setText(str(confirm_mode))
99
+ ser.close()
100
+
101
+ def _check_current_id(self):
102
+ dev = self._device
103
+ ser = serial.Serial(dev, timeout=0.4)
104
+ sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
105
+
106
+ sio.write("\r\nid\r\n")
107
+ sio.flush()
108
+ id_lines = sio.readlines()
109
+
110
+ uid = id_lines[3].split(': ')[1].strip()
111
+ self._display_current_id.setText(str(uid))
112
+ ser.close()
113
+
114
+ def _set_basestation_pressed(self):
115
+ self._set_basestation_button.setEnabled(False)
116
+ dev = self._device
117
+ try:
118
+ ser = serial.Serial(dev, timeout=0.4)
119
+ except serial.SerialException:
120
+ self._basestation_mode_status.setText(
121
+ 'Permission denied: cannot access serial port.\n'
122
+ 'Try running: \"sudo usermod -aG dialout [username]\" '
123
+ 'and then restart your computer.'
124
+ )
125
+
126
+ self._set_basestation_button.setEnabled(True)
127
+ return
128
+
129
+ sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
130
+ sio.write("\r\nmode " + str(self._channel) + "\r\n")
131
+ sio.flush()
132
+ time.sleep(1)
133
+ sio.write("\r\nparam save\r\n")
134
+ sio.flush()
135
+ time.sleep(1)
136
+ sio.write("\r\nmode\r\n")
137
+ sio.flush()
138
+ mode_confirm_lines = sio.readlines()
139
+ confirm_mode = None
140
+ for line in mode_confirm_lines:
141
+ if line.startswith('Current mode: '):
142
+ parts = line.split()
143
+ confirm_mode = int(parts[2])
144
+ if confirm_mode is self._channel:
145
+ self._basestation_mode_status.setText('Success !')
146
+ else:
147
+ self._basestation_mode_status.setText('Try again !')
148
+ self._display_current_channel.setText(str(confirm_mode))
149
+ self._set_basestation_button.setEnabled(True)
150
+ ser.close()
151
+
152
+ def _set_channel_number(self, value):
153
+ self._channel = value
154
+
155
+ def getName(self):
156
+ return 'LH Basestation Setup'
157
+
158
+ def getTabName(self):
159
+ return 'LH Basestation Setup'
160
+
161
+ def enable(self):
162
+ return
163
+
164
+ def disable(self):
165
+ return
166
+
167
+ def preferedDockArea(self):
168
+ return Qt.DockWidgetArea.RightDockWidgetArea
169
+
170
+ def _find_basestation(self):
171
+ ports = comports()
172
+
173
+ for port in ports:
174
+ if port.vid == self.VID and port.pid == self.PID:
175
+ return port.device
176
+
177
+ def reset(self):
178
+ self._channel = 1
179
+ self._device = None
180
+ self._set_basestation_button.setEnabled(False)
181
+ self._basestation_port_display.setText('No basestation found!')
182
+ self._display_current_channel.setText('')
183
+ self._basestation_mode_status.setText('')
184
+ self._set_channel_spinbox.setValue(self._channel)
185
+ self._display_current_id.setText('')
@@ -0,0 +1,186 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ui version="4.0">
3
+ <class>Form</class>
4
+ <widget class="QWidget" name="Form">
5
+ <property name="geometry">
6
+ <rect>
7
+ <x>0</x>
8
+ <y>0</y>
9
+ <width>400</width>
10
+ <height>300</height>
11
+ </rect>
12
+ </property>
13
+ <property name="windowTitle">
14
+ <string>Basestation configuration</string>
15
+ </property>
16
+ <layout class="QVBoxLayout" name="verticalLayout">
17
+ <item>
18
+ <layout class="QVBoxLayout" name="verticalLayout_2">
19
+ <item>
20
+ <layout class="QHBoxLayout" name="horizontalLayout">
21
+ <item>
22
+ <widget class="QLabel" name="label">
23
+ <property name="font">
24
+ <font>
25
+ <weight>75</weight>
26
+ <bold>true</bold>
27
+ </font>
28
+ </property>
29
+ <property name="text">
30
+ <string>Lighthouse V2 Basestation Configuration Tool</string>
31
+ </property>
32
+ </widget>
33
+ </item>
34
+ </layout>
35
+ </item>
36
+ <item>
37
+ <widget class="QLabel" name="label_5">
38
+ <property name="font">
39
+ <font>
40
+ <pointsize>9</pointsize>
41
+ <italic>true</italic>
42
+ </font>
43
+ </property>
44
+ <property name="text">
45
+ <string>Connect only 1 basestation with a micro usb at the time </string>
46
+ </property>
47
+ </widget>
48
+ </item>
49
+ <item>
50
+ <widget class="QLabel" name="label_6">
51
+ <property name="font">
52
+ <font>
53
+ <pointsize>9</pointsize>
54
+ <italic>true</italic>
55
+ </font>
56
+ </property>
57
+ <property name="text">
58
+ <string/>
59
+ </property>
60
+ </widget>
61
+ </item>
62
+ <item>
63
+ <layout class="QGridLayout" name="checkGrid">
64
+ <item row="5" column="0">
65
+ <widget class="QLabel" name="label_2">
66
+ <property name="text">
67
+ <string>Change channel</string>
68
+ </property>
69
+ </widget>
70
+ </item>
71
+ <item row="2" column="0">
72
+ <widget class="QLabel" name="label_3">
73
+ <property name="text">
74
+ <string>USB port: </string>
75
+ </property>
76
+ </widget>
77
+ </item>
78
+ <item row="1" column="1">
79
+ <widget class="QPushButton" name="_scan_basestation_button">
80
+ <property name="text">
81
+ <string>Scan basestation</string>
82
+ </property>
83
+ </widget>
84
+ </item>
85
+ <item row="5" column="1">
86
+ <widget class="QSpinBox" name="_set_channel_spinbox">
87
+ <property name="minimum">
88
+ <number>1</number>
89
+ </property>
90
+ <property name="maximum">
91
+ <number>16</number>
92
+ </property>
93
+ </widget>
94
+ </item>
95
+ <item row="3" column="0">
96
+ <widget class="QLabel" name="label_4">
97
+ <property name="text">
98
+ <string>Current channel:</string>
99
+ </property>
100
+ </widget>
101
+ </item>
102
+ <item row="3" column="1">
103
+ <widget class="QLabel" name="_display_current_channel">
104
+ <property name="text">
105
+ <string/>
106
+ </property>
107
+ </widget>
108
+ </item>
109
+ <item row="2" column="1">
110
+ <widget class="QLabel" name="_basestation_port_display">
111
+ <property name="text">
112
+ <string>None</string>
113
+ </property>
114
+ </widget>
115
+ </item>
116
+ <item row="6" column="0">
117
+ <widget class="QLabel" name="label_7">
118
+ <property name="text">
119
+ <string/>
120
+ </property>
121
+ </widget>
122
+ </item>
123
+ <item row="6" column="1">
124
+ <widget class="QPushButton" name="_set_basestation_button">
125
+ <property name="enabled">
126
+ <bool>true</bool>
127
+ </property>
128
+ <property name="text">
129
+ <string>Set channel</string>
130
+ </property>
131
+ <property name="checkable">
132
+ <bool>false</bool>
133
+ </property>
134
+ </widget>
135
+ </item>
136
+ <item row="4" column="0">
137
+ <widget class="QLabel" name="label_8">
138
+ <property name="text">
139
+ <string>Current ID</string>
140
+ </property>
141
+ </widget>
142
+ </item>
143
+ <item row="4" column="1">
144
+ <widget class="QLabel" name="_display_current_id">
145
+ <property name="text">
146
+ <string/>
147
+ </property>
148
+ </widget>
149
+ </item>
150
+ </layout>
151
+ </item>
152
+ <item>
153
+ <widget class="QLabel" name="_basestation_mode_status">
154
+ <property name="font">
155
+ <font>
156
+ <italic>true</italic>
157
+ </font>
158
+ </property>
159
+ <property name="text">
160
+ <string/>
161
+ </property>
162
+ <property name="alignment">
163
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
164
+ </property>
165
+ </widget>
166
+ </item>
167
+ <item>
168
+ <spacer name="verticalSpacer">
169
+ <property name="orientation">
170
+ <enum>Qt::Vertical</enum>
171
+ </property>
172
+ <property name="sizeHint" stdset="0">
173
+ <size>
174
+ <width>20</width>
175
+ <height>40</height>
176
+ </size>
177
+ </property>
178
+ </spacer>
179
+ </item>
180
+ </layout>
181
+ </item>
182
+ </layout>
183
+ </widget>
184
+ <resources/>
185
+ <connections/>
186
+ </ui>