def _stopped_maxtimer(self, dev: str): self.maxtimer_running[dev] = False self.dgtmenu.disable_picochess_displayed(dev) if dev not in self.devices: logging.debug('delete not registered (%s) tasks', dev) self.tasks[dev] = [] return if self.tasks[dev]: logging.debug('processing delayed (%s) tasks: %s', dev, self.tasks[dev]) else: logging.debug( '(%s) max timer finished - returning to time display', dev) DgtDisplay.show( Dgt.DISPLAY_TIME(force=False, wait=True, devs={dev})) while self.tasks[dev]: logging.debug('(%s) tasks has %i members', dev, len(self.tasks[dev])) try: message = self.tasks[dev].pop(0) except IndexError: break with self.process_lock[dev]: self._process_message(message, dev) if self.maxtimer_running[ dev]: # run over the task list until a maxtime command was processed remaining = len(self.tasks[dev]) if remaining: logging.debug('(%s) tasks stopped on %i remaining members', dev, remaining) else: logging.debug('(%s) tasks completed', dev) break
def _exit_display(self, devs=None): if devs is None: # prevent W0102 error devs = {'ser', 'i2c', 'web'} if self.play_move and self.dgtmenu.get_mode() in (Mode.NORMAL, Mode.BRAIN, Mode.REMOTE): side = self._get_clock_side(self.play_turn) beep = self.dgttranslate.bl(BeepLevel.BUTTON) text = Dgt.DISPLAY_MOVE(move=self.play_move, fen=self.play_fen, side=side, wait=True, maxtime=1, beep=beep, devs=devs, uci960=self.uci960, lang=self.dgttranslate.language, capital=self.dgttranslate.capital, long=self.dgttranslate.notation) else: text = None if self._inside_main_menu('dont_care_dev'): text = self.dgtmenu.get_current_text() if text: text.wait = True # in case of "bad pos" message send before else: text = Dgt.DISPLAY_TIME(force=True, wait=True, devs=devs) DgtObserver.fire(text)
def _exit_display(self): if self.play_move and self.dgtmenu.get_mode() in (Mode.NORMAL, Mode.BRAIN, Mode.REMOTE): side = self._get_clock_side(self.play_turn) beep = self.dgttranslate.bl(BeepLevel.BUTTON) text = Dgt.DISPLAY_MOVE(move=self.play_move, fen=self.play_fen, side=side, wait=True, maxtime=1, beep=beep, devs={'ser', 'i2c', 'web'}, uci960=self.uci960, lang=self.dgttranslate.language, capital=self.dgttranslate.capital) else: text = None if self._inside_main_menu(): text = self.dgtmenu.get_current_text() if text: text.wait = True # in case of "bad pos" message send before else: text = Dgt.DISPLAY_TIME(force=True, wait=True, devs={'ser', 'i2c', 'web'}) DispatchDgt.fire(text)
def _process_message(self, message): if False: # switch-case pass elif isinstance(message, Message.ENGINE_READY): self._process_engine_ready(message) elif isinstance(message, Message.ENGINE_STARTUP): self._process_engine_startup(message) elif isinstance(message, Message.ENGINE_FAIL): DgtObserver.fire(self.dgttranslate.text('Y10_erroreng')) self.dgtmenu.set_engine_restart(False) elif isinstance(message, Message.COMPUTER_MOVE): self._process_computer_move(message) elif isinstance(message, Message.NEW_GAME): self._process_new_game(message) elif isinstance(message, Message.COMPUTER_MOVE_DONE): self._process_computer_move_done() elif isinstance(message, Message.USER_MOVE_DONE): self._process_user_move_done(message) elif isinstance(message, Message.REVIEW_MOVE_DONE): self._process_review_move_done(message) elif isinstance(message, Message.ALTERNATIVE_MOVE): self.force_leds_off() self.play_mode = message.play_mode DgtObserver.fire(self.dgttranslate.text('B05_altmove')) elif isinstance(message, Message.NEW_LEVEL): if not self.dgtmenu.get_engine_restart(): DgtObserver.fire(message.level_text) elif isinstance(message, Message.TIME_CONTROL): self._process_time_control(message) elif isinstance(message, Message.NEW_BOOK): if not self.dgtmenu.get_confirm() or not message.show_ok: DgtObserver.fire(message.book_text) elif isinstance(message, Message.TAKE_BACK): self.force_leds_off() self._reset_moves_and_score() DgtObserver.fire(self.dgttranslate.text('C10_takeback')) DgtObserver.fire( Dgt.DISPLAY_TIME(force=True, wait=True, devs={'ser', 'i2c', 'web'})) elif isinstance(message, Message.GAME_ENDS): if not self.dgtmenu.get_engine_restart( ): # filter out the shutdown/reboot process text = self.dgttranslate.text(message.result.value) text.beep = self.dgttranslate.bl(BeepLevel.CONFIG) text.maxtime = 0.5 DgtObserver.fire(text) if self.dgtmenu.get_mode() == Mode.PONDER: self._reset_moves_and_score() text.beep = False text.maxtime = 1 self.score = text elif isinstance(message, Message.INTERACTION_MODE): if not self.dgtmenu.get_confirm() or not message.show_ok: DgtObserver.fire(message.mode_text) elif isinstance(message, Message.PLAY_MODE): self.play_mode = message.play_mode DgtObserver.fire(message.play_mode_text) elif isinstance(message, Message.NEW_SCORE): self._process_new_score(message) elif isinstance(message, Message.BOOK_MOVE): self.score = self.dgttranslate.text('N10_score', None) DgtObserver.fire(self.dgttranslate.text('N10_bookmove')) elif isinstance(message, Message.NEW_PV): self._process_new_pv(message) elif isinstance(message, Message.NEW_DEPTH): self.depth = message.depth elif isinstance(message, Message.IP_INFO): self.dgtmenu.int_ip = message.info['int_ip'] self.dgtmenu.ext_ip = message.info['ext_ip'] elif isinstance(message, Message.STARTUP_INFO): self._process_startup_info(message) elif isinstance(message, Message.SEARCH_STARTED): logging.debug('search started') elif isinstance(message, Message.SEARCH_STOPPED): logging.debug('search stopped') elif isinstance(message, Message.CLOCK_START): self._process_clock_start(message) elif isinstance(message, Message.CLOCK_STOP): DgtObserver.fire(Dgt.CLOCK_STOP(devs=message.devs, wait=True)) elif isinstance(message, Message.DGT_BUTTON): self._process_button(message) elif isinstance(message, Message.DGT_FEN): if self.dgtmenu.inside_updt_menu(): logging.debug('inside update menu => ignore fen %s', message.fen) else: self._process_fen(message.fen, message.raw) elif isinstance(message, Message.DGT_CLOCK_VERSION): DgtObserver.fire( Dgt.CLOCK_VERSION(main=message.main, sub=message.sub, devs={message.dev})) text = self.dgttranslate.text('Y21_picochess', devs={message.dev}) text.rd = ClockIcons.DOT DgtObserver.fire(text) if message.dev == 'ser': # send the "board connected message" to serial clock DgtObserver.fire(message.text) self._set_clock(devs={message.dev}) self._exit_display(devs={message.dev}) elif isinstance(message, Message.DGT_CLOCK_TIME): time_white = message.time_left time_black = message.time_right if self.dgtmenu.get_flip_board(): time_white, time_black = time_black, time_white EvtObserver.fire( Event.CLOCK_TIME(time_white=time_white, time_black=time_black, connect=message.connect, dev=message.dev)) elif isinstance(message, Message.CLOCK_TIME): self.low_time = message.low_time if self.low_time: logging.debug('time too low, disable confirm - w: %i, b: %i', message.time_white, message.time_black) elif isinstance(message, Message.DGT_SERIAL_NR): self._process_dgt_serial_nr() elif isinstance(message, Message.DGT_JACK_ERROR ): # only working in case of 2 clocks connected! DgtObserver.fire(self.dgttranslate.text('Y00_errorjack')) elif isinstance(message, Message.DGT_EBOARD_VERSION): if self.dgtmenu.inside_updt_menu(): logging.debug( 'inside update menu => board channel not displayed') else: DgtObserver.fire(message.text) self._exit_display(devs={'i2c', 'web' }) # ser is done, when clock found elif isinstance(message, Message.DGT_EBOARD_ERROR): if self.dgtmenu.inside_updt_menu( ) or self.dgtmenu.inside_main_menu(): logging.debug('inside menu => board error not displayed') else: DgtObserver.fire(message.text) elif isinstance(message, Message.DGT_CLOCK_ERROR): pass elif isinstance(message, Message.SWITCH_SIDES): self.play_move = chess.Move.null() self.play_fen = None self.play_turn = None self.hint_move = chess.Move.null() self.hint_fen = None self.hint_turn = None self.force_leds_off() logging.debug('user ignored move %s', message.move) elif isinstance(message, Message.EXIT_MENU): self._exit_display(devs={message.dev}) elif isinstance(message, Message.WRONG_FEN): DgtObserver.fire(self.dgttranslate.text('C10_setpieces')) elif isinstance(message, Message.BATTERY_BT): if message.percent == 0x7f: percent = ' NA' elif message.percent > 99: percent = ' 99' else: percent = str(message.percent) self.dgtmenu.battery = percent elif isinstance(message, Message.REMOTE_ROOM): self.dgtmenu.inside_room = message.inside else: # Default pass