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