You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.4 KiB
43 lines
1.4 KiB
"""Pure Phase 4 yaw and turn-level rules."""
|
|
|
|
from .config_loader import TurnDetectionSettings
|
|
from .models import TurnLevel
|
|
|
|
|
|
LEVEL_ORDER = {
|
|
TurnLevel.NONE.value: 0,
|
|
TurnLevel.FACE_APPEARED.value: 0,
|
|
TurnLevel.SUBTLE.value: 1,
|
|
TurnLevel.WEAK.value: 2,
|
|
TurnLevel.MEDIUM.value: 3,
|
|
TurnLevel.STRONG.value: 4,
|
|
TurnLevel.NOT_EVALUABLE.value: -1,
|
|
}
|
|
|
|
|
|
def yaw_delta_toward_signage(current_yaw: float, baseline_yaw: float, direction: str) -> tuple[float, float]:
|
|
"""Return raw delta and a delta whose positive sign points toward signage."""
|
|
if direction not in {"positive", "negative"}:
|
|
raise ValueError("direction must be positive or negative")
|
|
raw = current_yaw - baseline_yaw
|
|
return raw, raw if direction == "positive" else -raw
|
|
|
|
|
|
def classify_turn_level(delta: float, config: TurnDetectionSettings) -> str:
|
|
if delta < config.subtle_threshold_deg:
|
|
return TurnLevel.NONE.value
|
|
if delta < config.weak_threshold_deg:
|
|
return TurnLevel.SUBTLE.value
|
|
if delta < config.medium_threshold_deg:
|
|
return TurnLevel.WEAK.value
|
|
if delta < config.strong_threshold_deg:
|
|
return TurnLevel.MEDIUM.value
|
|
return TurnLevel.STRONG.value
|
|
|
|
|
|
def is_weak_or_higher(level: str) -> bool:
|
|
return LEVEL_ORDER.get(level, -1) >= LEVEL_ORDER[TurnLevel.WEAK.value]
|
|
|
|
|
|
def stronger_level(first: str, second: str) -> str:
|
|
return second if LEVEL_ORDER.get(second, -1) > LEVEL_ORDER.get(first, -1) else first
|
|
|