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; + }; +} 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/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 42bc5b547ae8..89212361ac32 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -2368,6 +2368,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 { }; @@ -8043,6 +8045,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; };