`updated`: uptime connectivity check (#35836)

* start

* p

* comment

* 2

* p

* no time

* order

* space

* fix
pull/35844/merge
Maxime Desroches 6 days ago committed by GitHub
parent 31c4bf8a4a
commit 44da3da1c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      common/params_keys.h
  2. 5
      selfdrive/ui/qt/util.cc
  3. 33
      system/updated/updated.py

@ -73,7 +73,9 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"LastOffroadStatusPacket", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, JSON}}, {"LastOffroadStatusPacket", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, JSON}},
{"LastPowerDropDetected", {CLEAR_ON_MANAGER_START, STRING}}, {"LastPowerDropDetected", {CLEAR_ON_MANAGER_START, STRING}},
{"LastUpdateException", {CLEAR_ON_MANAGER_START, STRING}}, {"LastUpdateException", {CLEAR_ON_MANAGER_START, STRING}},
{"LastUpdateRouteCount", {PERSISTENT, INT}},
{"LastUpdateTime", {PERSISTENT, TIME}}, {"LastUpdateTime", {PERSISTENT, TIME}},
{"LastUpdateUptimeOnroad", {PERSISTENT, FLOAT}},
{"LiveDelay", {PERSISTENT, BYTES}}, {"LiveDelay", {PERSISTENT, BYTES}},
{"LiveParameters", {PERSISTENT, JSON}}, {"LiveParameters", {PERSISTENT, JSON}},
{"LiveParametersV2", {PERSISTENT, BYTES}}, {"LiveParametersV2", {PERSISTENT, BYTES}},
@ -106,7 +108,7 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"RecordFront", {PERSISTENT, BOOL}}, {"RecordFront", {PERSISTENT, BOOL}},
{"RecordFrontLock", {PERSISTENT, BOOL}}, // for the internal fleet {"RecordFrontLock", {PERSISTENT, BOOL}}, // for the internal fleet
{"SecOCKey", {PERSISTENT | DONT_LOG, STRING}}, {"SecOCKey", {PERSISTENT | DONT_LOG, STRING}},
{"RouteCount", {PERSISTENT, INT}}, {"RouteCount", {PERSISTENT, INT, "0"}},
{"SnoozeUpdate", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, BOOL}}, {"SnoozeUpdate", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, BOOL}},
{"SshEnabled", {PERSISTENT, BOOL}}, {"SshEnabled", {PERSISTENT, BOOL}},
{"TermsVersion", {PERSISTENT, STRING}}, {"TermsVersion", {PERSISTENT, STRING}},

