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.
- cfclient/__init__.py +16 -11
- cfclient/configs/config.json +4 -3
- cfclient/configs/input/Generic_OS_X.json +1 -0
- cfclient/configs/input/Joystick.json +1 -0
- cfclient/configs/input/PS3_Mode_1.json +1 -0
- cfclient/configs/input/PS3_Mode_2.json +1 -0
- cfclient/configs/input/PS3_Mode_3.json +1 -0
- cfclient/configs/input/PS4_Mode_1.json +1 -0
- cfclient/configs/input/PS4_Mode_2.json +1 -0
- cfclient/configs/input/PS4_shoulder_btns_yaw.json +1 -0
- cfclient/configs/input/xbox360_mode1.json +1 -0
- cfclient/configs/log/PID_tuning/Attitude.json +46 -0
- cfclient/configs/log/PID_tuning/Attitude_rate.json +46 -0
- cfclient/configs/log/PID_tuning/Position.json +46 -0
- cfclient/configs/log/PID_tuning/Velocity.json +46 -0
- cfclient/configs/log/PID_tuning_components/Pitch.json +22 -0
- cfclient/configs/log/PID_tuning_components/Pitch_rate.json +22 -0
- cfclient/configs/log/PID_tuning_components/Position_x.json +22 -0
- cfclient/configs/log/PID_tuning_components/Position_y.json +22 -0
- cfclient/configs/log/PID_tuning_components/Position_z.json +22 -0
- cfclient/configs/log/PID_tuning_components/Roll.json +22 -0
- cfclient/configs/log/PID_tuning_components/Roll_rate.json +22 -0
- cfclient/configs/log/PID_tuning_components/Velocity_x.json +22 -0
- cfclient/configs/log/PID_tuning_components/Velocity_y.json +22 -0
- cfclient/configs/log/PID_tuning_components/Velocity_z.json +22 -0
- cfclient/configs/log/PID_tuning_components/Yaw.json +22 -0
- cfclient/configs/log/PID_tuning_components/Yaw_rate.json +22 -0
- cfclient/gui.py +44 -9
- cfclient/headless.py +3 -12
- cfclient/resources/log_param_doc.json +1 -0
- cfclient/ui/connectivity_manager.py +198 -0
- cfclient/ui/dialogs/about.py +53 -36
- cfclient/ui/dialogs/about.ui +23 -3
- cfclient/ui/dialogs/anchor_position_dialog.py +252 -0
- cfclient/ui/dialogs/anchor_position_dialog.ui +138 -0
- cfclient/ui/dialogs/basestation_mode_dialog.py +185 -0
- cfclient/ui/dialogs/basestation_mode_dialog.ui +186 -0
- cfclient/ui/dialogs/bootloader.py +448 -85
- cfclient/ui/dialogs/bootloader.ui +387 -134
- cfclient/ui/dialogs/cf2config.py +4 -4
- cfclient/ui/dialogs/cf2config.ui +3 -4
- cfclient/ui/dialogs/inputconfigdialogue.py +24 -19
- cfclient/ui/dialogs/inputconfigdialogue.ui +53 -30
- cfclient/ui/dialogs/lighthouse_bs_geometry_dialog.py +220 -0
- cfclient/ui/dialogs/lighthouse_bs_geometry_dialog.ui +110 -0
- cfclient/ui/dialogs/lighthouse_system_type_dialog.py +93 -0
- cfclient/ui/dialogs/lighthouse_system_type_dialog.ui +121 -0
- cfclient/ui/dialogs/logconfigdialogue.py +401 -101
- cfclient/ui/dialogs/logconfigdialogue.ui +117 -72
- cfclient/ui/icons/bl.webp +0 -0
- cfclient/ui/icons/bolt.webp +0 -0
- cfclient/ui/icons/cf21.webp +0 -0
- cfclient/ui/icons/checkmark_black.png +0 -0
- cfclient/ui/icons/checkmark_white.png +0 -0
- cfclient/ui/icons/create.png +0 -0
- cfclient/ui/icons/delete.png +0 -0
- cfclient/ui/icons/flapper.webp +0 -0
- cfclient/ui/icons/tag.webp +0 -0
- cfclient/ui/main.py +328 -258
- cfclient/ui/main.ui +184 -80
- cfclient/ui/pluginhelper.py +7 -1
- cfclient/ui/pose_logger.py +116 -0
- cfclient/ui/tab_toolbox.py +208 -0
- cfclient/ui/tabs/ColorLEDTab.py +752 -0
- cfclient/ui/tabs/ConsoleTab.py +48 -13
- cfclient/ui/{toolboxes → tabs}/CrtpSharkToolbox.py +19 -34
- cfclient/ui/tabs/ExampleTab.py +9 -16
- cfclient/ui/tabs/FlightTab.py +437 -325
- cfclient/ui/tabs/GpsTab.py +14 -20
- cfclient/ui/tabs/LEDRingTab.py +277 -0
- cfclient/ui/tabs/LogBlockDebugTab.py +20 -27
- cfclient/ui/tabs/LogBlockTab.py +35 -35
- cfclient/ui/tabs/LogClientTab.py +85 -0
- cfclient/ui/tabs/LogTab.py +50 -27
- cfclient/ui/tabs/ParamTab.py +443 -57
- cfclient/ui/tabs/PlotTab.py +23 -25
- cfclient/ui/tabs/TuningTab.py +292 -0
- cfclient/ui/tabs/__init__.py +12 -2
- cfclient/ui/tabs/colorLEDTab.ui +624 -0
- cfclient/ui/tabs/consoleTab.ui +46 -0
- cfclient/ui/tabs/flightActionContainer.ui +103 -0
- cfclient/ui/tabs/flightTab.ui +724 -237
- cfclient/ui/tabs/{ledTab.ui → ledRingTab.ui} +63 -46
- cfclient/ui/tabs/lighthouse_tab.py +714 -0
- cfclient/ui/tabs/lighthouse_tab.ui +430 -0
- cfclient/ui/tabs/locopositioning_tab.py +606 -389
- cfclient/ui/tabs/locopositioning_tab.ui +370 -253
- cfclient/ui/tabs/logClientTab.ui +52 -0
- cfclient/ui/tabs/logTab.ui +1 -1
- cfclient/ui/tabs/paramTab.ui +204 -3
- cfclient/ui/tabs/tuningTab.ui +773 -0
- cfclient/ui/widgets/ai.py +37 -39
- cfclient/ui/widgets/hexspinbox.py +16 -10
- cfclient/ui/widgets/plotter.ui +39 -47
- cfclient/ui/widgets/plotwidget.py +57 -22
- cfclient/ui/widgets/super_slider.py +112 -0
- cfclient/ui/wizards/__init__.py +0 -0
- cfclient/ui/wizards/bslh_1.png +0 -0
- cfclient/ui/wizards/bslh_2.png +0 -0
- cfclient/ui/wizards/bslh_3.png +0 -0
- cfclient/ui/wizards/bslh_4.png +0 -0
- cfclient/ui/wizards/bslh_5.png +0 -0
- cfclient/ui/wizards/lighthouse_geo_bs_estimation_wizard.py +465 -0
- cfclient/utils/config_manager.py +5 -4
- cfclient/utils/input/__init__.py +77 -19
- cfclient/utils/input/inputinterfaces/wiimote.py +2 -2
- cfclient/utils/input/inputreaderinterface.py +17 -7
- cfclient/utils/input/inputreaders/__init__.py +17 -0
- cfclient/utils/logconfigreader.py +245 -25
- cfclient/utils/logdatawriter.py +3 -1
- cfclient/utils/periodictimer.py +1 -1
- cfclient/utils/ui.py +336 -0
- cfclient/utils/zmq_led_driver.py +5 -0
- cfclient/utils/zmq_param.py +6 -0
- cfclient/version.py +34 -1
- cfclient-2025.12.1.dist-info/METADATA +70 -0
- cfclient-2025.12.1.dist-info/RECORD +152 -0
- {cfclient-2017.4.dist-info → cfclient-2025.12.1.dist-info}/WHEEL +1 -1
- {cfclient-2017.4.dist-info → cfclient-2025.12.1.dist-info}/entry_points.txt +0 -1
- cfclient-2025.12.1.dist-info/licenses/LICENSE.txt +350 -0
- {cfclient-2017.4.dist-info → cfclient-2025.12.1.dist-info}/top_level.txt +1 -0
- cfconfig/Makefile +51 -0
- cfconfig/configblock.py +111 -0
- cfloader/__init__.py +41 -55
- cfzmq/__init__.py +22 -14
- cfclient/ui/dialogs/cf1config.py +0 -265
- cfclient/ui/dialogs/cf1config.ui +0 -260
- cfclient/ui/tab.py +0 -96
- cfclient/ui/tabs/LEDTab.py +0 -169
- cfclient/ui/toolboxes/ConsoleToolbox.py +0 -69
- cfclient/ui/toolboxes/DebugDriverToolbox.py +0 -107
- cfclient/ui/toolboxes/__init__.py +0 -45
- cfclient/ui/toolboxes/consoleToolbox.ui +0 -62
- cfclient/ui/toolboxes/debugDriverToolbox.ui +0 -86
- cfclient-2017.4.dist-info/DESCRIPTION.rst +0 -3
- cfclient-2017.4.dist-info/METADATA +0 -22
- cfclient-2017.4.dist-info/RECORD +0 -104
- cfclient-2017.4.dist-info/metadata.json +0 -1
- /cfclient/{icon-256.png → ui/icons/icon-256.png} +0 -0
- /cfclient/ui/{toolboxes → tabs}/crtpSharkToolbox.ui +0 -0
cfclient/utils/logdatawriter.py
CHANGED
|
@@ -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
|
-
|
|
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)
|
cfclient/utils/periodictimer.py
CHANGED
|
@@ -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.
|
|
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
|
+
"""
|
cfclient/utils/zmq_led_driver.py
CHANGED
|
@@ -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"""
|
cfclient/utils/zmq_param.py
CHANGED
|
@@ -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
|
-
|
|
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 [](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,,
|