fix: force OBD reconnect after ~20s of stale null speed (BUG-24)
obd_speed() now counts consecutive null-speed polls. If the ELM327 returns null for 10 polls (~20s) while still reporting CAR_CONNECTED, it force-closes the connection so the reconnect loop re-handshakes instead of silently flatlining until the next ignition cycle.
This commit is contained in:
@@ -11,6 +11,9 @@ from modules import app_events, app_gps
|
|||||||
|
|
||||||
RECONNECT_INTERVAL = 10
|
RECONNECT_INTERVAL = 10
|
||||||
SENSOR_POLL_INTERVAL = 5
|
SENSOR_POLL_INTERVAL = 5
|
||||||
|
# Speed poll is every 2s; if the adapter returns null for this many consecutive
|
||||||
|
# polls (~20s) the ELM327 is usually stalled — force a reconnect.
|
||||||
|
STALE_SPEED_RECONNECT_THRESHOLD = 10
|
||||||
|
|
||||||
status = None
|
status = None
|
||||||
speed = 0
|
speed = 0
|
||||||
@@ -357,14 +360,25 @@ def get_fresh_dtc_codes(max_age=SENSOR_POLL_INTERVAL * 3):
|
|||||||
def obd_speed():
|
def obd_speed():
|
||||||
global speed, speed_updated_at
|
global speed, speed_updated_at
|
||||||
with obd_speed_lock:
|
with obd_speed_lock:
|
||||||
|
null_streak = 0
|
||||||
while not stop_speed.is_set() and _is_car_connected():
|
while not stop_speed.is_set() and _is_car_connected():
|
||||||
response = _query(obd.commands.SPEED)
|
response = _query(obd.commands.SPEED)
|
||||||
if response is None:
|
if response is None:
|
||||||
break
|
break
|
||||||
if response.is_null():
|
if response.is_null():
|
||||||
|
null_streak += 1
|
||||||
print("No speed data received. #" + str(get_speedtime()))
|
print("No speed data received. #" + str(get_speedtime()))
|
||||||
print(app_gps.get_gps())
|
print(app_gps.get_gps())
|
||||||
|
# A stalled ELM327 keeps the connection "alive" but returns
|
||||||
|
# null for speed forever. Force a reconnect after ~20s of null
|
||||||
|
# reads instead of flatlining until the next ignition cycle.
|
||||||
|
if null_streak >= STALE_SPEED_RECONNECT_THRESHOLD:
|
||||||
|
with _connection_lock:
|
||||||
|
candidate = connection
|
||||||
|
_mark_connection_lost(candidate, "speed", "stale null speed")
|
||||||
|
break
|
||||||
else:
|
else:
|
||||||
|
null_streak = 0
|
||||||
speed = round(response.value.to("kph").magnitude, 1)
|
speed = round(response.value.to("kph").magnitude, 1)
|
||||||
speed_updated_at = time.monotonic()
|
speed_updated_at = time.monotonic()
|
||||||
print("Speed:", speed, "kph")
|
print("Speed:", speed, "kph")
|
||||||
|
|||||||
Reference in New Issue
Block a user