diff --git a/src/fenrirscreenreader/speechDriver/dectalkDriver.py b/src/fenrirscreenreader/speechDriver/dectalkDriver.py index 1878d55c..20a97e87 100644 --- a/src/fenrirscreenreader/speechDriver/dectalkDriver.py +++ b/src/fenrirscreenreader/speechDriver/dectalkDriver.py @@ -17,13 +17,21 @@ class driver(hardware_serial_driver): return self._clean_text(text).encode("ascii", errors="replace") + b"\x0b" def _rate_command(self, rate): - return self._setting_command("ra", self._scale(rate, 75, 650)) + value = self._scale_around_default(rate, 75, 180, 650) + return self._setting_command("ra", value) def _pitch_command(self, pitch): - return self._setting_command("dv ap", self._scale(pitch, 50, 350)) + value = self._scale_around_default(pitch, 50, 122, 350) + return self._setting_command("dv ap", value) def _volume_command(self, volume): return self._setting_command("dv g5", self._scale(volume, 60, 86)) + def _scale_around_default(self, value, minimum, default, maximum): + value = max(0.0, min(1.0, value)) + if value <= 0.5: + return self._scale(value * 2, minimum, default) + return self._scale((value - 0.5) * 2, default, maximum) + def _setting_command(self, command, value): return f"[:{command} {value}]".encode("ascii") diff --git a/tests/unit/test_hardware_speech_drivers.py b/tests/unit/test_hardware_speech_drivers.py index 24e14dc5..92d248db 100644 --- a/tests/unit/test_hardware_speech_drivers.py +++ b/tests/unit/test_hardware_speech_drivers.py @@ -83,6 +83,17 @@ def test_dectalk_driver_writes_settings_and_cancel(serial_pair): speech_driver.shutdown() +def test_dectalk_driver_uses_native_defaults_at_fenrir_midpoint(serial_pair): + speech_driver, master_fd = initialized_driver(dectalkDriver, serial_pair) + try: + speech_driver.set_rate(0.5) + speech_driver.set_pitch(0.5) + expected = b"[:ra 180][:dv ap 122]" + assert read_available(master_fd, len(expected)) == expected + finally: + speech_driver.shutdown() + + def test_dectalk_driver_enables_xon_xoff_flow_control(serial_pair): speech_driver, _ = initialized_driver(dectalkDriver, serial_pair) try: