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
@@ -93,6 +93,7 @@ class LogWriter():
93
93
  logger.info("Stopped logging of block [%s] to file [%s]",
94
94
  self._block.name, self._filename)
95
95
  self._header_values = []
96
+ self._header_written = False
96
97
 
97
98
  def start(self):
98
99
  """Start the logging to file"""
@@ -105,7 +106,8 @@ class LogWriter():
105
106
 
106
107
  if not self._file:
107
108
  time_now = datetime.datetime.now()
108
- name = "{0}-{1}.csv".format(self._block.name,
109
+ block_name_corr = self._block.name.replace('/', '-')
110
+ name = "{0}-{1}.csv".format(block_name_corr,
109
111
  time_now.strftime(
110
112
  "%Y%m%dT%H-%M-%S"))
111
113
  self._filename = os.path.join(self._dir, name)
@@ -57,7 +57,7 @@ class PeriodicTimer:
57
57
  logger.warning("Timer already started, not restarting")
58
58
  return
59
59
  self._thread = _PeriodicTimerThread(self._period, self._callbacks)
60
- self._thread.setDaemon(True)
60
+ self._thread.daemon = True
61
61
  self._thread.start()
62
62
 
63
63
  def stop(self):
cfclient/utils/ui.py ADDED
@@ -0,0 +1,336 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # ,---------, ____ _ __
4
+ # | ,-^-, | / __ )(_) /_______________ _____ ___
5
+ # | ( O ) | / __ / / __/ ___/ ___/ __ `/_ / / _ \
6
+ # | / ,--´ | / /_/ / / /_/ /__/ / / /_/ / / /_/ __/
7
+ # +------` /_____/_/\__/\___/_/ \__,_/ /___/\___/
8
+ #
9
+ # Copyright (C) 2020-2023 Bitcraze AB
10
+ #
11
+ # Crazyflie Nano Quadcopter Client
12
+ #
13
+ # This program is free software; you can redistribute it and/or
14
+ # modify it under the terms of the GNU General Public License
15
+ # as published by the Free Software Foundation; either version 2
16
+ # of the License, or (at your option) any later version.
17
+ #
18
+ # This program is distributed in the hope that it will be useful,
19
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ # GNU General Public License for more details.
22
+
23
+ # You should have received a copy of the GNU General Public License
24
+ # along with this program; if not, write to the Free Software
25
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26
+ # MA 02110-1301, USA.
27
+
28
+ import os
29
+ from PyQt6.QtGui import QFont
30
+
31
+ import cfclient
32
+
33
+ __author__ = 'Bitcraze AB'
34
+ __all__ = ['UiUtils']
35
+
36
+ ICON_PATH = os.path.join(cfclient.module_path, 'ui', 'icons')
37
+
38
+
39
+ class UiUtils:
40
+
41
+ COLOR_GREEN = '#7cdb37'
42
+ COLOR_BLUE = '#3399ff'
43
+ COLOR_RED = '#cc0404'
44
+ COLOR_NAVY_BLUE = '#23335D'
45
+ COLOR_NAVY_LIGHT_BLUE = '#3c4869'
46
+ COLOR_LIGHT_GRAY = '#C8C8C8'
47
+ COLOR_LIGHT_GRAY2 = '#A3A3A3'
48
+ COLOR_HACKER_BLACK = '#0A0B0B'
49
+ COLOR_HACKER_GREEN = '#00FF2F'
50
+
51
+ FONT = QFont('Palantino')
52
+
53
+ THEMES = ['Default', 'Navy blue', 'Hacker']
54
+
55
+ # Note: progress bar styling is required for all themes to make the bars
56
+ # wider on OSX (default is very thin) and display the text in the bar.
57
+ # In general terms, when styling something, do check on all OSes, it
58
+ # rarely looks the same.
59
+
60
+ _THEME_DEFAULT = """
61
+ QProgressBar {
62
+ border: 1px solid gray;
63
+ border-radius: 2px;
64
+ text-align: center;
65
+ }
66
+
67
+ QProgressBar::chunk {
68
+ border-radius: 2px;
69
+ background-color: """ + COLOR_BLUE + """;
70
+ }
71
+ """
72
+
73
+ _THEME_HACKER = """
74
+ QApplication {
75
+ font: Palantino;
76
+ }
77
+
78
+ QProgressBar {
79
+ border: 1px solid gray;
80
+ border-radius: 2px;
81
+ background-color: white;
82
+ text-align: center;
83
+ }
84
+
85
+ QProgressBar::chunk {
86
+ border-radius: 2px;
87
+ background-color: """ + COLOR_GREEN + """;
88
+ }
89
+
90
+ QWidget {
91
+ background-color: """ + COLOR_HACKER_BLACK + """;
92
+ color: white;
93
+ }
94
+
95
+ QPushButton {
96
+ background-color: """ + COLOR_HACKER_BLACK + """;
97
+ color: """ + COLOR_HACKER_GREEN + """;
98
+ border: 1px solid gray;
99
+ }
100
+
101
+ QPushButton:hover {
102
+ background-color: """ + COLOR_LIGHT_GRAY + """;
103
+ }
104
+
105
+ QComboBox, QAbstractSpinBox, QAbstractSpinBox::Dropdown, QSpinBox {
106
+ background-color: white;
107
+ color: """ + COLOR_HACKER_BLACK + """;
108
+ }
109
+
110
+ QComboBox:disabled,
111
+ QAbstractSpinBox:disabled,
112
+ QSpinBox:disabled,
113
+ QAbstractButton:disabled {
114
+ color: gray;
115
+ }
116
+
117
+ QLineEdit {
118
+ border-style: outset;
119
+ border-width: 2px;
120
+ border-radius: 10px;
121
+ border-color: white;
122
+ background-color: white;
123
+ color: """ + COLOR_HACKER_BLACK + """;
124
+ margin: 3px;
125
+ border-radius: 2px;
126
+ }
127
+
128
+ QMenu::item:selected {
129
+ background-color: """ + COLOR_LIGHT_GRAY + """;
130
+ }
131
+
132
+ QTabWidget {
133
+ border: 3px solid white;
134
+ }
135
+
136
+ QCheckBox::indicator {
137
+ border: 1px solid white;
138
+ background: """ + COLOR_HACKER_BLACK + """;
139
+ }
140
+
141
+ QCheckBox::indicator:checked {
142
+ image: url(""" + ICON_PATH + '/checkmark_white.png' + """);
143
+ }
144
+
145
+ QComboBox {
146
+ selection-background-color: white;
147
+ selection-color: """ + COLOR_HACKER_GREEN + """;
148
+ color: """ + COLOR_HACKER_GREEN + """;
149
+ background-color: """ + COLOR_HACKER_BLACK + """;
150
+ border: 1px solid white;
151
+ }
152
+
153
+ QComboBox, QAbstractItemView {
154
+ color: """ + COLOR_HACKER_GREEN + """;
155
+ background-color: """ + COLOR_HACKER_BLACK + """;
156
+ }
157
+
158
+ .QSlider {
159
+ min-width: 100px;
160
+ max-width: 100px;
161
+ }
162
+
163
+ .QSlider::groove:vertical {
164
+ border: 1px solid white;
165
+ width: 10px;
166
+ }
167
+
168
+ .QSlider::handle:vertical {
169
+ background: """ + COLOR_GREEN + """;
170
+ border: 5px solid #B5E61D;
171
+ height: 5px;
172
+ border-radius: 30px;
173
+ }
174
+
175
+ QTreeView, QTextEdit {
176
+ border-style: outset;
177
+ border-width: 1px;
178
+ border-color: """ + COLOR_LIGHT_GRAY2 + """;
179
+ }
180
+
181
+ QTabBar::tab {
182
+ background-color: """ + COLOR_HACKER_BLACK + """;
183
+ }
184
+
185
+ QTabBar::tab:hover {
186
+ background-color: """ + COLOR_LIGHT_GRAY + """;
187
+ }
188
+
189
+ QTabBar::tab:selected {
190
+ background-color: """ + COLOR_LIGHT_GRAY2 + """;
191
+ }
192
+ """
193
+
194
+ _THEME_NAVY = """
195
+ QProgressBar {
196
+ border: 1px solid gray;
197
+ border-radius: 2px;
198
+ background-color: white;
199
+ text-align: center;
200
+ }
201
+
202
+ QProgressBar::chunk {
203
+ border-radius: 2px;
204
+ background-color: """ + COLOR_GREEN + """;
205
+ }
206
+
207
+ QWidget {
208
+ background-color: """ + COLOR_NAVY_BLUE + """;
209
+ color: white;
210
+ }
211
+
212
+ QPushButton {
213
+ background-color: white;
214
+ color: black;
215
+ }
216
+
217
+ QPushButton:hover {
218
+ background-color: """ + COLOR_LIGHT_GRAY + """;
219
+ }
220
+
221
+ QComboBox, QAbstractSpinBox, QSpinBox {
222
+ background-color: white;
223
+ color: black;
224
+ }
225
+
226
+ QComboBox:disabled,
227
+ QAbstractSpinBox:disabled,
228
+ QSpinBox:disabled,
229
+ QAbstractButton:disabled {
230
+ color: gray;
231
+ }
232
+
233
+ QLineEdit, QAbstractScrollArea {
234
+ background-color: white;
235
+ color: black;
236
+ border: 1px solid gray;
237
+ margin: 3px;
238
+ border-radius: 2px;
239
+ }
240
+
241
+ QMenu::item:selected {
242
+ background-color: """ + COLOR_LIGHT_GRAY + """;
243
+ }
244
+
245
+ QTabWidget {
246
+ border: 3px solid white;
247
+ }
248
+
249
+ QCheckBox::indicator {
250
+ border: 1px solid white;
251
+ background-color: """ + COLOR_NAVY_BLUE + """;
252
+ }
253
+
254
+ QCheckBox::indicator:checked {
255
+ image: url(""" + ICON_PATH + '/checkmark_white.png' + """);
256
+ }
257
+
258
+ .QSlider {
259
+ min-width: 100px;
260
+ max-width: 100px;
261
+ }
262
+
263
+ QComboBox {
264
+ selection-background-color: """ + COLOR_NAVY_BLUE + """;
265
+ selection-color: white;
266
+ color: black;
267
+ }
268
+
269
+ QComboBox, QAbstractItemView {
270
+ color: black;
271
+ background-color: white;
272
+ }
273
+
274
+ .QSlider::groove:vertical {
275
+ border: 1px solid white;
276
+ width: 10px;
277
+ }
278
+
279
+ .QSlider::handle:vertical {
280
+ background: """ + COLOR_GREEN + """;
281
+ border: 5px solid #B5E61D;
282
+ height: 5px;
283
+ border-radius: 30px;
284
+ }
285
+
286
+ QTabBar::tab {
287
+ background-color: """ + COLOR_NAVY_LIGHT_BLUE + """;
288
+ }
289
+
290
+ QTabBar::tab:hover {
291
+ background-color: """ + COLOR_LIGHT_GRAY + """;
292
+ }
293
+
294
+ QTabBar::tab:selected {
295
+ background-color: """ + COLOR_LIGHT_GRAY2 + """;
296
+ }
297
+
298
+ QHeaderView {
299
+ background-color: """ + COLOR_NAVY_LIGHT_BLUE + """;
300
+ border-color: """ + COLOR_NAVY_LIGHT_BLUE + """;
301
+ border-width: 0px;
302
+ color: white;
303
+ }
304
+
305
+ """
306
+
307
+ _THEMES = {
308
+ 'Default': _THEME_DEFAULT,
309
+ 'Navy blue': _THEME_NAVY,
310
+ 'Hacker': _THEME_HACKER,
311
+ }
312
+
313
+ @staticmethod
314
+ def set_background_color(obj, red, green, blue):
315
+ obj.setStyleSheet('background-color: rgb(%s, %s, %s)' %
316
+ (red, green, blue))
317
+
318
+ @staticmethod
319
+ def select_theme(theme):
320
+ return UiUtils._THEMES[theme]
321
+
322
+ @staticmethod
323
+ def progressbar_stylesheet(color):
324
+
325
+ return """
326
+ QProgressBar {
327
+ border: 1px solid gray;
328
+ border-radius: 2px;
329
+ text-align: center;
330
+ }
331
+
332
+ QProgressBar::chunk {
333
+ border-radius: 2px;
334
+ background-color: """ + color + """;
335
+ }
336
+ """
@@ -31,6 +31,7 @@ Give access to the LED driver memory via ZMQ.
31
31
  """
32
32
 
33
33
  from cflib.crazyflie.mem import MemoryElement
34
+ from cfclient.utils.config import Config
34
35
 
35
36
  import logging
36
37
  from threading import Thread, Lock
@@ -47,6 +48,10 @@ except Exception as e:
47
48
  logger.warning("Not enabling ZMQ LED driver access,"
48
49
  "import failed ({})".format(e))
49
50
 
51
+ if not Config().get("enable_zmq_led"):
52
+ enabled = False
53
+ logger.info("ZMQ led disabled in config file")
54
+
50
55
 
51
56
  class _PullReader(Thread):
52
57
  """Blocking thread for reading from ZMQ socket"""
@@ -33,6 +33,8 @@ Give access to the parameter framework via ZMQ.
33
33
  import logging
34
34
  from threading import Thread, Lock
35
35
 
36
+ from cfclient.utils.config import Config
37
+
36
38
  ZMQ_PULL_PORT = 1024 + 189
37
39
  logger = logging.getLogger(__name__)
38
40
 
@@ -45,6 +47,10 @@ except Exception as e:
45
47
  logger.warning(
46
48
  "Not enabling ZMQ param access, import failed ({})".format(e))
47
49
 
50
+ if not Config().get("enable_zmq_param"):
51
+ enabled = False
52
+ logger.info("ZMQ param disabled in config file")
53
+
48
54
 
49
55
  class _PullReader(Thread):
50
56
 
cfclient/version.py CHANGED
@@ -1 +1,34 @@
1
- VERSION = "2016.02"
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '2025.12.1'
32
+ __version_tuple__ = version_tuple = (2025, 12, 1)
33
+
34
+ __commit_id__ = commit_id = None
@@ -0,0 +1,70 @@
1
+ Metadata-Version: 2.4
2
+ Name: cfclient
3
+ Version: 2025.12.1
4
+ Summary: Crazyflie PC client
5
+ Author-email: Bitcraze and contributors <contact@bitcraze.io>
6
+ License: GPLv2+
7
+ Project-URL: Homepage, https://www.bitcraze.io
8
+ Project-URL: Documentation, https://www.bitcraze.io/documentation/repository/crazyflie-clients-python/master/
9
+ Project-URL: Repository, https://github.com/bitcraze/crazyflie-clients-python
10
+ Project-URL: Issues, https://github.com/bitcraze/crazyflie-clients-python/issues
11
+ Keywords: quadcopter,crazyflie
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)
14
+ Classifier: Topic :: Scientific/Engineering
15
+ Classifier: Topic :: Scientific/Engineering :: Visualization
16
+ Classifier: Topic :: Software Development :: User Interfaces
17
+ Classifier: Intended Audience :: End Users/Desktop
18
+ Classifier: Intended Audience :: Science/Research
19
+ Classifier: Intended Audience :: Education
20
+ Classifier: Intended Audience :: Developers
21
+ Classifier: Operating System :: POSIX :: Linux
22
+ Classifier: Operating System :: MacOS
23
+ Classifier: Operating System :: Microsoft :: Windows
24
+ Classifier: Programming Language :: Python :: 3.10
25
+ Classifier: Programming Language :: Python :: 3.11
26
+ Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
28
+ Requires-Python: >=3.10
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE.txt
31
+ Requires-Dist: cflib~=0.1.31
32
+ Requires-Dist: setuptools
33
+ Requires-Dist: appdirs~=1.4.0
34
+ Requires-Dist: pyzmq~=26.0
35
+ Requires-Dist: pyqtgraph~=0.13
36
+ Requires-Dist: PyYAML~=6.0.1
37
+ Requires-Dist: numpy~=2.2
38
+ Requires-Dist: vispy~=0.15.2
39
+ Requires-Dist: pyopengl~=3.1.7
40
+ Requires-Dist: pyserial~=3.5
41
+ Requires-Dist: PyQt6~=6.7.1
42
+ Requires-Dist: PyQt6-sip~=13.8
43
+ Requires-Dist: pysdl2~=0.9.14; platform_system == "Windows" or platform_system == "Darwin"
44
+ Requires-Dist: pysdl2-dll==2.24.0; platform_system == "Windows" or platform_system == "Darwin"
45
+ Provides-Extra: dev
46
+ Requires-Dist: pre-commit; extra == "dev"
47
+ Requires-Dist: cx_freeze==5.1.1; platform_system == "Windows" and extra == "dev"
48
+ Requires-Dist: jinja2==2.10.3; platform_system == "Windows" and extra == "dev"
49
+ Dynamic: license-file
50
+
51
+ # Crazyflie PC client [![CI](https://github.com/bitcraze/crazyflie-clients-python/workflows/CI/badge.svg)](https://github.com/bitcraze/crazyflie-clients-python/actions?query=workflow%3ACI)
52
+
53
+ This repository contains host applications for the Crazyflie, including the PC client (`cfclient`), headless client (`cfheadless`), firmware loader (`cfloader`), and ZMQ interface (`cfzmq`).
54
+ These applications provide graphical and command-line interfaces for firmware flashing, flight control, parameter configuration, real-time data logging and visualization, and more.
55
+ All applications are built on [`cflib`](https://github.com/bitcraze/crazyflie-lib-python).
56
+
57
+ ## Installation
58
+ See the [installation instructions](docs/installation/install.md) in the GitHub docs folder.
59
+
60
+ ## Official Documentation
61
+
62
+ Check out the [Bitcraze crazyflie-client-python documentation](https://www.bitcraze.io/documentation/repository/crazyflie-clients-python/master/) on our website.
63
+
64
+ ## Contribute
65
+ Go to the [contribute page](https://www.bitcraze.io/contribute/) on our website to learn more.
66
+
67
+ ### Test code for contribution
68
+ Run the automated build locally to test your code
69
+
70
+ python3 tools/build/build
@@ -0,0 +1,152 @@
1
+ cfclient/__init__.py,sha256=1-s1f5yEocDIsIQYUukuImVujGb0OANFKMQ-qOz_Iso,1986
2
+ cfclient/gui.py,sha256=98OT0wTR_itVbiO_E6vjOkL2f0H9XUvjsCCCXQEuLRQ,6419
3
+ cfclient/headless.py,sha256=Hgp81TLpvKyo00oAEn5nBW49BC4RNZEXcYNXDrLyJn8,6287
4
+ cfclient/version.py,sha256=DLdcBM2nfvHCiDJTY0T6yHWVUp0kQq_XE8qFRkVRpQ0,712
5
+ cfclient/configs/config.json,sha256=kh4c9Z5jFU7I3Rrfa4RXUlk5EdVNJcs9QJiT6luqu2Y,863
6
+ cfclient/configs/input/Generic_OS_X.json,sha256=LwAYms0RC2gutp2v_b5QcsjAFYNsEO40AeS__2zn07Q,1057
7
+ cfclient/configs/input/Joystick.json,sha256=4VrLEX6o2T5AogPZjFLNjaNx415fLwkrS8Htop7zSD0,2005
8
+ cfclient/configs/input/PS3_Mode_1.json,sha256=1zsI0N0j5V4Wy9uGLnlKLpq_b27x0sfuJoXYOupmG_Y,1145
9
+ cfclient/configs/input/PS3_Mode_2.json,sha256=_KJCXsQrlB9MVsNQY5zLZh5ePDuajW2JPUrb9bOKEFo,1047
10
+ cfclient/configs/input/PS3_Mode_3.json,sha256=qH5qu66FA2FC3lF0M5KOMDk0lqH6mm4naZfMdhHz2Vc,1722
11
+ cfclient/configs/input/PS4_Mode_1.json,sha256=Hc_xGrgZuvfdgCBkwicinopnkyUhssk2nCWU3lhcFf8,1831
12
+ cfclient/configs/input/PS4_Mode_2.json,sha256=iqXWmysjeB9YrizxO64HTzYigG3EIK_lwiiZzd986Uw,1830
13
+ cfclient/configs/input/PS4_shoulder_btns_yaw.json,sha256=A1FLfueb22eyuU_kAsWfrCULgsSdvGKsUWeUgH6315E,1914
14
+ cfclient/configs/input/xbox360_mode1.json,sha256=_beeR0vJsVeCFKTvrv9tSfn0q4_2cUowilABWI3aywk,1845
15
+ cfclient/configs/log/stabilizer.json,sha256=GLS6SFk7atFPm1wzDVVTe4cxu36WJyECfAZVA_V0QD4,387
16
+ cfclient/configs/log/PID_tuning/Attitude.json,sha256=u7HG2qtjag52hCF5CAMkTRauK_4GeqyPl0YUDf8Qtws,971
17
+ cfclient/configs/log/PID_tuning/Attitude_rate.json,sha256=8z28vW7o_law6P_CfcuBm-OsKddEh5kDBKcAJB33YxI,953
18
+ cfclient/configs/log/PID_tuning/Position.json,sha256=JUtrvDi16zLKRAWVNOQoH2Bo81Vi08-xHdM4xK8k41A,959
19
+ cfclient/configs/log/PID_tuning/Velocity.json,sha256=c3gugwFjvqH362etgV4s1XmHaAtEseFDbo_WM04SJ3E,965
20
+ cfclient/configs/log/PID_tuning_components/Pitch.json,sha256=893uMWAk-9GfEXHS3w-P4oxI0UQa1WyHCql0R_JgPIo,405
21
+ cfclient/configs/log/PID_tuning_components/Pitch_rate.json,sha256=9oGf68Hv6Mf7yWecJpy7LCiw2XExuA6wpqIJ8HUKDHE,401
22
+ cfclient/configs/log/PID_tuning_components/Position_x.json,sha256=XN-JL-cP-xJBmZ6rn9FLEtauM45hsVPANNTgG_7eVog,403
23
+ cfclient/configs/log/PID_tuning_components/Position_y.json,sha256=gFuHE4rUr9Ipx4y7n3vk_kSwIVxjbfwWJDHDhOU4yzI,403
24
+ cfclient/configs/log/PID_tuning_components/Position_z.json,sha256=6s7sxvxXOABBDuoYg6ld0BYACKed3fBDMVUeKeSFPWg,403
25
+ cfclient/configs/log/PID_tuning_components/Roll.json,sha256=a9YUTEKiNHuDy4kyRClWTX4Q2jGV0uoKYe30k4rzrYc,401
26
+ cfclient/configs/log/PID_tuning_components/Roll_rate.json,sha256=8mSJXn3vU_XRkJUo_6Wz2vKiU4X3TzlQsTO3s2HJTjs,398
27
+ cfclient/configs/log/PID_tuning_components/Velocity_x.json,sha256=GwNRKgdIT6dmP6KWHxgdAcWm3kU9s-7bBE7-gp0XPhU,405
28
+ cfclient/configs/log/PID_tuning_components/Velocity_y.json,sha256=dgLf8_KYeJWJ-IYK3RyWaVQA-1wDC82OdY5w3WOoNvw,405
29
+ cfclient/configs/log/PID_tuning_components/Velocity_z.json,sha256=4Ft9zscDrthqpgrTOlXZMP1NTO4FvjO5XiszQ5ejvCA,405
30
+ cfclient/configs/log/PID_tuning_components/Yaw.json,sha256=hAypXUh8auOBvDHVN-NNYhNTJWpsxh3JZov7jLCidzQ,399
31
+ cfclient/configs/log/PID_tuning_components/Yaw_rate.json,sha256=OviQ8oqp8zerQxNBawzSfnNnfugvcOWYVKUtkmNJwjw,397
32
+ cfclient/resources/log_param_doc.json,sha256=Qk6IPj1WXZgO3Syg5pK9q4-Tpp-0Im2MpGB_E1aKLzg,137928
33
+ cfclient/resources/map.html,sha256=pGwY2GW0F1rAtSImKbu-cFZyb6tJGwrDhkAgOZ98S68,360
34
+ cfclient/resources/map.js,sha256=0KyyJ-5W5qnrlEgTsp_oHk7b3w8k9qoyX4XjhThOkrU,839
35
+ cfclient/ui/__init__.py,sha256=8XHGfW8w3DnQGiL6R7GVob1KrKg4waKNzvSy79lRjMs,1342
36
+ cfclient/ui/connectivity_manager.py,sha256=DdkHL48pBOI9lctc2peHqzQy7u7-sGZTVHYdmd2T3Sk,8275
37
+ cfclient/ui/main.py,sha256=X5_alyqcBsvVTwiDLK2L09YdFdJNvj9qcrNaLSmUzTs,36956
38
+ cfclient/ui/main.ui,sha256=Np1l54_f3EKsa8E8MtqqRcVYivsCBe2fCAx1Fpt_AYc,16092
39
+ cfclient/ui/pluginhelper.py,sha256=dSq6sCz5TbESfdTPzRzLExHnIZeKdDyw3cuWSViXqL8,1590
40
+ cfclient/ui/pose_logger.py,sha256=1vADKP4-iCj9avqcuPI_amtZg3IKeCVTX0zYao3HPCE,4041
41
+ cfclient/ui/tab_toolbox.py,sha256=8O_rQSX2cVFZOMiHxzCgq6TzdS5MLQahit89JeBCpQ8,7061
42
+ cfclient/ui/dialogs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
+ cfclient/ui/dialogs/about.py,sha256=1Bf769zuQE8yPTrIf7Og7zG8k4P3dJQLkZc0L3DA2Qo,8211
44
+ cfclient/ui/dialogs/about.ui,sha256=K_YI-SuZMu9tAZN8fAiAJjwAG2QD6epaWOcGz-5asYU,7279
45
+ cfclient/ui/dialogs/anchor_position_dialog.py,sha256=46lYyQAm01d9b5qY6LB6s9lfzfoPpKz4X8oA4ijBX5I,9379
46
+ cfclient/ui/dialogs/anchor_position_dialog.ui,sha256=oQr8_DqKM33tajt8Ha_WVNinqTyH1VLpsxW8XBP32Aw,3679
47
+ cfclient/ui/dialogs/basestation_mode_dialog.py,sha256=wVai9l-lQ2LBks2ctXeZUsq1DUVwRQ68RCcX5oBFBvE,6251
48
+ cfclient/ui/dialogs/basestation_mode_dialog.ui,sha256=GKBilbHMECKWyoE3WUnCeB084f0rC270yx8f5Kq-JKg,5050
49
+ cfclient/ui/dialogs/bootloader.py,sha256=V6TUnm8iOg44rYGf8CxoNavsPzYpIma0dPMnUvIXYG4,25215
50
+ cfclient/ui/dialogs/bootloader.ui,sha256=kl1FF-0ZbxfwuCvlyRBj3yLiQQxEWkJCmg_OsCzKMOQ,15216
51
+ cfclient/ui/dialogs/cf2config.py,sha256=2xYeTeTpK1h42HReInwfr06dvnXmSseiS8D_VDcTmyo,4201
52
+ cfclient/ui/dialogs/cf2config.ui,sha256=gistq-KuUB6E7SMub6ElCG2u3XpUe6i-a19VHcYv7vg,5850
53
+ cfclient/ui/dialogs/inputconfigdialogue.py,sha256=4yhPRTc2-l5yDu2VvavuQUEt629wEkJ3T38YexA3I4w,17922
54
+ cfclient/ui/dialogs/inputconfigdialogue.ui,sha256=5zJ5-S639ctNiPvR_GlBHpbFayQahK4JuQ3ggbOlnSc,24426
55
+ cfclient/ui/dialogs/lighthouse_bs_geometry_dialog.py,sha256=RmmVv8GSVTDl__D_hn2sQXfz3VKi9zygJkJv54VikOM,8421
56
+ cfclient/ui/dialogs/lighthouse_bs_geometry_dialog.ui,sha256=KWISXmuFQBR3ogu2FCi_0-e36oJ2h4HefgdsnywECL0,2865
57
+ cfclient/ui/dialogs/lighthouse_system_type_dialog.py,sha256=vff5me_1PMvVOVTv9WCw9X7wKY_G4XCWwKOusuRSrEE,2999
58
+ cfclient/ui/dialogs/lighthouse_system_type_dialog.ui,sha256=0aWRgeXOGptg-gY4qn3OvFWg5To09Y9_V3Lbx3wOx4A,3279
59
+ cfclient/ui/dialogs/logconfigdialogue.py,sha256=Qbtb4ISxTi-a3_GaYKRDm_dEK1XswctDbdffWoFf8Fk,22543
60
+ cfclient/ui/dialogs/logconfigdialogue.ui,sha256=vurEY2SWHRyw-ZhE5Z1UbeC9KwGOaPEHE6si6drmvXM,9128
61
+ cfclient/ui/icons/bl.webp,sha256=dS3-vxoq63ZRgCbYt7UPn4g2cEIJ7y23cFMGPmHJ48Y,42458
62
+ cfclient/ui/icons/bolt.webp,sha256=ofkF8I-Dthhccl9R46ACBhXmRLZfc8nAWwZU0eLRdxI,22886
63
+ cfclient/ui/icons/cf21.webp,sha256=vi0rnQSJcZvEomZGlAUShmSeTPdfmGC1iKf_0N6LI_M,20848
64
+ cfclient/ui/icons/checkmark_black.png,sha256=NwtLwrfLfjp2739iYbSzy8L_y_KBaizKodtF_PtPXXs,440
65
+ cfclient/ui/icons/checkmark_white.png,sha256=vFPIddxRRNzEbDQBpHJwRW5g-nrSt6bUB-NLonhZ4Eo,289
66
+ cfclient/ui/icons/create.png,sha256=Va8a2cE6X1qTv7o3UjPsn8GQfZcdTgy8KvHkf-5W9Yo,1361
67
+ cfclient/ui/icons/delete.png,sha256=s82vdaCgOMkvD1sxbwZZZAEblSK0BZcLKpa66I7j6M4,387
68
+ cfclient/ui/icons/flapper.webp,sha256=b09atPldpCGyzTqZHByUcDBZnKgcZCpoKLvlVVmrXZk,19270
69
+ cfclient/ui/icons/icon-256.png,sha256=SrUxND4cRHSRC_0LCPHIzwYRo1r9ygR1aw_D0BRxfoM,6554
70
+ cfclient/ui/icons/tag.webp,sha256=ICAxETHJQ_ZI0vC_b-JuQBLC_LDbTkxBXnnZ1-JeONI,22776
71
+ cfclient/ui/tabs/ColorLEDTab.py,sha256=TG4fMRAt9uqmznDpEwEULQIIz1xcprGD2RWOiD6VTX0,27278
72
+ cfclient/ui/tabs/ConsoleTab.py,sha256=IP8FB_ev4iq5Bp4FfH9PrIIcEk_vtfdgaD3LYCv4ytw,5191
73
+ cfclient/ui/tabs/CrtpSharkToolbox.py,sha256=2TLhfunC7vqLBzl8Ld3sPPPrPbBvazfPU4UOV7woo24,4242
74
+ cfclient/ui/tabs/ExampleTab.py,sha256=PQZVNV2Rn0hp_WyY0jOQmUJKvZNMJSwIM77JIJOfgQg,3736
75
+ cfclient/ui/tabs/FlightTab.py,sha256=rQ4hvEwAVtWdKfULOA1M1G2ZAzvjuUjmAMbttkc55ZY,32969
76
+ cfclient/ui/tabs/GpsTab.py,sha256=TZKoiSQomc-TSnQ4iXanMzmp4BnO07BGjbEFFmW0Tak,6118
77
+ cfclient/ui/tabs/LEDRingTab.py,sha256=6HeedcV4HFNkF9PCWm2Yxeag_rI4PukG9fOU-IEZ3ss,10112
78
+ cfclient/ui/tabs/LogBlockDebugTab.py,sha256=mamAHKwrqifiXFu5zxROB2HCvxBuvh0A8Yjpf8Agczc,3892
79
+ cfclient/ui/tabs/LogBlockTab.py,sha256=Iktp20J8Rzxoaf8grcSw1n14DSmH_X32tmCRH_nT-oc,12327
80
+ cfclient/ui/tabs/LogClientTab.py,sha256=cEogxYAM0rkMHLbmJqp_6sNIIefqCGdZnbJZQXNpvEE,2630
81
+ cfclient/ui/tabs/LogTab.py,sha256=A1xj0xlW25QjrpdnRYzrKXChGitf4MAePA_XWd2dtTM,4568
82
+ cfclient/ui/tabs/ParamTab.py,sha256=Ans2k_I4OAodBYbK1zdjnn_h1EVgSTYmOKBPBNmauNI,25447
83
+ cfclient/ui/tabs/PlotTab.py,sha256=M9HRunURxqQHlLqCeQSZaz_lYl3HA-oK0Y2BGBT2b4w,9097
84
+ cfclient/ui/tabs/TuningTab.py,sha256=iJHz0LehnfAb4iIPR_MMY5m-8iCtVhbAxm6_h_yobvc,13217
85
+ cfclient/ui/tabs/__init__.py,sha256=ucfOxJUh5CxQPWXSLt5ZfmME4sJmJBQ8cDMxhzcHec4,2118
86
+ cfclient/ui/tabs/colorLEDTab.ui,sha256=QApBTDZcKZMXlfLkyozLkfkF1Pfh5nB-olXPUifDvTQ,19603
87
+ cfclient/ui/tabs/consoleTab.ui,sha256=01CCRlvhhDf_iXSKpkmjjXDRsBdeTa01kmanlWU3uss,4420
88
+ cfclient/ui/tabs/crtpSharkToolbox.ui,sha256=8wfoLVOI7qaHw6F8Mzq42eKv8-NiOQfYcA2yMEThuUk,2134
89
+ cfclient/ui/tabs/exampleTab.ui,sha256=kJqTMt8fw8-yhRYtrVL1E0U2rxOI4xL2CM0mThBKvqc,429
90
+ cfclient/ui/tabs/flightActionContainer.ui,sha256=BQLE17AF9kARb4U78JmiKFmHnMtR8tmUOTYHLgFau6w,2645
91
+ cfclient/ui/tabs/flightTab.ui,sha256=p06XcsZsMh0C8pRcpKSsIX_xquLscmn10X4wc2Sqc_w,42584
92
+ cfclient/ui/tabs/gpsTab.ui,sha256=IMtQRwhL7e8A-sv-_0nVm8FVCvo-uujJ9qdgg1aKTs0,5263
93
+ cfclient/ui/tabs/ledRingTab.ui,sha256=VB_pvCJMK9JQTre7LCOk98NVj0NoZa16ynHlvBJQf64,9307
94
+ cfclient/ui/tabs/lighthouse_tab.py,sha256=N2tx45LLhGYZxcxDYjTMKrNgasYCEM15Hmr9J1451K4,27443
95
+ cfclient/ui/tabs/lighthouse_tab.ui,sha256=46uLJoFr7iZ6BHBRy6oHxdL812ZajU509Zy-CnCsnjM,15349
96
+ cfclient/ui/tabs/locopositioning_tab.py,sha256=F66j9ruKPk16f36x-6UfGIgFl-hLL6pMrUUrwZhG_kU,31507
97
+ cfclient/ui/tabs/locopositioning_tab.ui,sha256=Kb3WZdVYO_IrjIDulkuK17Fflax60nHRwaMXQbBpFBw,16370
98
+ cfclient/ui/tabs/logBlockDebugTab.ui,sha256=pYQagmQPpSaZc235ECa9w-CM0snoA7FKY3WZh_W0u5s,1729
99
+ cfclient/ui/tabs/logBlockTab.ui,sha256=tE5DQ2dxskSrYWf3ha8Y86qeh89wcc9xOt1k8oDfKeA,602
100
+ cfclient/ui/tabs/logClientTab.ui,sha256=nkxnRKBt2VA04C584RRzivRCXf_3DJ11JiumVfhyEiI,1240
101
+ cfclient/ui/tabs/logTab.ui,sha256=gyTWwzS7hbILVB86D1yvG51Abb6Sj97EHrcWH8bIcbc,1420
102
+ cfclient/ui/tabs/paramTab.ui,sha256=NEEF3WegYkTXHWDZlzJo28h1K7oB_X2yEz6siNitfcg,9248
103
+ cfclient/ui/tabs/plotTab.ui,sha256=Jyn1V_vB1sKBGIpiRUlm4v6A1sqFDIt2w7ni0ixtdUc,688
104
+ cfclient/ui/tabs/tuningTab.ui,sha256=03uyP3WFRv60OaMkACT-yWuZvrtRM6Bnqmunlwv0Cbc,26596
105
+ cfclient/ui/widgets/__init__.py,sha256=QDw5m94D3izw5CBg0xHo-GsyxJCoJBsKeKyBxMrH7E4,1261
106
+ cfclient/ui/widgets/ai.py,sha256=_PRdYXUNT22PpXT01HQTOwFO9f2ccPw1lyVJqm47j9k,8673
107
+ cfclient/ui/widgets/hexspinbox.py,sha256=mElPVmZFzZMgRqWtUrVbcYzsHbz9zKtySOv49fUBmWo,2585
108
+ cfclient/ui/widgets/plotter.ui,sha256=xhYiKdrI2xPhBOzTQpJ8sxcSJ4ppPs2RS8KeJeHnLfE,9459
109
+ cfclient/ui/widgets/plotwidget.py,sha256=awM_HRMeQpXiEUdKVThidD_Ynnv1JU2X13YTacLy3-I,12954
110
+ cfclient/ui/widgets/super_slider.py,sha256=TlV2HHd-AdmUGvajMVbwhRtsJgV2t6pVsu9DQW37x9I,3893
111
+ cfclient/ui/wizards/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
+ cfclient/ui/wizards/bslh_1.png,sha256=Ha3cZy5Gk-aRwEUUhL4vZRB9LgHe9kSPlYk4A_CNMrY,6677
113
+ cfclient/ui/wizards/bslh_2.png,sha256=JYTuDv2ZiHNfY9ItIlUKFvxaRu0a_RJYiEZ0W0wH73E,9105
114
+ cfclient/ui/wizards/bslh_3.png,sha256=HGnDxjfKmrTZXZ9OzypEIqGuLSKQ6qdz5nGWk1hL350,8838
115
+ cfclient/ui/wizards/bslh_4.png,sha256=iDtVqLjksqwEgwTGPhgEdDtba59Rx20Jdn6CVCxlnmc,13664
116
+ cfclient/ui/wizards/bslh_5.png,sha256=2jhngrfqMKdb3l1reA1583_qkox3Tx80a2zNsnHnXhY,7743
117
+ cfclient/ui/wizards/lighthouse_geo_bs_estimation_wizard.py,sha256=eU9Kd03n6fkQmZjlcpFfW_Tin0M8OHIGXlA8sbqD4vA,21512
118
+ cfclient/utils/__init__.py,sha256=47bRoIBVYsDU26-VYi8EbImbWTxbzP-my6piaOVmOq8,1151
119
+ cfclient/utils/config.py,sha256=yAcCJtixnzAGScKFLh1Pb5hg524OkYePkdwlGiXfxlE,3418
120
+ cfclient/utils/config_manager.py,sha256=sqyIHv9s9ztof0v-YKp8fGk0ftYvId6ppUe77HvdB3g,6915
121
+ cfclient/utils/logconfigreader.py,sha256=Y5RRhYm2Pk4R8s9W8EN643jbsiOMzDS_XJrBGth-cm0,13674
122
+ cfclient/utils/logdatawriter.py,sha256=Qso_w3WeTksrSGcacfmRpOy4KMOTHytCQeIkuo9bO7o,4012
123
+ cfclient/utils/periodictimer.py,sha256=HHE8lhBeYMGSZlcHyZGdaAtLdKuzuVuMzQUgFXzKDJI,2592
124
+ cfclient/utils/singleton.py,sha256=yz-JMLr7F_rO6XpVn4VmGWt2c3vIascsZl0cUeoWqy0,1513
125
+ cfclient/utils/ui.py,sha256=85MeNFeFIjNE2PYn-rjtpfSaOEqFiyZPOZlEfEDS_yo,9687
126
+ cfclient/utils/zmq_led_driver.py,sha256=IJA4Q-FiqVEJH9lOOnFOTp85ygt56FBt4fOajrZ6Y2k,3591
127
+ cfclient/utils/zmq_param.py,sha256=Ok2XqQrv6Y7aalLePgd-bW_lbC1Y5QD7HDnGjjMjMNw,3936
128
+ cfclient/utils/input/__init__.py,sha256=dGkzxKaf7INCUrjB2qOV63plxpPYvaO990TwLy2erFE,22487
129
+ cfclient/utils/input/inputreaderinterface.py,sha256=4tNV7fdO6cSTgPEvAHlhR3QvY2t36nN5GzuCXx73wwo,9698
130
+ cfclient/utils/input/inputinterfaces/__init__.py,sha256=kqBz9KEj6dgK8Wncr1i2xS2FzUgcY0OS7UOf3kwLi5A,3447
131
+ cfclient/utils/input/inputinterfaces/leapmotion.py,sha256=-jPtWPCqqUisKfMLsgWgi11EszMPFbqu0tPXL0A5-aY,4780
132
+ cfclient/utils/input/inputinterfaces/wiimote.py,sha256=KTdPMtwKfqcB3xeUZWxMQpORSo7OLgqngz7XyS7cYdE,4399
133
+ cfclient/utils/input/inputinterfaces/zmqpull.py,sha256=mJ1dGDmXefalkabYt6u7kMILSGGSRlv3ZZ6rM1uOsKk,3791
134
+ cfclient/utils/input/inputreaders/__init__.py,sha256=h-aHtLJgGaxv3k8z54jHtD6bORpkuiHv8douU-oVofw,5581
135
+ cfclient/utils/input/inputreaders/linuxjsdev.py,sha256=V2JNfB-3bhgtjwzrROyvbx9ARZyeXicHT-Uqx7p0vfk,7425
136
+ cfclient/utils/input/inputreaders/pysdl2.py,sha256=5HD7qeoTkA73it05d7M0KDWZvlBXlS3UEZzJu_E8Mdk,6776
137
+ cfclient/utils/input/mux/__init__.py,sha256=TXP6Fqnj3eCZ5jrpzDhCjTbdnLDjuHn5cYcFAr3CvWM,2962
138
+ cfclient/utils/input/mux/nomux.py,sha256=HnQCoi-MqJvnOF3anyrlVMEWPJEBud_NYCoDFyJRC_o,1627
139
+ cfclient/utils/input/mux/takeovermux.py,sha256=7aftcx7-Kv2m2Cgs-Fuvs8i6NtvtPICSjUNsD04NGmA,1771
140
+ cfclient/utils/input/mux/takeoverselectivemux.py,sha256=nKX1mV331o37TrVT4FcsGdErFnzkyoxgSRj7rtBbZtI,2415
141
+ cfclient-2025.12.1.dist-info/licenses/LICENSE.txt,sha256=UMjaTs39CS8X5zNtH4UWpmDBTydaVVQSDG8j1N285mI,18415
142
+ cfconfig/Makefile,sha256=O2IZLnrGtKPfUC_eT_OWpAU5d9ULNjfBUdLi6VfPcK0,1775
143
+ cfconfig/configblock.py,sha256=aOzCnI-JJEyYI1-tJZMmzeB2p9bQL0M3fY9FZeNwQas,2901
144
+ cfloader/__init__.py,sha256=Cg4mKk5YlQytgZ-LXifDwW1YmYUZpw4nXbk4OtJUMgE,6023
145
+ cfloader/__main__.py,sha256=Ct5fO0RV6foPBMmTHpEASS6mZ-4roJKoXWL8lhuuda0,65
146
+ cfzmq/__init__.py,sha256=ik4QKjZP9syOqpEjSnzv57u_VTa-Cb3QcpaeyVpL_gc,14025
147
+ cfzmq/__main__.py,sha256=AoNwiCOwva0pyNZXMLRW5COKB6Fh3bPgQO-gE5hD_Cg,62
148
+ cfclient-2025.12.1.dist-info/METADATA,sha256=BtiyyXqbwKau9IATuXYu1YlrOXxunhlifQmdNUoN_E4,3389
149
+ cfclient-2025.12.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
150
+ cfclient-2025.12.1.dist-info/entry_points.txt,sha256=8_UbQo4eRlY2aks3MbiuNTTpaDvjVSsraMj_fVcrBtY,127
151
+ cfclient-2025.12.1.dist-info/top_level.txt,sha256=kEMGlBZwPaeAdpoqXh5uBLBb0xaanO_wPW14T6BuJKs,33
152
+ cfclient-2025.12.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.29.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5