diff --git a/EyeTrackApp/osc.py b/EyeTrackApp/osc.py index 33e4e09..02be6da 100644 --- a/EyeTrackApp/osc.py +++ b/EyeTrackApp/osc.py @@ -176,7 +176,6 @@ def output_osc(eye_x, eye_y, eye_blink, last_blink, pupil_dilation, avg_velocity if self.r_eye_blink == 0.0: if last_blink > 0.15: # when binary blink is on, blinks may be too fast for OSC so we repeat them. - # print("REPEATING R BLINK") for i in range(4): self.client.send_message( "/avatar/parameters/v2/EyeLidRight", diff --git a/tests/test_osc.py b/tests/test_osc.py index 882477b..dc72d25 100644 --- a/tests/test_osc.py +++ b/tests/test_osc.py @@ -126,6 +126,47 @@ def test_send_command_v2_params_single_eye(main_config_v2_params, eye_id, messag ("/avatar/parameters/v2/EyeLidLeft", 0.5), ], ), + # binary blink + ( + [ + ( + 0, + EyeInfoMock( + x=0, + y=0, + blink=0, + pupil_dilation=1, + avg_velocity=0, + ), + ), + ( + 1, + EyeInfoMock( + x=10, + y=5, + blink=0, + pupil_dilation=1, + avg_velocity=0, + ), + ), + ], + [ + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeRightX", 0), + ("/avatar/parameters/v2/EyeRightY", 0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLeftX", 0), + ("/avatar/parameters/v2/EyeLeftY", 5), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ], + ), ], ) def test_send_command_v2_params_dual_eye(main_config_v2_params, eye_data, expected_outcome): @@ -152,3 +193,122 @@ def test_send_command_v2_params_dual_eye(main_config_v2_params, eye_data, expect assert msg_queue.empty() assert client.client.messages == expected_outcome + + +@pytest.mark.parametrize( + "eye_data,expected_outcome", + [ + ( + [ + ( + 0, + EyeInfoMock( + x=0, + y=0, + blink=0, + pupil_dilation=1, + avg_velocity=0, + ), + ), + ( + 1, + EyeInfoMock( + x=10, + y=5, + blink=0, + pupil_dilation=1, + avg_velocity=0, + ), + ), + ], + [ + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeRightX", 0), + ("/avatar/parameters/v2/EyeRightY", 0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLeftX", 0), + ("/avatar/parameters/v2/EyeLeftY", 5), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ], + ), + ( + [ + ( + 0, + EyeInfoMock( + x=0, + y=0, + blink=0, + pupil_dilation=1, + avg_velocity=0, + ), + ), + ( + 1, + EyeInfoMock( + x=10, + y=5, + blink=0, + pupil_dilation=1, + avg_velocity=0, + ), + ), + ], + [ + # binary blink + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeRightX", 0), + ("/avatar/parameters/v2/EyeRightY", 0), + # side falloff + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + # binary blink again + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ("/avatar/parameters/v2/EyeLidRight", 0.0), + ("/avatar/parameters/v2/EyeLeftX", 0), + ("/avatar/parameters/v2/EyeLeftY", 5), + ("/avatar/parameters/v2/EyeLidLeft", 0.0), + ], + ), + ], +) +def test_send_command_v2_params_eye_outer_side_falloff(main_config_v2_params, eye_data, expected_outcome): + main_config_v2_params.eye_display_id = 2 + main_config_v2_params.settings.gui_outer_side_falloff = True + + with mock.patch("EyeTrackApp.osc.udp_client.SimpleUDPClient", SimpleUDPClientMock): + cancellation_event = threading.Event() + msg_queue = Queue() + client = VRChatOSC( + main_config=main_config_v2_params, + msg_queue=msg_queue, + cancellation_event=cancellation_event, + ) + + osc_thread = threading.Thread(target=client.run) + osc_thread.start() + + for eye_id, message in eye_data: + sleep(0.01) + msg_queue.put((eye_id, message)) + + cancellation_event.set() + osc_thread.join() + + assert msg_queue.empty() + assert client.client.messages == expected_outcome