@ -18,6 +18,7 @@
#include <QtXml/QDomDocument> #include <QtXml/QDomDocument>
#include "common/swaglog.h" #include "common/swaglog.h"
#include "common/util.h"
#include "system/hardware/hw.h" #include "system/hardware/hw.h"
QString getVersion() { QString getVersion() {
@ -57,6 +58,10 @@ QMap<QString, QString> getSupportedLanguages() {
} }
QString timeAgo(const QDateTime &date) { QString timeAgo(const QDateTime &date) {
if (!util::system_time_valid()) {
return date.date().toString();
}
int diff = date.secsTo(QDateTime::currentDateTimeUtc()); int diff = date.secsTo(QDateTime::currentDateTimeUtc());
QString s; QString s;

@ -31,8 +31,13 @@ FINALIZED = os.path.join(STAGING_ROOT, "finalized")
OVERLAY_INIT = Path(os.path.join(BASEDIR, ".overlay_init")) OVERLAY_INIT = Path(os.path.join(BASEDIR, ".overlay_init"))
DAYS_NO_CONNECTIVITY_MAX = 14 # do not allow to engage after this many days # do not allow to engage after this many hours onroad and this many routes
DAYS_NO_CONNECTIVITY_PROMPT = 10 # send an offroad prompt after this many days HOURS_NO_CONNECTIVITY_MAX = 27
ROUTES_NO_CONNECTIVITY_MAX = 84
# send an offroad prompt after this many hours onroad and this many routes
HOURS_NO_CONNECTIVITY_PROMPT = 23
ROUTES_NO_CONNECTIVITY_PROMPT = 80
class UserRequest: class UserRequest:
NONE = 0 NONE = 0
@ -271,13 +276,15 @@ class Updater:
if len(self.branches): if len(self.branches):
self.params.put("UpdaterAvailableBranches", ','.join(self.branches.keys())) self.params.put("UpdaterAvailableBranches", ','.join(self.branches.keys()))
last_update = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) last_uptime_onroad = self.params.get("UptimeOnroad", return_default=True)
last_route_count = self.params.get("RouteCount", return_default=True)
if update_success: if update_success:
write_time_to_param(self.params, "LastUpdateTime") self.params.put("LastUpdateTime", datetime.datetime.now(datetime.UTC).replace(tzinfo=None))
self.params.put("LastUpdateUptimeOnroad", last_uptime_onroad)
self.params.put("LastUpdateRouteCount", last_route_count)
else: else:
t = self.params.get("LastUpdateTime") last_uptime_onroad = self.params.get("LastUpdateUptimeOnroad") or last_uptime_onroad
if t is not None: last_route_count = self.params.get("LastUpdateRouteCount") or last_route_count
last_update = t
if exception is None: if exception is None:
self.params.remove("LastUpdateException") self.params.remove("LastUpdateException")
@ -315,8 +322,8 @@ class Updater:
for alert in ("Offroad_UpdateFailed", "Offroad_ConnectivityNeeded", "Offroad_ConnectivityNeededPrompt"): for alert in ("Offroad_UpdateFailed", "Offroad_ConnectivityNeeded", "Offroad_ConnectivityNeededPrompt"):
set_offroad_alert(alert, False) set_offroad_alert(alert, False)
now = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) dt_uptime_onroad = (self.params.get("UptimeOnroad", return_default=True) - last_uptime_onroad) / (60*60)
dt = now - last_update dt_route_count = self.params.get("RouteCount", return_default=True) - last_route_count
build_metadata = get_build_metadata() build_metadata = get_build_metadata()
if failed_count > 15 and exception is not None and self.has_internet: if failed_count > 15 and exception is not None and self.has_internet:
if build_metadata.tested_channel: if build_metadata.tested_channel:
@ -325,11 +332,11 @@ class Updater:
extra_text = exception extra_text = exception
set_offroad_alert("Offroad_UpdateFailed", True, extra_text=extra_text) set_offroad_alert("Offroad_UpdateFailed", True, extra_text=extra_text)
elif failed_count > 0: elif failed_count > 0:
if dt.days > DAYS_NO_CONNECTIVITY_MAX: if dt_uptime_onroad > HOURS_NO_CONNECTIVITY_MAX and dt_route_count > ROUTES_NO_CONNECTIVITY_MAX:
set_offroad_alert("Offroad_ConnectivityNeeded", True) set_offroad_alert("Offroad_ConnectivityNeeded", True)
elif dt.days > DAYS_NO_CONNECTIVITY_PROMPT: elif dt_uptime_onroad > HOURS_NO_CONNECTIVITY_PROMPT and dt_route_count > ROUTES_NO_CONNECTIVITY_PROMPT:
remaining = max(DAYS_NO_CONNECTIVITY_MAX - dt.days, 1) remaining = max(HOURS_NO_CONNECTIVITY_MAX - dt_uptime_onroad, 1)
set_offroad_alert("Offroad_ConnectivityNeededPrompt", True, extra_text=f"{remaining} day{'' if remaining == 1 else 's'}.") set_offroad_alert("Offroad_ConnectivityNeededPrompt", True, extra_text=f"{remaining} hour{'' if remaining == 1 else 's'}.")
def check_for_update(self) -> None: def check_for_update(self) -> None:
cloudlog.info("checking for updates") cloudlog.info("checking for updates")

Loading…
Cancel
Save