Exemplo n.º 1
0
    def test_single(self):
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule = MagicMock(
        )

        self.machine.flippers["f_test_single"].enable()
        self.assertEqual(
            1,
            len(self.machine.default_platform.
                set_pulse_on_hit_and_enable_and_release_rule.
                _mock_call_args_list))
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.assert_called_once_with(
            SwitchSettings(
                hw_switch=self.machine.switches["s_flipper"].hw_switch,
                invert=False,
                debounce=False),
            DriverSettings(
                hw_driver=self.machine.coils["c_flipper_main"].hw_driver,
                pulse_settings=PulseSettings(power=1.0, duration=10),
                hold_settings=HoldSettings(power=0.125),
                recycle=False))

        self.machine.default_platform.clear_hw_rule = MagicMock()
        self.machine.flippers["f_test_single"].disable()

        self.assertEqual(1, self.machine.default_platform.clear_hw_rule.called)
        self.machine.default_platform.clear_hw_rule.assert_called_once_with(
            SwitchSettings(
                hw_switch=self.machine.switches["s_flipper"].hw_switch,
                invert=False,
                debounce=False),
            DriverSettings(
                hw_driver=self.machine.coils["c_flipper_main"].hw_driver,
                pulse_settings=PulseSettings(power=1.0, duration=10),
                hold_settings=HoldSettings(power=0.125),
                recycle=False))
Exemplo n.º 2
0
    def test_enable_and_disable(self):
        coil = self.machine.coils['coil_1']
        coil.hw_driver.enable = MagicMock()
        coil.hw_driver.pulse = MagicMock()
        coil.hw_driver.disable = MagicMock()

        self.machine.events.post('event4')
        self.advance_time_and_run()

        coil.hw_driver.enable.assert_called_with(
            PulseSettings(power=1.0, duration=10), HoldSettings(power=1.0))
        assert not coil.hw_driver.pulse.called

        self.machine.events.post('event5')
        self.advance_time_and_run()

        coil.hw_driver.disable.assert_called_with()

        # same again but use on and off instead of enable and disable
        coil.hw_driver.enable = MagicMock()
        coil.hw_driver.pulse = MagicMock()
        coil.hw_driver.disable = MagicMock()

        self.machine.events.post('event10')
        self.advance_time_and_run()

        coil.hw_driver.enable.assert_called_with(
            PulseSettings(power=1.0, duration=10), HoldSettings(power=1.0))
        assert not coil.hw_driver.pulse.called

        self.machine.events.post('event11')
        self.advance_time_and_run()

        coil.hw_driver.disable.assert_called_with()
Exemplo n.º 3
0
    def test_flipper_with_settings(self):
        flipper = self.machine.flippers.f_test_flippers_with_settings
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule = MagicMock(
        )

        flipper.enable()
        self.assertEqual(
            1,
            len(self.machine.default_platform.
                set_pulse_on_hit_and_enable_and_release_rule.
                _mock_call_args_list))

        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches.s_flipper.hw_switch,
                           invert=False,
                           debounce=False),
            DriverSettings(
                hw_driver=self.machine.coils.c_flipper_main.hw_driver,
                pulse_settings=PulseSettings(power=1.0, duration=10),
                hold_settings=HoldSettings(power=0.125),
                recycle=False))

        self.machine.default_platform.clear_hw_rule = MagicMock()
        flipper.disable()

        self.assertEqual(1, self.machine.default_platform.clear_hw_rule.called)
        self.machine.default_platform.clear_hw_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches.s_flipper.hw_switch,
                           invert=False,
                           debounce=False),
            DriverSettings(
                hw_driver=self.machine.coils.c_flipper_main.hw_driver,
                pulse_settings=PulseSettings(power=1.0, duration=10),
                hold_settings=HoldSettings(power=0.125),
                recycle=False))

        self.machine.settings.set_setting_value("flipper_power", 0.8)
        self.advance_time_and_run()

        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule = MagicMock(
        )
        flipper.enable()
        self.assertEqual(
            1,
            len(self.machine.default_platform.
                set_pulse_on_hit_and_enable_and_release_rule.
                _mock_call_args_list))

        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches.s_flipper.hw_switch,
                           invert=False,
                           debounce=False),
            DriverSettings(
                hw_driver=self.machine.coils.c_flipper_main.hw_driver,
                pulse_settings=PulseSettings(power=1.0, duration=8),
                hold_settings=HoldSettings(power=0.125),
                recycle=False))

        self.assertEqual(8, flipper._get_pulse_ms())
