openc3 5.2.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of openc3 might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aff3df27d8a9cde6fb3e45403131ff0a29fbb5abb2e204e398e33d79c2bb7ead
4
- data.tar.gz: ae3041bbd1868d8f3c5627dd5a6ebc381397deae7d27d997e7dfee009683175c
3
+ metadata.gz: 883789b740b96ae3fac34c78b5a643a2fa1fb087d601a0f87c46d0062eec3dec
4
+ data.tar.gz: 510b9f4c8f98735f033f6dd6d31ebd86ffaeb8df0664d77720e15a3df3df6dcb
5
5
  SHA512:
6
- metadata.gz: 967885d19c2ccf945765d355346ffde2aca982e65993630f4a4c4fe36a7f04c425176f50b9a8e4c639a21a5cc673f87928513047c84fccc3d12a8d59762fe44e
7
- data.tar.gz: 2d11de60af3e15328db350cd278dc4ec79a848bb8bfbcb5f6f1a819f052f93f37397f2f23e1a1ebc1868b002f9568262599e05aa9c33f960f8fef31fe25e221b
6
+ metadata.gz: 999476145415b7f6b160319fee0f67174ad2cdf415ef3a87628177964e37bf690e5c368bf3da9c6a08ca663679999b71b3e7d4c176c2a302724073b7c5c8faca
7
+ data.tar.gz: 206852353795f779b2d8481f68bcf881c465ceaf3c6a48b852a61dab34275b7736249def97edd7932e7fa9286d71f07f210ca340c0363dbce30839504d548640
@@ -78,10 +78,6 @@ PROTOCOL:
78
78
  Protocols can be either READ, WRITE, or READ_WRITE. READ protocols act on the data
79
79
  received by the interface while write acts on the data before it is sent out. READ_WRITE applies
80
80
  the protocol to both reading and writing.<br/><br/>
81
- There is only one built in protocol implemented by override_protocol.rb.
82
- This protocol allows for Scripts to use the override_tlm() and normalize_tlm() methods to permanently
83
- change a telemetry value. Note, this differs from set_tlm() as set_tlm() is over-written by new
84
- incoming telemetry.<br/><br/>
85
81
  For information on creating your own custom protocol please see <a href="https://openc3.com/docs/v5/protocols">https://openc3.com/docs/v5/protocols</a>
86
82
  since: 4.0.0
87
83
  parameters:
@@ -116,3 +112,25 @@ OPTION:
116
112
  required: false
117
113
  description: Parameters to pass to the option
118
114
  values: .*
115
+ SECRET:
116
+ summary: Define a secret needed by this interface
117
+ description: Defines a secret for this interface and optionally assigns its value to an option
118
+ parameters:
119
+ - name: Type
120
+ required: true
121
+ description:
122
+ ENV or FILE. ENV will mount the secret into an environment variable.
123
+ FILE mounts the secret into a file.
124
+ values: .*
125
+ - name: Secret Name
126
+ required: true
127
+ description: The name of the secret to retrieve
128
+ values: .*
129
+ - name: Environment Variable of File Path
130
+ required: true
131
+ description: Environment variable name or file path to store secret
132
+ values: .*
133
+ - name: Option Name
134
+ required: false
135
+ description: Interface option to pass the secret value
136
+ values: .*
@@ -88,3 +88,21 @@ MICROSERVICE:
88
88
  required: false
89
89
  description: Name of the container
90
90
  values: .+
91
+ SECRET:
92
+ summary: Define a secret needed by this microservice
93
+ description: Defines a secret for this microservice
94
+ parameters:
95
+ - name: Type
96
+ required: true
97
+ description:
98
+ ENV or FILE. ENV will mount the secret into an environment variable.
99
+ FILE mounts the secret into a file.
100
+ values: .*
101
+ - name: Secret Name
102
+ required: true
103
+ description: The name of the secret to retrieve
104
+ values: .*
105
+ - name: Environment Variable of File Path
106
+ required: true
107
+ description: Environment variable name or file path to store secret
108
+ values: .*
@@ -36,6 +36,8 @@ module OpenC3
36
36
  'stop_raw_logging_interface',
