fix(installer): prefer real HDMI EDID during setup
This commit is contained in:
parent
ca649f96e5
commit
3be2d485b0
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -1652,7 +1652,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.16.4"
|
version = "0.16.5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1686,7 +1686,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.16.4"
|
version = "0.16.5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@ -1698,7 +1698,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.16.4"
|
version = "0.16.5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ path = "src/main.rs"
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.16.4"
|
version = "0.16.5"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.16.4"
|
version = "0.16.5"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@ -614,18 +614,19 @@ prepare_hdmi_detection_boot_state() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe_hdmi_connectors() {
|
describe_hdmi_connectors() {
|
||||||
local dev name status id
|
local dev name status id edid_bytes
|
||||||
for dev in /sys/class/drm/card*-HDMI-A-*; do
|
for dev in /sys/class/drm/card*-HDMI-A-*; do
|
||||||
[[ -e $dev/status ]] || continue
|
[[ -e $dev/status ]] || continue
|
||||||
name=$(basename "$dev")
|
name=$(basename "$dev")
|
||||||
status=$(cat "$dev/status" 2>/dev/null || true)
|
status=$(cat "$dev/status" 2>/dev/null || true)
|
||||||
id=$(cat "$dev/connector_id" 2>/dev/null || true)
|
id=$(cat "$dev/connector_id" 2>/dev/null || true)
|
||||||
printf ' %s (%s): %s\n' "$(normalize_hdmi_connector "$name")" "${id:-no-id}" "${status:-unknown}" >&2
|
edid_bytes=$(wc -c <"$dev/edid" 2>/dev/null || echo 0)
|
||||||
|
printf ' %s (%s): %s, edid=%sB\n' "$(normalize_hdmi_connector "$name")" "${id:-no-id}" "${status:-unknown}" "${edid_bytes:-0}" >&2
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_connected_hdmi_connector() {
|
detect_connected_hdmi_connector() {
|
||||||
local dev name stable_name status score
|
local dev name stable_name status score existing increment edid_bytes
|
||||||
local best="" best_score=0 best_count=0
|
local best="" best_score=0 best_count=0
|
||||||
declare -A scores=()
|
declare -A scores=()
|
||||||
|
|
||||||
@ -639,7 +640,15 @@ detect_connected_hdmi_connector() {
|
|||||||
stable_name=$(normalize_hdmi_connector "$name")
|
stable_name=$(normalize_hdmi_connector "$name")
|
||||||
status=$(cat "$dev/status" 2>/dev/null || true)
|
status=$(cat "$dev/status" 2>/dev/null || true)
|
||||||
if [[ $status == connected ]]; then
|
if [[ $status == connected ]]; then
|
||||||
scores[$stable_name]=$(( ${scores[$stable_name]:-0} + 1 ))
|
increment=1
|
||||||
|
# A boot-forced HDMI connector also reports "connected" on Raspberry Pi,
|
||||||
|
# even when no sink is present. Real EDID is stronger evidence than the
|
||||||
|
# status bit, so prefer it before falling back to older install state.
|
||||||
|
edid_bytes=$(wc -c <"$dev/edid" 2>/dev/null || echo 0)
|
||||||
|
if [[ ${edid_bytes:-0} =~ ^[0-9]+$ ]] && (( edid_bytes > 0 )); then
|
||||||
|
increment=20
|
||||||
|
fi
|
||||||
|
scores[$stable_name]=$(( ${scores[$stable_name]:-0} + increment ))
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
sleep 0.2
|
sleep 0.2
|
||||||
@ -666,6 +675,14 @@ detect_connected_hdmi_connector() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
existing=$(read_existing_hdmi_connector)
|
||||||
|
if [[ -n $existing && ${scores[$existing]:-0} -eq $best_score ]]; then
|
||||||
|
echo "⚠️ multiple HDMI connectors are equally connected; preserving existing LESAVKA_HDMI_CONNECTOR=$existing." >&2
|
||||||
|
describe_hdmi_connectors
|
||||||
|
printf '%s\n' "$existing"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
echo "❌ multiple HDMI connectors are equally connected; refusing to guess." >&2
|
echo "❌ multiple HDMI connectors are equally connected; refusing to guess." >&2
|
||||||
describe_hdmi_connectors
|
describe_hdmi_connectors
|
||||||
echo " Disconnect the non-target HDMI output or run once with LESAVKA_HDMI_CONNECTOR=HDMI-A-N." >&2
|
echo " Disconnect the non-target HDMI output or run once with LESAVKA_HDMI_CONNECTOR=HDMI-A-N." >&2
|
||||||
|
|||||||
@ -10,7 +10,7 @@ bench = false
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.16.4"
|
version = "0.16.5"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
autobins = false
|
autobins = false
|
||||||
|
|
||||||
|
|||||||
@ -198,6 +198,22 @@ fn server_install_pins_hdmi_camera_and_display_defaults() {
|
|||||||
SERVER_INSTALL.contains("validate_server_ready"),
|
SERVER_INSTALL.contains("validate_server_ready"),
|
||||||
"install script should verify that lesavka-server reaches a running state"
|
"install script should verify that lesavka-server reaches a running state"
|
||||||
);
|
);
|
||||||
|
assert!(
|
||||||
|
SERVER_INSTALL.contains("edid_bytes=$(wc -c <\"$dev/edid\""),
|
||||||
|
"HDMI auto-detection should count real EDID bytes instead of trusting sysfs file size"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
SERVER_INSTALL.contains("(( edid_bytes > 0 ))"),
|
||||||
|
"HDMI auto-detection should prefer a connector with real EDID over a boot-forced phantom connection"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
SERVER_INSTALL.contains("preserving existing LESAVKA_HDMI_CONNECTOR"),
|
||||||
|
"HDMI auto-detection should preserve the prior connector when physical evidence is still tied"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
SERVER_INSTALL.contains("edid=%sB"),
|
||||||
|
"ambiguous HDMI diagnostics should show EDID evidence for operator debugging"
|
||||||
|
);
|
||||||
assert!(
|
assert!(
|
||||||
SERVER_INSTALL.contains("active and listening"),
|
SERVER_INSTALL.contains("active and listening"),
|
||||||
"install script should require the TCP listener before declaring server readiness"
|
"install script should require the TCP listener before declaring server readiness"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user