updated docstrings to follow google styling, changed checking of hardware to only happen once

This commit is contained in:
Nicholas Dyer 2023-05-12 11:20:00 -04:00
parent f56f775541
commit 65365adc3d
5 changed files with 82 additions and 53 deletions

View File

@ -3,9 +3,6 @@ import json
class SaveData: class SaveData:
"""
Class that represents the save data of the game.
"""
def __init__(self): def __init__(self):
""" """

View File

@ -1,6 +1,6 @@
""" """
Module used to fake the RPi.GPIO module so that Dummy module that contains empty functions and variables that exist in RPi.GPIO. This module is to be imported
the program can be run without the actual hardware. if importing RPi.GPIO fails.
""" """
# Constants used by RPi.GPIO # Constants used by RPi.GPIO
@ -12,7 +12,11 @@ FALLING = 0
def setmode(new_mode): def setmode(new_mode):
""" """
Fake setmode function. Fake setmode function.
:param new_mode: Args:
new_mode:
Returns:
""" """
pass pass
@ -20,10 +24,14 @@ def setmode(new_mode):
def setup(channel, mode, initial=None, pull_up_down=None): def setup(channel, mode, initial=None, pull_up_down=None):
""" """
Fake setup function. Fake setup function.
:param channel: Args:
:param mode: channel:
:param initial: mode:
:param pull_up_down: initial:
pull_up_down:
Returns:
""" """
pass pass
@ -31,10 +39,14 @@ def setup(channel, mode, initial=None, pull_up_down=None):
def add_event_detect(channel, edge_type, callback=None, bouncetime=0): def add_event_detect(channel, edge_type, callback=None, bouncetime=0):
""" """
Fake function to add a non-existent event detect. Fake function to add a non-existent event detect.
:param channel: Args:
:param edge_type: channel:
:param callback: edge_type:
:param bouncetime: callback:
bouncetime:
Returns:
""" """
pass pass
@ -42,8 +54,11 @@ def add_event_detect(channel, edge_type, callback=None, bouncetime=0):
def event_detected(channel): def event_detected(channel):
""" """
Fake function to detect an event. Always returns false. Fake function to detect an event. Always returns false.
:param channel: Args:
:return: channel:
Returns:
""" """
return False return False
@ -51,6 +66,10 @@ def event_detected(channel):
def cleanup(channel=None): def cleanup(channel=None):
""" """
Fake cleanup function. Fake cleanup function.
:param channel: Args:
channel:
Returns:
""" """
pass pass

View File

