Class: OpenC3::System

Inherits:
Object show all
Defined in:
lib/openc3/system/system.rb,
ext/openc3/ext/telemetry/telemetry.c

Constant Summary collapse

@@instance =

Variable that holds the singleton instance

nil
@@instance_mutex =

Mutex used to ensure that only one instance of System is created

Mutex.new
@@limits_set =

The current limits set

nil

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(target_names, target_config_dir) ⇒ System

Create a new System object.



118
119
120
121
122
123
124
125
# File 'lib/openc3/system/system.rb', line 118

def initialize(target_names, target_config_dir)
  @targets = {}
  @packet_config = PacketConfig.new
  @commands = Commands.new(@packet_config)
  @telemetry = Telemetry.new(@packet_config)
  @limits = Limits.new(@packet_config)
  target_names.each { |target_name| add_target(target_name, target_config_dir) }
end

Class Method Details

.instance(target_names = nil, target_config_dir = nil) ⇒ System

Get the singleton instance of System



104
105
106
107
108
109
110
111
112
# File 'lib/openc3/system/system.rb', line 104

def self.instance(target_names = nil, target_config_dir = nil)
  return @@instance if @@instance
  raise "System.instance parameters are required on first call" unless target_names and target_config_dir

  @@instance_mutex.synchronize do
    @@instance ||= self.new(target_names, target_config_dir)
    return @@instance
  end
end

.limits_setSymbol



63
64
65
66
67
68
# File 'lib/openc3/system/system.rb', line 63

def self.limits_set
  unless @@limits_set
    @@limits_set = LimitsEventTopic.current_set(scope: $openc3_scope).to_s.intern
  end
  @@limits_set
end

.limits_set=(value) ⇒ Object



70
71
72
# File 'lib/openc3/system/system.rb', line 70

def self.limits_set=(value)
  @@limits_set = value.to_s.intern
end

.setup_targets(target_names, base_dir, scope:) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/openc3/system/system.rb', line 74

def self.setup_targets(target_names, base_dir, scope:)
  if @@instance.nil?
    FileUtils.mkdir_p("#{base_dir}/targets")
    bucket = Bucket.getClient()
    target_names.each do |target_name|
      # Retrieve bucket/targets/target_name/target_id.zip
      zip_path = "#{base_dir}/targets/#{target_name}_current.zip"
      FileUtils.mkdir_p(File.dirname(zip_path))
      bucket_key = "#{scope}/target_archives/#{target_name}/#{target_name}_current.zip"
      Logger.info("Retrieving #{bucket_key} from targets bucket")
      bucket.get_object(bucket: ENV['OPENC3_CONFIG_BUCKET'], key: bucket_key, path: zip_path)
      Zip::File.open(zip_path) do |zip_file|
        zip_file.each do |entry|
          path = File.join("#{base_dir}/targets", entry.name)
          FileUtils.mkdir_p(File.dirname(path))
          zip_file.extract(entry, path) unless File.exist?(path)
        end
      end
    end

    # Build System from targets
    System.instance(target_names, "#{base_dir}/targets")
  end
end

Instance Method Details

#add_target(target_name, target_config_dir) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/openc3/system/system.rb', line 127

def add_target(target_name, target_config_dir)
  parser = ConfigParser.new
  folder_name = File.join(target_config_dir, target_name)
  raise parser.error("Target folder must exist '#{folder_name}'.") unless Dir.exist?(folder_name)

  target = Target.new(target_name, target_config_dir)
  @targets[target.name] = target
  target.cmd_tlm_files.each do |cmd_tlm_file|
    @packet_config.process_file(cmd_tlm_file, target.name)
  rescue Exception => err
    Logger.error "Problem processing #{cmd_tlm_file}: #{err}."
    raise err
  end
end

#commandsCommands



45
# File 'lib/openc3/system/system.rb', line 45

instance_attr_reader :commands

#limitsLimits



51
# File 'lib/openc3/system/system.rb', line 51

instance_attr_reader :limits

#packet_configPacketConfig



42
# File 'lib/openc3/system/system.rb', line 42

instance_attr_reader :packet_config

#targetsHash<String,Target>



39
# File 'lib/openc3/system/system.rb', line 39

instance_attr_reader :targets

#telemetryTelemetry



48
# File 'lib/openc3/system/system.rb', line 48

instance_attr_reader :telemetry