diff --git a/prog/communication.py b/prog/communication.py index be0d89bba90f0082f4632f41a0460d6e567826e7..0f7a974df2684c1d5208f5ce6d37a453611b54e9 100644 --- a/prog/communication.py +++ b/prog/communication.py @@ -237,17 +237,17 @@ class MainServer(FuncCaller): self._download_server = download_server.DownloadServer(s) return self._download_server - async def _tree_walker(self, condition, worker): + async def _tree_walker(self, condition, worker, reverse=False): d = "data/realtime" - for d_Y_m_d in sorted(os.listdir(d)): + for d_Y_m_d in sorted(os.listdir(d), reverse=reverse): path = d_Y_m_d dt = path_to_dt(path) if await condition(dt, datetime.timedelta(days=1)): - for d_H in sorted(os.listdir(d+"/"+path)): + for d_H in sorted(os.listdir(d+"/"+path), reverse=reverse): path = d_Y_m_d+"/"+d_H dt = path_to_dt(path) if await condition(dt, datetime.timedelta(hours=1)): - for d_M_S in sorted(os.listdir(d+"/"+path)): + for d_M_S in sorted(os.listdir(d+"/"+path), reverse=reverse): path = d_Y_m_d+"/"+d_H+"/"+d_M_S dt = path_to_dt(path) await worker(dt) @@ -278,6 +278,21 @@ class MainServer(FuncCaller): return r.val return None + async def list_prev_realtime_data(self, dt_from: datetime): + class Return(Exception): + def __init__(self, val): + self.val = val + async def condition(dt, delta): + return dt_intersect(dt_minf, dt_from, dt, delta) + async def worker(dt): + if dt < dt_from: + raise Return(dt) + try: + await self._tree_walker(condition, worker, reverse=True) + except Return as r: + return r.val + return None + @server_exec() async def get_data(self, dt: datetime.datetime): path = "data/realtime/"+dt_to_path(dt) @@ -298,6 +313,14 @@ class MainServer(FuncCaller): else: return next_dt, await self.get_data(dt) + @server_exec() + async def get_prev_data(self, dt: datetime.datetime): + prev_dt = await self.list_prev_realtime_data(dt) + if prev_dt is None: + return None + else: + return prev_dt, await self.get_data(dt) + @server_exec() async def get_preprocessed_data(self, dt: datetime.datetime, route_id: str): assert all(i.isalnum() for i in route_id)