37
37
  'get_all_interface_info',
38
38
  'map_target_to_interface',
39
+ 'interface_cmd',
40
+ 'interface_protocol_cmd'
39
41
  ])
40
42
 
41
43
  # Get information about an interface
@@ -139,5 +141,15 @@ module OpenC3
139
141
  end
140
142
  nil
141
143
  end
144
+
145
+ def interface_cmd(interface_name, cmd_name, *cmd_params, scope: $openc3_scope, token: $openc3_token)
146
+ authorize(permission: 'system_set', interface_name: interface_name, scope: scope, token: token)
147
+ InterfaceTopic.interface_cmd(interface_name, cmd_name, *cmd_params, scope: scope)
148
+ end
149
+
150
+ def interface_protocol_cmd(interface_name, cmd_name, *cmd_params, read_write: :READ_WRITE, index: -1, scope: $openc3_scope, token: $openc3_token)
151
+ authorize(permission: 'system_set', interface_name: interface_name, scope: scope, token: token)
152
+ InterfaceTopic.protocol_cmd(interface_name, cmd_name, *cmd_params, read_write: read_write, index: index, scope: scope)
153
+ end
142
154
  end
143
155
  end
@@ -35,6 +35,8 @@ module OpenC3
35
35
  'start_raw_logging_router',
36
36
  'stop_raw_logging_router',
37
37
  'get_all_router_info',
38
+ 'router_cmd',
39
+ 'router_protocol_cmd'
38
40
  ])
39
41
 
40
42
  # Get information about a router
@@ -74,7 +76,7 @@ module OpenC3
74
76
 
75
77
  # Starts raw logging for a router
76
78
  #
77
- # @param router_name [String] The name of the interface
79
+ # @param router_name [String] The name of the router
78
80
  def start_raw_logging_router(router_name = 'ALL', scope: $openc3_scope, token: $openc3_token)
79
81
  authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
80
82
  if router_name == 'ALL'
@@ -88,7 +90,7 @@ module OpenC3
88
90
 
89
91
  # Stop raw logging for a router
90
92
  #
91
- # @param router_name [String] The name of the interface
93
+ # @param router_name [String] The name of the router
92
94
  def stop_raw_logging_router(router_name = 'ALL', scope: $openc3_scope, token: $openc3_token)
93
95
  authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
94
96
  if router_name == 'ALL'
@@ -116,5 +118,15 @@ module OpenC3
116
118
  info.sort! { |a, b| a[0] <=> b[0] }
117
119
  info
118
120
  end
121
+
122
+ def router_cmd(router_name, cmd_name, *cmd_params, scope: $openc3_scope, token: $openc3_token)
123
+ authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
124
+ RouterTopic.router_cmd(router_name, cmd_name, *cmd_params, scope: scope)
125
+ end
126
+
127
+ def router_protocol_cmd(router_name, cmd_name, *cmd_params, read_write: :READ_WRITE, index: -1, scope: $openc3_scope, token: $openc3_token)
128
+ authorize(permission: 'system_set', router_name: router_name, scope: scope, token: token)
129
+ RouterTopic.protocol_cmd(router_name, cmd_name, *cmd_params, read_write: read_write, index: index, scope: scope)
130
+ end
119
131
  end
120
132
  end
@@ -28,7 +28,8 @@ module OpenC3
28
28
  WHITELIST.concat([
29
29
  'get_target_list',
30
30
  'get_target',
31
- 'get_all_target_info',
31
+ 'get_target_interfaces',
32
+ 'get_all_target_info', # DEPRECATED
32
33
  ])
33
34
 
34
35
  # Returns the list of all target names
@@ -49,9 +50,29 @@ module OpenC3
49
50
  TargetModel.get(name: target_name, scope: scope)
50
51
  end
51
52
 