Exemplo n.º 4
0
    def testBasicFunctions(self):
        # Make sure hardware devices have been configured for tests
        self.assertIn('coil_01', self.machine.coils)
        self.assertIn('coil_02', self.machine.coils)

        # Setup platform function mock to test coil
        self.machine.coils.coil_01.hw_driver.disable = MagicMock()
        self.machine.coils.coil_01.hw_driver.enable = MagicMock()
        self.machine.coils.coil_01.hw_driver.pulse = MagicMock()

        self.machine.coils.coil_01.enable()
        self.machine.coils.coil_01.hw_driver.enable.assert_called_with(
            PulseSettings(power=1.0, duration=30), HoldSettings(power=1.0))
        self.machine.coils.coil_01.pulse(100)
        self.machine.coils.coil_01.hw_driver.pulse.assert_called_with(
            PulseSettings(power=1.0, duration=100))
        self.machine.coils.coil_01.disable()
        self.machine.coils.coil_01.hw_driver.disable.assert_called_with()

        self.machine.coils.coil_03.hw_driver.disable = MagicMock()
        self.machine.coils.coil_03.hw_driver.enable = MagicMock()
        self.machine.coils.coil_03.hw_driver.pulse = MagicMock()

        # test default pulse_ms
        self.machine.config['mpf']['default_pulse_ms'] = 23
        self.machine.coils.coil_03.pulse()
        self.machine.coils.coil_03.hw_driver.pulse.assert_called_with(
            PulseSettings(power=1.0, duration=23))

        # test power
        self.machine.config['mpf']['default_pulse_ms'] = 40
        self.machine.coils.coil_03.pulse(pulse_power=1.0)
        self.machine.coils.coil_03.hw_driver.pulse.assert_called_with(
            PulseSettings(power=1.0, duration=40))

        self.machine.coils.coil_03.pulse(pulse_power=0.5)
        self.machine.coils.coil_03.hw_driver.pulse.assert_called_with(
            PulseSettings(power=0.5, duration=40))

        self.machine.coils.coil_01.enable(pulse_power=0.7, hold_power=0.3)
        self.machine.coils.coil_01.hw_driver.enable.assert_called_with(
            PulseSettings(power=0.7, duration=30), HoldSettings(power=0.3))

        # test long pulse with delay
        self.machine.coils.coil_03.hw_driver.pulse = MagicMock()
        self.machine.coils.coil_03.hw_driver.enable = MagicMock()
        self.machine.coils.coil_03.hw_driver.disable = MagicMock()
        self.machine.coils.coil_03.pulse(pulse_ms=500)
        self.machine.coils.coil_03.hw_driver.enable.assert_called_with(
            PulseSettings(power=1.0, duration=0), HoldSettings(power=1.0))
        self.machine.coils.coil_03.hw_driver.pulse.assert_not_called()
        self.advance_time_and_run(.5)

        self.machine.coils.coil_03.hw_driver.disable.assert_called_with()
Exemplo n.º 5
0
    def configure_driver(self, config: DriverConfig, number: str, platform_settings: dict):
        """Configure a driver.

        Args:
            config: Config dict.
        """
        if not self.opp_connection:
            self.raise_config_error("A request was made to configure an OPP solenoid, "
                                    "but no OPP connection is available", 4)

        number = self._get_dict_index(number)

        if number not in self.solDict:
            self.raise_config_error("A request was made to configure an OPP solenoid "
                                    "with number {} which doesn't exist".format(number), 5)

        # Use new update individual solenoid command
        opp_sol = self.solDict[number]
        opp_sol.config = config
        opp_sol.platform_settings = platform_settings
        self.log.debug("Configure driver %s", number)
        default_pulse = PulseSettings(config.default_pulse_power, config.default_pulse_ms)
        default_hold = HoldSettings(config.default_hold_power)
        opp_sol.reconfigure_driver(default_pulse, default_hold)

        # Removing the default input is not necessary since the
        # CFG_SOL_USE_SWITCH is not being set

        return opp_sol
