Parse the settings correctly lol.
This commit is contained in:
@@ -46,8 +46,8 @@ class hardware_serial_driver(speech_driver):
|
|||||||
self.env = environment
|
self.env = environment
|
||||||
self._is_initialized = False
|
self._is_initialized = False
|
||||||
settings_manager = self.env["runtime"]["SettingsManager"]
|
settings_manager = self.env["runtime"]["SettingsManager"]
|
||||||
self.device = settings_manager.get_setting(
|
self.device = self._clean_device_setting(
|
||||||
"speech", "hardware_device"
|
settings_manager.get_setting("speech", "hardware_device")
|
||||||
)
|
)
|
||||||
self.baud_rate = settings_manager.get_setting_as_int(
|
self.baud_rate = settings_manager.get_setting_as_int(
|
||||||
"speech", "hardware_baud_rate"
|
"speech", "hardware_baud_rate"
|
||||||
@@ -69,6 +69,12 @@ class hardware_serial_driver(speech_driver):
|
|||||||
)
|
)
|
||||||
self.worker_thread.start()
|
self.worker_thread.start()
|
||||||
|
|
||||||
|
def _clean_device_setting(self, device):
|
||||||
|
if not isinstance(device, str):
|
||||||
|
return "auto"
|
||||||
|
device = device.split("#", 1)[0].split(";", 1)[0].strip()
|
||||||
|
return device or "auto"
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
if not self._is_initialized:
|
if not self._is_initialized:
|
||||||
return
|
return
|
||||||
@@ -207,7 +213,7 @@ class hardware_serial_driver(speech_driver):
|
|||||||
attrs[0] &= ~(termios.IXON | termios.IXOFF | termios.IXANY)
|
attrs[0] &= ~(termios.IXON | termios.IXOFF | termios.IXANY)
|
||||||
termios.tcsetattr(port, termios.TCSANOW, attrs)
|
termios.tcsetattr(port, termios.TCSANOW, attrs)
|
||||||
return port
|
return port
|
||||||
except OSError as error:
|
except (OSError, termios.error) as error:
|
||||||
self._debug(
|
self._debug(
|
||||||
f"Hardware speech device open failed: {device}: {error}",
|
f"Hardware speech device open failed: {device}: {error}",
|
||||||
debug.DebugLevel.ERROR,
|
debug.DebugLevel.ERROR,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import select
|
import select
|
||||||
|
import termios
|
||||||
import time
|
import time
|
||||||
from unittest.mock import ANY
|
from unittest.mock import ANY
|
||||||
from unittest.mock import Mock
|
from unittest.mock import Mock
|
||||||
@@ -128,6 +129,19 @@ def test_auto_device_detection_includes_classic_serial(
|
|||||||
speech_driver.shutdown()
|
speech_driver.shutdown()
|
||||||
|
|
||||||
|
|
||||||
|
def test_configured_device_strips_inline_comment(serial_pair):
|
||||||
|
master_fd, slave_name = serial_pair
|
||||||
|
device_setting = f"{slave_name} # built-in serial port"
|
||||||
|
speech_driver = litetalkDriver.driver()
|
||||||
|
speech_driver.initialize(build_environment(device_setting))
|
||||||
|
try:
|
||||||
|
assert speech_driver.device == slave_name
|
||||||
|
speech_driver.speak("Specific")
|
||||||
|
assert read_available(master_fd, 9) == b"Specific\r"
|
||||||
|
finally:
|
||||||
|
speech_driver.shutdown()
|
||||||
|
|
||||||
|
|
||||||
def test_auto_device_detection_prefers_probe_response(monkeypatch):
|
def test_auto_device_detection_prefers_probe_response(monkeypatch):
|
||||||
opened_ports = []
|
opened_ports = []
|
||||||
closed_ports = []
|
closed_ports = []
|
||||||
@@ -260,6 +274,71 @@ def test_auto_device_detection_falls_back_without_probe_response(
|
|||||||
speech_driver.shutdown()
|
speech_driver.shutdown()
|
||||||
|
|
||||||
|
|
||||||
|
def test_auto_device_detection_skips_termios_failures(monkeypatch):
|
||||||
|
opened_ports = []
|
||||||
|
closed_ports = []
|
||||||
|
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
|
||||||
|
lambda pattern: ["/dev/ttyUSB0"]
|
||||||
|
if pattern == "/dev/ttyUSB*"
|
||||||
|
else ["/dev/ttyS0"]
|
||||||
|
if pattern == "/dev/ttyS*"
|
||||||
|
else [],
|
||||||
|
)
|
||||||
|
|
||||||
|
def fake_open(device, flags):
|
||||||
|
port = 100 + len(opened_ports)
|
||||||
|
opened_ports.append((device, port))
|
||||||
|
return port
|
||||||
|
|
||||||
|
def fake_tcgetattr(port):
|
||||||
|
if port == 101:
|
||||||
|
raise termios.error(5, "Input/output error")
|
||||||
|
return [0, 0, 0, 0, 0, 0, [0] * 32]
|
||||||
|
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.open",
|
||||||
|
fake_open,
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.close",
|
||||||
|
lambda port: closed_ports.append(port),
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.os.write",
|
||||||
|
lambda port, data: len(data),
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.select.select",
|
||||||
|
lambda readable, writable, exceptional, timeout: (
|
||||||
|
[],
|
||||||
|
writable,
|
||||||
|
exceptional,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcgetattr",
|
||||||
|
fake_tcgetattr,
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.termios.tcsetattr",
|
||||||
|
lambda port, when, attrs: None,
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.tty.setraw",
|
||||||
|
lambda port: None,
|
||||||
|
)
|
||||||
|
|
||||||
|
speech_driver = litetalkDriver.driver()
|
||||||
|
speech_driver.initialize(build_environment("auto"))
|
||||||
|
try:
|
||||||
|
assert opened_ports == [("/dev/ttyUSB0", 100), ("/dev/ttyS0", 101)]
|
||||||
|
assert speech_driver.device == "/dev/ttyUSB0"
|
||||||
|
finally:
|
||||||
|
speech_driver.shutdown()
|
||||||
|
|
||||||
|
|
||||||
def test_auto_device_detection_fails_when_no_serial_device(monkeypatch):
|
def test_auto_device_detection_fails_when_no_serial_device(monkeypatch):
|
||||||
monkeypatch.setattr(
|
monkeypatch.setattr(
|
||||||
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
|
"fenrirscreenreader.speechDriver.hardwareSerialDriver.glob.glob",
|
||||||
|
|||||||
Reference in New Issue
Block a user