52
- # Get information about all targets
53
+ # Get all targets and their interfaces
53
54
  #
54
- # @return [Array<Array<String, Numeric, Numeric>] Array of Arrays \[name, interface, cmd_cnt, tlm_cnt]
55
+ # @return [Array<Array<String, String] Array of Arrays \[name, interfaces]
56
+ def get_target_interfaces(scope: $openc3_scope, token: $openc3_token)
57
+ authorize(permission: 'system', scope: scope, token: token)
58
+ info = []
59
+ interfaces = InterfaceModel.all(scope: scope)
60
+ get_target_list(scope: scope, token: token).each do |target_name|
61
+ interface_names = []
62
+ interfaces.each do |name, interface|
63
+ if interface['target_names'].include? target_name
64
+ interface_names << interface['name']
65
+ end
66
+ end
67
+ info << [target_name, interface_names.join(",")]
68
+ end
69
+ info
70
+ end
71
+
72
+ # DEPRECATED: Get information about all targets
73
+ # Warning this call can take a long time with many defined packets
74
+ #
75
+ # @return [Array<Array<String, String, Numeric, Numeric>] Array of Arrays \[name, interface, cmd_cnt, tlm_cnt]
55
76
  def get_all_target_info(scope: $openc3_scope, token: $openc3_token)
56
77
  authorize(permission: 'system', scope: scope, token: token)
57
78
  info = []
@@ -161,8 +161,8 @@ module OpenC3
161
161
  # @param args The args must either be a string followed by a value or
162
162
  # three strings followed by a value (see the calling style in the
163
163
  # description).
164
- # @param type [Symbol] Telemetry type, :RAW, :CONVERTED (default), :FORMATTED, or :WITH_UNITS
165
- def override_tlm(*args, type: :CONVERTED, scope: $openc3_scope, token: $openc3_token)
164
+ # @param type [Symbol] Telemetry type, :ALL (default), :RAW, :CONVERTED, :FORMATTED, :WITH_UNITS
165
+ def override_tlm(*args, type: :ALL, scope: $openc3_scope, token: $openc3_token)
166
166
  target_name, packet_name, item_name, value = set_tlm_process_args(args, __method__, scope: scope)
167
167
  authorize(permission: 'tlm_set', target_name: target_name, packet_name: packet_name, scope: scope, token: token)
168
168
  CvtModel.override(target_name, packet_name, item_name, value, type: type.intern, scope: scope)
@@ -179,7 +179,7 @@ module OpenC3
179
179
  #
180
180
  # @param args The args must either be a string or three strings
181
181
  # (see the calling style in the description).
182
- # @param type [Symbol] Telemetry type, :RAW, :CONVERTED (default), :FORMATTED, or :WITH_UNITS
182
+ # @param type [Symbol] Telemetry type, :ALL (default), :RAW, :CONVERTED, :FORMATTED, :WITH_UNITS
183
183
  # Also takes :ALL which means to normalize all telemetry types
184
184
  def normalize_tlm(*args, type: :ALL, scope: $openc3_scope, token: $openc3_token)
185
185
  target_name, packet_name, item_name = tlm_process_args(args, __method__, scope: scope)
@@ -22,6 +22,7 @@
22
22
 
23
23
  require 'openc3/api/api'
24
24
  require 'openc3/io/raw_logger_pair'
25
+ require 'openc3/utilities/secrets'
25
26
 
26
27
  module OpenC3
27
28
  # Defines all the attributes and methods common to all interface classes
@@ -112,9 +113,6 @@ module OpenC3
112
113
  # @return [Array<[Protocol Class, Protocol Args, Protocol kind (:READ, :WRITE, :READ_WRITE)>] Info to recreate protocols
113
114
  attr_accessor :protocol_info
114
115
 
115
- # @return [Hash or nil] Hash of overridden telemetry points
116
- attr_accessor :override_tlm
117
-
118
116
  # @return [String] Most recently read raw data
119
117
  attr_accessor :read_raw_data
120
118
 