Exemplo n.º 6
0
 def remove_switch_rule(self):
     """Remove switch rule."""
     self.switch_rule = None
     self.reconfigure_driver(
         PulseSettings(duration=self.config.default_pulse_ms
                       if self.config.default_pulse_ms is not None else 10,
                       power=self.config.default_pulse_power),
         HoldSettings(power=self.config.default_hold_power), True)
Exemplo n.º 7
0
    def test_hold_with_eos(self):
        self.machine.default_platform.set_pulse_on_hit_and_release_and_disable_rule = MagicMock()
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule = MagicMock()

        self.machine.flippers["f_test_hold_eos"].enable()

        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches["s_flipper"].hw_switch, invert=False, debounce=False),
            DriverSettings(hw_driver=self.machine.coils["c_flipper_hold"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0, duration=10),
                           hold_settings=HoldSettings(power=1.0), recycle=False)
        )
        self.machine.default_platform.set_pulse_on_hit_and_release_and_disable_rule.assert_called_with(
            SwitchSettings(hw_switch=self.machine.switches["s_flipper"].hw_switch, invert=False, debounce=False),
            SwitchSettings(hw_switch=self.machine.switches["s_flipper_eos"].hw_switch, invert=False, debounce=False),
            DriverSettings(hw_driver=self.machine.coils["c_flipper_main"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0, duration=10),
                           hold_settings=None, recycle=False),
            RepulseSettings(enable_repulse=False)
        )

        self.machine.default_platform.clear_hw_rule = MagicMock()
        self.machine.flippers["f_test_hold_eos"].disable()

        self.machine.default_platform.clear_hw_rule.assert_has_calls([
            call(
                SwitchSettings(hw_switch=self.machine.switches["s_flipper"].hw_switch, invert=False, debounce=False),
                DriverSettings(hw_driver=self.machine.coils["c_flipper_main"].hw_driver,
                               pulse_settings=PulseSettings(power=1.0, duration=10),
                               hold_settings=None, recycle=False)
            ),
            call(
                SwitchSettings(hw_switch=self.machine.switches["s_flipper_eos"].hw_switch, invert=False, debounce=False),
                DriverSettings(hw_driver=self.machine.coils["c_flipper_main"].hw_driver,
                               pulse_settings=PulseSettings(power=1.0, duration=10),
                               hold_settings=None, recycle=False)
            ),
            call(
                SwitchSettings(hw_switch=self.machine.switches["s_flipper"].hw_switch, invert=False, debounce=False),
                DriverSettings(hw_driver=self.machine.coils["c_flipper_hold"].hw_driver,
                               pulse_settings=PulseSettings(power=1.0, duration=10),
                               hold_settings=HoldSettings(power=1.0), recycle=False)
            ),
        ], any_order=True)
Exemplo n.º 8
0
    def test_express_config(self):
        # coil with allow_enable set
        coil = self.machine.coils['coil_1']
        coil.hw_driver.pulse = MagicMock()
        coil.hw_driver.enable = MagicMock()

        self.machine.events.post('event1')
        self.advance_time_and_run()

        coil.hw_driver.pulse.assert_called_with(
            PulseSettings(power=1.0, duration=10))
        assert not coil.hw_driver.enable.called

        # coil without allow_enable
        coil = self.machine.coils['coil_2']
        coil.hw_driver.pulse = MagicMock()
        coil.hw_driver.enable = MagicMock()

        self.machine.events.post('event6')
        self.advance_time_and_run()

        coil.hw_driver.pulse.assert_called_with(
            PulseSettings(power=1.0, duration=10))
        assert not coil.hw_driver.enable.called

        coil = self.machine.coils['coil_3']
        coil.hw_driver.pulse = MagicMock()
        coil.hw_driver.enable = MagicMock()
        coil.hw_driver.disable = MagicMock()

        self.post_event("event7")
        self.advance_time_and_run()
        coil.hw_driver.enable.assert_called_with(
            PulseSettings(power=1.0, duration=10), HoldSettings(power=0.5))
        assert not coil.hw_driver.disable.called
        assert not coil.hw_driver.pulse.called
        coil.hw_driver.pulse = MagicMock()
        coil.hw_driver.enable = MagicMock()
        coil.hw_driver.disable = MagicMock()

        self.post_event("event8")
        self.advance_time_and_run()
        coil.hw_driver.disable.assert_called_with()
        assert not coil.hw_driver.enable.called
        assert not coil.hw_driver.pulse.called
        coil.hw_driver.pulse = MagicMock()
        coil.hw_driver.enable = MagicMock()
        coil.hw_driver.disable = MagicMock()

        self.post_event("event9")
        self.advance_time_and_run()
        coil.hw_driver.pulse.assert_called_with(
            PulseSettings(power=1.0, duration=30))
        assert not coil.hw_driver.disable.called
        assert not coil.hw_driver.enable.called
