basics · beginner · ~15 min

Traffic Signal State Machine Enum

Implement finite state machine transitions safely using enums.

Challenge

Finite state machines in embedded C commonly represent control states as explicit enum constants. Modeling valid transitions defends against invalid system states.

Your Task

Given the state definitions:

typedef enum {
    SIGNAL_RED = 0,
    SIGNAL_GREEN = 1,
    SIGNAL_YELLOW = 2,
    SIGNAL_FLASHING_AMBER = 3
} TrafficSignal;

Implement:

TrafficSignal next_signal_state(TrafficSignal current, int emergency_override);
const char *signal_state_name(TrafficSignal s);

Rules

  1. If emergency_override != 0, transition immediately to SIGNAL_FLASHING_AMBER.
  2. In normal operation (emergency_override == 0):
    • SIGNAL_RED transitions to SIGNAL_GREEN.
    • SIGNAL_GREEN transitions to SIGNAL_YELLOW.
    • SIGNAL_YELLOW transitions to SIGNAL_RED.
    • SIGNAL_FLASHING_AMBER transitions to SIGNAL_RED.
    • Any other invalid value transitions to SIGNAL_RED.
  3. signal_state_name returns "RED", "GREEN", "YELLOW", "FLASHING_AMBER", or "UNKNOWN".

Example

next_signal_state(SIGNAL_RED, 0); // returns SIGNAL_GREEN
next_signal_state(SIGNAL_GREEN, 1); // returns SIGNAL_FLASHING_AMBER

Input format

current: TrafficSignal enum; emergency_override: int boolean flag.

Output format

Returns next TrafficSignal enum and state name string.

Constraints

Zero dynamic allocations. Pure enum state logic.

Starter code

typedef enum {
    SIGNAL_RED = 0,
    SIGNAL_GREEN = 1,
    SIGNAL_YELLOW = 2,
    SIGNAL_FLASHING_AMBER = 3
} TrafficSignal;

TrafficSignal next_signal_state(TrafficSignal current, int emergency_override) {
    (void)current; (void)emergency_override;
    return SIGNAL_RED;
}

const char *signal_state_name(TrafficSignal s) {
    (void)s;
    return "UNKNOWN";
}

Common mistakes

Missing emergency check before normal transitions; string typos.

Edge cases to handle

Override overrides any state; unknown input state defaults safely to RED.

Background lessons

Solve this exercise in the browser editor — compile and run against the test harness, no setup required.