@@ -134,6 +132,9 @@ module OpenC3
134
132
  # (when used as a BridgeRouter)
135
133
  attr_accessor :interfaces
136
134
 
135
+ # @return [Secrets] Interface secrets manager class
136
+ attr_accessor :secrets
137
+
137
138
  # Initialize default attribute values
138
139
  def initialize
139
140
  @name = self.class.to_s.split("::")[-1] # Remove namespacing if present
@@ -166,13 +167,13 @@ module OpenC3
166
167
  @read_protocols = []
167
168
  @write_protocols = []
168
169
  @protocol_info = []
169
- @override_tlm = nil
170
170
  @read_raw_data = ''
171
171
  @written_raw_data = ''
172
172
  @read_raw_data_time = nil
173
173
  @written_raw_data_time = nil
174
174
  @config_params = []
175
175
  @interfaces = []
176
+ @secrets = Secrets.getClient
176
177
  end
177
178
 
178
179
  # Connects the interface to its target(s). Must be implemented by a
@@ -406,13 +407,13 @@ module OpenC3
406
407
  # num_clients is per interface so don't copy
407
408
  # read_queue_size is the number of packets in the queue so don't copy
408
409
  # write_queue_size is the number of packets in the queue so don't copy
409
- other_interface.options = self.options.clone
410
+ self.options.each do |option_name, option_values|
411
+ other_interface.set_option(option_name, option_values)
412
+ end
410
413
  other_interface.protocol_info = []
411
414
  self.protocol_info.each do |protocol_class, protocol_args, read_write|
412
415
  other_interface.add_protocol(protocol_class, protocol_args, read_write)
413
416
  end
414
- other_interface.override_tlm = nil
415
- other_interface.override_tlm = self.override_tlm.clone if self.override_tlm
416
417
  end
417
418
 
418
419
  # Set an interface or router specific option
@@ -484,28 +485,28 @@ module OpenC3
484
485
  protocol.interface = self
485
486
  end
486
487
 
487
- def _override_tlm(target_name, packet_name, item_name, value)
488
- _override(target_name, packet_name, item_name, value, :CONVERTED)
488
+ def interface_cmd(cmd_name, *cmd_args)
489
+ # Default do nothing - Implemented by subclasses
490
+ return false
489
491
  end
490
492
 
491
- def _override_tlm_raw(target_name, packet_name, item_name, value)
492
- _override(target_name, packet_name, item_name, value, :RAW)
493
- end
494
-
495
- def _normalize_tlm(target_name, packet_name, item_name)
496
- @override_tlm ||= {}
497
- pkt = @override_tlm[target_name]
498
- if pkt
499
- items = @override_tlm[target_name][packet_name]
500
- items.delete(item_name) if items
493
+ def protocol_cmd(cmd_name, *cmd_args, read_write: :READ_WRITE, index: -1)
494
+ read_write = read_write.to_s.upcase.intern
495
+ protocols = nil
496
+ case read_write
497
+ when :READ, :READ_WRITE
498
+ protocols = @read_protocols
499
+ when :WRITE
500
+ protocols = @write_protocols.reverse # Reverse so ordering matches configuration ordering
501
+ else
502
+ raise "Unknown protocol descriptor: #{read_write}. Must be :READ, :WRITE, or :READ_WRITE."
501
503
  end
502
- end
503
-
504
- def _override(target_name, packet_name, item_name, value, type)
505
- @override_tlm ||= {}
506
- @override_tlm[target_name] ||= {}
507
- @override_tlm[target_name][packet_name] ||= {}
508
- @override_tlm[target_name][packet_name][item_name] = [value, type]
504
+ handled = false
505
+ protocols.each_with_index do |protocol, protocol_index|
506
+ result = protocol.protocol_cmd(cmd_name, @cmd_args) if index == protocol_index or index == -1
507
+ handled = true if result
508
+ end
509
+ return handled
509
510
  end
510
511
  end
511
512
  end
