-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPiQuiz.py
executable file
·237 lines (208 loc) · 6.84 KB
/
PiQuiz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#!/usr/bin/python
#
# Copyright (C) 2016 Jason Wessel
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
# Some notes:
# If you were looking for a well written program, don't look here.
# This program was written very quickly just to get the GPIOs tested
# and working for a simple quiz game. It should be refactored to not
# use all these global variables and a more typical python style.
#
# Discliamer aside, this is just a very basic 4 paddle lockout system
# which has two modes.
#
# Mode: Use Moderator Paddle
# In this mode the moderator paddle must be pressed to clear
# the lockout of one of the other 3 paddles
# Mode: Timed Lockout Clear
# In this mode the lockout clears automatically after a defined
# interval and all 4 paddles are part of the lockout
# Swithing modes:
# The moderator paddle must be held down for 10 seconds in moderator
# when in moderator mode. In Timed Lockout Clear, the winning paddle
# must be held down for 10 seconds and it will become the moderator
# paddle.
import RPi.GPIO as GPIO
from time import sleep
import pygame
import os
debug = 0
# Startup mode is defined by use_moderator
# The moderator paddle can change the game mode by pressing
# it for "switch_time" milliseconds to the 4 paddle version
# with a set clear_time
use_moderator = True
use_moderator = False
# Clear time is in ms
clear_time = 4000
# Time to hold moderator paddle before switching modes
switch_time = 10000
# Init speaker and path to wav files
pygame.mixer.init()
wavpath = os.path.dirname(os.path.realpath(__file__))
# Define Lights and Buttons
Light = [1,2,3,4]
Button = [1,2,3,4]
Sound = [1,2,3,4]
# Orange Paddle
Light[0] = 15
Button[0] = 16
Sound[0] = pygame.mixer.Sound(wavpath + "/1.wav")
# Green Paddle
Light[1] = 32
Button[1] = 31
Sound[1] = pygame.mixer.Sound(wavpath + "/2.wav")
# Purple Paddle
Light[2] = 35
Button[2] = 36
Sound[2] = pygame.mixer.Sound(wavpath + "/3.wav")
# Blue Paddle
Light[3] = 38
Button[3] = 37
Sound[3] = pygame.mixer.Sound(wavpath + "/4.wav")
# Moderator Button Number
Moderator = Button[1]
Winner = Moderator
# Time in MS to ignore second button press
btn_delay_ms = 300
lockout = False
# Button Callback
def button_press(channel):
global lockout
global Winner
if lockout:
return
try:
i = Button.index(channel)
lockout = True
Winner = channel
GPIO.output(Light[i], True)
if (Sound[i]):
Sound[i].play()
except ValueError:
return
# Initialize Player and Buttons
def init_gpio():
global debug
global use_moderator
global Moderator
GPIO.setmode(GPIO.BOARD)
for i in range(len(Button)):
GPIO.setup(Light[i], GPIO.OUT)
GPIO.output(Light[i], False)
GPIO.setup(Button[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)
if not (Button[i] == Moderator and use_moderator):
if debug:
print "Init Button %i " % i
GPIO.add_event_detect(Button[i],
GPIO.FALLING,
callback=button_press,
bouncetime=btn_delay_ms)
# Moderator Control Loop
def moderator_control_loop():
global debug
global lockout
global use_moderator
global switch_time
global Moderator
try:
x = 0
while True:
x = x + 1
if debug:
print "looping1... %s" % x
while GPIO.wait_for_edge(Moderator, GPIO.FALLING, timeout=100) is None:
if not GPIO.input(Moderator):
break
if debug:
print "looping2... %s %s" % (x, GPIO.input(Moderator))
GPIO.output(Light[Button.index(Moderator)], True)
tick = 0
while GPIO.wait_for_edge(Moderator, GPIO.RISING, timeout=100) is None:
tick = tick + 100
if debug:
print "looping3... %s %s" % (x, GPIO.input(Moderator))
if GPIO.input(Moderator):
break
else:
if tick >= switch_time:
i = Button.index(Moderator)
if (Sound[i]):
Sound[i].play()
use_moderator = False
return 2;
if debug:
print "looping4... %s" % x
for i in range(len(Light)):
GPIO.output(Light[i], False)
lockout = False
except KeyboardInterrupt:
return 0
return 1
def clear_time_control_loop():
global debug
global lockout
global use_moderator
global clear_time
global switch_time
global Winner
global Moderator
try:
x = 0
tick = 0
while True:
sleep(0.1)
if lockout:
# Check if moderator paddle is depressed for
# long enough to switch modes
if not GPIO.input(Winner):
if debug:
print "Tick Moderator %s" % tick
if tick >= switch_time:
i = Button.index(Winner)
# What ever paddle kept the button down
# is the new Moderator
Moderator = Winner
if (Sound[i]):
Sound[i].play()
use_moderator = True
return 2;
else:
# Process time out to reset
if debug:
print "Tick check %s" % tick
if tick >= clear_time:
for i in range(len(Light)):
GPIO.output(Light[i], False)
lockout = False
if debug:
print "Reseting paddles"
tick = 0
tick = tick + 100
except KeyboardInterrupt:
return 0
return 1
# Main Program
while True:
init_gpio()
if debug:
print "Use Moderator: %s" % use_moderator
if use_moderator:
ret = moderator_control_loop()
else:
ret = clear_time_control_loop()
GPIO.cleanup()
if not ret:
break