Skip to content

Commit

Permalink
add expire and test mode
Browse files Browse the repository at this point in the history
  • Loading branch information
jabdoa2 committed Jun 12, 2017
1 parent 73f464e commit 22cc2f5
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 17 deletions.
36 changes: 28 additions & 8 deletions mpf/config_players/segment_display_player.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from mpf.core.delays import DelayManager

from mpf.config_players.device_config_player import DeviceConfigPlayer


Expand All @@ -9,6 +11,11 @@ class SegmentDisplayPlayer(DeviceConfigPlayer):
show_section = 'segment_displays'
machine_collection_name = 'segment_displays'

def __init__(self, machine):
"""Initialise SegmentDisplayPlayer."""
super().__init__(machine)
self.delay = DelayManager(self.machine.delayRegistry)

def play(self, settings, context, calling_context, priority=0, **kwargs):
"""Show text on display"""
del kwargs
Expand All @@ -27,23 +34,36 @@ def play(self, settings, context, calling_context, priority=0, **kwargs):

if action == "add":
# in case it is already there
if key in instance_dict[display]:
display.remove_text_by_key(key)
self._remove(instance_dict=instance_dict, key=key, display=display)
# add text
display.add_text(s['text'], priority + s['priority'], key)
instance_dict[display][key] = True

if s['expire']:
instance_dict[display][key] = self.delay.add(s['expire'], self._remove,
instance_dict=instance_dict,
key=key,
display=display)
else:
instance_dict[display][key] = True
elif action == "remove":
if key in instance_dict[display]:
display.remove_text_by_key(key)
del instance_dict[display][key]
self._remove(instance_dict=instance_dict, key=key, display=display)
else:
raise AssertionError("Invalid action {}".format(action))

def _remove(self, instance_dict, key, display):
if key in instance_dict[display]:
display.remove_text_by_key(key)
if instance_dict[display][key] is not True:
self.delay.remove(instance_dict[display][key])
del instance_dict[display][key]

def clear_context(self, context):
"""Remove all texts."""
full_context = self._get_full_context(context)
for light in self._get_instance_dict(context).values():
light.remove_from_stack_by_key(full_context)
instance_dict = self._get_instance_dict(context)
for display, keys in instance_dict.items():
for key in dict(keys).keys():
self._remove(instance_dict=instance_dict, key=key, display=display)

self._reset_instance_dict(context)

Expand Down
1 change: 1 addition & 0 deletions mpf/core/config_spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -864,6 +864,7 @@
text: single|str|None
action: single|enum(add,remove)|add
key: single|str|None
expire: single|ms|None
servo_controller:
__valid_in__: machine # todo add to validator
servo_controllers:
Expand Down
13 changes: 5 additions & 8 deletions mpf/devices/segment_display.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,20 +52,17 @@ def _update_stack(self) -> None:
self._current_text = None
return

old_entry = self._text_stack[0]

# sort stack by priority
self._text_stack.sort(key=attrgetter("priority"), reverse=True)
# get top entry
top_entry = self._text_stack[0]

if not self._current_text or old_entry != top_entry:
if self._current_text:
self._current_text.stop_monitor()
if self._current_text:
self._current_text.stop_monitor()

self._current_text = TextTemplate(self.machine, top_entry.text)
self._current_text.monitor_changes(self._update_display)
self._update_display()
self._current_text = TextTemplate(self.machine, top_entry.text)
self._current_text.monitor_changes(self._update_display)
self._update_display()

def _update_display(self) -> None:
"""Update display to current text."""
Expand Down
12 changes: 11 additions & 1 deletion mpf/tests/machine_files/segment_display/config/config.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
#config_version=4

modes:
- mode1

segment_displays:
display1:
number: 1
Expand All @@ -22,4 +25,11 @@ segment_display_player:
display1:
text: "1: (player1|score)"
display2:
text: "2: (machine|test)"
text: "2: (machine|test)"

test_flash:
display1:
priority: 10
key: flash
text: "TEST"
expire: 2s
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#config_version=4

mode:
priority: 100

segment_display_player:
mode_mode1_started:
display1:
text: "MODE1"
display2:
text: "MODE1"
expire: 10s
28 changes: 28 additions & 0 deletions mpf/tests/test_SegmentDisplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,31 @@ def test_player(self):
self.advance_time_and_run()
self.assertEqual("1: 123", display1.hw_display.text)
self.assertEqual("2: 1337", display2.hw_display.text)

self.post_event("test_flash")
self.advance_time_and_run(.1)
self.assertEqual("TEST", display1.hw_display.text)
self.assertEqual("2: 1337", display2.hw_display.text)

self.advance_time_and_run(2)
self.assertEqual("1: 123", display1.hw_display.text)
self.assertEqual("2: 1337", display2.hw_display.text)

self.machine.modes.mode1.start()
self.advance_time_and_run(.1)
self.assertEqual("MODE1", display1.hw_display.text)
self.assertEqual("MODE1", display2.hw_display.text)

self.machine.modes.mode1.stop()
self.advance_time_and_run(7)
self.assertEqual("1: 123", display1.hw_display.text)
self.assertEqual("2: 1337", display2.hw_display.text)

self.machine.modes.mode1.start()
self.advance_time_and_run(5)
self.assertEqual("MODE1", display1.hw_display.text)
self.assertEqual("MODE1", display2.hw_display.text)

self.advance_time_and_run(5)
self.assertEqual("MODE1", display1.hw_display.text)
self.assertEqual("2: 1337", display2.hw_display.text)

0 comments on commit 22cc2f5

Please sign in to comment.