Class: OpenC3::UdpInterface
- Defined in:
- lib/openc3/interfaces/udp_interface.rb
Overview
Base class for interfaces that send and receive messages over UDP
Constant Summary
Constants included from Api
Api::DELAY_METRICS, Api::DURATION_METRICS, Api::SUBSCRIPTION_DELIMITER, Api::SUM_METRICS
Constants included from ApiShared
ApiShared::DEFAULT_TLM_POLLING_RATE
Constants included from Extract
Extract::SCANNING_REGULAR_EXPRESSION
Instance Attribute Summary
Attributes inherited from Interface
#auto_reconnect, #bytes_read, #bytes_written, #cmd_routers, #cmd_target_names, #config_params, #connect_on_startup, #disable_disconnect, #interfaces, #name, #num_clients, #options, #packet_log_writer_pairs, #protocol_info, #read_count, #read_protocols, #read_queue_size, #read_raw_data, #read_raw_data_time, #reconnect_delay, #routers, #scheduler, #secrets, #state, #stored_packet_log_writer_pairs, #stream_log_pair, #target_names, #tlm_target_names, #write_count, #write_protocols, #write_queue_size, #written_raw_data, #written_raw_data_time
Instance Method Summary collapse
-
#connect ⇒ Object
Creates a new UdpWriteSocket if the the write_dest_port was given in the constructor and a new UdpReadSocket if the read_port was given in the constructor.
-
#connected? ⇒ Boolean
Whether the active ports (read and/or write) have created sockets.
- #connection_string ⇒ Object
-
#disconnect ⇒ Object
Close the active ports (read and/or write) and set the sockets to nil.
-
#initialize(hostname, write_dest_port, read_port, write_src_port = nil, interface_address = nil, ttl = 128, write_timeout = 10.0, read_timeout = nil, bind_address = '0.0.0.0') ⇒ UdpInterface
constructor
A new instance of UdpInterface.
- #read ⇒ Object
-
#read_interface ⇒ Object
Reads from the socket if the read_port is defined.
-
#write_interface(data, extra = nil) ⇒ Object
Writes to the socket.
Methods inherited from Interface
#_write, #add_protocol, #as_json, #convert_data_to_packet, #convert_packet_to_data, #copy_to, #interface_cmd, #protocol_cmd, #read_allowed?, #read_interface_base, #set_option, #start_raw_logging, #stop_raw_logging, #write, #write_allowed?, #write_interface_base, #write_raw, #write_raw_allowed?
Methods included from Api
#_build_cmd_output_string, #_cmd_implementation, #_extract_target_command_names, #_extract_target_command_parameter_names, #_extract_target_packet_item_names, #_extract_target_packet_names, #_get_and_set_cmd, #_get_item, #_limits_group, #_set_tlm_process_args, #_tlm_process_args, #_validate_tlm_type, #build_cmd, #cmd, #cmd_no_checks, #cmd_no_hazardous_check, #cmd_no_range_check, #cmd_raw, #cmd_raw_no_checks, #cmd_raw_no_hazardous_check, #cmd_raw_no_range_check, #config_tool_names, #connect_interface, #connect_router, #delete_config, #disable_cmd, #disable_limits, #disable_limits_group, #disconnect_interface, #disconnect_router, #enable_cmd, #enable_limits, #enable_limits_group, #get_all_cmd_names, #get_all_cmds, #get_all_interface_info, #get_all_router_info, #get_all_settings, #get_all_target_info, #get_all_tlm, #get_all_tlm_names, #get_cmd, #get_cmd_buffer, #get_cmd_cnt, #get_cmd_cnts, #get_cmd_hazardous, #get_cmd_time, #get_cmd_value, #get_interface, #get_interface_names, #get_item, #get_limits, #get_limits_events, #get_limits_groups, #get_limits_set, #get_limits_sets, #get_metrics, #get_out_of_limits, #get_overall_limits_state, #get_overrides, #get_packet_derived_items, #get_packets, #get_param, #get_router, #get_router_names, #get_setting, #get_settings, #get_target, #get_target_interfaces, #get_target_names, #get_tlm, #get_tlm_buffer, #get_tlm_cnt, #get_tlm_cnts, #get_tlm_packet, #get_tlm_values, #inject_tlm, #interface_cmd, #interface_protocol_cmd, #limits_enabled?, #list_configs, #list_settings, #load_config, #map_target_to_interface, #normalize_tlm, #offline_access_needed, #override_tlm, #router_cmd, #router_protocol_cmd, #save_config, #send_raw, #set_limits, #set_limits_set, #set_offline_access, #set_setting, #set_tlm, #start_raw_logging_interface, #start_raw_logging_router, #stash_all, #stash_delete, #stash_get, #stash_keys, #stash_set, #stop_raw_logging_interface, #stop_raw_logging_router, #subscribe_packets, #tlm, #tlm_formatted, #tlm_raw, #tlm_variable, #tlm_with_units
Constructor Details
#initialize(hostname, write_dest_port, read_port, write_src_port = nil, interface_address = nil, ttl = 128, write_timeout = 10.0, read_timeout = nil, bind_address = '0.0.0.0') ⇒ UdpInterface
Returns a new instance of UdpInterface.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 43 def initialize( hostname, write_dest_port, read_port, write_src_port = nil, interface_address = nil, ttl = 128, # default for Windows write_timeout = 10.0, read_timeout = nil, bind_address = '0.0.0.0' ) super() @hostname = ConfigParser.handle_nil(hostname) if @hostname @hostname = @hostname.to_s @hostname = '127.0.0.1' if @hostname.casecmp('LOCALHOST').zero? end @write_dest_port = ConfigParser.handle_nil(write_dest_port) @write_dest_port = write_dest_port.to_i if @write_dest_port @read_port = ConfigParser.handle_nil(read_port) @read_port = read_port.to_i if @read_port @write_src_port = ConfigParser.handle_nil(write_src_port) @write_src_port = @write_src_port.to_i if @write_src_port @interface_address = ConfigParser.handle_nil(interface_address) if @interface_address && @interface_address.casecmp('LOCALHOST').zero? @interface_address = '127.0.0.1' end @ttl = ttl.to_i @ttl = 1 if @ttl < 1 @write_timeout = ConfigParser.handle_nil(write_timeout) if @write_timeout @write_timeout = @write_timeout.to_f else Logger.instance.warn("Warning: To avoid interface lock, write_timeout can not be nil. Setting to 10 seconds.") @write_timeout = 10.0 end @read_timeout = ConfigParser.handle_nil(read_timeout) @read_timeout = @read_timeout.to_f if @read_timeout @bind_address = ConfigParser.handle_nil(bind_address) if @bind_address && @bind_address.casecmp('LOCALHOST').zero? @bind_address = '127.0.0.1' end @write_socket = nil @read_socket = nil @read_allowed = false unless @read_port @write_allowed = false unless @write_dest_port @write_raw_allowed = false unless @write_dest_port end |
Instance Method Details
#connect ⇒ Object
Creates a new OpenC3::UdpWriteSocket if the the write_dest_port was given in the constructor and a new OpenC3::UdpReadSocket if the read_port was given in the constructor.
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 106 def connect if @read_port and @write_dest_port and @write_src_port and (@read_port == @write_src_port) @read_socket = UdpReadWriteSocket.new( @read_port, @bind_address, @write_dest_port, @hostname, @interface_address, @ttl ) @write_socket = @read_socket else @read_socket = UdpReadSocket.new( @read_port, @hostname, @interface_address, @bind_address ) if @read_port @write_socket = UdpWriteSocket.new( @hostname, @write_dest_port, @write_src_port, @interface_address, @ttl, @bind_address ) if @write_dest_port end @thread_sleeper = nil super() end |
#connected? ⇒ Boolean
Returns Whether the active ports (read and/or write) have created sockets. Since UDP is connectionless, creation of the sockets is used to determine connection.
140 141 142 143 144 145 146 147 148 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 140 def connected? if @write_dest_port && @read_port (@write_socket && @read_socket) ? true : false elsif @write_dest_port @write_socket ? true : false else @read_socket ? true : false end end |
#connection_string ⇒ Object
93 94 95 96 97 98 99 100 101 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 93 def connection_string result = '' result += " #{@hostname}:#{@write_dest_port} (write dest port)" if @write_dest_port result += " #{@write_src_port} (write src port)" if @write_src_port result += " #{@hostname}:#{@read_port} (read)" if @read_port result += " #{@interface_address} (interface addr)" if @interface_address result += " #{@bind_address} (bind addr)" if @bind_address != '0.0.0.0' return result.strip end |
#disconnect ⇒ Object
Close the active ports (read and/or write) and set the sockets to nil.
151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 151 def disconnect if @write_socket != @read_socket OpenC3.close_socket(@write_socket) end OpenC3.close_socket(@read_socket) @write_socket = nil @read_socket = nil @thread_sleeper.cancel if @thread_sleeper @thread_sleeper = nil super() end |
#read ⇒ Object
163 164 165 166 167 168 169 170 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 163 def read return super() if @read_port # Write only interface so stop the thread which calls read @thread_sleeper = Sleeper.new @thread_sleeper.sleep(1_000_000_000) while connected? return nil end |
#read_interface ⇒ Object
Reads from the socket if the read_port is defined
173 174 175 176 177 178 179 180 181 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 173 def read_interface data = @read_socket.read(@read_timeout) Logger.info "#{@name}: Udp read returned 0 bytes (stream closed)" if data.length <= 0 extra = nil read_interface_base(data, extra) return data, extra rescue IOError # Disconnected return nil end |
#write_interface(data, extra = nil) ⇒ Object
Writes to the socket
185 186 187 188 189 |
# File 'lib/openc3/interfaces/udp_interface.rb', line 185 def write_interface(data, extra = nil) write_interface_base(data, extra) @write_socket.write(data, @write_timeout) return data, extra end |