Exemplo n.º 9
0
    def test_ac_switch_and_enable(self):

        c_side_a2 = self._get_a_driver(self.machine.coils.c_side_a2)
        c_side_c2 = self._get_c_driver(self.machine.coils.c_side_c2)

        c_side_a2.enable = MagicMock()
        c_side_a2.disable = MagicMock()
        c_side_c2.enable = MagicMock()
        c_side_c2.disable = MagicMock()

        c_ac_relay = self.machine.coils.c_ac_relay
        c_ac_relay.enable = MagicMock()
        c_ac_relay.disable = MagicMock()

        self.advance_time_and_run(0.10)

        # test enable on c side
        self.machine.coils.c_side_c2.enable()
        self.machine_run()
        c_ac_relay.enable.assert_called_with()
        c_ac_relay.enable = MagicMock()
        assert not c_side_c2.enable.called
        self.advance_time_and_run(0.075)
        c_side_c2.enable.assert_called_with(
            PulseSettings(power=1.0, duration=10), HoldSettings(power=0.5))

        # a side has preference. it should transition
        self.machine.coils.c_side_a2.enable()
        self.machine_run()
        c_side_c2.disable.assert_called_with()
        c_ac_relay.disable.assert_called_with()
        c_ac_relay.disable = MagicMock()
        assert not c_side_a2.enable.called

        # it should enable a side coils now
        self.advance_time_and_run(0.075)
        c_side_a2.enable.assert_called_with(
            PulseSettings(power=1.0, duration=10), HoldSettings(power=0.5))

        # disable driver on a side.
        self.machine.coils.c_side_a2.disable()
        self.advance_time_and_run(0.2)
Exemplo n.º 10
0
 def enable(self):
     """Enable digital output."""
     if self.type == "driver":
         self.hw_driver.enable(PulseSettings(power=1.0, duration=0),
                               HoldSettings(power=1.0))
     elif self.type == "light":
         self.hw_driver.set_fade(1.0, -1, 1.0, -1)
         self.platform.light_sync()
         self.delay.remove(name='timed_disable')
     else:
         raise AssertionError(INVALID_TYPE_ERROR.format(self.type))
Exemplo n.º 11
0
 def enable(self):
     """Enable digital output."""
     if self.type == "driver":
         self.hw_driver.enable(PulseSettings(power=1.0, duration=0),
                               HoldSettings(power=1.0))
     elif self.type == "light":
         self.hw_driver.set_fade(partial(self._get_state, state=True))
         self.platform.light_sync()
         self.delay.remove(name='timed_disable')
     else:
         raise AssertionError("Invalid type {}".format(self.type))
Exemplo n.º 12
0
 def enable(self, **kwargs):
     """Enable digital output."""
     del kwargs
     if self.type == "driver":
         self.hw_driver.enable(PulseSettings(power=1.0, duration=0),
                               HoldSettings(power=1.0))
     elif self.type == "light":
         self.hw_driver.set_fade(partial(self._get_state, state=True))
         self.platform.light_sync()
     else:
         raise AssertionError("Invalid type {}".format(self.type))
