Skip to content

Instantly share code, notes, and snippets.

@felixangell
Created March 7, 2018 02:38
Show Gist options
  • Save felixangell/c6a815686ea04d02894a21bc0f6b86c4 to your computer and use it in GitHub Desktop.
Save felixangell/c6a815686ea04d02894a21bc0f6b86c4 to your computer and use it in GitHub Desktop.
please ignore me
#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