From 5026579e86acc21dbc53edf9da2611dddb97eff4 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Tue, 12 Dec 2023 16:26:10 +0000 Subject: [PATCH] Synchronise figure updates with data updates --- app/app.py | 29 +++++++++++++++++++++++------ app/data.py | 6 +----- app/pages/control.py | 10 ++++++++-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/app.py b/app/app.py index f3f0c5f..99e87e3 100644 --- a/app/app.py +++ b/app/app.py @@ -1,13 +1,9 @@ """Sets up the server for the Dash app.""" import dash # type: ignore -from dash import Dash, dcc, html # type: ignore +from dash import Dash, Input, Output, callback, dcc, html # type: ignore from . import log -################## -interval = 7000 -################## - app = Dash(__package__, use_pages=True, update_title=None) app.layout = html.Div( @@ -17,7 +13,7 @@ }, children=[ dash.page_container, - dcc.Interval(id="figure_interval", interval=interval), + dcc.Interval(id="figure_interval"), ], ) @@ -25,5 +21,26 @@ log.info("Gridlington Visualisation System is running...") +@callback( + [Output("figure_interval", "disabled"), Output("figure_interval", "interval")], + [Input("figure_interval", "n_intervals")], +) +def update_interval( + n_intervals: int, +) -> tuple[bool, int]: + """_summary_. + + Args: + n_intervals (int): _description_ + + Returns: + tuple[bool, int]: _description_ + """ + from .data import data_ended + from .pages.control import interval + + return (data_ended, interval) + + if __name__ == "__main__": app.run_server(debug=True) diff --git a/app/data.py b/app/data.py index 75f4aeb..2a5c8a8 100644 --- a/app/data.py +++ b/app/data.py @@ -6,10 +6,6 @@ from . import LIVE_MODEL, log from .datahub_api import get_opal_data, get_wesim_data # , get_dsr_data -################## -interval = 7000 -################## - DF_OPAL = pd.DataFrame({"Col": [0]}) WESIM_START_DATE = "2035-01-22 00:00" # corresponding to hour 0 TODO: check @@ -24,7 +20,7 @@ else: WESIM = {"df": pd.DataFrame({"Col": [0]})} -data_interval = dcc.Interval(id="data_interval", interval=interval) +data_interval = dcc.Interval(id="data_interval") data_ended = False diff --git a/app/pages/control.py b/app/pages/control.py index 709f6ee..1da29cf 100644 --- a/app/pages/control.py +++ b/app/pages/control.py @@ -10,6 +10,9 @@ dash.register_page(__name__) +################## +interval = 7000 +################## options = [key for key in core.INIT_SECTIONS.keys() if key != "Control"] @@ -179,10 +182,10 @@ def get_button(func: str, icon: str) -> html.Button: html.Div( dcc.Slider( id="update-interval-slider", - min=1, + min=2, max=10, step=1, - value=data_interval.interval / 1000, + value=interval / 1000, ), style={"width": "100%"}, ), @@ -333,5 +336,8 @@ def default_button_click(n_clicks: int | None) -> list[str]: ) def update_interval(value: int) -> list[int]: """Returns the update interval value.""" + global interval + log.debug(f"Update interval set to {value} seconds.") + interval = value * 1000 return [value * 1000]