Gordons Projects

--> Projects Top-Level GIT

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