From 605a12ede1bbcd83107c527ba243c7e7d3267750 Mon Sep 17 00:00:00 2001 From: Brandon Rodriguez <brodriguez8774@gmail.com> Date: Tue, 2 Nov 2021 11:34:46 -0400 Subject: [PATCH] Add additional GUI buttons for roomba ai logic --- src/entities/gui_entities.py | 94 ++++++++++++++++++++++++++++++------ src/misc.py | 53 +++++++++++++++++++- 2 files changed, 131 insertions(+), 16 deletions(-) diff --git a/src/entities/gui_entities.py b/src/entities/gui_entities.py index c7f5a84..30c7f2d 100644 --- a/src/entities/gui_entities.py +++ b/src/entities/gui_entities.py @@ -12,22 +12,23 @@ Sprite Depth Values (0 is lowest. Higher values will display ontop of lower ones # System Imports. import sdl2.ext -from sdl2 import SDL_CreateTextureFromSurface, SDL_CreateRenderer, SDL_RENDERER_ACCELERATED -from fclist import fclist, fcmatch -from sdl2.sdlttf import TTF_Init, TTF_OpenFont, TTF_RenderText_Solid +from fclist import fcmatch # User Imports. from src.logging import init_logging +from src.misc import ( + set_roomba_vision_range_0, + set_roomba_vision_range_1, + set_roomba_vision_range_2, + set_roomba_vision_range_full, + toggle_roomba_ai, +) # Initialize logger. logger = init_logging(__name__) -# # Initialize SDL2_ttf. -# TTF_Init() - - class GuiCore: """ @@ -42,11 +43,22 @@ class GuiCore: # Initialize general gui background. self.background = GuiBackground(data_manager) + # Initialize "toggle ai" button. + self.toggle_ai = GuiButton( + data_manager, + 'Toggle AI', + 20, + name='Toggle AI', + function_call=toggle_roomba_ai, + function_args=data_manager, + ) + self.elements.append(self.toggle_ai) + # Initialize "randomize tile walls" buttons. self.rand_walls = GuiButton( data_manager, 'Randomize Walls (E)', - 50, + 90, name='RandWalls Button (Equal Randomization)', function_call=data_manager.tile_set.randomize_tile_walls_equal, ) @@ -54,22 +66,66 @@ class GuiCore: self.rand_walls = GuiButton( data_manager, 'Randomize Walls (W)', - 90, + 130, name='RandWalls Button (Weighted Randomization)', function_call=data_manager.tile_set.randomize_tile_walls_weighted, ) self.elements.append(self.rand_walls) - # # Initialize "randomize trash piles" button. + # Initialize "randomize trash piles" button. self.rand_trash = GuiButton( data_manager, 'Randomize Trash', - 130, + 170, name='RandTrash Button', function_call=data_manager.tile_set.randomize_trash, ) self.elements.append(self.rand_trash) + # Initialize "roomba vision distance of 0" (aka "bump sensor") button. + self.vision_0 = GuiButton( + data_manager, + 'Bump Sensor', + 250, + name='Distance of 0 (Bump Sensor)', + function_call=set_roomba_vision_range_0, + function_args=data_manager, + ) + self.elements.append(self.vision_0) + + # Initialize "roomba vision distance of 1" button. + self.vision_1 = GuiButton( + data_manager, + 'Distance of 1', + 290, + name='Distance of 1', + function_call=set_roomba_vision_range_1, + function_args=data_manager, + ) + self.elements.append(self.vision_1) + + # Initialize "roomba vision distance of 2" button. + self.vision_2 = GuiButton( + data_manager, + 'Distance of 2', + 330, + name='Distance of 2', + function_call=set_roomba_vision_range_2, + function_args=data_manager, + ) + self.elements.append(self.vision_2) + + # Initialize "roomba vision distance of 'all seeing'" button. + self.vision_full = GuiButton( + data_manager, + 'Full Sight', + 370, + name='Full Sight', + function_call=set_roomba_vision_range_full, + function_args=data_manager, + ) + self.elements.append(self.vision_full) + class GuiBackground: """ @@ -162,10 +218,17 @@ class GuiButton: """ A button for the GUI interface. """ - def __init__(self, data_manager, text, pos_y, name='Gui Button', function_call=None): + def __init__(self, data_manager, text, pos_y, name='Gui Button', function_call=None, function_args=None): self.data_manager = data_manager self.name = str(name) self.function_call = function_call + if function_args is None: + self.function_args = None + else: + if isinstance(function_args, list) or isinstance(function_args, tuple): + self.function_args = function_args + else: + self.function_args = [function_args] # Determine bounds of button we're generating. Allows handling on click events. background_width = data_manager.gui_data['gui_w_end'] - data_manager.gui_data['gui_w_start'] - 40 @@ -221,12 +284,15 @@ class GuiButton: Allows external logic (such as main event loop) to trigger expected button press logic, on click. :return: Corresponding return value for bound function call. """ - logger.info(' Clicked button "{0}:'.format(self.name)) + logger.info(' Clicked button "{0}":'.format(self.name)) if self.function_call is None: raise RuntimeError('Button does not have a bound function call!') - return self.function_call() + if self.function_args: + return self.function_call(*self.function_args) + else: + return self.function_call() class GuiButtonSprite(sdl2.ext.Entity): """ diff --git a/src/misc.py b/src/misc.py index bee43a3..8d2debf 100644 --- a/src/misc.py +++ b/src/misc.py @@ -45,6 +45,8 @@ class DataManager: self.gui = None self.tile_set = None self.roomba = None + self.ai_active = False + self.roomba_vision_range = 1 self.ideal_trash_paths = None self.graph = networkx.Graph() self.graph.data = { @@ -659,8 +661,7 @@ def calc_trash_distances(data_manager): def calc_traveling_salesman(data_manager, debug=False): """ Calculates the approximately-ideal overall path to visit all trash tiles. - :param data_manager: - :return: + :param data_manager: Data manager data structure. Consolidates useful program data to one location. """ debug = True @@ -806,6 +807,54 @@ def calc_traveling_salesman(data_manager, debug=False): data_manager.debug_entities.append(debug_entity) +def toggle_roomba_ai(data_manager): + """ + Toggles roomba AI on or off. Program start default is off. + :param data_manager: Data manager data structure. Consolidates useful program data to one location. + """ + logger.info('Toggling roomba ai.') + if data_manager.ai_active: + data_manager.ai_active = False + else: + data_manager.ai_active = True + + +def set_roomba_vision_range_0(data_manager): + """ + Adjusts roomba AI sight to see 0 tiles out from current location. + :param data_manager: Data manager data structure. Consolidates useful program data to one location. + """ + logger.info('Setting roomba vision to "0 tiles" (bump sensor).') + data_manager.roomba_vision = 0 + + +def set_roomba_vision_range_1(data_manager): + """ + Adjusts roomba AI sight to see 1 tiles out from current location. + :param data_manager: Data manager data structure. Consolidates useful program data to one location. + """ + logger.info('Setting roomba vision to "1 tiles".') + data_manager.roomba_vision = 1 + + +def set_roomba_vision_range_2(data_manager): + """ + Adjusts roomba AI sight to see 2 tiles out from current location. + :param data_manager: Data manager data structure. Consolidates useful program data to one location. + """ + logger.info('Setting roomba vision to "2 tiles".') + data_manager.roomba_vision = 2 + + +def set_roomba_vision_range_full(data_manager): + """ + Adjusts roomba AI sight to see all tiles on map. + :param data_manager: Data manager data structure. Consolidates useful program data to one location. + """ + logger.info('Setting roomba vision to "full sight".') + data_manager.roomba_vision = -1 + + def clear_debug_entities(data_manager): """ Removes all debug entities, so that the screen does not become cluttered with redundant/overlapping debug info. -- GitLab