@@ -0,0 +1,240 @@
1
+ # encoding: ascii-8bit
2
+
3
+ # Copyright 2022 OpenC3, Inc.
4
+ # All Rights Reserved.
5
+ #
6
+ # This program is free software; you can modify and/or redistribute it
7
+ # under the terms of the GNU Affero General Public License
8
+ # as published by the Free Software Foundation; version 3 with
9
+ # attribution addendums as found in the LICENSE.txt
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # This file may also be used under the terms of a commercial license
17
+ # if purchased from OpenC3, Inc.
18
+
19
+ # You can quickly setup an unauthenticated MQTT server in Docker with
20
+ # docker run -it -p 1883:1883 eclipse-mosquitto:2.0.15 mosquitto -c /mosquitto-no-auth.conf
21
+
22
+ require 'openc3/interfaces/interface'
23
+ require 'openc3/config/config_parser'
24
+ require 'mqtt'
25
+
26
+ # Patches to the Ruby MQTT library so that it will work reliably with COSMOS
27
+ saved_verbose = $VERBOSE
28
+ $VERBOSE = nil
29
+ module MQTT
30
+ class Client
31
+ def get(topic = nil, options = {})
32
+ if block_given?
33
+ get_packet(topic) do |packet|
34
+ yield(packet.topic, packet.payload) unless packet.retain && options[:omit_retained]
35
+ end
36
+ else
37
+ loop do
38
+ # Wait for one packet to be available
39
+ packet = get_packet(topic)
40
+ return nil unless packet # Patch for COSMOS
41
+ return packet.topic, packet.payload unless packet.retain && options[:omit_retained]
42
+ end
43
+ end
44
+ end
45
+
46
+ def get_packet(topic = nil)
47
+ # Subscribe to a topic, if an argument is given
48
+ subscribe(topic) unless topic.nil?
49
+
50
+ if block_given?
51
+ # Loop forever!
52
+ loop do
53
+ packet = @read_queue.pop
54
+ return nil unless packet # Patch for COSMOS
55
+ yield(packet)
56
+ puback_packet(packet) if packet.qos > 0
57
+ end
58
+ else
59
+ # Wait for one packet to be available
60
+ packet = @read_queue.pop
61
+ return nil unless packet # Patch for COSMOS
62
+ puback_packet(packet) if packet.qos > 0
63
+ return packet
64
+ end
65
+ end
66
+
67
+ def disconnect(send_msg = true)
68
+ # Stop reading packets from the socket first
69
+ @read_thread.kill if @read_thread && @read_thread.alive?
70
+ @read_thread = nil
71
+
72
+ @read_queue << nil # Patch for COSMOS
73
+
74
+ # Close the socket if it is open
75
+ if connected?
76
+ if send_msg
77
+ packet = MQTT::Packet::Disconnect.new
78
+ send_packet(packet)
79
+ end
80
+ @socket.close unless @socket.nil?
81
+ @socket = nil
82
+ end
83
+ end
84
+
85
+ end
86
+ end
87
+ $VERBOSE = saved_verbose
88
+
89
+ module OpenC3
90
+ # Base class for interfaces that send and receive messages over MQTT
91
+ class MqttInterface < Interface
92
+ # @param hostname [String] MQTT server to connect to
93
+ # @param port [Integer] MQTT port
94
+ # @param ssl [Boolean] Use SSL true/false
95
+ def initialize(hostname, port = 1883, ssl = false)
96
+ super()
97
+ @hostname = hostname
98
+ @port = Integer(port)
99
+ @ssl = ConfigParser.handle_true_false(ssl)
100
+ @username = nil
101
+ @password = nil
102
+ @cert = nil
103
+ @key = nil
104
+ @ca_file = nil
105
+
106
+ @write_topics = []
107
+ @read_topics = []
108
+
109
+ # Build list of packets by topic
110
+ @read_packets_by_topic = {}
111
+ System.telemetry.all.each do |target_name, target_packets|
112
+ target_packets.each do |packet_name, packet|
113
+ topics = packet.meta['TOPIC']
114
+ topics = packet.meta['TOPICS'] unless topics
115
+ if topics
116
+ topics.each do |topic|
117
+ @read_packets_by_topic[topic] = packet
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ # Connects the interface to its target(s)
125
+ def connect
126
+ @write_topics = []
127
+ @read_topics = []
128
+ @client = MQTT::Client.new
129
+ @client.host = @hostname
130
+ @client.port = @port
131
+ @client.ssl = @ssl
132
+ @client.username = @username if @username
133
+ @client.password = @password if @password
134
+ @client.cert = @cert if @cert
135
+ @client.key = @key if @key
136
+ @client.ca_file = @ca_file.path if @ca_file
137
+ @client.connect
138
+ @read_packets_by_topic.each do |topic, _|
139
+ Logger.info "#{@name}: Subscribing to #{topic}"
140
+ @client.subscribe(topic)
141
+ end
142
+ super()
143
+ end
144
+
145
+ # @return [Boolean] Whether the active ports (read and/or write) have
146
+ # created sockets. Since UDP is connectionless, creation of the sockets
147
+ # is used to determine connection.
148
+ def connected?
149
+ if @client
150
+ return @client.connected?
151
+ else
152
+ return false
153
+ end
154
+ end
155
+
156
+ # Disconnects the interface from its target(s)
157
+ def disconnect
158
+ @client.disconnect
159
+ @client = nil
160
+ super()
161
+ end
162
+
163
+ def read
164
+ topic = @read_topics.shift
165
+ packet = super()
166
+ return nil unless packet
167
+ identified_packet = @read_packets_by_topic[topic]
168
+ if identified_packet
169
+ identified_packet = identified_packet.dup
170
+ identified_packet.buffer = packet.buffer
171
+ packet = identified_packet
172
+ end
173
+ packet.received_time = nil
174
+ return packet
175
+ end
176
+
177
+ def write(packet)
178
+ topics = packet.meta['TOPIC']
179
+ topics = packet.meta['TOPICS'] unless topics
180
+ if topics
181
+ topics.each do |topic|
182
+ @write_topics << topic
183
+ super(packet)
184
+ end
185
+ else
186
+ raise "Command packet #{packet.target_name} #{packet.packet_name} requires a META TOPIC or TOPICS"
187
+ end
188
+ end
189
+
190
+ # Reads from the socket if the read_port is defined
191
+ def read_interface
192
+ topic, data = @client.get
193
+ if data.nil? or data.length <= 0
194
+ Logger.info "#{@name}: read returned nil" if data.nil?
195
+ Logger.info "#{@name}: read returned 0 bytes" if not data.nil? and data.length <= 0
196
+ return nil
197
+ end
198
+ @read_topics << topic
199
+ read_interface_base(data)
200
+ return data
201
+ rescue IOError # Disconnected
202
+ return nil
203
+ end
204
+
205
+ # Writes to the socket
206
+ # @param data [String] Raw packet data
207
+ def write_interface(data)
208
+ write_interface_base(data)
209
+ topic = @write_topics.shift
210
+ @client.publish(topic, data)
211
+ data
212
+ end
213
+
214
+ # Supported Options
215
+ # USERNAME - Username for Mqtt Server
216
+ # PASSWORD - Password for Mqtt Server
217
+ # CERT - Public Key for Client Cert Auth
218
+ # KEY - Private Key for Client Cert Auth
219
+ # CA_FILE - Certificate Authority for Client Cert Auth
220
+ # (see Interface#set_option)
221
+ def set_option(option_name, option_values)
222
+ super(option_name, option_values)
223
+ case option_name.upcase
224
+ when 'USERNAME'
225
+ @username = option_values[0]
226
+ when 'PASSWORD'
227
+ @password = option_values[0]
228
+ when 'CERT'
229
+ @cert = option_values[0]
230
+ when 'KEY'
231
+ @key = option_values[0]
232
+ when 'CA_FILE'
233
+ # CA_FILE must be given as a file
234
+ @ca_file = Tempfile.new('ca_file')
235
+ @ca_file.write(option_values[0])
236
+ @ca_file.close
237
+ end
238
+ end
239
+ end
240
+ end
@@ -1,63 +1,4 @@
1
1
  # encoding: ascii-8bit
