Class: OpenC3::InterfaceTopic

Inherits:
Topic show all
Defined in:
lib/openc3/topics/interface_topic.rb

Constant Summary collapse

COMMAND_ACK_TIMEOUT_S =
30

Class Method Summary collapse

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