The axis and button indices in mapping.py are SDL's documented layout rather than an observed one, and until now the only way to find a pad that numbers things differently was to watch a real arm move the wrong way. `dora-teleop-probe` prints the raw axes, the buttons it sees and the velocity that would be sent, live, with no dataflow and no arm — it cannot move anything. It goes through the same Gamepad and velocity() the node runs, so what it prints is what the arm would get; that is the whole reason it is worth having, and the reason it must not grow its own copy of the mapping. Every axis is listed, including ones the layout does not use, because an axis marked unused that moves when a stick is pushed is exactly the finding this is for. The centred bar makes a worn stick that does not return to zero obvious.
82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
"""The probe: what it draws, without a pad or a terminal."""
|
|
|
|
from dora_teleop import mapping, probe
|
|
from dora_teleop.gamepad import Sample
|
|
from tests.conftest import stick
|
|
|
|
|
|
def test_a_centred_stick_puts_the_marker_in_the_middle():
|
|
drawn = probe.bar(0.0)
|
|
|
|
assert drawn[len(drawn) // 2] == "#"
|
|
|
|
|
|
def test_the_bar_leans_the_way_the_stick_is_pushed():
|
|
left = probe.bar(-1.0)
|
|
right = probe.bar(1.0)
|
|
|
|
assert left.index("#") < left.index("|")
|
|
assert right.index("#") > right.index("|")
|
|
|
|
|
|
def test_a_reading_beyond_full_deflection_stays_on_the_bar():
|
|
# SDL has been known to report slightly outside -1..1 on a worn stick.
|
|
assert "#" in probe.bar(-4.0)
|
|
assert "#" in probe.bar(4.0)
|
|
|
|
|
|
def test_no_gamepad_says_so_and_names_the_index_it_looked_for(config):
|
|
config.joystick_index = 2
|
|
|
|
drawn = probe.render(Sample(present=False), [0.0] * 6, config)
|
|
|
|
assert "no gamepad found" in drawn
|
|
assert "index 2" in drawn
|
|
|
|
|
|
def test_every_axis_the_pad_reports_is_shown_even_the_unused_ones(config):
|
|
# A pad whose sticks land on indices we do not use is exactly what this is
|
|
# for, so nothing may be hidden.
|
|
sample = Sample(axes=[0.0] * 8, buttons=[], present=True)
|
|
|
|
drawn = probe.render(sample, [0.0] * 6, config)
|
|
|
|
assert "unused" in drawn
|
|
assert "axes (8 reported)" in drawn
|
|
|
|
|
|
def test_a_pressed_button_is_named(config):
|
|
sample = stick(buttons=[True])
|
|
|
|
drawn = probe.render(sample, [0.0] * 6, config)
|
|
|
|
assert "grasp" in drawn
|
|
|
|
|
|
def test_nothing_pressed_says_so_rather_than_showing_an_empty_line(config):
|
|
drawn = probe.render(stick(), [0.0] * 6, config)
|
|
|
|
assert "none pressed" in drawn
|
|
|
|
|
|
def test_the_velocity_is_shown_in_the_units_the_arm_takes(config):
|
|
velocity = mapping.velocity(stick(axes=[0.0, -1.0]).axes, [], config)
|
|
|
|
drawn = probe.render(stick(axes=[0.0, -1.0]), velocity, config)
|
|
|
|
assert "mm/s" in drawn
|
|
assert "deg/s" in drawn
|
|
assert f"{config.speed_mm_s:+8.2f}" in drawn
|
|
|
|
|
|
def test_a_still_arm_is_reported_as_still(config):
|
|
drawn = probe.render(stick(), [0.0] * 6, config)
|
|
|
|
assert "told to hold still" in drawn
|
|
|
|
|
|
def test_a_moving_arm_is_reported_as_moving(config):
|
|
drawn = probe.render(stick(axes=[0.0, -1.0]), [10.0, 0, 0, 0, 0, 0], config)
|
|
|
|
assert "moving: yes" in drawn
|