Class: OpenC3::InterfaceTopic
- Defined in:
- lib/openc3/topics/interface_topic.rb
Constant Summary collapse
- COMMAND_ACK_TIMEOUT_S =
30
Class Method Summary collapse
- .connect_interface(interface_name, *interface_params, scope:) ⇒ Object
- .disconnect_interface(interface_name, scope:) ⇒ Object
- .inject_tlm(interface_name, target_name, packet_name, item_hash = nil, type: :CONVERTED, scope:) ⇒ Object
- .interface_cmd(interface_name, cmd_name, *cmd_params, scope:) ⇒ Object
- .protocol_cmd(interface_name, cmd_name, *cmd_params, read_write: :READ_WRITE, index: -1,, scope:) ⇒ Object
- .receive_commands(interface, scope:) ⇒ Object
- .shutdown(interface, scope:) ⇒ Object
- .start_raw_logging(interface_name, scope:) ⇒ Object
- .stop_raw_logging(interface_name, scope:) ⇒ Object
-
.topics(interface, scope:) ⇒ Object
Generate a list of topics for this interface.
- .write_raw(interface_name, data, timeout: nil, scope:) ⇒ Object
Methods inherited from Topic
clear_topics, get_cnt, method_missing
Class Method Details
.connect_interface(interface_name, *interface_params, scope:) ⇒ Object
76 77 78 79 80 81 82 |
# File 'lib/openc3/topics/interface_topic.rb', line 76 def self.connect_interface(interface_name, *interface_params, scope:) if interface_params && !interface_params.empty? Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'connect' => 'true', 'params' => JSON.generate(interface_params) }, '*', 100) else Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'connect' => 'true' }, '*', 100) end end |
.disconnect_interface(interface_name, scope:) ⇒ Object
84 85 86 |
# File 'lib/openc3/topics/interface_topic.rb', line 84 def self.disconnect_interface(interface_name, scope:) Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'disconnect' => 'true' }, '*', 100) end |
.inject_tlm(interface_name, target_name, packet_name, item_hash = nil, type: :CONVERTED, scope:) ⇒ Object
116 117 118 119 120 121 122 123 |
# File 'lib/openc3/topics/interface_topic.rb', line 116 def self.inject_tlm(interface_name, target_name, packet_name, item_hash = nil, type: :CONVERTED, scope:) data = {} data['target_name'] = target_name.to_s.upcase data['packet_name'] = packet_name.to_s.upcase data['item_hash'] = item_hash data['type'] = type Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'inject_tlm' => JSON.generate(data, allow_nan: true) }, '*', 100) end |
.interface_cmd(interface_name, cmd_name, *cmd_params, scope:) ⇒ Object
100 101 102 103 104 105 |
# File 'lib/openc3/topics/interface_topic.rb', line 100 def self.interface_cmd(interface_name, cmd_name, *cmd_params, scope:) data = {} data['cmd_name'] = cmd_name data['cmd_params'] = cmd_params Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'interface_cmd' => JSON.generate(data, allow_nan: true) }, '*', 100) end |
.protocol_cmd(interface_name, cmd_name, *cmd_params, read_write: :READ_WRITE, index: -1,, scope:) ⇒ Object
107 108 109 110 111 112 113 114 |
# File 'lib/openc3/topics/interface_topic.rb', line 107 def self.protocol_cmd(interface_name, cmd_name, *cmd_params, read_write: :READ_WRITE, index: -1, scope:) data = {} data['cmd_name'] = cmd_name data['cmd_params'] = cmd_params data['read_write'] = read_write.to_s.upcase data['index'] = index Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'protocol_cmd' => JSON.generate(data, allow_nan: true) }, '*', 100) end |
.receive_commands(interface, scope:) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/openc3/topics/interface_topic.rb', line 41 def self.receive_commands(interface, scope:) while true Topic.read_topics(InterfaceTopic.topics(interface, scope: scope)) do |topic, msg_id, msg_hash, redis| result = yield topic, msg_id, msg_hash, redis ack_topic = topic.split("__") ack_topic[1] = 'ACK' + ack_topic[1] ack_topic = ack_topic.join("__") Topic.write_topic(ack_topic, { 'result' => result, 'id' => msg_id }, '*', 100) end end end |
.shutdown(interface, scope:) ⇒ Object
96 97 98 |
# File 'lib/openc3/topics/interface_topic.rb', line 96 def self.shutdown(interface, scope:) Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface.name}", { 'shutdown' => 'true' }, '*', 100) end |
.start_raw_logging(interface_name, scope:) ⇒ Object
88 89 90 |
# File 'lib/openc3/topics/interface_topic.rb', line 88 def self.start_raw_logging(interface_name, scope:) Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'log_stream' => 'true' }, '*', 100) end |
.stop_raw_logging(interface_name, scope:) ⇒ Object
92 93 94 |
# File 'lib/openc3/topics/interface_topic.rb', line 92 def self.stop_raw_logging(interface_name, scope:) Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'log_stream' => 'false' }, '*', 100) end |
.topics(interface, scope:) ⇒ Object
Generate a list of topics for this interface. This includes the interface itself and all the targets which are assigned to this interface.
31 32 33 34 35 36 37 38 39 |
# File 'lib/openc3/topics/interface_topic.rb', line 31 def self.topics(interface, scope:) topics = [] topics << "{#{scope}__CMD}INTERFACE__#{interface.name}" interface.cmd_target_names.each do |target_name| topics << "{#{scope}__CMD}TARGET__#{target_name}" end topics << "OPENC3__SYSTEM__EVENTS" # Add System Events topics end |
.write_raw(interface_name, data, timeout: nil, scope:) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/openc3/topics/interface_topic.rb', line 53 def self.write_raw(interface_name, data, timeout: nil, scope:) interface_name = interface_name.upcase timeout = COMMAND_ACK_TIMEOUT_S unless timeout ack_topic = "{#{scope}__ACKCMD}INTERFACE__#{interface_name}" Topic.update_topic_offsets([ack_topic]) cmd_id = Topic.write_topic("{#{scope}__CMD}INTERFACE__#{interface_name}", { 'raw' => data }, '*', 100) time = Time.now while (Time.now - time) < timeout Topic.read_topics([ack_topic]) do |_topic, _msg_id, msg_hash, _redis| if msg_hash["id"] == cmd_id if msg_hash["result"] == "SUCCESS" return else raise msg_hash["result"] end end end end raise "Timeout of #{timeout}s waiting for cmd ack" end |