State Machine Patterns
Traffic Light
A traffic light cycles through a fixed set of states.
cycle
A cycle returns to the first state after the final state.
transition
The transition helper keeps the next-state rule separate from the loop.
Traffic Light
traffic_light.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
enum LightState {
LIGHT_RED,
LIGHT_GREEN,
LIGHT_YELLOW
};
enum LightState nextLight(enum LightState state) {
if (state == LIGHT_RED) {
return LIGHT_GREEN;
}
if (state == LIGHT_GREEN) {
return LIGHT_YELLOW;
}
return LIGHT_RED;
}
int main(void) {
int ticks = 2;
enum LightState state = LIGHT_RED;
for (int i = 0; i < ticks; i++) {
state = nextLight(state);
}
printf("ticks=%d light=%d\n", ticks, state);
return 0;
}
#include <stdio.h>
enum LightState {
LIGHT_RED,
LIGHT_GREEN,
LIGHT_YELLOW
};
enum LightState nextLight(enum LightState state) {
if (state == LIGHT_RED) {
return LIGHT_GREEN;
}
if (state == LIGHT_GREEN) {
return LIGHT_YELLOW;
}
return LIGHT_RED;
}
int main(void) {
int ticks = 1;
enum LightState state = LIGHT_RED;
for (int i = 0; i < ticks; i++) {
state = nextLight(state);
}
printf("ticks=%d light=%d\n", ticks, state);
return 0;
}
#include <stdio.h>
enum LightState {
LIGHT_RED,
LIGHT_GREEN,
LIGHT_YELLOW
};
enum LightState nextLight(enum LightState state) {
if (state == LIGHT_RED) {
return LIGHT_GREEN;
}
if (state == LIGHT_GREEN) {
return LIGHT_YELLOW;
}
return LIGHT_RED;
}
int main(void) {
int ticks = 5;
enum LightState state = LIGHT_RED;
for (int i = 0; i < ticks; i++) {
state = nextLight(state);
}
printf("ticks=%d light=%d\n", ticks, state);
return 0;
}
ticks ← 2
19int main(void) {20 int ticks→ 2 = 2; //@ticks=1, 521 enum LightState state = LIGHT_RED;for (int i = 0; i < ticks; i++)
pass 1 of 223for (int i0 = 0; i < ticks2; i++) {24 state0 = nextLight(state);25}enum LightState nextLight(enum LightState state)
pass 1 of 29enum LightState nextLight(enum LightState state0) {10 if (state == LIGHT_RED) {if (state == LIGHT_RED)
9enum LightState nextLight(enum LightState state) {10 if (state0 == LIGHT_RED0) {11 return LIGHT_GREEN1;12 }state ← 1
23for (int i = 0; i < ticks; i++) {24 state→ 1 = nextLight(state);25}for (int i = 0; i < ticks; i++)
pass 2 of 223for (int i1 = 0; i < ticks2; i++) {24 state1 = nextLight(state);25}enum LightState nextLight(enum LightState state)
pass 2 of 29enum LightState nextLight(enum LightState state1) {10 if (state == LIGHT_RED) {if (state == LIGHT_GREEN)
12}13if (state1 == LIGHT_GREEN1) {14 return LIGHT_YELLOW2;15}state ← 2
23for (int i = 0; i < ticks; i++) {24 state→ 2 = nextLight(state);25}printf("ticks=%d light=%d ", ticks, state);
27 printf("ticks=%d light=%d\n", ticks2, state2);28 return 0;29}outputticks=2 light=2
ticks ← 1
19int main(void) {20 int ticks→ 1 = 1;21 enum LightState state = LIGHT_RED;for (int i = 0; i < ticks; i++)
23for (int i0 = 0; i < ticks1; i++) {24 state0 = nextLight(state);25}enum LightState nextLight(enum LightState state)
9enum LightState nextLight(enum LightState state0) {10 if (state == LIGHT_RED) {if (state == LIGHT_RED)
9enum LightState nextLight(enum LightState state) {10 if (state0 == LIGHT_RED0) {11 return LIGHT_GREEN1;12 }state ← 1
23for (int i = 0; i < ticks; i++) {24 state→ 1 = nextLight(state);25}printf("ticks=%d light=%d ", ticks, state);
27 printf("ticks=%d light=%d\n", ticks1, state1);28 return 0;29}outputticks=1 light=1
ticks ← 5
19int main(void) {20 int ticks→ 5 = 5;21 enum LightState state = LIGHT_RED;for (int i = 0; i < ticks; i++)
pass 1 of 523for (int i0 = 0; i < ticks5; i++) {24 state0 = nextLight(state);25}All 5 passes — pass 1 is the card above pass istateLIGHT_REDLIGHT_GREENLIGHT_YELLOW1 0 0 0 1 — 2 1 1 — 1 2 3 2 2 — — — 4 3 0 0 1 — 5 4 1 — 1 2 enum LightState nextLight(enum LightState state)
pass 1 of 59enum LightState nextLight(enum LightState state0) {10 if (state == LIGHT_RED) {All 5 passes — pass 1 is the card above pass stateLIGHT_REDLIGHT_GREENLIGHT_YELLOW1 0 0 1 — 2 1 — 1 2 3 2 0 — — 4 0 0 1 — 5 1 — 1 2 if (state == LIGHT_RED)
pass 1 of 29enum LightState nextLight(enum LightState state) {10 if (state0 == LIGHT_RED0) {11 return LIGHT_GREEN1;12 }state ← 1
23for (int i = 0; i < ticks; i++) {24 state→ 1 = nextLight(state);25}if (state == LIGHT_GREEN)
pass 1 of 212}13if (state1 == LIGHT_GREEN1) {14 return LIGHT_YELLOW2;15}state ← 2
23for (int i = 0; i < ticks; i++) {24 state→ 2 = nextLight(state);25}state ← 0
23for (int i = 0; i < ticks; i++) {24 state→ 0 = nextLight(state);25}if (state == LIGHT_RED)
pass 2 of 29enum LightState nextLight(enum LightState state) {10 if (state0 == LIGHT_RED0) {11 return LIGHT_GREEN1;12 }state ← 1
23for (int i = 0; i < ticks; i++) {24 state→ 1 = nextLight(state);25}if (state == LIGHT_GREEN)
pass 2 of 212}13if (state1 == LIGHT_GREEN1) {14 return LIGHT_YELLOW2;15}state ← 2
23for (int i = 0; i < ticks; i++) {24 state→ 2 = nextLight(state);25}printf("ticks=%d light=%d ", ticks, state);
27 printf("ticks=%d light=%d\n", ticks5, state2);28 return 0;29}outputticks=5 light=2