@ -1,15 +1,19 @@
""" """Handle inputs from the GPIO pins on the Raspberry Pi and converting them to events to be used in other places (
Handle inputs from the GPIO pins on the Raspberry Pi and converting them to events to be used in other places (pygame, etc.) pygame, etc.)"""
"""
import importlib.util import importlib.util
# If the RPi.GPIO module is not found (aka the program is not running on a Pi), import the fake # If the RPi.GPIO module is not found (aka the program is not running on a Pi), import the fake
# GPIO module instead to prevent a crash. # GPIO module instead to prevent a crash.
ON_HARDWARE = None # Flag to tell other methods if the program is running on hardware or not
try: try:
importlib.util.find_spec('RPi.GPIO') importlib.util.find_spec('RPi.GPIO')
import RPi.GPIO as GPIO import RPi.GPIO as GPIO
ON_HARDWARE = True
except ImportError: except ImportError:
import pocket_friends.game_files.io.fake_gpio as GPIO import pocket_friends.game_files.io.fake_gpio as GPIO
ON_HARDWARE = False
# Dictionary of all the buttons used and what their corresponding GPIO codes are # Dictionary of all the buttons used and what their corresponding GPIO codes are
BUTTONS = { BUTTONS = {
@ -24,9 +28,7 @@ BUTTONS = {
def setup(): def setup():
""" """Prime the GPIO pins for reading the inputs of the buttons."""
Primes the GPIO pins for reading the inputs of the buttons.
"""
GPIO.setmode(GPIO.BOARD) GPIO.setmode(GPIO.BOARD)
GPIO.setup(BUTTONS.get('a'), GPIO.IN) GPIO.setup(BUTTONS.get('a'), GPIO.IN)
@ -47,16 +49,17 @@ def setup():
def teardown(): def teardown():
""" """Clean up the GPIO handler."""
Cleans up the GPIO handler.
"""
GPIO.cleanup() GPIO.cleanup()
def get_press(button): def get_press(button):
""" """
Returns true if a button has changed from not pressed to pressed. Checks if a given button code has been pressed and returns a bool depending on the state.
:param button: button to be detected Args:
:return: True if the button is has been pressed, False otherwise button: button to be detected
Returns: True if the button is has been pressed, False otherwise
""" """
return GPIO.event_detected(button) return GPIO.event_detected(button)

View File

@ -1,5 +1,4 @@
import pygame import pygame
import importlib.util
import pocket_friends.game_files.io.gpio_handler as gpio_handler import pocket_friends.game_files.io.gpio_handler as gpio_handler
@ -7,36 +6,40 @@ class InputHandler:
""" """
Class that is implemented into surfaces in order to control the Class that is implemented into surfaces in order to control the
pressing of buttons on both the real hardware and on a keyboard. pressing of buttons on both the real hardware and on a keyboard.
Attributes:
clock (pygame.time.Clock): Pygame clock used for input time calculations.
last_input_tick (int): The tick that the last input was registered on.
""" """
def __init__(self, pygame_clock): def __init__(self, pygame_clock):
"""
Create a InputHandler object using a given Pygame clock.
Args:
pygame_clock (pygame.time.Clock): A pygame clock to use as the clock for input time calculations.
"""
self.clock = pygame_clock self.clock = pygame_clock
# If not on actual hardware, fake the GPIO in order to get it working correctly.
try:
importlib.util.find_spec('RPi.GPIO')
import RPi.GPIO as GPIO
self.on_hardware = True
except ImportError:
import pocket_friends.game_files.io.fake_gpio as GPIO
self.on_hardware = False
self.last_input_tick = 0 self.last_input_tick = 0
def create_event(self, pressed_button): def create_event(self, pressed_button):
""" """
Creates a pygame event with a given keyboard code Create a pygame event given a GPIO code and post it to the pygame event handler.
:param pressed_button: Args:
pressed_button (int): The GPIO code to be registered and pressed.
""" """
# Register a button click so long as the last button click happened no less than two frames ago # Register a button click so long as the last button click happened no less than two frames ago
if pygame.time.get_ticks() - self.last_input_tick > self.clock.get_time() * 2 or not self.on_hardware: if pygame.time.get_ticks() - self.last_input_tick > self.clock.get_time() * 2 or not gpio_handler.ON_HARDWARE:
pygame.event.post(pygame.event.Event(pygame.KEYDOWN, {'key': pressed_button})) pygame.event.post(pygame.event.Event(pygame.KEYDOWN, {'key': pressed_button}))
pygame.event.post(pygame.event.Event(pygame.KEYUP, {'key': pressed_button})) pygame.event.post(pygame.event.Event(pygame.KEYUP, {'key': pressed_button}))
self.last_input_tick = pygame.time.get_ticks() self.last_input_tick = pygame.time.get_ticks()
def handle_gpio(self): def handle_gpio(self):
""" """
Handles getting GPIO button presses and making a pygame event when a press is detected. Handle GPIO events and create events for them.
""" """
for pressed_button in gpio_handler.BUTTONS: for pressed_button in gpio_handler.BUTTONS:
code = gpio_handler.BUTTONS.get(pressed_button) code = gpio_handler.BUTTONS.get(pressed_button)
@ -45,10 +48,8 @@ class InputHandler:
if gpio_handler.get_press(code): if gpio_handler.get_press(code):
self.create_event(code) self.create_event(code)
def keyboard_handler(self): def handle_keyboard(self):
""" """Handle keyboard presses and generate corresponding GPIO codes to create events."""
Simulates key presses to GPIO button presses. Also handles quitting the game.
"""
# Checks if a corresponding keyboard key has been pressed. If it has, emulate a button press. # Checks if a corresponding keyboard key has been pressed. If it has, emulate a button press.
for keyboard_event in pygame.event.get(): for keyboard_event in pygame.event.get():
@ -73,10 +74,8 @@ class InputHandler:
running = False running = False
def update(self): def update(self):
""" """Run either the GPIO handler or the keyboard handler to check for input and create events."""
Run the input handler and check for inputs. if gpio_handler.ON_HARDWARE:
"""
if self.on_hardware:
self.handle_gpio() self.handle_gpio()
else: else:
self.keyboard_handler() self.handle_keyboard()

View File

@ -6,7 +6,18 @@ from ..io.input_handler import InputHandler
class Surface(pygame.Surface): class Surface(pygame.Surface):
"""
"""
def __init__(self, window_size, resources_dir, game_fps, **kwargs): def __init__(self, window_size, resources_dir, game_fps, **kwargs):
"""
Args:
window_size:
resources_dir:
game_fps:
**kwargs:
"""
super().__init__(window_size, pygame.SRCALPHA) super().__init__(window_size, pygame.SRCALPHA)
self.name = 'selection_info' self.name = 'selection_info'
self.running = True self.running = True