Exemplo n.º 13
0
    def _get_configured_driver_with_optional_hold(driver: DriverRuleSettings, pulse_setting: PulseRuleSettings,
                                                  hold_settings: HoldRuleSettings) -> DriverSettings:
        """Return configured driver for rule which might have hold."""
        pulse_duration = driver.driver.get_and_verify_pulse_ms(pulse_setting.duration if pulse_setting else None)
        pulse_power = driver.driver.get_and_verify_pulse_power(pulse_setting.power if pulse_setting else None)
        hold_power = driver.driver.get_and_verify_hold_power(hold_settings.power if hold_settings else None)

        return DriverSettings(
            hw_driver=driver.driver.hw_driver,
            pulse_settings=PulseSettings(duration=pulse_duration, power=pulse_power),
            hold_settings=HoldSettings(power=hold_power),
            recycle=driver.recycle)
Exemplo n.º 14
0
    def enable(self,
               pulse_ms: int = None,
               pulse_power: float = None,
               hold_power: float = None):
        """Enable a driver by holding it 'on'.

        Args:
        ----
            pulse_ms: The number of milliseconds the driver should be
                enabled for. If no value is provided, the driver will be
                enabled for the value specified in the config dictionary.
            pulse_power: The pulse power. A float between 0.0 and 1.0.
            hold_power: The pulse power. A float between 0.0 and 1.0.

        If this driver is configured with a holdpatter, then this method will use
        that holdpatter to pwm pulse the driver.

        If not, then this method will just enable the driver. As a safety
        precaution, if you want to enable() this driver without pwm, then you
        have to add the following option to this driver in your machine
        configuration files:

        allow_enable: True
        """
        assert self.hw_driver is not None
        pulse_ms = self.get_and_verify_pulse_ms(pulse_ms)

        pulse_power = self.get_and_verify_pulse_power(pulse_power)
        hold_power = self.get_and_verify_hold_power(hold_power)

        if hold_power == 0.0:
            raise DriverLimitsError("Cannot enable driver with hold_power 0.0")

        self.info_log(
            "Enabling Driver with power %s (pulse_ms %sms and pulse_power %s)",
            hold_power, pulse_ms, pulse_power)
        self.hw_driver.enable(
            PulseSettings(power=pulse_power, duration=pulse_ms),
            HoldSettings(power=hold_power))

        if self.config['max_hold_duration']:
            self.delay.add_if_doesnt_exist(
                self.config['max_hold_duration'] * 1000,
                self._enable_limit_reached, "enable_limit_reached")

        # inform bcp clients
        self.machine.bcp.interface.send_driver_event(
            action="enable",
            name=self.name,
            number=self.config['number'],
            pulse_ms=pulse_ms,
            pulse_power=pulse_power,
            hold_power=hold_power)
Exemplo n.º 15
0
    def _get_configured_driver_with_hold(driver: DriverRuleSettings, pulse_setting: PulseRuleSettings,
                                         hold_settings: HoldRuleSettings) -> DriverSettings:
        """Return configured driver with hold > 0 for rule."""
        pulse_duration = driver.driver.get_and_verify_pulse_ms(pulse_setting.duration if pulse_setting else None)
        pulse_power = driver.driver.get_and_verify_pulse_power(pulse_setting.power if pulse_setting else None)
        hold_power = driver.driver.get_and_verify_hold_power(hold_settings.power if hold_settings else None)

        if hold_power == 0.0:
            raise AssertionError("Cannot enable driver with hold_power 0.0")

        return DriverSettings(
            hw_driver=driver.driver.hw_driver,
            pulse_settings=PulseSettings(duration=pulse_duration, power=pulse_power),
            hold_settings=HoldSettings(power=hold_power),
            recycle=driver.recycle)
Exemplo n.º 16
0
 def _pulse_now(self, pulse_ms: int, pulse_power: float) -> None:
     """Pulse this driver now."""
     if 0 < pulse_ms <= self.platform.features['max_pulse']:
         self.info_log("Pulsing Driver for %sms (%s pulse_power)", pulse_ms, pulse_power)
         self.hw_driver.pulse(PulseSettings(power=pulse_power, duration=pulse_ms))
     else:
         self.info_log("Enabling Driver for %sms (%s pulse_power)", pulse_ms, pulse_power)
         self.delay.reset(name='timed_disable',
                          ms=pulse_ms,
                          callback=self.disable)
         self.hw_driver.enable(PulseSettings(power=pulse_power, duration=0),
                               HoldSettings(power=pulse_power))
     # inform bcp clients
     self.machine.bcp.interface.send_driver_event(action="pulse", name=self.name, number=self.config['number'],
                                                  pulse_ms=pulse_ms, pulse_power=pulse_power)
