Implement feetech broadcast ping

This commit is contained in:
Simon Alibert
2025-03-24 20:46:36 +01:00
parent 1de75c46c0
commit 7c8ab8e2d6
4 changed files with 120 additions and 32 deletions

View File

@@ -295,16 +295,13 @@ class MockMotors(MockSerial):
return new_stub
def build_broadcast_ping_stub(
self, ids_models_firmwares: dict[int, list[int]] | None = None, num_invalid_try: int = 0
self, ids_models: dict[int, list[int]] | None = None, num_invalid_try: int = 0
) -> str:
ping_request = MockInstructionPacket.ping(scs.BROADCAST_ID)
return_packets = b"".join(
MockStatusPacket.ping(idx, model, firm_ver)
for idx, (model, firm_ver) in ids_models_firmwares.items()
)
return_packets = b"".join(MockStatusPacket.ping(idx, model) for idx, model in ids_models.items())
ping_response = self._build_send_fn(return_packets, num_invalid_try)
stub_name = "Ping_" + "_".join([str(idx) for idx in ids_models_firmwares])
stub_name = "Ping_" + "_".join([str(idx) for idx in ids_models])
self.stub(
name=stub_name,
receive_bytes=ping_request,

View File

@@ -6,7 +6,7 @@ import pytest
import scservo_sdk as scs
from lerobot.common.motors import CalibrationMode, Motor
from lerobot.common.motors.feetech import FeetechMotorsBus
from lerobot.common.motors.feetech import MODEL_NUMBER, FeetechMotorsBus
from tests.mocks.mock_feetech import MockMotors, MockPortHandler
@@ -93,15 +93,10 @@ def test_abc_implementation(dummy_motors):
@pytest.mark.skip("TODO")
@pytest.mark.parametrize(
"idx, model_nb",
[
(1, 1190),
(2, 1200),
(3, 1120),
],
)
def test_ping(idx, model_nb, mock_motors, dummy_motors):
@pytest.mark.parametrize("idx", [1, 2, 3])
def test_ping(idx, mock_motors, dummy_motors):
expected_model = dummy_motors[f"dummy_{idx}"].model
model_nb = MODEL_NUMBER[expected_model]
stub_name = mock_motors.build_ping_stub(idx, model_nb)
motors_bus = FeetechMotorsBus(
port=mock_motors.port,
@@ -111,27 +106,24 @@ def test_ping(idx, model_nb, mock_motors, dummy_motors):
ping_model_nb = motors_bus.ping(idx)
assert ping_model_nb == model_nb
assert ping_model_nb == expected_model
assert mock_motors.stubs[stub_name].called
@pytest.mark.skip("TODO")
def test_broadcast_ping(mock_motors, dummy_motors):
expected_pings = {
1: [1060, 50],
2: [1120, 30],
3: [1190, 10],
}
stub_name = mock_motors.build_broadcast_ping_stub(expected_pings)
expected_models = {m.id: m.model for m in dummy_motors.values()}
model_nbs = {id_: MODEL_NUMBER[model] for id_, model in expected_models.items()}
stub_name = mock_motors.build_broadcast_ping_stub(model_nbs)
motors_bus = FeetechMotorsBus(
port=mock_motors.port,
motors=dummy_motors,
)
motors_bus.connect()
ping_list = motors_bus.broadcast_ping()
ping_model_nbs = motors_bus.broadcast_ping()
assert ping_list == expected_pings
assert ping_model_nbs == expected_models
assert mock_motors.stubs[stub_name].called