Gordons Projects

--> Projects Top-Level GIT

Added GPLv3 headers to everything
[gpioExamples] / tuxx / tuxx.c
1 /*
2  * tuxx.c:
3  *      https://projects.drogon.net/raspberry-pi/gpio-examples/
4  *
5  *      Copyright (c) 2012 Gordon Henderson
6  *********************************************************************************
7  *
8  *   This program is free software: you can redistribute it and/or modify
9  *   it under the terms of the GNU General Public License as published by
10  *   the Free Software Foundation, either version 3 of the License, or
11  *   (at your option) any later version.
12  *
13  *   This program is distributed in the hope that it will be useful,
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *   GNU General Public License for more details.
17  *
18  *   You should have received a copy of the GNU General Public License
19  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  ***********************************************************************
22  *
23  *      Tux Crossing. A variant on the UK "Pelican" crossing for
24  *      pedestrians going over roads.
25  *
26  *      There is a set of Red, Yellow (sometimes called amber) and
27  *      Green traffic lights to control the traffic, and a "Red Man"
28  *      and "Green Man" indicators for pedestrians, and a button for
29  *      them to push.
30  *
31  *      Push the button and the lights cycle to Red, then the Green Man
32  *      comes on (often with a beeping sound), then afte a short while
33  *      the Green man starts to flash, meaning to not start crossing,
34  *      and the Yellow traffic light flashes too - meaning that if the
35  *      crossing is clear, traffic can pass... Then after a few more seconds
36  *      the flashing stops and it revers to Go for traffic and Stop for
37  *      pedestrians.
38  *
39  ***********************************************************************
40  */
41
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <unistd.h>
45 #include <wiringPi.h>
46
47 // Our lamps:
48 //      (These are wiringPi pin numbers)
49
50 #define RED             0
51 #define YELLOW          1
52 #define GREEN           2
53 #define RED_MAN         3
54 #define GREEN_MAN       4
55
56 // The input button
57
58 #define BUTTON          8
59
60
61 /*
62  * setup:
63  *      Program the GPIO correctly and initialise the lamps
64  ***********************************************************************
65  */
66
67 void setup (void)
68 {
69   int i ;
70
71   if (geteuid () != 0)
72   {
73     fprintf (stderr, "tuxx: Need to be root to run (sudo?)\n") ;
74     exit (0) ;
75   }
76
77   if (wiringPiSetup () == -1)
78     exit (1) ;
79
80   printf ("Setup ... ") ; fflush (stdout) ;
81   for (i = 0 ; i < 5 ; ++i)
82   {
83     pinMode (i, OUTPUT) ;
84     digitalWrite (i, 0) ;
85   }
86   digitalWrite (GREEN, 1) ;
87   digitalWrite (RED_MAN, 1) ;
88   pinMode (BUTTON, INPUT) ;
89
90   printf ("OK\n") ;
91 }
92
93 /*
94  * waitButton:
95  *      Wait for the button to be pressed. Because we have the GPIO
96  *      pin pulled high, we wait for it to go low to indicate a push.
97  ***********************************************************************
98  */
99
100 void waitButton (void)
101 {
102   printf ("Waiting for button ... ") ; fflush (stdout) ;
103   while (digitalRead (BUTTON) == HIGH)
104     delay (100) ;
105   printf ("Got it\n") ;
106 }
107
108 /*
109  * stopTraffic:
110  *      Cycle the traffic lights from Green to Red
111  ***********************************************************************
112  */
113
114 void stopTraffic ()
115 {
116   printf ("Stopping traffic ... ") ; fflush (stdout) ;
117   digitalWrite (GREEN,  0) ;
118   digitalWrite (YELLOW, 1) ;
119   delay (2000) ;
120   digitalWrite (YELLOW, 0) ;
121   digitalWrite (RED,    1) ;
122   delay (2000) ;
123   printf ("Stopped\n") ;
124 }
125
126 /*
127  * walk:
128  *      Signal the red/green man to walk and when time is up,
129  *      start the traffic light sequence to let the traffic move again
130  ***********************************************************************
131  */
132
133 void walk ()
134 {
135   printf ("Walk now ... ") ; fflush (stdout) ;
136
137   digitalWrite (RED_MAN,   0) ;
138   digitalWrite (GREEN_MAN, 1) ;
139   delay (10000) ;
140   digitalWrite (RED,    0) ;
141   digitalWrite (YELLOW, 1) ;
142
143   printf ("Walked\n") ;
144 }
145
146 /*
147  * graceTime:
148  *      This is the time when the green man is flashing, and the yellow
149  *      traffic light is also flashing - to signal to pedestrians to not
150  *      start to cross and to drivers that they can move on if the 
151  *      crossing is clear.
152  ***********************************************************************
153  */
154
155 void graceTime ()
156 {
157   int i ;
158
159   printf ("Grace time ... ") ; fflush (stdout) ;
160
161   for (i = 0 ; i < 8 ; ++i)
162   {
163     delay (500) ;
164     digitalWrite (GREEN_MAN, 0) ;
165     digitalWrite (YELLOW,    0) ;
166     delay (500) ;
167     digitalWrite (GREEN_MAN, 1) ;
168     digitalWrite (YELLOW,    1) ;
169   }
170   printf ("time up!\n") ;
171 }
172
173 /*
174  * startTraffic:
175  *      Back to the Red Man and Green traffic light
176  ***********************************************************************
177  */
178
179 void startTraffic ()
180 {
181   printf ("Starting traffic ... ") ; fflush (stdout) ;
182
183   digitalWrite (GREEN_MAN, 0) ;
184   digitalWrite (RED_MAN,   1) ;
185   delay (500) ;
186   digitalWrite (YELLOW, 0) ;
187   digitalWrite (GREEN,  1) ;
188
189   printf ("Going\n") ;
190 }
191
192
193 /*
194  ***********************************************************************
195  * The main program
196  *      Call our setup routing once, then sit in a loop, waiting for
197  *      the button to be pressed then executing the sequence.
198  ***********************************************************************
199  */
200
201 int main (void)
202 {
203   setup () ;
204   for (;;)
205   {
206     waitButton   () ;
207     stopTraffic  () ;
208     walk         () ;
209     graceTime    () ;
210     startTraffic () ;
211   }
212 }