From 9209db62cd8a33d676d3c83d4dbbdf5f9f9f52b2 Mon Sep 17 00:00:00 2001 From: Dustin Spicuzza Date: Sat, 4 Nov 2023 23:52:18 -0400 Subject: [PATCH 1/3] Switch SendableChooser to rpy::gilsafe_object - GIL wasn't being properly acquired in callbacks - Add tests --- .../robotpy-wpilib/gen/SendableChooser.yml | 22 ++++++-- subprojects/robotpy-wpilib/tests/conftest.py | 23 ++++++++ .../tests/test_sendable_chooser.py | 55 +++++++++++++++++++ 3 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 subprojects/robotpy-wpilib/tests/conftest.py create mode 100644 subprojects/robotpy-wpilib/tests/test_sendable_chooser.py diff --git a/subprojects/robotpy-wpilib/gen/SendableChooser.yml b/subprojects/robotpy-wpilib/gen/SendableChooser.yml index a24154f1..8d150a0c 100644 --- a/subprojects/robotpy-wpilib/gen/SendableChooser.yml +++ b/subprojects/robotpy-wpilib/gen/SendableChooser.yml @@ -1,5 +1,8 @@ --- +extra_includes: +- gilsafe_object.h + classes: SendableChooser: shared_ptr: true @@ -9,10 +12,6 @@ classes: SendableChooser: AddOption: SetDefaultOption: - AddObject: - ignore: true - AddDefault: - ignore: true GetSelected: # weirdness because return type cpp_code: | @@ -24,10 +23,23 @@ classes: return v; } OnChange: + # more weirdness + cpp_code: | + [](frc::SendableChooser *self, std::function fn) { + self->OnChange([fn](T v) { + py::gil_scoped_acquire lock; + if (v) { + fn(v); + } else { + fn(py::none()); + } + }); + } + InitSendable: templates: SendableChooser: qualname: frc::SendableChooser params: - - py::object \ No newline at end of file + - rpy::gilsafe_object diff --git a/subprojects/robotpy-wpilib/tests/conftest.py b/subprojects/robotpy-wpilib/tests/conftest.py new file mode 100644 index 00000000..1a926f3a --- /dev/null +++ b/subprojects/robotpy-wpilib/tests/conftest.py @@ -0,0 +1,23 @@ +import logging + +import pytest +import ntcore +import wpilib + + +@pytest.fixture +def cfg_logging(caplog): + caplog.set_level(logging.INFO) + + +@pytest.fixture(scope="function") +def nt(cfg_logging): + instance = ntcore.NetworkTableInstance.getDefault() + instance.startLocal() + + try: + yield instance + finally: + instance.stopLocal() + instance._reset() + wpilib._wpilib._clearSmartDashboardData() diff --git a/subprojects/robotpy-wpilib/tests/test_sendable_chooser.py b/subprojects/robotpy-wpilib/tests/test_sendable_chooser.py new file mode 100644 index 00000000..09765164 --- /dev/null +++ b/subprojects/robotpy-wpilib/tests/test_sendable_chooser.py @@ -0,0 +1,55 @@ +import pytest + +from ntcore import NetworkTableInstance +from wpilib import SendableChooser, SmartDashboard + + +@pytest.fixture +def chooser() -> SendableChooser: + chooser = SendableChooser() + for i in range(1, 4): + chooser.addOption(str(i), i) + return chooser + + +@pytest.mark.parametrize("value", [0, 1, 2, 3]) +def test_returns_selected( + nt: NetworkTableInstance, chooser: SendableChooser, value: int +): + chooser.setDefaultOption("0", 0) + + with nt.getStringTopic( + "/SmartDashboard/ReturnsSelectedChooser/selected" + ).publish() as pub: + SmartDashboard.putData("ReturnsSelectedChooser", chooser) + SmartDashboard.updateValues() + print("set", value) + pub.set(str(value)) + SmartDashboard.updateValues() + print("get", chooser.getSelected()) + assert value == chooser.getSelected() + + +def test_default_is_returned_on_no_select(chooser: SendableChooser): + chooser.setDefaultOption("4", 4) + assert 4 == chooser.getSelected() + + +def test_default_constructable_is_returned_on_no_select_and_no_default( + chooser: SendableChooser, +): + assert chooser.getSelected() is None + + +def test_change_listener(nt: NetworkTableInstance, chooser: SendableChooser): + current_val = [0] + + def on_change(val): + current_val[0] = val + + chooser.onChange(on_change) + SmartDashboard.putData("ChangeListenerChooser", chooser) + SmartDashboard.updateValues() + SmartDashboard.putString("ChangeListenerChooser/selected", "3") + SmartDashboard.updateValues() + assert 3 == current_val[0] From 421f6e604f975fce549374562defe45b420adee3 Mon Sep 17 00:00:00 2001 From: Dustin Spicuzza Date: Sat, 4 Nov 2023 23:54:20 -0400 Subject: [PATCH 2/3] Updated dependencies - build-system.requires: robotpy-build<2025.0.0,~=2024.0.0b3 --- rdev.toml | 2 +- subprojects/pyntcore/pyproject.toml | 2 +- subprojects/robotpy-apriltag/pyproject.toml | 2 +- subprojects/robotpy-cscore/pyproject.toml | 2 +- subprojects/robotpy-hal/pyproject.toml | 2 +- subprojects/robotpy-halsim-ds-socket/pyproject.toml | 2 +- subprojects/robotpy-halsim-gui/pyproject.toml | 2 +- subprojects/robotpy-halsim-ws/pyproject.toml | 2 +- subprojects/robotpy-wpilib/pyproject.toml | 2 +- subprojects/robotpy-wpimath/pyproject.toml | 2 +- subprojects/robotpy-wpinet/pyproject.toml | 2 +- subprojects/robotpy-wpiutil/pyproject.toml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rdev.toml b/rdev.toml index 188551a2..e221add4 100644 --- a/rdev.toml +++ b/rdev.toml @@ -13,7 +13,7 @@ exclude_artifacts = [ "opencv-cpp" ] -robotpy_build_req = "<2025.0.0,~=2024.0.0b2" +robotpy_build_req = "<2025.0.0,~=2024.0.0b3" # # Subproject configuration diff --git a/subprojects/pyntcore/pyproject.toml b/subprojects/pyntcore/pyproject.toml index 32a25565..fb305c3a 100644 --- a/subprojects/pyntcore/pyproject.toml +++ b/subprojects/pyntcore/pyproject.toml @@ -12,7 +12,7 @@ install_requires = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", "robotpy-wpinet~=2024.0.0b2", ] diff --git a/subprojects/robotpy-apriltag/pyproject.toml b/subprojects/robotpy-apriltag/pyproject.toml index 245812ac..61dce1a5 100644 --- a/subprojects/robotpy-apriltag/pyproject.toml +++ b/subprojects/robotpy-apriltag/pyproject.toml @@ -12,7 +12,7 @@ install_requires = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", "robotpy-wpimath~=2024.0.0b2", ] diff --git a/subprojects/robotpy-cscore/pyproject.toml b/subprojects/robotpy-cscore/pyproject.toml index a232baed..b11ccc10 100644 --- a/subprojects/robotpy-cscore/pyproject.toml +++ b/subprojects/robotpy-cscore/pyproject.toml @@ -13,7 +13,7 @@ install_requires = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", "robotpy-wpinet~=2024.0.0b2", "pyntcore~=2024.0.0b2", diff --git a/subprojects/robotpy-hal/pyproject.toml b/subprojects/robotpy-hal/pyproject.toml index 7d82f88f..bcdf2bd0 100644 --- a/subprojects/robotpy-hal/pyproject.toml +++ b/subprojects/robotpy-hal/pyproject.toml @@ -11,7 +11,7 @@ install_requires = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", ] diff --git a/subprojects/robotpy-halsim-ds-socket/pyproject.toml b/subprojects/robotpy-halsim-ds-socket/pyproject.toml index e7937ffe..e64ae3b3 100644 --- a/subprojects/robotpy-halsim-ds-socket/pyproject.toml +++ b/subprojects/robotpy-halsim-ds-socket/pyproject.toml @@ -15,7 +15,7 @@ robotpysimext = ["ds-socket = halsim_ds_socket"] [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-hal~=2024.0.0b2", "robotpy-wpinet~=2024.0.0b2", ] diff --git a/subprojects/robotpy-halsim-gui/pyproject.toml b/subprojects/robotpy-halsim-gui/pyproject.toml index 5afab54e..1cfbec85 100644 --- a/subprojects/robotpy-halsim-gui/pyproject.toml +++ b/subprojects/robotpy-halsim-gui/pyproject.toml @@ -14,7 +14,7 @@ install_requires = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", "robotpy-wpimath~=2024.0.0b2", "robotpy-hal~=2024.0.0b2", diff --git a/subprojects/robotpy-halsim-ws/pyproject.toml b/subprojects/robotpy-halsim-ws/pyproject.toml index 2fcb184c..c3659164 100644 --- a/subprojects/robotpy-halsim-ws/pyproject.toml +++ b/subprojects/robotpy-halsim-ws/pyproject.toml @@ -19,7 +19,7 @@ robotpysimext = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-hal~=2024.0.0b2", "robotpy-wpinet~=2024.0.0b2", ] diff --git a/subprojects/robotpy-wpilib/pyproject.toml b/subprojects/robotpy-wpilib/pyproject.toml index 6a622adb..fe275bd7 100644 --- a/subprojects/robotpy-wpilib/pyproject.toml +++ b/subprojects/robotpy-wpilib/pyproject.toml @@ -17,7 +17,7 @@ robotpy = ["run = wpilib._impl.start:Main"] [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", "robotpy-wpimath~=2024.0.0b2", "robotpy-hal~=2024.0.0b2", diff --git a/subprojects/robotpy-wpimath/pyproject.toml b/subprojects/robotpy-wpimath/pyproject.toml index d5f84b8c..e6309e2b 100644 --- a/subprojects/robotpy-wpimath/pyproject.toml +++ b/subprojects/robotpy-wpimath/pyproject.toml @@ -11,7 +11,7 @@ install_requires = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", # "numpy", # broken in raspbian CI ] diff --git a/subprojects/robotpy-wpinet/pyproject.toml b/subprojects/robotpy-wpinet/pyproject.toml index 84da7b10..3bca4f4d 100644 --- a/subprojects/robotpy-wpinet/pyproject.toml +++ b/subprojects/robotpy-wpinet/pyproject.toml @@ -36,6 +36,6 @@ install_requires = [ [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", "robotpy-wpiutil~=2024.0.0b2", ] diff --git a/subprojects/robotpy-wpiutil/pyproject.toml b/subprojects/robotpy-wpiutil/pyproject.toml index fba2848b..52404b2d 100644 --- a/subprojects/robotpy-wpiutil/pyproject.toml +++ b/subprojects/robotpy-wpiutil/pyproject.toml @@ -9,7 +9,7 @@ install_requires = [] [build-system] requires = [ - "robotpy-build<2025.0.0,~=2024.0.0b2", + "robotpy-build<2025.0.0,~=2024.0.0b3", ] [tool.robotpy-build] From fa44c2658175a81ee0ade5031878fe5edd721e78 Mon Sep 17 00:00:00 2001 From: Dustin Spicuzza Date: Sun, 5 Nov 2023 00:07:08 -0400 Subject: [PATCH 3/3] Use py::typing::List instead of py::List --- subprojects/robotpy-apriltag/gen/AprilTagDetector.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/robotpy-apriltag/gen/AprilTagDetector.yml b/subprojects/robotpy-apriltag/gen/AprilTagDetector.yml index 08db95bc..e03df049 100644 --- a/subprojects/robotpy-apriltag/gen/AprilTagDetector.yml +++ b/subprojects/robotpy-apriltag/gen/AprilTagDetector.yml @@ -49,7 +49,7 @@ classes: py::object py_result = py::cast(c_result); auto len = c_result->size(); auto get = py_result.attr("get"); - py::List l(len); + py::typing::List l(len); for (size_t i = 0; i < len; i++) { l[i] = get(i); }