diff --git a/fishy/engine/common/window.py b/fishy/engine/common/window.py index 48f98f6..25ba3f3 100644 --- a/fishy/engine/common/window.py +++ b/fishy/engine/common/window.py @@ -23,16 +23,16 @@ class WindowClient: self.crop = crop self.scale = scale self.show_name = show_name - self.showing = False if len(WindowClient.clients) == 0: window_server.start() WindowClient.clients.append(self) - def __del__(self): + def destory(self): WindowClient.clients.remove(self) if len(WindowClient.clients) == 0: window_server.stop() + logging.info("window server stopped") @staticmethod def running(): @@ -86,7 +86,7 @@ class WindowClient: else: return func(img) - def show(self, resize=None, func=None): + def show(self, to_show, resize=None, func=None): """ Displays the processed image for debugging purposes :param ready_img: send ready image, just show the `ready_img` directly @@ -100,6 +100,10 @@ class WindowClient: logging.warning("You need to assign a name first") return + if not to_show: + cv2.destroyWindow(self.show_name) + return + img = self.processed_image(func) if img is None: @@ -108,5 +112,4 @@ class WindowClient: if resize is not None: img = imutils.resize(img, width=resize) cv2.imshow(self.show_name, img) - - self.showing = True + cv2.waitKey(25) diff --git a/fishy/engine/common/window_server.py b/fishy/engine/common/window_server.py index 517732a..4b4907b 100644 --- a/fishy/engine/common/window_server.py +++ b/fishy/engine/common/window_server.py @@ -77,11 +77,6 @@ def loop(): def loop_end(): cv2.waitKey(25) - from fishy.engine.common.window import WindowClient - for c in WindowClient.clients: - if not c.showing: - cv2.destroyWindow(c.show_name) - def run(): # todo use config diff --git a/fishy/engine/fullautofisher/engine.py b/fishy/engine/fullautofisher/engine.py index 5c468b3..24b6508 100644 --- a/fishy/engine/fullautofisher/engine.py +++ b/fishy/engine/fullautofisher/engine.py @@ -92,7 +92,16 @@ class FullAuto(IEngine): self.fisher = SemiFisherEngine(None) self.controls = Controls(self.get_controls()) + @property + def show(self): + return config.get("show_window_full_auto", False) + + @show.setter + def show(self, x): + config.set("show_window_full_auto", x) + def update_crop(self): + self.show = True self.crop = get_crop_coods(self.window) config.set("full_auto_crop", self.crop) self.window.crop = self.crop @@ -118,12 +127,16 @@ class FullAuto(IEngine): self.gui.bot_started(True) while self.start and WindowClient.running(): - self.window.show(func=image_pre_process) - cv2.waitKey(25) + self.window.show(self.show, func=image_pre_process) + if not self.show: + time.sleep(0.1) self.gui.bot_started(False) self.controls.unassign_keys() + self.window.show(False) logging.info("Quit") + self.window.destory() + self.fisher.toggle_start() def get_coods(self): return get_values_from_image(self.window.processed_image(func=image_pre_process), self._tesseract_dir) @@ -163,7 +176,6 @@ class FullAuto(IEngine): if from_angle is None: _, _, from_angle = self.get_coods() - if target_angle < 0: target_angle = 360 + target_angle while target_angle > 360: @@ -234,32 +246,36 @@ class FullAuto(IEngine): def move_to_target(): self.move_to(config.get("target")) - def rotate_to(): + def rotate_to_90(): self.rotate_to(90) + def toggle_show(): + self.show = not self.show + controls = [ - { + ("MAIN", { Key.RIGHT: Player(self).start_route, Key.UP: Calibrate(self).callibrate, - Key.LEFT: self.update_crop, + Key.LEFT: Recorder(self).start_recording, Key.DOWN: change_state - }, - { + }), + ("COODS", { Key.RIGHT: print_coods, - Key.UP: Recorder(self).start_recording, - Key.LEFT: helper.empty_function, + Key.UP: self.update_crop, + Key.LEFT: toggle_show, Key.DOWN: change_state - }, - { + }), + ("TEST1", { Key.RIGHT: set_target, - Key.UP: rotate_to, + Key.UP: rotate_to_90, Key.LEFT: move_to_target, Key.DOWN: change_state - } + }) ] return controls + class Controls: def __init__(self, controls, first=0): self.current_menu = first - 1 @@ -270,8 +286,8 @@ class Controls: if self.current_menu == len(self.controls): self.current_menu = 0 - help_str = "CONTROLS" - for key, func in self.controls[self.current_menu].items(): + help_str = F"CONTROLS: {self.controls[self.current_menu][0]}" + for key, func in self.controls[self.current_menu][1].items(): hotkey.set_hotkey(key, func) help_str += f"\n{key.value}: {func.__name__}" logging.info(help_str) @@ -279,7 +295,7 @@ class Controls: def unassign_keys(self): keys = [] for c in self.controls: - for k in c.keys(): + for k in c[1].keys(): if k not in keys: hotkey.free_key(k) diff --git a/fishy/engine/semifisher/engine.py b/fishy/engine/semifisher/engine.py index dffff9a..fc7937c 100644 --- a/fishy/engine/semifisher/engine.py +++ b/fishy/engine/semifisher/engine.py @@ -37,7 +37,7 @@ class SemiFisherEngine(IEngine): self.gui.bot_started(True) logging.info("Starting the bot engine, look at the fishing hole to start fishing") Thread(target=self._wait_and_check).start() - while self.start: + while self.start and WindowClient.running(): capture = self.fishPixWindow.get_capture() if capture is None: @@ -53,6 +53,7 @@ class SemiFisherEngine(IEngine): logging.info("Fishing engine stopped") self.gui.bot_started(False) fishing_event.unsubscribe() + self.fishPixWindow.destory() def _wait_and_check(self): time.sleep(10)