Class: RSMP::TLC::TrafficController
- Inherits:
-
Component
- Object
- ComponentBase
- Component
- RSMP::TLC::TrafficController
- Includes:
- Modules::DetectorLogics, Modules::Display, Modules::Helpers, Modules::Inputs, Modules::Modes, Modules::Outputs, Modules::Plans, Modules::SignalGroups, Modules::StartupSequence, Modules::System, Modules::TrafficData
- Defined in:
- lib/rsmp/tlc/traffic_controller.rb
Overview
TrafficController is the main component of a TrafficControllerSite. It handles all command and status for the main component, and keeps track of signal plans, detector logics, inputs, etc. which do not have dedicated components.
Constant Summary
Constants inherited from ComponentBase
ComponentBase::AGGREGATED_STATUS_KEYS
Instance Attribute Summary collapse
-
#cycle_counter ⇒ Object
readonly
Returns the value of attribute cycle_counter.
-
#cycle_time ⇒ Object
readonly
Returns the value of attribute cycle_time.
-
#functional_position ⇒ Object
readonly
Returns the value of attribute functional_position.
-
#plan ⇒ Object
readonly
Returns the value of attribute plan.
-
#pos ⇒ Object
readonly
Returns the value of attribute pos.
-
#startup_sequence ⇒ Object
readonly
Returns the value of attribute startup_sequence.
Attributes inherited from ComponentBase
#aggregated_status, #aggregated_status_bools, #alarms, #c_id, #grouped, #node, #ntsoid, #statuses, #xnid
Instance Method Summary collapse
- #get_status(code, name = nil, options = {}) ⇒ Object
- #handle_command(command_code, arg, options = {}) ⇒ Object
-
#initialize(node:, id:, ntsoid: nil, xnid: nil, **options) ⇒ TrafficController
constructor
A new instance of TrafficController.
- #move_cycle_counter ⇒ Object
- #reset ⇒ Object
-
#status_updates_sent ⇒ Object
this method is called by the supervisor proxy each time status updates have been send we can then prune our priority request list.
- #timer(_now) ⇒ Object
Methods included from Modules::Helpers
#bool_string_to_digit, #bool_to_digit, #find_plan, #string_to_bool
Methods included from Modules::Display
#format_signal_group_status, #output_states
Methods included from Modules::StartupSequence
#end_startup_sequence, #initiate_startup_sequence, #startup_state
Methods included from Modules::TrafficData
#handle_s0205, #handle_s0206, #handle_s0207, #handle_s0208
Methods included from Modules::DetectorLogics
#add_detector_logic, #handle_m0021, #handle_s0002, #handle_s0016, #handle_s0021, #handle_s0031
Methods included from Modules::Outputs
#handle_m0020, #handle_s0004, #handle_s0030
Methods included from Modules::Inputs
#apply_input_changes, #extract_input_bits, #handle_m0006, #handle_m0012, #handle_m0013, #handle_m0019, #handle_s0003, #handle_s0029, #input_logic, #parse_input_status, #set_input, #setup_inputs, #validate_input_ranges
Methods included from Modules::SignalGroups
#add_signal_group, #handle_m0022, #priority_list, #prune_priorities, #signal_priority_changed
Methods included from Modules::Plans
#current_plan, #find_plan, #handle_m0002, #handle_m0003, #handle_m0014, #handle_m0015, #handle_m0016, #handle_m0017, #handle_m0018, #handle_m0023, #handle_s0014, #handle_s0015, #handle_s0018, #handle_s0019, #handle_s0022, #handle_s0023, #handle_s0024, #handle_s0026, #handle_s0027, #handle_s0028, #switch_plan, #switch_traffic_situation
Methods included from Modules::Modes
#check_functional_position_timeout, #dark?, #handle_m0001, #handle_m0005, #handle_m0007, #handle_s0006, #handle_s0007, #handle_s0008, #handle_s0009, #handle_s0010, #handle_s0011, #handle_s0012, #handle_s0013, #handle_s0020, #handle_s0032, #handle_s0035, #normal_control?, #reset_modes, #set_fixed_time_control, #switch_functional_position, #yellow_flash?
Methods included from Modules::System
#clock, #datetime_components, #handle_m0004, #handle_m0103, #handle_m0104, #handle_s0005, #handle_s0091, #handle_s0092, #handle_s0095, #handle_s0096
Methods inherited from Component
#acknowledge_alarm, #activate_alarm, #deactivate_alarm, #resume_alarm, #suspend_alarm
Methods inherited from ComponentBase
#aggregated_status_changed, #clear_aggregated_status, #clear_alarm_timestamps, #get_alarm_state, #log, #now, #set_aggregated_status
Methods included from Inspect
Constructor Details
#initialize(node:, id:, ntsoid: nil, xnid: nil, **options) ⇒ TrafficController
Returns a new instance of TrafficController.
23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 23 def initialize(node:, id:, ntsoid: nil, xnid: nil, **) super(node: node, id: id, ntsoid: ntsoid, xnid: xnid, grouped: true) @signal_groups = [] @detector_logics = [] @plans = [:signal_plans] @num_traffic_situations = 1 setup_inputs([:inputs]) @startup_sequence = StartupSequence.new([:startup_sequence]) @live_output = [:live_output] reset end |
Instance Attribute Details
#cycle_counter ⇒ Object (readonly)
Returns the value of attribute cycle_counter.
20 21 22 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 20 def cycle_counter @cycle_counter end |
#cycle_time ⇒ Object (readonly)
Returns the value of attribute cycle_time.
20 21 22 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 20 def cycle_time @cycle_time end |
#functional_position ⇒ Object (readonly)
Returns the value of attribute functional_position.
20 21 22 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 20 def functional_position @functional_position end |
#plan ⇒ Object (readonly)
Returns the value of attribute plan.
20 21 22 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 20 def plan @plan end |
#pos ⇒ Object (readonly)
Returns the value of attribute pos.
20 21 22 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 20 def pos @pos end |
#startup_sequence ⇒ Object (readonly)
Returns the value of attribute startup_sequence.
20 21 22 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 20 def startup_sequence @startup_sequence end |
Instance Method Details
#get_status(code, name = nil, options = {}) ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 97 def get_status(code, name = nil, = {}) case code when 'S0001', 'S0002', 'S0003', 'S0004', 'S0005', 'S0006', 'S0007', 'S0008', 'S0009', 'S0010', 'S0011', 'S0012', 'S0013', 'S0014', 'S0015', 'S0016', 'S0017', 'S0018', 'S0019', 'S0020', 'S0021', 'S0022', 'S0023', 'S0024', 'S0026', 'S0027', 'S0028', 'S0029', 'S0030', 'S0031', 'S0032', 'S0033', 'S0035', 'S0091', 'S0092', 'S0095', 'S0096', 'S0097', 'S0098', 'S0205', 'S0206', 'S0207', 'S0208' send("handle_#{code.downcase}", code, name, ) else raise InvalidMessage, "unknown status code #{code}" end end |
#handle_command(command_code, arg, options = {}) ⇒ Object
84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 84 def handle_command(command_code, arg, = {}) case command_code when 'M0001', 'M0002', 'M0003', 'M0004', 'M0005', 'M0006', 'M0007', 'M0012', 'M0013', 'M0014', 'M0015', 'M0016', 'M0017', 'M0018', 'M0019', 'M0020', 'M0021', 'M0022', 'M0023', 'M0103', 'M0104' send("handle_#{command_code.downcase}", arg, ) else raise UnknownCommand, "Unknown command #{command_code}" end end |
#move_cycle_counter ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 72 def move_cycle_counter plan = current_plan counter = if plan Time.now.to_i % plan.cycle_time else 0 end changed = counter != @cycle_counter @cycle_counter = counter changed end |
#reset ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 35 def reset reset_modes @cycle_counter = 0 @plan = 1 @plan_source = 'startup' @intersection = 0 @intersection_source = 'startup' @emergency_routes = Set.new @last_emergency_route = nil @traffic_situation = 0 @traffic_situation_source = 'startup' @day_time_table = {} @time_int = nil @inputs.reset @signal_priorities = [] @dynamic_bands_timeout = 0 end |
#status_updates_sent ⇒ Object
this method is called by the supervisor proxy each time status updates have been send we can then prune our priority request list
68 69 70 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 68 def status_updates_sent prune_priorities end |
#timer(_now) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/rsmp/tlc/traffic_controller.rb', line 53 def timer(_now) # TODO: use monotone timer, to avoid jumps in case the user sets the system time return unless move_cycle_counter check_functional_position_timeout @startup_sequence.advance if @startup_sequence.active? @signal_groups.each(&:timer) @signal_priorities.each(&:timer) output_states end |