Switched to pygame.fastevent for thread safety

This commit is contained in:
Balthasar Reuter
2015-05-30 14:12:18 +02:00
parent df3c6480ec
commit 80238bbe38

View File

@@ -11,7 +11,12 @@ from sys import exit
from time import sleep
from PIL import Image
import pygame
import pygame
try:
import pygame.fastevent as eventmodule
except ImportError:
import pygame.event as eventmodule
try:
import RPi.GPIO as GPIO
@@ -89,6 +94,8 @@ class GUI_PyGame:
"""The GUI class using PyGame"""
def __init__(self, name, size):
pygame.init()
if hasattr(eventmodule, 'init'):
eventmodule.init()
# Window name
pygame.display.set_caption(name)
# Hide mouse cursor
@@ -146,13 +153,15 @@ class GUI_PyGame:
# Render everything
self.apply()
# Wait for event
event = pygame.event.wait()
event = eventmodule.wait()
# Handle the event
if event.type == pygame.QUIT: return
elif event.type == pygame.KEYDOWN: handle_keypress(event.key)
elif event.type == pygame.MOUSEBUTTONUP: handle_mousebutton(event.button, event.pos)
elif event.type == pygame.USEREVENT: handle_gpio_event(event.channel)
# Ignore all input that happened inbetween
pygame.event.clear()
# eventmodule.clear()
eventmodule.get()
def teardown(self):
pygame.quit()
@@ -278,10 +287,10 @@ def handle_mousebutton(key, pos):
def handle_gpio_event(channel):
"""Implements the actions taken for a GPIO event"""
if channel == gpio_trigger_channel:
GPIO.remove_event_detect(gpio_trigger_channel)
#GPIO.remove_event_detect(gpio_trigger_channel)
take_picture()
GPIO.add_event_detect(gpio_trigger_channel, GPIO.RISING,
callback=handle_gpio_event, bouncetime=200)
#GPIO.add_event_detect(gpio_trigger_channel, GPIO.RISING,
# callback=handle_gpio_event, bouncetime=200)
def handle_exception(msg):
"""Displays an error message and returns"""
@@ -303,10 +312,13 @@ def setup_gpio():
# Setup the trigger channel as input and listen for events
GPIO.setup(gpio_trigger_channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(gpio_trigger_channel, GPIO.RISING,
callback=handle_gpio_event, bouncetime=200)
callback=handle_gpio, bouncetime=200)
else:
print("Warning: RPi.GPIO could not be loaded. GPIO disabled.")
def handle_gpio(channel):
"""Interrupt handler for GPIO events"""
eventmodule.post(eventmodule.Event(USEREVENT, channel=channel))
def teardown(exit_code=0):
display.teardown()