melhorado regra de saude por degradacao de rtk
This commit is contained in:
parent
7d63265ad1
commit
ded951d733
|
|
@ -10,6 +10,10 @@ class ModuloGPS(ModuloDiagnosticoBase):
|
||||||
self.nome = "UM982"
|
self.nome = "UM982"
|
||||||
self.timeout = 5
|
self.timeout = 5
|
||||||
|
|
||||||
|
self._rtk_expirado_desde = 0.0
|
||||||
|
self._rtk_recuperado_desde = 0.0
|
||||||
|
self._rtk_falha_persistente = False
|
||||||
|
|
||||||
def atualizar_saude(self):
|
def atualizar_saude(self):
|
||||||
try:
|
try:
|
||||||
now = time.perf_counter()
|
now = time.perf_counter()
|
||||||
|
|
@ -28,18 +32,43 @@ class ModuloGPS(ModuloDiagnosticoBase):
|
||||||
fix = modulo.get("fix", 0)
|
fix = modulo.get("fix", 0)
|
||||||
rtk = modulo.get("rtk", False)
|
rtk = modulo.get("rtk", False)
|
||||||
hAcc = modulo.get("hAcc", 0)
|
hAcc = modulo.get("hAcc", 0)
|
||||||
age = modulo.get("age", -1)
|
age_bruto = modulo.get("age", -1)
|
||||||
ntrip = modulo.get("correcao_ntrip", False)
|
ntrip = modulo.get("correcao_ntrip", False)
|
||||||
|
|
||||||
orientacao = modulo.get("orientacao") or {}
|
orientacao = modulo.get("orientacao") or {}
|
||||||
|
status_ori = str(orientacao.get("status", "")).strip().upper()
|
||||||
status_ori = str(
|
|
||||||
orientacao.get("status", "")
|
|
||||||
).strip().upper()
|
|
||||||
|
|
||||||
valor_ori_bruto = orientacao.get("valor", 9999.0)
|
valor_ori_bruto = orientacao.get("valor", 9999.0)
|
||||||
valida_redis = orientacao.get("valida", False)
|
valida_redis = orientacao.get("valida", False)
|
||||||
|
|
||||||
|
try:
|
||||||
|
age = float(age_bruto)
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
age = -1.0
|
||||||
|
|
||||||
|
AGE_WARN = 5.0
|
||||||
|
AGE_FAIL = 15.0
|
||||||
|
AGE_RECOVER = 3.0
|
||||||
|
T_FAIL = 2.0
|
||||||
|
T_RECOVER = 3.0
|
||||||
|
agora_mono = time.monotonic()
|
||||||
|
age_valido = math.isfinite(age) and age >= 0.0
|
||||||
|
correcao_expirada = not age_valido or age >= AGE_FAIL
|
||||||
|
correcao_recuperada = (age_valido and age <= AGE_RECOVER and bool(rtk))
|
||||||
|
if correcao_expirada:
|
||||||
|
if self._rtk_expirado_desde <= 0:
|
||||||
|
self._rtk_expirado_desde = agora_mono
|
||||||
|
self._rtk_recuperado_desde = 0.0
|
||||||
|
if (agora_mono - self._rtk_expirado_desde >= T_FAIL):
|
||||||
|
self._rtk_falha_persistente = True
|
||||||
|
elif correcao_recuperada:
|
||||||
|
self._rtk_expirado_desde = 0.0
|
||||||
|
if self._rtk_recuperado_desde <= 0:
|
||||||
|
self._rtk_recuperado_desde = agora_mono
|
||||||
|
if (agora_mono - self._rtk_recuperado_desde >= T_RECOVER):
|
||||||
|
self._rtk_falha_persistente = False
|
||||||
|
else:
|
||||||
|
self._rtk_expirado_desde = 0.0
|
||||||
|
self._rtk_recuperado_desde = 0.0
|
||||||
|
|
||||||
# Proteção caso o Redis devolva booleano como texto.
|
# Proteção caso o Redis devolva booleano como texto.
|
||||||
if isinstance(valida_redis, str):
|
if isinstance(valida_redis, str):
|
||||||
valida_redis = valida_redis.strip().lower() in (
|
valida_redis = valida_redis.strip().lower() in (
|
||||||
|
|
@ -56,27 +85,10 @@ class ModuloGPS(ModuloDiagnosticoBase):
|
||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
valor_ori = 9999.0
|
valor_ori = 9999.0
|
||||||
|
|
||||||
valor_ori_valido = (
|
valor_ori_valido = (math.isfinite(valor_ori) and 0.0 <= valor_ori < 360.0)
|
||||||
math.isfinite(valor_ori)
|
orientacao_recebendo = (freq_ori > FREQ_MIN and not fail_ori)
|
||||||
and 0.0 <= valor_ori < 360.0
|
posicao_recebendo = (freq_pos > FREQ_MIN and not fail_pos)
|
||||||
)
|
orientacao_valida = (orientacao_recebendo and valida_redis and status_ori == "A" and valor_ori_valido)
|
||||||
|
|
||||||
orientacao_recebendo = (
|
|
||||||
freq_ori > FREQ_MIN
|
|
||||||
and not fail_ori
|
|
||||||
)
|
|
||||||
|
|
||||||
posicao_recebendo = (
|
|
||||||
freq_pos > FREQ_MIN
|
|
||||||
and not fail_pos
|
|
||||||
)
|
|
||||||
|
|
||||||
orientacao_valida = (
|
|
||||||
orientacao_recebendo
|
|
||||||
and valida_redis
|
|
||||||
and status_ori == "A"
|
|
||||||
and valor_ori_valido
|
|
||||||
)
|
|
||||||
|
|
||||||
saude = 100
|
saude = 100
|
||||||
motivos = []
|
motivos = []
|
||||||
|
|
@ -148,6 +160,11 @@ class ModuloGPS(ModuloDiagnosticoBase):
|
||||||
if p_age > 0:
|
if p_age > 0:
|
||||||
saude -= p_age
|
saude -= p_age
|
||||||
motivos.append(f"Correção RTK degradada (age={age:.1f}s, penalidade {p_age}%, ntrip: {ntrip})")
|
motivos.append(f"Correção RTK degradada (age={age:.1f}s, penalidade {p_age}%, ntrip: {ntrip})")
|
||||||
|
|
||||||
|
if self._rtk_falha_persistente:
|
||||||
|
saude = 0
|
||||||
|
motivos.append(f"Correção RTK expirada persistentemente: age={age:.1f}s, limite={AGE_FAIL:.1f}s")
|
||||||
|
|
||||||
# 🔹 hAcc
|
# 🔹 hAcc
|
||||||
p_hacc = self._penalidade_hacc(hAcc)
|
p_hacc = self._penalidade_hacc(hAcc)
|
||||||
if p_hacc > 0:
|
if p_hacc > 0:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue