diff --git a/classes/Component.m b/classes/Component.m index 617c4070edff58f53826614b096927a8db92e389..cf1a5e42baf4b92ba8a46a140cb6fc10e366ad17 100644 --- a/classes/Component.m +++ b/classes/Component.m @@ -1,25 +1,51 @@ classdef Component < Config % Component: Represents an abstraction layer for all components % Components standardize object construction, config and data loading +% +% Constructor: +% - Component: Creates an instance of the Component class. +% Arguments: +% - mission: Mission, mission object, used to find config +% files +% - varsIn: If present, data is read from this variable +% instead of config file +% +% Options: +% +% - elementWise: +% - if true, data is copied element-by-element +% into target class +% - if false, the loaded data substitutes target class properties(Abstract, Access = protected) - % Insert dependencies here mission Mission end methods - function obj = Component(mission, varsIn) + function obj = Component(mission, varsIn, options) + % Component: Contains and manages all bays + % + % Constructor: + % - Rocket: Creates an instance of the Rocket class. + % Loaded config: rocketConfig.m > rocket (for overrides) + % Loaded data: - + % Arguments: + % - mission: Mission, mission object + % - varIn: (optional) config source. Alternative to config.m + % file + arguments (Input) mission Mission = Mission() varsIn = [] + options.elementWise logical = true end - obj.mission = mission; - %if isempty(mission.name) && nargin > 0, warning('Mission arguments are empty. Returning an uninitialized component...'); end + if isempty(mission.name) return; end + if isempty(varsIn) - varsIn = obj.getConfig(); + varsIn = obj.getConfig(mission); end fileName = obj.configName; @@ -35,15 +61,26 @@ classdef Component < Config 'and the config file is correct'], fileName, varName); end - [varsIn.(varName).mission] = deal(mission); - obj = varsIn.(varName); + configObj = varsIn.(varName); + + if options.elementWise + fields = obj.getProperties('writable'); + for j = 1:size(fields, 2) + if isempty([configObj.(fields{j})]), continue; end + obj.(fields{j}) = configObj.(fields{j}); + end + else + obj = configObj; + end + + [obj.mission] = deal(mission); end end methods(Access = protected) - function outputVariables = getConfig(obj) + function outputVariables = getConfig(obj, mission) fileName = obj.configName; - filePath = obj.mission.configPath; + filePath = mission.configPath; file = fullfile(filePath, fileName); if ~isfile(file) diff --git a/classes/Rocket.m b/classes/Rocket.m index 7b6799a8b3478ff117381fe7067c126d87f5766d..7494483b86d25b1396321b9a995ad1c76f69edc4 100644 --- a/classes/Rocket.m +++ b/classes/Rocket.m @@ -231,12 +231,11 @@ classdef Rocket < Component obj@Component(mission, varIn); %% Loading data - if nargin == 0 + if isempty(mission.name) return; end - obj.mission = mission; - vars = obj.getConfig(); % Load config once and apply to other bays + vars = obj.getConfig(mission); % Load config once and apply to other bays obj.payload = Payload(mission, vars); obj.recovery = Recovery(mission, vars); obj.electronics = Electronics(mission, vars); diff --git a/classes/components/Para.m b/classes/components/Para.m index d62907e8fffabd3b97f9ab7010233accc13f1040..ef74338bcccc5f29d0943eaa1efb635286f06495 100644 --- a/classes/components/Para.m +++ b/classes/components/Para.m @@ -27,7 +27,7 @@ classdef Para < matlab.mixin.Heterogeneous & Component mission Mission = Mission() varIn = [] end - obj@Component(mission, varIn); + obj@Component(mission, varIn, "elementWise", false); %% Forcing creation of heterogeneous array if any(size(obj) > 1)