diff --git a/common/params.cc b/common/params.cc index b416b801a8..639de5322b 100644 --- a/common/params.cc +++ b/common/params.cc @@ -94,6 +94,7 @@ std::unordered_map keys = { {"AssistNowToken", PERSISTENT}, {"AthenadPid", PERSISTENT}, {"AthenadUploadQueue", PERSISTENT}, + {"AthenadRecentlyViewedRoutes", PERSISTENT}, {"CalibrationParams", PERSISTENT}, {"CameraDebugExpGain", CLEAR_ON_MANAGER_START}, {"CameraDebugExpTime", CLEAR_ON_MANAGER_START}, diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 2df44cb090..0a5c9b7999 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -432,6 +432,21 @@ def cancelUpload(upload_id: Union[str, List[str]]) -> Dict[str, Union[int, str]] cancelled_uploads.update(cancelled_ids) return {"success": 1} +@dispatcher.add_method +def setRouteViewed(route: str) -> Dict[str, Union[int, str]]: + # maintain a list of the last 10 routes viewed in connect + params = Params() + + r = params.get("AthenadRecentlyViewedRoutes", encoding="utf8") + routes = [] if r is None else r.split(",") + routes.append(route) + + # remove duplicates + routes = list(dict.fromkeys(routes)) + + params.put("AthenadRecentlyViewedRoutes", ",".join(routes[-10:])) + return {"success": 1} + def startLocalProxy(global_end_event: threading.Event, remote_ws_uri: str, local_port: int) -> Dict[str, int]: try: diff --git a/system/loggerd/loggerd.cc b/system/loggerd/loggerd.cc index 8d5fcb95ac..27dfa187c4 100644 --- a/system/loggerd/loggerd.cc +++ b/system/loggerd/loggerd.cc @@ -6,6 +6,7 @@ #include #include +#include "common/params.h" #include "system/loggerd/encoder/encoder.h" #include "system/loggerd/loggerd.h" #include "system/loggerd/video_writer.h" @@ -187,6 +188,12 @@ void handle_user_flag(LoggerdState *s) { if (ret) { LOGE("setxattr %s failed for %s: %s", PRESERVE_ATTR_NAME, s->logger.segmentPath().c_str(), strerror(errno)); } + + // mark route for uploading + Params params; + std::string routes = Params().get("AthenadRecentlyViewedRoutes"); + params.put("AthenadRecentlyViewedRoutes", routes + "," + s->logger.routeName()); + prev_segment = s->logger.segment(); } diff --git a/system/loggerd/uploader.py b/system/loggerd/uploader.py index 8b45627751..105e830a4c 100755 --- a/system/loggerd/uploader.py +++ b/system/loggerd/uploader.py @@ -74,6 +74,8 @@ class Uploader: self.api = Api(dongle_id) self.root = root + self.params = Params() + # stats for last successfully uploaded file self.last_filename = "" @@ -81,6 +83,9 @@ class Uploader: self.immediate_priority = {"qlog": 0, "qlog.bz2": 0, "qcamera.ts": 1} def list_upload_files(self, metered: bool) -> Iterator[Tuple[str, str, str]]: + r = self.params.get("AthenadRecentlyViewedRoutes", encoding="utf8") + requested_routes = [] if r is None else r.split(",") + for logdir in listdir_by_creation(self.root): path = os.path.join(self.root, logdir) try: @@ -105,10 +110,14 @@ class Uploader: if is_uploaded: continue - # delay uploading crash and boot logs on metered connections - dt = datetime.timedelta(hours=12) - if metered and logdir in self.immediate_folders and (datetime.datetime.now() - datetime.datetime.fromtimestamp(ctime)) < dt: - continue + # limit uploading on metered connections + if metered: + dt = datetime.timedelta(hours=12) + if logdir in self.immediate_folders and (datetime.datetime.now() - datetime.datetime.fromtimestamp(ctime)) < dt: + continue + + if name == "qcamera.ts" and not any(logdir.startswith(r.split('|')[-1]) for r in requested_routes): + continue yield name, key, fn