Add auxiliary monitor configuration and enhance trigger logic for KVM switching
This commit is contained in:
+54
-19
@@ -10,14 +10,30 @@ from app.config import SUPPORTED_TARGET_PORTS
|
||||
ALIENWARE_MODEL_TOKEN = "AW3423DWF"
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class TriggerMonitorCandidate:
|
||||
id: str
|
||||
label: str
|
||||
input_code: int | None = None
|
||||
|
||||
def to_dict(self) -> dict[str, int | str | None]:
|
||||
return {
|
||||
"id": self.id,
|
||||
"label": self.label,
|
||||
"input_code": self.input_code,
|
||||
}
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class HardwareScan:
|
||||
samsung_present: bool = False
|
||||
trigger_input_code: int | None = None
|
||||
trigger_monitor_id: str | None = None
|
||||
alienware_detected: bool = False
|
||||
alienware_input_code: int | None = None
|
||||
trigger_description: str | None = None
|
||||
alienware_description: str | None = None
|
||||
trigger_candidates: list[TriggerMonitorCandidate] = field(default_factory=list)
|
||||
errors: list[str] = field(default_factory=list)
|
||||
|
||||
|
||||
@@ -68,36 +84,44 @@ class RealMonitorBackend:
|
||||
|
||||
trigger_description: str | None = None
|
||||
trigger_input_code: int | None = None
|
||||
trigger_monitor_id: str | None = None
|
||||
trigger_candidates = (
|
||||
samsung_named_candidates
|
||||
if samsung_named_candidates
|
||||
else (non_alienware_candidates if samsung_present else [])
|
||||
)
|
||||
if len(trigger_candidates) == 1:
|
||||
trigger_monitor, trigger_description = trigger_candidates[0]
|
||||
trigger_input_code = self._read_input_code(
|
||||
trigger_monitor,
|
||||
"Samsung trigger monitor",
|
||||
errors,
|
||||
scanned_candidates: list[TriggerMonitorCandidate] = []
|
||||
for index, (monitor, description) in enumerate(trigger_candidates, start=1):
|
||||
local_errors: list[str] = []
|
||||
input_code = self._read_input_code(
|
||||
monitor,
|
||||
"Samsung trigger candidate monitor",
|
||||
local_errors,
|
||||
)
|
||||
elif not trigger_candidates:
|
||||
scanned_candidates.append(
|
||||
TriggerMonitorCandidate(
|
||||
id=_build_trigger_candidate_id(description, index),
|
||||
label=description,
|
||||
input_code=input_code,
|
||||
)
|
||||
)
|
||||
|
||||
if len(scanned_candidates) == 1:
|
||||
selected = scanned_candidates[0]
|
||||
trigger_description = selected.label
|
||||
trigger_input_code = selected.input_code
|
||||
trigger_monitor_id = selected.id
|
||||
elif not scanned_candidates:
|
||||
errors.append("Samsung trigger monitor could not be identified through DDC/CI.")
|
||||
else:
|
||||
scanned_candidates: list[tuple[object, str, int | None]] = []
|
||||
for monitor, description in trigger_candidates:
|
||||
local_errors: list[str] = []
|
||||
input_code = self._read_input_code(
|
||||
monitor,
|
||||
"Samsung trigger candidate monitor",
|
||||
local_errors,
|
||||
)
|
||||
scanned_candidates.append((monitor, description, input_code))
|
||||
|
||||
selected_index = _select_trigger_candidate_index(
|
||||
[(description, input_code) for _, description, input_code in scanned_candidates]
|
||||
[(candidate.label, candidate.input_code) for candidate in scanned_candidates]
|
||||
)
|
||||
if selected_index is not None:
|
||||
_, trigger_description, trigger_input_code = scanned_candidates[selected_index]
|
||||
selected = scanned_candidates[selected_index]
|
||||
trigger_description = selected.label
|
||||
trigger_input_code = selected.input_code
|
||||
trigger_monitor_id = selected.id
|
||||
elif samsung_named_candidates:
|
||||
errors.append("Multiple Samsung DDC monitors were detected; trigger monitor is ambiguous.")
|
||||
else:
|
||||
@@ -111,10 +135,12 @@ class RealMonitorBackend:
|
||||
return HardwareScan(
|
||||
samsung_present=samsung_present,
|
||||
trigger_input_code=trigger_input_code,
|
||||
trigger_monitor_id=trigger_monitor_id,
|
||||
alienware_detected=len(alienware_candidates) == 1,
|
||||
alienware_input_code=alienware_input_code,
|
||||
trigger_description=trigger_description,
|
||||
alienware_description=alienware_description,
|
||||
trigger_candidates=scanned_candidates,
|
||||
errors=errors,
|
||||
)
|
||||
|
||||
@@ -222,3 +248,12 @@ def _select_trigger_candidate_index(candidates: list[tuple[str, int | None]]) ->
|
||||
return generic[0]
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def _build_trigger_candidate_id(description: str, index: int) -> str:
|
||||
normalized = description.strip().lower()
|
||||
safe = "".join(ch if ch.isalnum() else "-" for ch in normalized).strip("-")
|
||||
safe = "-".join(part for part in safe.split("-") if part)
|
||||
if not safe:
|
||||
safe = "monitor"
|
||||
return f"{safe}-{index}"
|
||||
|
||||
Reference in New Issue
Block a user