Exemplo n.º 17
0
    def enable(self,
               pulse_ms: int = None,
               pulse_power: float = None,
               hold_power: float = None,
               **kwargs):
        """Enable a driver by holding it 'on'.

        Args:
            pulse_ms: The number of milliseconds the driver should be
                enabled for. If no value is provided, the driver will be
                enabled for the value specified in the config dictionary.
            pulse_power: The pulse power. A float between 0.0 and 1.0.
            hold_power: The pulse power. A float between 0.0 and 1.0.

        If this driver is configured with a holdpatter, then this method will use
        that holdpatter to pwm pulse the driver.

        If not, then this method will just enable the driver. As a safety
        precaution, if you want to enable() this driver without pwm, then you
        have to add the following option to this driver in your machine
        configuration files:

        allow_enable: True
        """
        del kwargs

        pulse_ms = self.get_and_verify_pulse_ms(pulse_ms)

        pulse_power = self.get_and_verify_pulse_power(pulse_power)
        hold_power = self.get_and_verify_hold_power(hold_power)

        if hold_power == 0.0:
            raise AssertionError("Cannot enable driver with hold_power 0.0")

        self.time_when_done = -1
        self.time_last_changed = self.machine.clock.get_time()
        self.debug_log("Enabling Driver")
        self.hw_driver.enable(
            PulseSettings(power=pulse_power, duration=pulse_ms),
            HoldSettings(power=hold_power))
        # inform bcp clients
        self.machine.bcp.interface.send_driver_event(
            action="enable",
            name=self.name,
            number=self.config['number'],
            pulse_ms=pulse_ms,
            pulse_power=pulse_power,
            hold_power=hold_power)
Exemplo n.º 18
0
    def test_coil_player_in_mode(self):
        coil = self.machine.coils['coil_3']
        coil.hw_driver.enable = MagicMock()
        coil.hw_driver.disable = MagicMock()

        # start mode
        self.post_event("start_mode1", 1)
        self.assertFalse(coil.hw_driver.enable.called)
        self.assertFalse(coil.hw_driver.disable.called)

        # enable coil
        self.post_event("event1_mode", 1)
        coil.hw_driver.enable.assert_called_with(
            PulseSettings(power=1.0, duration=10), HoldSettings(power=1.0))
        coil.hw_driver.enable = MagicMock()
        self.assertFalse(coil.hw_driver.disable.called)

        # on mode stop the coil player should disable the coil
        self.post_event("stop_mode1", 1)
        self.assertFalse(coil.hw_driver.enable.called)
        coil.hw_driver.disable.assert_called_with()
Exemplo n.º 19
0
    def _enable_now(self,
                    pulse_ms: int = None,
                    pulse_power: float = None,
                    hold_power: float = None):
        self.info_log(
            "Enabling Driver with power %s (pulse_ms %sms and pulse_power %s)",
            hold_power, pulse_ms, pulse_power)
        self.hw_driver.enable(
            PulseSettings(power=pulse_power, duration=pulse_ms),
            HoldSettings(power=hold_power))

        if self.config['max_hold_duration']:
            self.delay.add_if_doesnt_exist(
                self.config['max_hold_duration'] * 1000,
                self._enable_limit_reached, "enable_limit_reached")

        # inform bcp clients
        self.machine.bcp.interface.send_driver_event(
            action="enable",
            name=self.name,
            number=self.config['number'],
            pulse_ms=pulse_ms,
            pulse_power=pulse_power,
            hold_power=hold_power)
