Class: OpenC3::PacketParser

Inherits:
Object show all
Defined in:
lib/openc3/packets/parsers/packet_parser.rb

Direct Known Subclasses

TableParser

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parser) ⇒ PacketParser



71
72
73
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 71

def initialize(parser)
  @parser = parser
end

Class Method Details

.check_for_duplicate(type, list, packet) ⇒ Object



106
107
108
109
110
111
112
113
114
115
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 106

def self.check_for_duplicate(type, list, packet)
  msg = nil
  if list[packet.target_name]
    if list[packet.target_name][packet.packet_name]
      msg = "#{type} Packet #{packet.target_name} #{packet.packet_name} redefined."
      Logger.instance.warn msg
    end
  end
  msg
end

.check_item_data_types(packet) ⇒ Object



60
61
62
63
64
65
66
67
68
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 60

def self.check_item_data_types(packet)
  packet.sorted_items.each do |item|
    item.check_default_and_range_data_types()
  end
rescue
  # Add the target name and packet name to the error message so the user
  # can debug where the error occurred
  raise $!, "#{packet.target_name} #{packet.packet_name} #{$!}", $!.backtrace
end

.finish_create_command(packet, commands, warnings) ⇒ Object



117
118
119
120
121
122
123
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 117

def self.finish_create_command(packet, commands, warnings)
  warning = PacketParser.check_for_duplicate('Command', commands, packet)
  warnings << warning if warning
  packet.define_reserved_items()
  commands[packet.target_name] ||= {}
  packet
end

.finish_create_telemetry(packet, telemetry, latest_data, warnings) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 125

def self.finish_create_telemetry(packet, telemetry, latest_data, warnings)
  warning = PacketParser.check_for_duplicate('Telemetry', telemetry, packet)
  warnings << warning if warning
  packet.define_reserved_items()

  unless telemetry[packet.target_name]
    telemetry[packet.target_name] = {}
    latest_data[packet.target_name] = {}
  end
  packet
end

.parse_command(parser, target_name, commands, warnings) ⇒ Object



34
35
36
37
38
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 34

def self.parse_command(parser, target_name, commands, warnings)
  parser = PacketParser.new(parser)
  parser.verify_parameters()
  parser.create_command(target_name, commands, warnings)
end

.parse_telemetry(parser, target_name, telemetry, latest_data, warnings) ⇒ Object



52
53
54
55
56
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 52

def self.parse_telemetry(parser, target_name, telemetry, latest_data, warnings)
  parser = PacketParser.new(parser)
  parser.verify_parameters()
  parser.create_telemetry(target_name, telemetry, latest_data, warnings)
end

Instance Method Details

#create_command(target_name, commands, warnings) ⇒ Object



81
82
83
84
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 81

def create_command(target_name, commands, warnings)
  packet = create_packet(target_name)
  PacketParser.finish_create_command(packet, commands, warnings)
end

#create_packet(target_name) ⇒ Object

private



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 93

def create_packet(target_name)
  params = @parser.parameters
  target_name = params[0].to_s.upcase if target_name == 'SYSTEM'
  packet_name = params[1].to_s.upcase
  endianness = params[2].to_s.upcase.to_sym
  description = params[3].to_s
  if endianness != :BIG_ENDIAN and endianness != :LITTLE_ENDIAN
    raise @parser.error("Invalid endianness #{params[2]}. Must be BIG_ENDIAN or LITTLE_ENDIAN.", @usage)
  end

  Packet.new(target_name, packet_name, endianness, description)
end

#create_telemetry(target_name, telemetry, latest_data, warnings) ⇒ Object



86
87
88
89
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 86

def create_telemetry(target_name, telemetry, latest_data, warnings)
  packet = create_packet(target_name)
  PacketParser.finish_create_telemetry(packet, telemetry, latest_data, warnings)
end

#verify_parametersObject



75
76
77
78
79
# File 'lib/openc3/packets/parsers/packet_parser.rb', line 75

def verify_parameters
  @usage = "#{@parser.keyword} <TARGET NAME> <PACKET NAME> <ENDIANNESS: BIG_ENDIAN/LITTLE_ENDIAN> <DESCRIPTION (Optional)>"
  @parser.verify_num_parameters(3, 4, @usage)
  @parser.verify_parameter_naming(2) # Packet name is the 2nd parameter
end