Skip to content

Commit

Permalink
Merge pull request #968 from BallAerospace/fix_template_protocol_targ…
Browse files Browse the repository at this point in the history
…et_name

closes #956, use target name from command for response
  • Loading branch information
ryanmelt committed Apr 2, 2019
2 parents 3bc9163 + 217480f commit ba87b40
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 26 deletions.
7 changes: 6 additions & 1 deletion lib/cosmos/interfaces/protocols/template_protocol.rb
Expand Up @@ -62,6 +62,7 @@ def initialize(
allow_empty_data)
@response_template = nil
@response_packet = nil
@response_target_name = nil
@response_packets = []
@write_block_queue = Queue.new
@ignore_lines = ignore_lines.to_i
Expand Down Expand Up @@ -124,7 +125,7 @@ def read_packet(packet)
end

# Grab the response packet specified in the command
result_packet = System.telemetry.packet(@interface.target_names[0], @response_packet).clone
result_packet = System.telemetry.packet(@response_target_name, @response_packet).clone
result_packet.received_time = nil
result_packet.id_items.each do |item|
result_packet.write_item(item, item.id_value, :RAW)
Expand Down Expand Up @@ -181,17 +182,20 @@ def write_packet(packet)
begin
@response_template = packet.read("RSP_TEMPLATE").strip
@response_packet = packet.read("RSP_PACKET").strip
@response_target_name = packet.target_name
# If the template or packet are empty set them to nil. This allows for
# the user to remove the RSP_TEMPLATE and RSP_PACKET values and avoid
# any response timeouts
if @response_template.empty? || @response_packet.empty?
@response_template = nil
@response_packet = nil
@response_target_name = nil
end
rescue
# If there is no response template we set to nil
@response_template = nil
@response_packet = nil
@response_target_name = nil
end

# Grab the command template because that is all we eventually send
Expand Down Expand Up @@ -235,6 +239,7 @@ def post_write_interface(packet, data)

@response_template = nil
@response_packet = nil
@response_target_name = nil
@response_packets.clear
end
return super(packet, data)
Expand Down
103 changes: 78 additions & 25 deletions spec/interfaces/protocols/template_protocol_spec.rb
Expand Up @@ -28,6 +28,7 @@ def read; $read_buffer; end
before(:each) do
@interface = StreamInterface.new
allow(@interface).to receive(:connected?) { true }
$write_buffer = ''
$read_buffer = ''
$read_cnt = 0
end
Expand Down Expand Up @@ -173,12 +174,20 @@ def read; $read_buffer; end
end

it "processes responses with no ID fields" do
rsp_pkt = Packet.new('TGT', 'READ_VOLTAGE')
rsp_pkt.append_item("VOLTAGE", 16, :UINT)
allow(System).to receive_message_chain(:telemetry, :packet).and_return(rsp_pkt)
tf = Tempfile.new('unittest')
tf.puts 'TELEMETRY TGT READ_VOLTAGE BIG_ENDIAN'
tf.puts ' APPEND_ITEM VOLTAGE 16 UINT'
tf.close
pc = PacketConfig.new
pc.process_file(tf.path, "SYSTEM")
telemetry = Telemetry.new(pc)
tf.unlink

allow(System).to receive_message_chain(:telemetry).and_return(telemetry)
@interface.instance_variable_set(:@stream, TemplateStream.new)
@interface.add_protocol(TemplateProtocol, %w(0xABCD 0xABCD 0 nil 1 true 0 nil false nil nil), :READ_WRITE)
@interface.target_names = ['TGT']
# Add extra target names to the interface to ensure we grab the correct one
@interface.target_names = ['BLAH','TGT','OTHER']
packet = Packet.new('TGT', 'CMD')
packet.append_item("VOLTAGE", 16, :UINT)
packet.get_item("VOLTAGE").default = 11
Expand All @@ -198,13 +207,21 @@ def read; $read_buffer; end
@interface.write(packet)
sleep 0.55
expect($write_buffer).to eql("SOUR:VOLT 11, (@1)\xAB\xCD")
expect(read_result.read("VOLTAGE")).to eql(10)
end

it "sets the response ID to the defined ID value" do
rsp_pkt = Packet.new('TGT', 'READ_VOLTAGE')
rsp_pkt.append_item("PKT_ID", 16, :UINT, nil, :BIG_ENDIAN, :ERROR, nil, nil, nil, 1) # ID == 1
rsp_pkt.append_item("VOLTAGE", 16, :UINT)
allow(System).to receive_message_chain(:telemetry, :packet).and_return(rsp_pkt)
tf = Tempfile.new('unittest')
tf.puts 'TELEMETRY TGT READ_VOLTAGE BIG_ENDIAN'
tf.puts ' APPEND_ID_ITEM PKT_ID 16 UINT 1'
tf.puts ' APPEND_ITEM VOLTAGE 16 UINT'
tf.close
pc = PacketConfig.new
pc.process_file(tf.path, "SYSTEM")
telemetry = Telemetry.new(pc)
tf.unlink

allow(System).to receive_message_chain(:telemetry).and_return(telemetry)
@interface.instance_variable_set(:@stream, TemplateStream.new)
@interface.add_protocol(TemplateProtocol, %w(0xABCD 0xABCD 0 nil 1 true 0 nil false nil nil), :READ_WRITE)
@interface.target_names = ['TGT']
Expand All @@ -230,14 +247,22 @@ def read; $read_buffer; end
sleep 0.55
expect($write_buffer).to eql("SOUR:VOLT 11, (@1)\xAB\xCD")
expect(read_result.read("PKT_ID")).to eql(1) # Result ID set to the defined value
expect(read_result.read("VOLTAGE")).to eql(10)
end