Exemplo n.º 20
0
    def testBasicFunctions(self):
        c_power = self.machine.coils["c_power"].hw_driver
        c_hold = self.machine.coils["c_hold"].hw_driver
        c_power.enable = MagicMock()
        c_power.disable = MagicMock()
        c_power.pulse = MagicMock()
        c_hold.enable = MagicMock()
        c_hold.disable = MagicMock()
        c_hold.pulse = MagicMock()

        # test enable
        self.machine.coils["c_test"].enable()
        c_power.pulse.assert_called_with(PulseSettings(power=1.0, duration=20))
        c_power.pulse = MagicMock()
        assert not c_power.enable.called
        c_hold.enable.assert_called_with(PulseSettings(power=1.0, duration=10),
                                         HoldSettings(power=1.0))
        c_hold.enable = MagicMock()
        assert not c_hold.pulse.called

        # test disable
        self.machine.coils["c_test"].disable()
        c_power.disable.assert_called_with()
        c_power.disable = MagicMock()
        c_hold.disable.assert_called_with()
        c_hold.disable = MagicMock()

        # test pulse
        self.machine.coils["c_test"].pulse(17)
        c_power.pulse.assert_called_with(PulseSettings(power=1.0, duration=17))
        c_hold.pulse.assert_called_with(PulseSettings(power=1.0, duration=17))

        # test default pulse
        self.machine.coils["c_test"].pulse()
        c_power.pulse.assert_called_with(PulseSettings(power=1.0, duration=20))
        c_hold.pulse.assert_called_with(PulseSettings(power=1.0, duration=10))
    def test_dual_wound_flipper_with_software_eos_repulse(self):
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse = MagicMock()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable = MagicMock()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable = MagicMock()

        # nothing should happen on EOS close without flipper button active
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # nothing should happen on EOS open without flipper button active
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # flipper activation should also not yet do what
        self.hit_switch_and_run("s_flipper_dual_wound", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS closes. nothing happens yet
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS opens. nothing should happen as flipper is not enabled
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # release flipper prior to enabling the flipper
        self.release_switch_and_run("s_flipper_dual_wound", 1)

        self.machine.default_platform.set_pulse_on_hit_and_release_and_disable_rule = MagicMock(
        )
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule = MagicMock(
        )
        self.assertPlaceholderEvaluates(
            False, "device.flippers.dual_wound_flipper.enabled")

        # enable flipper
        self.post_event("enable_flipper_dual_wound")
        self.assertPlaceholderEvaluates(
            True, "device.flippers.dual_wound_flipper.enabled")

        self.assertEqual(
            1,
            len(self.machine.default_platform.
                set_pulse_on_hit_and_release_and_disable_rule.
                _mock_call_args_list))
        self.assertEqual(
            1,
            len(self.machine.default_platform.
                set_pulse_on_hit_and_enable_and_release_rule.
                _mock_call_args_list))
        self.machine.default_platform.set_pulse_on_hit_and_release_and_disable_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.
                           switches["s_flipper_dual_wound"].hw_switch,
                           invert=False,
                           debounce=False),
            SwitchSettings(hw_switch=self.machine.
                           switches["s_flipper_dual_wound_eos"].hw_switch,
                           invert=False,
                           debounce=False),
            DriverSettings(hw_driver=self.machine.
                           coils["c_flipper_dual_wound_main"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0,
                                                        duration=30),
                           hold_settings=None,
                           recycle=False),
            None  # this is not passed as we implement it in software
        )
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.
                           switches["s_flipper_dual_wound"].hw_switch,
                           invert=False,
                           debounce=False),
            DriverSettings(hw_driver=self.machine.
                           coils["c_flipper_dual_wound_hold"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0,
                                                        duration=10),
                           hold_settings=HoldSettings(power=1.0),
                           recycle=False))

        # nothing should happen on EOS close without flipper button active
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # nothing should happen on EOS open without flipper button active
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # flipper activation should also not yet do what
        self.hit_switch_and_run("s_flipper_dual_wound", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS closes. nothing happens yet
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS opens. it should repulse
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_called_with(
                PulseSettings(power=1.0, duration=30))
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse = MagicMock()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS closes only shortly
        self.hit_switch_and_run("s_flipper_dual_wound_eos", .1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS opens. it should not repulse yet
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS closes. nothing happens yet
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS opens. it should repulse
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_called_with(
                PulseSettings(power=1.0, duration=30))
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse = MagicMock()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS closes. nothing happens yet
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # flipper button releases
        self.release_switch_and_run("s_flipper_dual_wound", 1)

        # eos opens - nothing should happen
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_called_with(
            )
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable = MagicMock()

        # disable flipper
        self.post_event("disable_flipper_dual_wound")
        self.assertPlaceholderEvaluates(
            False, "device.flippers.dual_wound_flipper.enabled")

        # nothing should happen on EOS close without flipper button active
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # nothing should happen on EOS open without flipper button active
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # flipper activation should also not yet do what
        self.hit_switch_and_run("s_flipper_dual_wound", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS closes. nothing happens yet
        self.hit_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # EOS opens. nothing should happen as flipper is not enabled
        self.release_switch_and_run("s_flipper_dual_wound_eos", 1)
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.pulse.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.enable.assert_not_called()
        self.machine.coils[
            "c_flipper_dual_wound_main"].hw_driver.disable.assert_not_called()

        # release flipper prior to enabling the flipper
        self.release_switch_and_run("s_flipper_dual_wound", 1)
Exemplo n.º 22
0
    def test_hold_no_eos(self):
        self.machine.default_platform.set_pulse_on_hit_and_release_rule = MagicMock()
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule = MagicMock()

        # Config uses enable_events to enable the flipper on boot
        self.assertTrue(self.machine.flippers["left_flipper"]._enabled)
        self.machine.flippers["left_flipper"].disable()

        self.assertFalse(self.machine.flippers["left_flipper"]._enabled)
        self.machine.flippers["left_flipper"].enable()
        #     def set_hw_rule(self, sw_name, sw_activity, driver_name, driver_action,
        #                     disable_on_release=True, drive_now=False,
        #                     **driver_settings_overrides):
        self.assertEqual(1, len(self.machine.default_platform.set_pulse_on_hit_and_release_rule._mock_call_args_list))
        self.assertEqual(1, len(self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.
                                _mock_call_args_list))

        self.machine.default_platform.set_pulse_on_hit_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches["s_left_flipper"].hw_switch, invert=False, debounce=False),
            DriverSettings(hw_driver=self.machine.coils["c_flipper_left_main"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0, duration=30),
                           hold_settings=None, recycle=False)
        )

        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches["s_left_flipper"].hw_switch, invert=False, debounce=False),
            DriverSettings(hw_driver=self.machine.coils["c_flipper_left_hold"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0, duration=10),
                           hold_settings=HoldSettings(power=1.0), recycle=False)
        )

        self.machine.default_platform.clear_hw_rule = MagicMock()
        self.machine.flippers["left_flipper"].disable()
        self.assertFalse(self.machine.flippers["left_flipper"]._enabled)

        self.machine.default_platform.clear_hw_rule.assert_has_calls(
            [call(
                SwitchSettings(hw_switch=self.machine.switches["s_left_flipper"].hw_switch, invert=False, debounce=False),
                DriverSettings(hw_driver=self.machine.coils["c_flipper_left_main"].hw_driver,
                               pulse_settings=PulseSettings(power=1.0, duration=30),
                               hold_settings=None, recycle=False)
            ),
             call(
                 SwitchSettings(hw_switch=self.machine.switches["s_left_flipper"].hw_switch, invert=False, debounce=False),
                 DriverSettings(hw_driver=self.machine.coils["c_flipper_left_hold"].hw_driver,
                                pulse_settings=PulseSettings(power=1.0, duration=10),
                                hold_settings=HoldSettings(power=1.0), recycle=False)
            )
        ], any_order=True)

        self.machine.default_platform.set_pulse_on_hit_and_release_rule = MagicMock()
        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule = MagicMock()

        self.machine.flippers["left_flipper"].enable()
        self.machine.default_platform.set_pulse_on_hit_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches["s_left_flipper"].hw_switch, invert=False, debounce=False),
            DriverSettings(hw_driver=self.machine.coils["c_flipper_left_main"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0, duration=30),
                           hold_settings=None, recycle=False)
        )

        self.machine.default_platform.set_pulse_on_hit_and_enable_and_release_rule.assert_called_once_with(
            SwitchSettings(hw_switch=self.machine.switches["s_left_flipper"].hw_switch, invert=False, debounce=False),
            DriverSettings(hw_driver=self.machine.coils["c_flipper_left_hold"].hw_driver,
                           pulse_settings=PulseSettings(power=1.0, duration=10),
                           hold_settings=HoldSettings(power=1.0), recycle=False)
        )