Gordons Projects

--> Projects Top-Level GIT

Added in new C and BASIC programs to drive the Raspberry Ladder
[ladder] / simon.rtb
1 //
2 // simion:
3 //    Version of the popular "Simon" memory game for
4 //    the Rasberry Ladder board
5 //
6 PROC ladderSetup
7 //
8 // 100 memory slots - ought to be enough..
9 //
10 DIM memory(100)
11 //
12 CLS 
13 PRINT 
14 PRINT "==     Simon Says - Remember the LEDs!"
15 PRINT "== Memory Game for the Raspberry Ladder Board =="
16 PRINT "================================================"
17 PRINT 
18 PRINT "The Ladder board will flash seuences of LEDs. You must try to"
19 PRINT "remember the sequence and push the buttons next to the LEDs"
20 PRINT "to confirm your memory. Each cycle, one more LED colour will"
21 PRINT "be added to the sequence..."
22 //
23 CYCLE 
24   memCount = 0
25   userCount = 0
26   lost = FALSE
27   PRINT 
28   PRINT "Push Button A (next to the Blue LEDs) to begin"
29   PRINT 
30   //
31   DigitalWrite (gMan, 0)
32   CYCLE 
33     DigitalWrite (rMan, 1)
34     WAIT (0.1)
35     DigitalWrite (rMan, 0)
36     WAIT (0.1)
37     IF DigitalRead (buttonA) = 0 THEN BREAK 
38   REPEAT 
39   //
40   WAIT (0.01)
41   WHILE DigitalRead (buttonA) = 0 CYCLE 
42     // Wait for button up
43   REPEAT 
44   DigitalWrite (gMan, 1)
45   WAIT (0.5)
46   //
47   // This is it
48   //
49   CYCLE 
50     PROC addNewColour
51     PROC playSequence
52     PROC getInput
53     WAIT (0.5)
54   REPEAT UNTIL lost // We can never win...
55   //
56   PROC mainOff
57   DigitalWrite (rMan, 1)
58   PRINT 
59   PRINT "You ran out of memory!"
60   PRINT "There were ";  memCount;  " changes in the sequence, you got: ";  userCount
61   PRINT "The sequence was:"
62   PRINT 
63   PRINT "   ";  
64   FOR i = 0 TO memCount - 1 CYCLE 
65     led = memory(i)
66     IF led = 0 THEN 
67       TCOLOUR = Blue
68       PRINT "B";  
69     ENDIF 
70     IF led = 1 THEN 
71       TCOLOUR = Green
72       PRINT "G";  
73     ENDIF 
74     IF led = 2 THEN 
75       TCOLOUR = Yellow
76       PRINT "Y";  
77     ENDIF 
78     IF led = 3 THEN 
79       TCOLOUR = Red
80       PRINT "R";  
81     ENDIF 
82     TCOLOUR = White
83     IF i = userCount - 1 THEN 
84       PRINT "<";  
85     ELSE 
86       PRINT " ";  
87     ENDIF 
88   REPEAT 
89   PRINT 
90   PRINT 
91 REPEAT 
92 END 
93 //
94 // getInput:
95 //    Read the buttons, but if we wait too long, or push the wrong one,
96 //    then it's game over!
97 //
98 DEF PROC getInput
99 userCount = 0
100 WHILE userCount < memCount CYCLE 
101   button = FN getButton
102   IF button = -1 THEN  // Took too long
103     lost = TRUE
104     BREAK 
105   ENDIF 
106   //
107   // was it the right one?
108   //
109   IF button <> memory(userCount) THEN 
110     PROC lightLED(memory(userCount))
111     lost = TRUE
112     BREAK 
113   ENDIF 
114   //
115   // Light up the light for as long as the button is pushed
116   //
117   PROC lightLED(button)
118   WHILE DigitalRead (buttonA) + DigitalRead (buttonB) + DigitalRead (buttonC) + DigitalRead (buttonD) <> 4 CYCLE 
119   REPEAT 
120   PROC mainOff
121   WAIT (0.05)
122   userCount = userCount + 1
123 REPEAT 
124 //
125 ENDPROC 
126 //
127 // getButton:
128 //    function to return the button pressed - as 0, 1, 2 or 3
129 //    or return -1 if we don't push a button inside 2 seconds
130 //
131 DEF FN getButton
132 LOCAL start, button
133 etime = TIME + 2000
134 button = -1
135 CYCLE 
136   IF DigitalRead (buttonA) = 0 THEN button = 0
137   IF DigitalRead (buttonB) = 0 THEN button = 1
138   IF DigitalRead (buttonC) = 0 THEN button = 2
139   IF DigitalRead (buttonD) = 0 THEN button = 3
140 REPEAT UNTIL (TIME > etime) OR (button <> -1)
141  = button
142 //
143 //
144 // addNewColour
145 //    Add a new colour to the sequence
146 //
147 DEF PROC addNewColour
148 memory(memCount) = RND (4)
149 memCount = memCount + 1
150 ENDPROC 
151 //
152 // playSequence:
153 //    Play back the sequence stored so-far
154 //
155 DEF PROC playSequence
156 LOCAL i
157 FOR i = 0 TO memCount - 1 CYCLE 
158   PROC display(memory(i))
159 REPEAT 
160 ENDPROC 
161 //
162 // display:
163 //    Light up an LED pair for 1/5 a second
164 //
165 DEF PROC display(led)
166 PROC lightLED(led)
167 WAIT (0.4)
168 PROC mainOff
169 WAIT (0.2)
170 ENDPROC 
171 //
172 // lightLED
173 //    Light up the colour pair
174 //
175 DEF PROC lightLED(ledCol)
176 SWITCH (ledCol)
177   CASE 0
178     DigitalWrite (ledBlue1, 1)
179     DigitalWrite (ledBlue2, 1)
180   ENDCASE 
181   CASE 1
182     DigitalWrite (ledGreen1, 1)
183     DigitalWrite (ledGreen2, 1)
184   ENDCASE 
185   CASE 2
186     DigitalWrite (ledYellow1, 1)
187     DigitalWrite (ledYellow2, 1)
188   ENDCASE 
189   CASE 3
190     DigitalWrite (ledRed1, 1)
191     DigitalWrite (ledRed2, 1)
192   ENDCASE 
193 ENDSWITCH 
194 ENDPROC 
195 //
196 // mainOff
197 //    Turn the main LEDs off
198 //
199 DEF PROC mainOff
200 LOCAL i
201 FOR i = 0 TO 7 CYCLE 
202   DigitalWrite (i, 0)
203 REPEAT 
204 ENDPROC 
205 //
206 // ladderSetup:
207 //    This is the setup procedure. We initialise the various
208 //    pins into the correct modes and extinbuish all the LEDs
209 //
210 DEF PROC ladderSetup
211 LOCAL i
212 FOR i = 0 TO 9 CYCLE 
213   PinMode (i, 1) // Output
214   DigitalWrite (i, 0) // Off
215 REPEAT 
216 FOR i = 10 TO 13 CYCLE 
217   PinMode (i, 0) // Input
218   PullUpDn (i, 2) // Activate internal pull-up
219 REPEAT 
220 //
221 // Make some globals
222 //
223 ledRed1 = 0
224 ledRed2 = 1
225 ledYellow1 = 2
226 ledYellow2 = 3
227 ledGreen1 = 4
228 ledGreen2 = 5
229 ledBlue1 = 6
230 ledBlue2 = 7
231 gMan = 8
232 rMan = 9
233 //
234 buttonA = 11
235 buttonB = 10
236 buttonC = 12
237 buttonD = 13
238 //
239 ENDPROC