Method: OpenC3::Target#process_file

Defined in:
lib/openc3/system/target.rb

#process_file(filename) ⇒ Object

Parses the target configuration file

Parameters:

  • filename (String)

    The target configuration file to parse



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/openc3/system/target.rb', line 116

def process_file(filename)
  Logger.instance.info "Processing target definition in file '#{filename}'"
  parser = ConfigParser.new("https://docs.openc3.com/docs/configuration/target")
  parser.parse_file(filename) do |keyword, parameters|
    case keyword
    when 'LANGUAGE'
      usage = "#{keyword} <ruby | python>"
      parser.verify_num_parameters(1, 1, usage)
      @language = parameters[0].downcase

    when 'REQUIRE'
      usage = "#{keyword} <FILENAME>"
      parser.verify_num_parameters(1, 1, usage)
      filename = File.join(@dir, 'lib', parameters[0])
      begin
        # Require absolute path to file in target lib folder. Prevents name
        # conflicts at the require step
        OpenC3.disable_warnings do
          OpenC3.require_file(filename, false)
        end
      rescue LoadError
        begin
          # If we couldn't load at the target/lib level check everywhere
          OpenC3.disable_warnings do
            filename = parameters[0]
            OpenC3.require_file(parameters[0])
          end
        rescue Exception => e
          raise parser.error(e.formatted)
        end
      rescue Exception => e
        raise parser.error(e.formatted)
      end

      # This code resolves any relative paths to absolute before putting into the @requires array
      unless Pathname.new(filename).absolute?
        $:.each do |search_path|
          test_filename = File.join(search_path, filename).gsub("\\", "/")
          if File.exist?(test_filename)
            filename = test_filename
            break
          end
        end
      end

      @requires << filename

    when 'IGNORE_PARAMETER', 'IGNORE_ITEM'
      usage = "#{keyword} <#{keyword.split('_')[1]} NAME>"
      parser.verify_num_parameters(1, 1, usage)
      @ignored_parameters << parameters[0].upcase if keyword.include?("PARAMETER")
      @ignored_items << parameters[0].upcase if keyword.include?("ITEM")

    when 'COMMANDS', 'TELEMETRY'
      usage = "#{keyword} <FILENAME>"
      parser.verify_num_parameters(1, 1, usage)
      filename = File.join(@dir, 'cmd_tlm', parameters[0])
      raise parser.error("#{filename} not found") unless File.exist?(filename)

      @cmd_tlm_files << filename

      # when 'AUTO_SCREEN_SUBSTITUTE'
      # usage = "#{keyword}"
      # parser.verify_num_parameters(0, 0, usage)
      # @auto_screen_substitute = true

    when 'CMD_UNIQUE_ID_MODE'
      usage = "#{keyword}"
      parser.verify_num_parameters(0, 0, usage)
      @cmd_unique_id_mode = true

    when 'TLM_UNIQUE_ID_MODE'
      usage = "#{keyword}"
      parser.verify_num_parameters(0, 0, usage)
      @tlm_unique_id_mode = true

    else
      # blank lines will have a nil keyword and should not raise an exception
      raise parser.error("Unknown keyword '#{keyword}'") if keyword
    end # case keyword
  end
end