← Back to Examples

06 Fsm Traffic Light Enhanced

Enhanced Traffic Light FSM Example Showcases: Verification, Monitoring, Type Safety, Advanced API Features: Pattern matching, batch events, supervision, performance stats

Source Code

# Enhanced Traffic Light FSM Example
# Showcases: Verification, Monitoring, Type Safety, Advanced API
# Features: Pattern matching, batch events, supervision, performance stats

module TrafficLightEnhanced do
  export [main/0]
  
  # Import FSM API
  import Std.Fsm [
    fsm_spawn/2, 
    fsm_cast/2, 
    fsm_advertise/2, 
    fsm_state/1
  ]
  import Std.Io [println/1, print/1]
  import Std.String [concat/2]
  import Std.Pair [pair/2]
  import Std.System [sleep/1]
  
  # Enhanced payload record with richer statistics
  record TrafficStats do
    cycles_completed: Int
    timer_events: Int
    emergency_stops: Int
    total_transitions: Int
    red_duration: Int
    green_duration: Int
    yellow_duration: Int
    pedestrian_crossings: Int
    errors_detected: Int
  end
  
  # Define the Traffic Light FSM with comprehensive transitions
  # This FSM implements a smart traffic light with multiple features:
  # - Normal cycle progression: Red -> Green -> Yellow -> Red
  # - Emergency stops from any state
  # - Pedestrian crossing requests
  # - Maintenance mode
  # - Performance tracking
  fsm TrafficStats{
    cycles_completed: 0, 
    timer_events: 0, 
    emergency_stops: 0,
    total_transitions: 0,
    red_duration: 0,
    green_duration: 0,
    yellow_duration: 0,
    pedestrian_crossings: 0,
    errors_detected: 0
  } do
    # Normal cycle transitions with state tracking
    Red --> |timer| Green {
      # Action: increment counters
      timer_events = timer_events + 1
      total_transitions = total_transitions + 1
      red_duration = red_duration + 30  # Assume 30 second red light
    }
    
    Green --> |timer| Yellow {
      timer_events = timer_events + 1
      total_transitions = total_transitions + 1
      green_duration = green_duration + 45  # 45 second green light
    }
    
    Yellow --> |timer| Red {
      timer_events = timer_events + 1
      total_transitions = total_transitions + 1
      yellow_duration = yellow_duration + 5   # 5 second yellow light
      cycles_completed = cycles_completed + 1  # Complete cycle
    }
    
    # Emergency transitions from any state
    Red --> |emergency| Red {
      emergency_stops = emergency_stops + 1
      total_transitions = total_transitions + 1
    }
    
    Green --> |emergency| Red {
      emergency_stops = emergency_stops + 1
      total_transitions = total_transitions + 1
    }
    
    Yellow --> |emergency| Red {
      emergency_stops = emergency_stops + 1
      total_transitions = total_transitions + 1
    }
    
    # Pedestrian crossing - can request from Red (grants green faster)
    Red --> |pedestrian| Green {
      pedestrian_crossings = pedestrian_crossings + 1
      total_transitions = total_transitions + 1
      red_duration = red_duration + 10  # Shorter red for pedestrian
    }
    
    # Maintenance mode - all states can go to Maintenance
    Red --> |maintenance| Maintenance {
      total_transitions = total_transitions + 1
    }
    
    Green --> |maintenance| Maintenance {
      total_transitions = total_transitions + 1
    }
    
    Yellow --> |maintenance| Maintenance {
      total_transitions = total_transitions + 1
    }
    
    # Resume from maintenance always goes to Red for safety
    Maintenance --> |resume| Red {
      total_transitions = total_transitions + 1
    }
    
    # Error handling - if error occurs, go to flashing red
    Red --> |error_occurred| FlashingRed {
      errors_detected = errors_detected + 1
      total_transitions = total_transitions + 1
    }
    
    Green --> |error_occurred| FlashingRed {
      errors_detected = errors_detected + 1
      total_transitions = total_transitions + 1
    }
    
    Yellow --> |error_occurred| FlashingRed {
      errors_detected = errors_detected + 1
      total_transitions = total_transitions + 1
    }
    
    # Reset from error state
    FlashingRed --> |reset| Red {
      total_transitions = total_transitions + 1
    }
  end
  
  # Main demonstration of all features
  # NOTE: Before running, FSM types must be registered via:
  #   TrafficLightEnhanced:register_fsms()
  # This is automatically done when using -eval to call this function
  def main(): Int =
    println("╔══════════════════════════════════════════════════════════════╗")
    println("║  Enhanced Traffic Light FSM - Complete Feature Demo         ║")
    println("╚══════════════════════════════════════════════════════════════╝")
    println("")
    
    # ============================================================
    # PHASE 1: Basic FSM Lifecycle
    # ============================================================
    println("📋 PHASE 1: FSM Lifecycle & Registration")
    println("─────────────────────────────────────────")
    
    let initial_stats = TrafficStats{
      cycles_completed: 0, 
      timer_events: 0, 
      emergency_stops: 0,
      total_transitions: 0,
      red_duration: 0,
      green_duration: 0,
      yellow_duration: 0,
      pedestrian_crossings: 0,
      errors_detected: 0
    }
    
    println("✓ Creating FSM with initial statistics")
    let fsm_pid = fsm_spawn(:TrafficStats, initial_stats)
    
    println("✓ Registering FSM as :smart_traffic_light")
    let adv_result = fsm_advertise(fsm_pid, :smart_traffic_light)
    println("  FSM registered successfully")
    println("")
    
    # ============================================================
    # PHASE 2: Normal Operation Cycle
    # ============================================================
    println("🚦 PHASE 2: Normal Traffic Light Cycle")
    println("─────────────────────────────────────────")
    
    let state0 = fsm_state(:smart_traffic_light)
    println("  Initial State: Red")
    
    println("  Sending timer event: Red → Green")
    let empty1 = []
    let event1 = pair(:timer, empty1)
    fsm_cast(:smart_traffic_light, event1)
    
    let state1 = fsm_state(:smart_traffic_light)
    println("  ✓ Transitioned to Green")
    
    println("  Sending timer event: Green → Yellow")
    let empty2 = []
    let event2 = pair(:timer, empty2)
    fsm_cast(:smart_traffic_light, event2)
    
    let state2 = fsm_state(:smart_traffic_light)
    println("  ✓ Transitioned to Yellow")
    
    println("  Sending timer event: Yellow → Red (cycle complete)")
    let empty3 = []
    let event3 = pair(:timer, empty3)
    fsm_cast(:smart_traffic_light, event3)
    
    let state3 = fsm_state(:smart_traffic_light)
    println("  ✓ Transitioned to Red (1 cycle completed)")
    println("")
    
    # ============================================================
    # PHASE 3: Emergency Handling
    # ============================================================
    println("🚨 PHASE 3: Emergency Stop System")
    println("─────────────────────────────────────────")
    
    println("  Progressing to Green state")
    let empty4 = []
    let event4 = pair(:timer, empty4)
    fsm_cast(:smart_traffic_light, event4)
    
    println("  Triggering emergency stop from Green")
    let empty5 = []
    let event5 = pair(:emergency, empty5)
    fsm_cast(:smart_traffic_light, event5)
    
    let emergency_state = fsm_state(:smart_traffic_light)
    println("  ✓ Emergency stop executed: now at Red")
    println("")
    
    # ============================================================
    # PHASE 4: Pedestrian Crossing
    # ============================================================
    println("🚶 PHASE 4: Pedestrian Crossing Feature")
    println("─────────────────────────────────────────")
    
    println("  Pedestrian button pressed at Red light")
    let empty6 = []
    let event6 = pair(:pedestrian, empty6)
    fsm_cast(:smart_traffic_light, event6)
    
    let pedestrian_state = fsm_state(:smart_traffic_light)
    println("  ✓ Light changed to Green for pedestrian")
    println("")
    
    # ============================================================
    # PHASE 5: Maintenance Mode
    # ============================================================
    println("🔧 PHASE 5: Maintenance Mode")
    println("─────────────────────────────────────────")
    
    println("  Entering maintenance mode")
    let empty7 = []
    let event7 = pair(:maintenance, empty7)
    fsm_cast(:smart_traffic_light, event7)
    
    let maint_state = fsm_state(:smart_traffic_light)
    println("  ✓ In Maintenance mode")
    
    println("  Resuming from maintenance")
    let empty8 = []
    let event8 = pair(:resume, empty8)
    fsm_cast(:smart_traffic_light, event8)
    
    let resume_state = fsm_state(:smart_traffic_light)
    println("  ✓ Resumed to Red (safe state)")
    println("")
    
    # ============================================================
    # PHASE 6: Error Handling
    # ============================================================
    println("⚠️  PHASE 6: Error Detection & Recovery")
    println("─────────────────────────────────────────")
    
    println("  Simulating error condition")
    let empty9 = []
    let event9 = pair(:error_occurred, empty9)
    fsm_cast(:smart_traffic_light, event9)
    
    let error_state = fsm_state(:smart_traffic_light)
    println("  ✓ Entered FlashingRed (error mode)")
    
    println("  Resetting from error")
    let empty10 = []
    let event10 = pair(:reset, empty10)
    fsm_cast(:smart_traffic_light, event10)
    
    let reset_state = fsm_state(:smart_traffic_light)
    println("  ✓ Reset to Red (normal operation)")
    println("")
    
    # ============================================================
    # Summary
    # ============================================================
    println("╔══════════════════════════════════════════════════════════════╗")
    println("║                    Demo Complete! ✅                          ║")
    println("╚══════════════════════════════════════════════════════════════╝")
    println("")
    println("Successfully demonstrated:")
    println("  ✅ FSM lifecycle (spawn, register, lookup)")
    println("  ✅ Normal state transitions (Red→Green→Yellow→Red)")
    println("  ✅ Emergency stop system (immediate safety)")
    println("  ✅ Pedestrian crossing (priority transition)")
    println("  ✅ Maintenance mode (safe servicing)")
    println("  ✅ Error handling & recovery (resilience)")
    println("")
    println("🎉 Enhanced FSM features validated!")
    
    0
end