From 14918d8f887b0135a6af32ac3c09bc6e6f3f2ae8 Mon Sep 17 00:00:00 2001 From: Brian McGillion Date: Sun, 25 May 2025 20:25:11 +0400 Subject: [PATCH 1/3] libusb-package: init at 1.0.26.3 This is a helper library for usb access from python scripts. It is added here in support of the cflib (crazyflie library) used to controll the small crazyflie nano drones. Signed-off-by: Brian McGillion --- .../python-modules/libusb-package/default.nix | 43 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 4 ++ 2 files changed, 47 insertions(+) create mode 100644 pkgs/development/python-modules/libusb-package/default.nix diff --git a/pkgs/development/python-modules/libusb-package/default.nix b/pkgs/development/python-modules/libusb-package/default.nix new file mode 100644 index 000000000000..7cc3d6602712 --- /dev/null +++ b/pkgs/development/python-modules/libusb-package/default.nix @@ -0,0 +1,43 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + setuptools, + setuptools-scm, + tomli, + importlib-resources, + libusb1, +}: + +buildPythonPackage rec { + pname = "libusb-package"; + version = "1.0.26.3"; + pyproject = true; + + src = fetchFromGitHub { + owner = "pyocd"; + repo = "libusb-package"; + tag = "v${version}"; + hash = "sha256-4zTyaidpSlledTcEztWzRgwj43oNV7xWrhMXCE9Qz3k="; + }; + + build-system = [ + setuptools + setuptools-scm + tomli + ]; + + dependencies = [ + importlib-resources + libusb1 + ]; + + meta = { + description = "Python package for simplified libusb distribution and usage with pyOCD"; + homepage = "https://github.com/pyocd/libusb-package"; + changelog = "https://github.com/pyocd/libusb-package/releases/tag/v${version}"; + license = lib.licenses.asl20; + maintainers = [ lib.maintainers.brianmcgillion ]; + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index c4c9004ae04d..a7a1e6b8d340 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -8041,6 +8041,10 @@ self: super: with self; { libtorrent-rasterbar = (toPythonModule (pkgs.libtorrent-rasterbar.override { python3 = python; })).python; + libusb-package = callPackage ../development/python-modules/libusb-package { + inherit (pkgs) libusb1; + }; + libusb1 = callPackage ../development/python-modules/libusb1 { inherit (pkgs) libusb1; }; libusbsio = callPackage ../development/python-modules/libusbsio { inherit (pkgs) libusbsio; }; From 0b95d24dabddd50d7c12de449372e241e085cfa6 Mon Sep 17 00:00:00 2001 From: Brian McGillion Date: Sun, 25 May 2025 20:28:42 +0400 Subject: [PATCH 2/3] cflib: init at 0.1.28 Python library to communicate with and control the crazyflie micro quadcopters. Signed-off-by: Brian McGillion --- .../python-modules/cflib/default.nix | 90 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 92 insertions(+) create mode 100644 pkgs/development/python-modules/cflib/default.nix diff --git a/pkgs/development/python-modules/cflib/default.nix b/pkgs/development/python-modules/cflib/default.nix new file mode 100644 index 000000000000..a76c9568643d --- /dev/null +++ b/pkgs/development/python-modules/cflib/default.nix @@ -0,0 +1,90 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + setuptools, + setuptools-scm, + libusb-package, + numpy, + packaging, + pyserial, + pyusb, + scipy, + pytestCheckHook, + pyyaml, + udevCheckHook, +}: + +buildPythonPackage rec { + pname = "cflib"; + version = "0.1.28"; + pyproject = true; + + src = fetchFromGitHub { + owner = "bitcraze"; + repo = "crazyflie-lib-python"; + tag = version; + hash = "sha256-vGqwQVD80NcFJosVAmqj66uxYNoVtAqzVhVQiuWP5yM="; + }; + + strictDeps = true; + + build-system = [ + setuptools + setuptools-scm + ]; + + pythonRelaxDeps = [ "numpy" ]; + + dependencies = [ + libusb-package + numpy + packaging + pyserial + pyusb + scipy + ]; + + disabledTestPaths = [ + # exception: Cannot find a Crazyradio Dongle (HW required) + "sys_test/single_cf_grounded/" + "sys_test/swarm_test_rig/" + ]; + + pythonImportsCheck = [ "cflib" ]; + nativeCheckInputs = [ + pytestCheckHook + pyyaml + ]; + + # The udevCheckHook is used to verify udev rules + # requires diInstallCheck to be enabled, which is default for pythonPackages + nativeInstallCheckInputs = [ + udevCheckHook + ]; + + # Install udev rules as defined + # https://www.bitcraze.io/documentation/repository/crazyflie-lib-python/master/installation/usb_permissions/ + postInstall = '' + # Install udev rules + mkdir -p $out/etc/udev/rules.d + + cat < $out/etc/udev/rules.d/99-bitcraze.rules + # Crazyradio (normal operation) + SUBSYSTEM=="usb", ATTRS{idVendor}=="1915", ATTRS{idProduct}=="7777", MODE="0664", GROUP="plugdev" + # Bootloader + SUBSYSTEM=="usb", ATTRS{idVendor}=="1915", ATTRS{idProduct}=="0101", MODE="0664", GROUP="plugdev" + # Crazyflie (over USB) + SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", MODE="0664", GROUP="plugdev" + EOF + ''; + + meta = { + description = "Python library for the Crazyflie quadcopter by Bitcraze"; + homepage = "https://github.com/bitcraze/crazyflie-lib-python"; + changelog = "https://github.com/bitcraze/crazyflie-lib-python/releases/tag/${version}"; + license = lib.licenses.gpl2Only; + maintainers = [ lib.maintainers.brianmcgillion ]; + platforms = lib.platforms.linux; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index a7a1e6b8d340..751cece0fb41 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -2366,6 +2366,8 @@ self: super: with self; { cfgv = callPackage ../development/python-modules/cfgv { }; + cflib = callPackage ../development/python-modules/cflib { }; + cfn-flip = callPackage ../development/python-modules/cfn-flip { }; cfn-lint = callPackage ../development/python-modules/cfn-lint { }; From b6529db3f2d9c2b4c415baed15711c6967cd052f Mon Sep 17 00:00:00 2001 From: Brian McGillion Date: Sun, 25 May 2025 20:34:43 +0400 Subject: [PATCH 3/3] cfclient: init at 2025.2 The Crazyflie PC client enables flashing and controlling the Crazyflie. It implements the user interface and high-level control (for example gamepad handling). The communication with Crazyflie and the implementation of the CRTP protocol to control the Crazyflie is handled by the cflib project. Signed-off-by: Brian McGillion --- pkgs/by-name/cf/cfclient/package.nix | 79 ++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 pkgs/by-name/cf/cfclient/package.nix diff --git a/pkgs/by-name/cf/cfclient/package.nix b/pkgs/by-name/cf/cfclient/package.nix new file mode 100644 index 000000000000..d744757fe5d5 --- /dev/null +++ b/pkgs/by-name/cf/cfclient/package.nix @@ -0,0 +1,79 @@ +{ + lib, + python3Packages, + fetchFromGitHub, + qt6, +}: + +python3Packages.buildPythonApplication rec { + pname = "cfclient"; + version = "2025.2"; + pyproject = true; + + src = fetchFromGitHub { + owner = "bitcraze"; + repo = "crazyflie-clients-python"; + tag = version; + hash = "sha256-LCGTMLIfGH59KFwQACyuEQTh/zkGgzXd3e6MkFTgKhA="; + }; + + strictDeps = true; + + buildInputs = [ + qt6.qtbase + ]; + + nativeBuildInputs = [ + qt6.wrapQtAppsHook + ]; + + dontWrapQtApps = true; + + build-system = with python3Packages; [ + setuptools + setuptools-scm + ]; + + pythonRelaxDeps = [ + "numpy" + "pyqt6" + "vispy" + ]; + + dependencies = with python3Packages; [ + appdirs + cflib + numpy + pyopengl + pyserial + pysdl2 + pyqtgraph + pyqt6 + pyqt6-sip + pyyaml + pyzmq + scipy + setuptools + vispy + ]; + + # No tests + doCheck = false; + + # Use wrapQtApp for Python scripts as the manual mentions that wrapQtAppsHook only applies to binaries + postFixup = '' + wrapQtApp "$out/bin/cfclient" \ + --set QT_QPA_PLATFORM "wayland" \ + --set XDG_CURRENT_DESKTOP "Wayland" \ + ''${qtWrapperArgs[@]} + ''; + + meta = { + description = "Host applications and library for Crazyflie drones written in Python"; + homepage = "https://github.com/bitcraze/crazyflie-clients-python"; + changelog = "https://github.com/bitcraze/crazyflie-clients-python/releases/tag/${version}"; + license = lib.licenses.gpl2Only; + maintainers = [ lib.maintainers.brianmcgillion ]; + platforms = lib.platforms.linux; + }; +}