Created
March 7, 2018 02:38
-
-
Save felixangell/c6a815686ea04d02894a21bc0f6b86c4 to your computer and use it in GitHub Desktop.
please ignore me
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "arduino_simulator.h" | |
enum { | |
RED, AMBER, GREEN, | |
NUM_LIGHTS, | |
}; | |
enum { | |
SET_A, | |
SET_B, | |
MAX_LIGHT_AMT, | |
}; | |
static int LIGHT_IDX = 0; | |
int TRAFFIC_LIGHT_SETS[NUM_LIGHTS][MAX_LIGHT_AMT]; | |
const int PEDESTRIAN_LIGHT_PIN = 25; | |
void register_traffic_lights(int light_set[3]) { | |
for (int i = 0; i < 3; i++) { | |
pinMode(light_set[i], OUTPUT); | |
TRAFFIC_LIGHT_SETS[LIGHT_IDX][i] = light_set[i]; | |
} | |
LIGHT_IDX += 1; | |
} | |
void toggle_light(int pin, bool on) { | |
digitalWrite(pin, on ? HIGH : LOW); | |
// hack... | |
if (pin == PEDESTRIAN_LIGHT_PIN) { | |
Serial.print("PED "); | |
Serial.print(on ? "ON" : "OFF"); | |
Serial.print('\n'); | |
} | |
} | |
void flash_light(int pin, int blink_count) { | |
for (int i = 0; i < blink_count; i++) { | |
toggle_light(pin, true); | |
delay(25); | |
toggle_light(pin, false); | |
delay(25); | |
} | |
} | |
// traffic_light sets the state of each light for | |
// the given traffic_light set. | |
void traffic_light(int light_set_idx, bool r, bool a, bool g) { | |
if (light_set_idx < 0 || light_set_idx > LIGHT_IDX) { | |
return; | |
} | |
int* light_set = TRAFFIC_LIGHT_SETS[light_set_idx]; | |
toggle_light(light_set[RED], r); | |
toggle_light(light_set[AMBER], a); | |
toggle_light(light_set[GREEN], g); | |
Serial.print('L'); | |
// arrays are zero indexed, the assignment wants it to | |
// start from 1 so add 1! i.e. light set 0 becomes L1 | |
// light set 1 becomes L2. | |
Serial.print(light_set_idx + 1); | |
Serial.print(" = "); | |
Serial.print(r ? "ON" : "OFF"); | |
Serial.print(' '); | |
Serial.print(a ? "ON" : "OFF"); | |
Serial.print(' '); | |
Serial.print(g ? "ON" : "OFF"); | |
Serial.print('\n'); | |
} | |
void setup() { | |
int set_a[] = {14, 15, 16}; | |
register_traffic_lights(set_a); | |
int set_b[] = {17, 18, 19}; | |
register_traffic_lights(set_b); | |
pinMode(PEDESTRIAN_LIGHT_PIN, OUTPUT); | |
} | |
void four_phase_light(int light_idx) { | |
// red light on | |
traffic_light(light_idx, true, false, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// red light & amber light on | |
traffic_light(light_idx, true, true, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// green light on | |
traffic_light(light_idx, false, false, true); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// amber light on | |
traffic_light(light_idx, false, true, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// red light on | |
traffic_light(light_idx, true, false, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
} | |
// unused! | |
void match_four_phase_lights() { | |
// red light on | |
traffic_light(SET_A, true, false, false); | |
traffic_light(SET_B, true, false, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// red light & amber light on | |
traffic_light(SET_A, true, true, false); | |
traffic_light(SET_B, true, true, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// green light on | |
traffic_light(SET_A, false, false, true); | |
traffic_light(SET_B, false, false, true); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// amber light on | |
traffic_light(SET_A, false, true, false); | |
traffic_light(SET_B, false, true, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
delay(3000); | |
// red light on! | |
traffic_light(SET_A, true, false, false); | |
traffic_light(SET_B, true, false, false); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
} | |
void loop() { | |
if (Serial.available() > 0) { | |
if (Serial.read() != 'G') { | |
return; | |
} | |
// flash the ped light and turn it off | |
flash_light(PEDESTRIAN_LIGHT_PIN, 5); | |
toggle_light(PEDESTRIAN_LIGHT_PIN, false); | |
// start the lights! | |
four_phase_light(SET_A); | |
delay(6000); | |
four_phase_light(SET_B); | |
// both lights should be red. | |
// turn PED light on! | |
toggle_light(PEDESTRIAN_LIGHT_PIN, true); | |
delay(15000); | |
} | |
} | |
int main() { | |
setup(); | |
while (true) { | |
loop(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment