def __init__(self, options, config, machine_path, thread_stopper=None, **kwargs): self.log = logging.getLogger('mpfmc') self.log.info("Mission Pinball Framework Media Controller v%s", __version__) self.log.info("Mission Pinball Framework Game Engine v%s", __mpfversion__) if (__version__.split('.')[0] != __mpfversion__.split('.')[0] or __version__.split('.')[1] != __mpfversion__.split('.')[1]): self.log.error("MPF MC and MPF Game engines must be same " "major.minor versions. You have MPF v{} and MPF-MC" " v{}".format(__mpfversion__, __version__)) raise ValueError("MPF MC and MPF Game engines must be same " "major.minor versions. You have MPF v{} and MPF-MC" " v{}".format(__mpfversion__, __version__)) super().__init__(**kwargs) self.options = options self.machine_config = config self.log.info("Machine path: %s", machine_path) self.machine_path = machine_path self.clock = Clock # pylint: disable-msg=protected-access self.log.info("Starting clock at %sHz", Clock._max_fps) self._boot_holds = set() self.mpf_path = os.path.dirname(mpf.__file__) self.modes = CaseInsensitiveDict() self.player_list = list() self.player = None self.num_players = 0 self.bcp_client_connected = False self.placeholder_manager = McPlaceholderManager(self) self.settings = McSettingsController(self) self.animation_configs = dict() self.active_slides = dict() self.scriptlets = list() self.register_boot_hold('init') self.displays = CaseInsensitiveDict() self.machine_vars = CaseInsensitiveDict() self.machine_var_monitor = False self.monitors = dict() self.targets = dict() """Dict which contains all the active slide frames in the machine that a slide can target. Will always contain an entry called 'default' which will be used if a slide doesn't specify targeting. """ self.keyboard = None self.physical_dmds = [] self.physical_rgb_dmds = [] self.crash_queue = queue.Queue() self.ticks = 0 self.start_time = 0 self.is_init_done = False if thread_stopper: self.thread_stopper = thread_stopper else: self.thread_stopper = threading.Event() # Core components self.config_validator = ConfigValidator(self) self.events = EventManager(self) self.mode_controller = ModeController(self) create_config_collections(self, self.machine_config['mpf-mc']['config_collections']) ConfigValidator.load_config_spec() self.config_processor = ConfigProcessor(self) self.transition_manager = TransitionManager(self) self._set_machine_path() self._load_font_paths() # Initialize the sound system (must be done prior to creating the AssetManager). # If the sound system is not available, do not load any other sound-related modules. if SoundSystem is None: self.sound_system = None else: self.sound_system = SoundSystem(self) self.asset_manager = ThreadedAssetManager(self) self.bcp_processor = BcpProcessor(self) # Asset classes ImageAsset.initialize(self) VideoAsset.initialize(self) self._initialise_sound_system() self.clock.schedule_interval(self._check_crash_queue, 1) self.events.add_handler("client_connected", self._create_physical_dmds) self.events.add_handler("player_turn_start", self.player_start_turn)
def __init__(self, options, config: MpfMcConfig, thread_stopper=None): self.log = logging.getLogger('mpfmc') self.log.info("Mission Pinball Framework Media Controller v%s", __version__) self.log.info("Mission Pinball Framework Game Engine v%s", __mpfversion__) if (__version__.split('.')[0] != __mpfversion__.split('.')[0] or __version__.split('.')[1] != __mpfversion__.split('.')[1]): self.log.error( "MPF MC and MPF Game engines must be same " "major.minor versions. You have MPF v%s and MPF-MC" " v%s", __mpfversion__, __version__) raise ValueError( "MPF MC and MPF Game engines must be same " "major.minor versions. You have MPF v{} and MPF-MC" " v{}".format(__mpfversion__, __version__)) super().__init__() self.options = options self.machine_path = config.get_machine_path() self.log.info("Machine path: %s", self.machine_path) # load machine into path to load modules if self.machine_path not in sys.path: sys.path.append(self.machine_path) self.mc_config = config self.config_validator = ConfigValidator(self, config.get_config_spec()) self.machine_config = self.mc_config.get_machine_config() self.config = self.machine_config self.clock = Clock # pylint: disable-msg=protected-access self.log.info("Starting clock at %sHz", Clock._max_fps) self._boot_holds = set() self.is_init_done = threading.Event() self.mpf_path = os.path.dirname(mpf.__file__) self.modes = CaseInsensitiveDict() self.player_list = list() self.player = None self.num_players = 0 self.bcp_client_connected = False self.placeholder_manager = McPlaceholderManager(self) self.settings = McSettingsController(self) self.animation_configs = dict() self.active_slides = dict() self.custom_code = list() self.register_boot_hold('init') self.displays = DeviceCollection(self, "displays", "displays") self.machine_vars = CaseInsensitiveDict() self.machine_var_monitor = False self.monitors = dict() self.targets = dict() """Dict which contains all the active slide frames in the machine that a slide can target. Will always contain an entry called 'default' which will be used if a slide doesn't specify targeting. """ self.keyboard = None self.dmds = [] self.rgb_dmds = [] self.crash_queue = queue.Queue() self.ticks = 0 self.start_time = 0 self.debug_refs = [] MYPY = False # NOQA if MYPY: # pragma: no cover self.videos = None # type: Dict[str, VideoAsset] if thread_stopper: self.thread_stopper = thread_stopper else: self.thread_stopper = threading.Event() # Core components self.events = EventManager(self) self.mode_controller = ModeController(self) create_config_collections( self, self.machine_config['mpf-mc']['config_collections']) self._preprocess_config(self.config) self.config_processor = ConfigProcessor(self) self.transition_manager = TransitionManager(self) self.effects_manager = EffectsManager(self) self._set_machine_path() self._load_font_paths() # Initialize the sound system (must be done prior to creating the AssetManager). # If the sound system is not available, do not load any other sound-related modules. if SoundSystem is None or self.options.get("no_sound"): self.sound_system = None else: self.sound_system = SoundSystem(self) if self.sound_system.audio_interface is None: self.sound_system = None self.asset_manager = ThreadedAssetManager(self) self.bcp_processor = BcpProcessor(self) # Asset classes ImageAsset.initialize(self) VideoAsset.initialize(self) BitmapFontAsset.initialize(self) self._initialise_sound_system() self.clock.schedule_interval(self._check_crash_queue, 1) self.events.add_handler("client_connected", self._create_dmds) self.events.add_handler("player_turn_start", self.player_start_turn) self.create_machine_var('mpfmc_ver', __version__) # force setting it here so we have it before MPF connects self.receive_machine_var_update('mpfmc_ver', __version__, 0, True)