From 33c1690366936440a6a8ffb9230f545113b2a2d5 Mon Sep 17 00:00:00 2001 From: Anthony van Winkle Date: Thu, 22 Feb 2024 08:43:02 -0800 Subject: [PATCH 1/2] Refactor Timer to support kwargs placeholder evaluation --- mpf/devices/timer.py | 74 ++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/mpf/devices/timer.py b/mpf/devices/timer.py index 57da6f40b..15ac9765a 100644 --- a/mpf/devices/timer.py +++ b/mpf/devices/timer.py @@ -185,15 +185,12 @@ def reset(self, **kwargs): Args: ---- - **kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - del kwargs - self.debug_log("Resetting timer. New value: %s", self.start_value) - self.jump(self.start_value) + self.jump(self.start_value, **kwargs) def start(self, **kwargs): """Start this timer based on the starting value that's already been configured. @@ -246,12 +243,10 @@ def restart(self, **kwargs): Args: ---- - **kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - del kwargs - self.reset() + self.reset(**kwargs) # If the timer is not running, start it if not self.running: self.start() @@ -300,16 +295,13 @@ def pause(self, timer_value=0, **kwargs): timer_value: How many seconds you want to pause the timer for. Note that this pause time is real-world seconds and does not take into consideration this timer's tick interval. - **kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - del kwargs - if not timer_value: pause_ms = 0 # make sure it's not None, etc. else: - pause_ms = self._get_timer_value(timer_value) * 1000 # delays happen in ms + pause_ms = self._get_timer_value(timer_value, in_ms=True, **kwargs) # delays happen in ms self.info_log("Pausing Timer for %s ms", pause_ms) @@ -417,13 +409,10 @@ def add(self, timer_value, **kwargs): ---- timer_value: The number of ticks you want to add to this timer's current value. - kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - del kwargs - - timer_value = self._get_timer_value(timer_value) + timer_value = self._get_timer_value(timer_value, **kwargs) ticks_added = timer_value new_value = self.ticks + ticks_added @@ -457,13 +446,10 @@ def subtract(self, timer_value, **kwargs): ---- timer_value: The number of ticks you want to subtract from this timer's current value. - **kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - del kwargs - - ticks_subtracted = self._get_timer_value(timer_value) + ticks_subtracted = self._get_timer_value(timer_value, **kwargs) self.ticks -= ticks_subtracted @@ -526,10 +512,10 @@ def _remove_system_timer(self): self.timer = None @staticmethod - def _get_timer_value(timer_value): + def _get_timer_value(timer_value, in_ms=False, **kwargs): if hasattr(timer_value, "evaluate"): # Convert to int for ticks; config_spec must be float for change_tick_interval - return int(timer_value.evaluate([])) + return int(timer_value.evaluate(kwargs) * (1000 if in_ms else 1)) return timer_value def change_tick_interval(self, change=0.0, **kwargs): @@ -541,14 +527,10 @@ def change_tick_interval(self, change=0.0, **kwargs): tick rate. Note this value is multiplied by the current tick interval: >1 will increase the tick interval (slow the timer) and <1 will decrease the tick interval (accelerate the timer). - To set an absolute value, use the set_tick_interval() method. - **kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - del kwargs - - self.tick_secs *= change.evaluate([]) + self.tick_secs *= change.evaluate(kwargs) self._create_system_timer() def set_tick_interval(self, timer_value, **kwargs): @@ -561,11 +543,10 @@ def set_tick_interval(self, timer_value, **kwargs): ---- timer_value: The new number of seconds between each tick of this timer. This value should always be positive. - **kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - self.tick_secs = abs(self._get_timer_value(timer_value.evaluate(kwargs))) + self.tick_secs = abs(self._get_timer_value(timer_value, **kwargs)) self._create_system_timer() def jump(self, timer_value, **kwargs): @@ -577,13 +558,10 @@ def jump(self, timer_value, **kwargs): Args: ---- timer_value: Integer of the current value you want this timer to be. - **kwargs: Not used in this method. Only exists since this method is - often registered as an event handler which may contain - additional keyword arguments. + **kwargs: Optional kwargs that may affect the evaluation of the + timer value placeholder template. """ - del kwargs - - self.ticks = self._get_timer_value(timer_value) + self.ticks = self._get_timer_value(timer_value, **kwargs) if self.max_value and self.ticks > self.max_value: self.ticks = self.max_value From e40b0f1eb5990b6c80597dcdae2003250646429f Mon Sep 17 00:00:00 2001 From: Anthony van Winkle Date: Thu, 22 Feb 2024 09:00:03 -0800 Subject: [PATCH 2/2] Separate timer ticks calculation from tick_secs calculation --- mpf/devices/timer.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mpf/devices/timer.py b/mpf/devices/timer.py index 15ac9765a..2cac6456e 100644 --- a/mpf/devices/timer.py +++ b/mpf/devices/timer.py @@ -513,11 +513,20 @@ def _remove_system_timer(self): @staticmethod def _get_timer_value(timer_value, in_ms=False, **kwargs): + """Return an int value for the number of ticks on the timer.""" if hasattr(timer_value, "evaluate"): # Convert to int for ticks; config_spec must be float for change_tick_interval return int(timer_value.evaluate(kwargs) * (1000 if in_ms else 1)) return timer_value + @staticmethod + def _get_timer_tick_secs(timer_value, **kwargs): + """Return a float value for the number of seconds between each tick.""" + if hasattr(timer_value, "evaluate"): + # Convert to int for ticks; config_spec must be float for change_tick_interval + return timer_value.evaluate(kwargs) + return timer_value + def change_tick_interval(self, change=0.0, **kwargs): """Change the interval for each "tick" of this timer. @@ -546,7 +555,7 @@ def set_tick_interval(self, timer_value, **kwargs): **kwargs: Optional kwargs that may affect the evaluation of the timer value placeholder template. """ - self.tick_secs = abs(self._get_timer_value(timer_value, **kwargs)) + self.tick_secs = abs(self._get_timer_tick_secs(timer_value, **kwargs)) self._create_system_timer() def jump(self, timer_value, **kwargs):