2
2
 
3
- # Copyright 2022 Ball Aerospace & Technologies Corp.
4
- # All Rights Reserved.
5
- #
6
- # This program is free software; you can modify and/or redistribute it
7
- # under the terms of the GNU Affero General Public License
8
- # as published by the Free Software Foundation; version 3 with
9
- # attribution addendums as found in the LICENSE.txt
10
- #
11
- # This program is distributed in the hope that it will be useful,
12
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- # GNU Affero General Public License for more details.
15
-
16
- # Modified by OpenC3, Inc.
17
- # All changes Copyright 2022, OpenC3, Inc.
18
- # All Rights Reserved
19
- #
20
- # This file may also be used under the terms of a commercial license
21
- # if purchased from OpenC3, Inc.
22
-
23
- require 'openc3/interfaces/protocols/protocol'
24
-
25
- module OpenC3
26
- # Protocol which permanently overrides an item value such that reading the
27
- # item returns the overriden value. Methods are prefixed with underscores
28
- # so the API can include the original name which calls out to these
29
- # methods. Clearing the override requires calling normalize_tlm.
30
- class OverrideProtocol < Protocol
31
- # @param allow_empty_data [true/false/nil] See Protocol#initialize
32
- def initialize(allow_empty_data = nil)
33
- super(allow_empty_data)
34
- end
35
-
36
- # Called to perform modifications on a read packet before it is given to the user
37
- #
38
- # @param packet [Packet] Original packet
39
- # @return [Packet] Potentially modified packet
40
- def read_packet(packet)
41
- if @interface.override_tlm && !@interface.override_tlm.empty?
42
- # Need to make sure packet is identified and defined
43
- target_names = nil
44
- target_names = @interface.tlm_target_names if @interface
45
- identified_packet = System.telemetry.identify_and_define_packet(packet, target_names)
46
- if identified_packet
47
- packet = identified_packet
48
- packets = @interface.override_tlm[packet.target_name]
49
- if packets
50
- items = packets[packet.packet_name]
51
- if items
52
- items.each do |item_name, value|
53
- # This should be safe because we check at the API level it exists
54
- packet.write(item_name, value[0], value[1])
55
- end
56
- end
57
- end
58
- end
59
- end
60
- return packet
61
- end
62
- end
63
- end
3
+ # This class is deprecated and this file exists only to satisfy existing code requiring it
4
+ # TODO: Remove this in a future release
@@ -17,7 +17,7 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/config/config_parser'
@@ -81,5 +81,10 @@ module OpenC3
81
81
  def post_write_interface(packet, data)
82
82
  return packet, data
83
83
  end
84
+
85
+ def protocol_cmd(cmd_name, *cmd_args)
86
+ # Default do nothing - Implemented by subclasses
87
+ return false
88
+ end
84
89
  end
85
90
  end
@@ -17,11 +17,10 @@
17
17
  # All changes Copyright 2022, OpenC3, Inc.
18
18
  # All Rights Reserved
19
19
  #
20
- # This file may also be used under the terms of a commercial license
20
+ # This file may also be used under the terms of a commercial license
21
21
  # if purchased from OpenC3, Inc.
22
22
 
23
23
  require 'openc3/interfaces/interface'
24
- require 'openc3/interfaces/protocols/override_protocol'
25
24
 
26
25
  module OpenC3
27
26
  # An interface class that provides simulated telemetry and command responses
@@ -38,7 +37,6 @@ module OpenC3
38
37
  @sim_target = nil
39
38
  @write_raw_allowed = false
40
39
  @raw_logger_pair = nil
41
- add_protocol(OverrideProtocol, [], :READ)
42
40
  end
43
41
 
44
42
  # Initialize the simulated target object and "connect" to the target