it "handles multiple response IDs" do
rsp_pkt = Packet.new('TGT', 'READ_VOLTAGE')
rsp_pkt.append_item("APID", 16, :UINT, nil, :BIG_ENDIAN, :ERROR, nil, nil, nil, 10) # ID == 10
rsp_pkt.append_item("PKTID", 16, :UINT, nil, :BIG_ENDIAN, :ERROR, nil, nil, nil, 20) # ID == 20
rsp_pkt.append_item("VOLTAGE", 16, :UINT)
allow(System).to receive_message_chain(:telemetry, :packet).and_return(rsp_pkt)
tf = Tempfile.new('unittest')
tf.puts 'TELEMETRY TGT READ_VOLTAGE BIG_ENDIAN'
tf.puts ' APPEND_ID_ITEM APID 16 UINT 10'
tf.puts ' APPEND_ID_ITEM PKTID 16 UINT 20'
tf.puts ' APPEND_ITEM VOLTAGE 16 UINT'
tf.close
pc = PacketConfig.new
pc.process_file(tf.path, "SYSTEM")
telemetry = Telemetry.new(pc)
tf.unlink

allow(System).to receive_message_chain(:telemetry).and_return(telemetry)
@interface.instance_variable_set(:@stream, TemplateStream.new)
@interface.add_protocol(TemplateProtocol, %w(0xABCD 0xABCD 0 nil 1 true 0 nil false nil nil), :READ_WRITE)
@interface.target_names = ['TGT']
Expand Down Expand Up @@ -272,9 +297,16 @@ def read; $read_buffer; end
end

it "handles templates with more values than the response" do
rsp_pkt = Packet.new('TGT', 'READ_VOLTAGE')
rsp_pkt.append_item("VOLTAGE", 16, :UINT)
allow(System).to receive_message_chain(:telemetry, :packet).and_return(rsp_pkt)
tf = Tempfile.new('unittest')
tf.puts 'TELEMETRY TGT READ_VOLTAGE BIG_ENDIAN'
tf.puts ' APPEND_ITEM VOLTAGE 16 UINT'
tf.close
pc = PacketConfig.new
pc.process_file(tf.path, "SYSTEM")
telemetry = Telemetry.new(pc)
tf.unlink

allow(System).to receive_message_chain(:telemetry).and_return(telemetry)
@interface.instance_variable_set(:@stream, TemplateStream.new)
@interface.add_protocol(TemplateProtocol, %w(0xABCD 0xABCD 0 nil 1 true 0 nil false nil), :READ_WRITE)
@interface.target_names = ['TGT']
Expand Down Expand Up @@ -304,9 +336,16 @@ def read; $read_buffer; end
end

it "handles responses with more values than the template" do
rsp_pkt = Packet.new('TGT', 'READ_VOLTAGE')
rsp_pkt.append_item("VOLTAGE", 16, :UINT)
allow(System).to receive_message_chain(:telemetry, :packet).and_return(rsp_pkt)
tf = Tempfile.new('unittest')
tf.puts 'TELEMETRY TGT READ_VOLTAGE BIG_ENDIAN'
tf.puts ' APPEND_ITEM VOLTAGE 16 UINT'
tf.close
pc = PacketConfig.new
pc.process_file(tf.path, "SYSTEM")
telemetry = Telemetry.new(pc)
tf.unlink

allow(System).to receive_message_chain(:telemetry).and_return(telemetry)
@interface.instance_variable_set(:@stream, TemplateStream.new)
@interface.add_protocol(TemplateProtocol, %w(0xABCD 0xABCD 0 nil 1 true 0 nil false nil), :READ_WRITE)
@interface.target_names = ['TGT']
Expand Down Expand Up @@ -336,9 +375,16 @@ def read; $read_buffer; end
end

it "ignores response lines" do
rsp_pkt = Packet.new('TGT', 'READ_VOLTAGE')
rsp_pkt.append_item("VOLTAGE", 16, :UINT)
allow(System).to receive_message_chain(:telemetry, :packet).and_return(rsp_pkt)
tf = Tempfile.new('unittest')
tf.puts 'TELEMETRY TGT READ_VOLTAGE BIG_ENDIAN'
tf.puts ' APPEND_ITEM VOLTAGE 16 UINT'
tf.close
pc = PacketConfig.new
pc.process_file(tf.path, "SYSTEM")
telemetry = Telemetry.new(pc)
tf.unlink

allow(System).to receive_message_chain(:telemetry).and_return(telemetry)
@interface.instance_variable_set(:@stream, TemplateStream.new)
@interface.add_protocol(TemplateProtocol, %w(0xAD 0xA 1), :READ_WRITE)
@interface.target_names = ['TGT']
Expand All @@ -365,9 +411,16 @@ def read; $read_buffer; end
end

it "allows multiple response lines" do
rsp_pkt = Packet.new('TGT', 'DATA')
rsp_pkt.append_item("STRING", 512, :STRING)
allow(System).to receive_message_chain(:telemetry, :packet).and_return(rsp_pkt)
tf = Tempfile.new('unittest')
tf.puts 'TELEMETRY TGT DATA BIG_ENDIAN'
tf.puts ' APPEND_ITEM STRING 512 STRINg'
tf.close
pc = PacketConfig.new
pc.process_file(tf.path, "SYSTEM")
telemetry = Telemetry.new(pc)
tf.unlink

allow(System).to receive_message_chain(:telemetry).and_return(telemetry)
@interface.instance_variable_set(:@stream, TemplateStream.new)
@interface.add_protocol(TemplateProtocol, %w(0xAD 0xA 0 nil 2), :READ_WRITE)
@interface.target_names = ['TGT']
Expand Down

0 comments on commit ba87b40

Please sign in to comment.