#define GPIOOff 0
#define GPIOOn 1
#define traff1RedPin 0
#define traff1AmberPin 1
#define traff1GreenPin 2
#define traff2RedPin 3
#define traff2AmberPin 4
#define traff2GreenPin 5
#define pedes1RedPin 7
#define pedes1GreenPin 8
#define pedes1WhitePin 9
#define PedestrianButtonPin 6
class GPIO {
protected:
int Pin;
int State;
int Direction;
public:
GPIO (){
}
GPIO (int PinNo, int DefaultState, int PinDirection){
SetUp(PinNo, DefaultState, PinDirection);
}
void SetUp (int PinNo, int DefaultState, int PinDirection) {
Pin = PinNo;
State = DefaultState;
pinMode(Pin, PinDirection);
SaveState();
}
int ReadState(){
State = digitalRead(Pin);
return State;
}
void SaveState(){
digitalWrite(Pin, State);
}
void SaveState(int PinState){
State = PinState;
SaveState();
}
void ToggleState(){
State = !ReadState();
SaveState();
}
};
class Led : public GPIO {
public:
Led () : GPIO () {}
Led (int PinNo, int DefaultState) : GPIO (PinNo, DefaultState, OUTPUT) {}
};
class TrafficLight {
#define State_STOP 0
#define State_Transition 1
#define State_GO 2
#define Trans_DELAY 1500
private:
Led RedLED;
Led AmberLED;
Led GreenLED;
int state = State_STOP;
public:
TrafficLight(int RedPinNo, int AmberPinNo, int GreenPinNo) {
RedLED.SetUp(RedPinNo, GPIOOff, OUTPUT);
AmberLED.SetUp(AmberPinNo, GPIOOff, OUTPUT);
GreenLED.SetUp(GreenPinNo, GPIOOff, OUTPUT);
DefaultState(GPIOOn, GPIOOff, GPIOOff);
}
void DefaultState(int RedState, int AmberState, int GreenState) {
RedLED.SaveState(RedState);
AmberLED.SaveState(AmberState);
GreenLED.SaveState(GreenState);
}
void Transition() {
if (state != State_Transition) {
if (state == State_STOP) {
state = State_Transition;
for (int phase = 0; phase < 2; phase++) {
sleep_ms(Trans_DELAY);
switch (phase) {
case 0:
AmberLED.ToggleState();
break;
case 1:
RedLED.ToggleState();
AmberLED.ToggleState();
GreenLED.ToggleState();
break;
}
}
state = State_GO;
} else {
state = State_Transition;
for (int phase = 0; phase < 3; phase++) {
sleep_ms(Trans_DELAY);
switch (phase) {
case 0:
GreenLED.ToggleState();
AmberLED.ToggleState();
break;
case 1:
RedLED.ToggleState();
AmberLED.ToggleState();
break;
}
}
state = State_STOP;
}
}
}
};
class PedestrianLight {
#define State_STOP 0
#define State_Transition 1
#define State_GO 2
#define Trans_DELAY 1500
private:
Led RedLED;
Led GreenLED;
int state = State_STOP;
public:
PedestrianLight(int RedPinNo, int GreenPinNo) {
RedLED.SetUp(RedPinNo, GPIOOff, OUTPUT);
GreenLED.SetUp(GreenPinNo, GPIOOff, OUTPUT);
DefaultState(GPIOOn, GPIOOff);
}
void DefaultState(int RedState, int GreenState) {
RedLED.SaveState(RedState);
GreenLED.SaveState(GreenState);
}
void Transition() {
if (state != State_Transition) {
state = State_Transition;
for (int phase = 0; phase < 3; phase++) {
switch (phase) {
case 0:
RedLED.ToggleState();
GreenLED.ToggleState();
sleep_ms(Trans_DELAY * 3);
break;
case 1:
for (int blink = 0 ; blink <20; blink++){
GreenLED.ToggleState();
sleep_ms(Trans_DELAY /4 );
}
break;
case 2:
GreenLED.ToggleState();
RedLED.ToggleState();
break;
}
}
state = State_GO;
}
}
};
class Button : public GPIO {
public:
Button () : GPIO () {}
Button (int PinNo, int DefaultState) : GPIO (PinNo, DefaultState, INPUT_PULLUP) {
}
};
int buttonPressed = 0;
void myISR(){
buttonPressed = 1;
digitalWrite(pedes1WhitePin, HIGH);
Serial1.println("Got Button Click");
}
void setup() {
// put your setup code here, to run once:
Serial1.begin(115200);
Serial1.println("Hello, Raspberry Pi Pico!");
}
void buttonDetect() {
if (digitalRead(PedestrianButtonPin)){
buttonPressed = 1;
digitalWrite(pedes1WhitePin, HIGH);
}
}
void loop() {
TrafficLight trafficLight1(traff1RedPin, traff1AmberPin, traff1GreenPin);
TrafficLight trafficLight2(traff2RedPin, traff2AmberPin, traff2GreenPin);
PedestrianLight pedestrianLight1(pedes1RedPin, pedes1GreenPin);
Button button1(PedestrianButtonPin, GPIOOff);
pinMode(pedes1WhitePin, OUTPUT);
//attachInterrupt(digitalPinToInterrupt(PedestrianButtonPin), myISR, LOW);
while (true){
trafficLight1.Transition();
//buttonDetect();
sleep_ms(3000);
trafficLight1.Transition();
//buttonDetect();
if (buttonPressed != 0){
digitalWrite(pedes1WhitePin, LOW);
pedestrianLight1.Transition();
buttonPressed = 0;
}
trafficLight2.Transition();
//buttonDetect();
sleep_ms(3000);
trafficLight2.Transition();
//buttonDetect();
if (buttonPressed != 0){
digitalWrite(pedes1WhitePin, LOW);
pedestrianLight1.Transition();
buttonPressed = 0;
}
}
}