From 31a7388c5a1d24ed2212910a196b4fefe6dcaf67 Mon Sep 17 00:00:00 2001
From: Mauco03 <marco.gaibotti@skywarder.eu>
Date: Wed, 6 Mar 2024 09:29:52 +0100
Subject: [PATCH] [msa-refactoring][classes] Added matrix Component support Now
 yoy can create component matrices from config. e.g: see parachuteConfig.m and
 try creating a Parachute

---
 classes/Component.m                           |  25 ++--
 classes/Rocket.m                              |   2 +-
 classes/components/Environment.m              |   2 +-
 classes/components/Parachute.m                |  44 ++++---
 .../config/parachuteConfig.m                  | 113 ++++++++----------
 5 files changed, 100 insertions(+), 86 deletions(-)

diff --git a/classes/Component.m b/classes/Component.m
index 91d88c8..6db8d02 100644
--- a/classes/Component.m
+++ b/classes/Component.m
@@ -11,16 +11,27 @@ classdef Component < Config
         function obj = Component(mission, varsIn)
             arguments (Input)
                 mission Mission = Mission()
-                varsIn = 0
+                varsIn = []
             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 ~isstruct(varsIn) && varsIn == 0
-                obj.loadConfig(); 
-            else
-                obj.loadConfig(varsIn);
+            if isempty(varsIn), varsIn = obj.getConfig(); end
+
+            fileName = obj.configName;
+            varName = obj.variableName;
+            if isempty(varName), varName = strtok(fileName, 'C'); end
+
+            [m, n] = size(varsIn.(varName));
+            objMatrix(m,n) = obj;
+
+            for i = 1:m
+                for j = 1:n
+                    varIn.(varName) = varsIn.(varName)(i,j);
+                    objMatrix(i,j).loadConfig(varIn);
+                end
             end
+            obj = objMatrix;
             obj.loadData();
         end
     end
@@ -56,7 +67,7 @@ classdef Component < Config
                     run(fileName);
                     configObj = eval(varName);
                 case 2
-                    configObj = varargin{1}.(varName);
+                    configObj = varargin{end}.(varName);
                 otherwise
                     error('Too many input arguments.')
             end
@@ -65,7 +76,7 @@ classdef Component < Config
             for j = 1:size(fields, 2), obj.(fields{j}) = configObj.(fields{j}); end
         end
 
-        function outputVariables = getConfigVariables(obj)
+        function outputVariables = getConfig(obj)
             fileName = obj.configName;
             filePath = obj.mission.configPath;
 
diff --git a/classes/Rocket.m b/classes/Rocket.m
index bddf2d7..11e7907 100644
--- a/classes/Rocket.m
+++ b/classes/Rocket.m
@@ -36,7 +36,7 @@ classdef Rocket < Bay
 
             %% Loading data
             if nargin == 0, return;  end
-            vars             = obj.getConfigVariables(); % Load config once and apply to other bays
+            vars             = obj.getConfig(); % Load config once and apply to other bays
             obj.nose         = Nose(mission, vars);
             obj.payload      = Payload(mission, vars);
             obj.recovery     = Recovery(mission, vars);
diff --git a/classes/components/Environment.m b/classes/components/Environment.m
index 41ebd8b..47ec3e0 100644
--- a/classes/components/Environment.m
+++ b/classes/components/Environment.m
@@ -32,7 +32,7 @@ classdef Environment < Component
             arguments(Input)
                 mission Mission = Mission()
                 motor Motor = Motor()
-                varIn = 0
+                varIn = []
             end
             if nargin > 0 && nargin < 2, error('Too few arguments. Type help for more info'); end
             if nargin > 3, error('Too many arguments.'); end
diff --git a/classes/components/Parachute.m b/classes/components/Parachute.m
index 4d26768..e03bac7 100644
--- a/classes/components/Parachute.m
+++ b/classes/components/Parachute.m
@@ -2,26 +2,40 @@ classdef Parachute < Component
     %PARACHUTE Summary of this class goes here
     %   Detailed explanation goes here
     properties
-        name                {mustBeTextScalar} = '' 
-        surface double          % [m^2]   Surface
-        mass double                % [kg]   Parachute Mass
-        cd double                  % [/] Parachute Drag Coefficient
-        cl double                   % [/] Parachute Lift Coefficient
-        openingDelay double          % [s] drogue opening delay
-        finalAltitude double     % [m] Final altitude of the parachute
-        cx double     % [/] Parachute Longitudinal Drag Coefficient
-        chordLength double     % [m] Shock Chord Length
-        chordK double     % [N/m^2] Shock Chord Elastic Constant
-        chordC double       % [Ns/m] Shock Chord Dynamic Coefficient
-        m double       % [m^2/s] Coefficient of the surface vs. time opening model
-        nf double       % [/] Adimensional Opening Time
-        expulsionSpeed double
+        name            {mustBeTextScalar} = '' 
+        surface         double                  % [m^2]   Surface
+        mass            double                  % [kg]   Parachute Mass
+        openingDelay    double                  % [s] drogue opening delay
+        finalAltitude   double                  % [m] Final altitude of the parachute
+        chordLength     double                  % [m] Shock Chord Length
+        chordK          double                  % [N/m^2] Shock Chord Elastic Constant
+        chordC          double                  % [Ns/m] Shock Chord Dynamic Coefficient
+        expulsionSpeed  double
+        cx              double                  % [/] Parachute Longitudinal Drag Coefficient
+        cd              double                  % [/] Parachute Drag Coefficient
+        cl              double                  % [/] Parachute Lift Coefficient
+        m               double                  % [m^2/s] Coefficient of the surface vs. time opening model
+        nf              double                  % [/] Adimensional Opening Time
     end
     
     properties(Access = protected)
         configName = 'parachuteConfig.m'
-        variableName = 'parachute'
+        variableName = ''
         mission Mission
     end
+
+    methods
+        function obj = Parachute(mission, varIn)
+            arguments(Input)
+                mission Mission = Mission()
+                varIn = []
+            end
+            % if nargin > 0 && nargin < 2, error('Too few arguments. Type help for more info'); end
+            % if nargin > 3, error('Too many arguments.'); end
+
+            obj@Component(mission, varIn);
+            %obj.motor = motor;
+        end
+    end
 end
 
diff --git a/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m b/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m
index e38d18a..90554bc 100644
--- a/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m
+++ b/missions/2024_Lyra_Roccaraso_September/config/parachuteConfig.m
@@ -1,70 +1,59 @@
 % CONFIG - This script contains information about the parachutes onboard
-parachute = Parachute();
+parachute(1, 1) = Parachute();
 
-parachute.name = 'DROGUE chute';
-parachute.surface = 1.2219;    % [m^2]   Surface
-parachute.mass = 0.15;   % [kg]   Parachute Mass
-parachute.cd = 0.96;     % [/] Parachute Drag Coefficient
-parachute.cl = 0;        % [/] Parachute Lift Coefficient
-parachute.openingDelay = 1;     % [s] drogue opening delay
-parachute.finalAltitude = 350;           % [m] Final altitude of the parachute
-parachute.cx = 1.4;      % [/] Parachute Longitudinal Drag Coefficient
-parachute.chordLength = 1.5;       % [m] Shock Chord Length
-parachute.chordK = 7200;      % [N/m^2] Shock Chord Elastic Constant
-parachute.chordC = 0;         % [Ns/m] Shock Chord Dynamic Coefficient
-parachute.m = 1;         % [m^2/s] Coefficient of the surface vs. time opening model
-parachute.nf = 12;       % [/] Adimensional Opening Time
-parachute.expulsionSpeed = 5;     % [m/s] Expulsion Speed
+parachute(1,1).name = 'DROGUE chute';
+parachute(1,1).surface = 1.2219;         % [m^2]   Surface
+parachute(1,1).mass = 0.15;              % [kg]   Parachute Mass
+parachute(1,1).cd = 0.96;                % [/] Parachute Drag Coefficient
+parachute(1,1).cl = 0;                   % [/] Parachute Lift Coefficient
+parachute(1,1).openingDelay = 1;         % [s] drogue opening delay
+parachute(1,1).finalAltitude = 350;      % [m] Final altitude of the parachute
+parachute(1,1).cx = 1.4;                 % [/] Parachute Longitudinal Drag Coefficient
+parachute(1,1).chordLength = 1.5;        % [m] Shock Chord Length
+parachute(1,1).chordK = 7200;            % [N/m^2] Shock Chord Elastic Constant
+parachute(1,1).chordC = 0;               % [Ns/m] Shock Chord Dynamic Coefficient
+parachute(1,1).m = 1;                    % [m^2/s] Coefficient of the surface vs. time opening model
+parachute(1,1).nf = 12;                  % [/] Adimensional Opening Time
+parachute(1,1).expulsionSpeed = 5;       % [m/s] Expulsion Speed
 
-% %% ROCKET CHUTES
-% % parachute 1
-% parachute.para(1, 1).name = 'DROGUE chute';
-% parachute.para(1, 1).surface = 1.2219;    % [m^2]   Surface
-% parachute.para(1, 1).mass = 0.15;   % [kg]   Parachute Mass
-% parachute.para(1, 1).cd = 0.96;     % [/] Parachute Drag Coefficient
-% parachute.para(1, 1).cl = 0;        % [/] Parachute Lift Coefficient
-% parachute.para(1, 1).openingDelay = 1;     % [s] drogue opening delay
-% parachute.para(1, 1).finalAltitude = 350;           % [m] Final altitude of the parachute
-% parachute.para(1, 1).cx = 1.4;      % [/] Parachute Longitudinal Drag Coefficient
-% parachute.para(1, 1).chordLength = 1.5;       % [m] Shock Chord Length
-% parachute.para(1, 1).chordK = 7200;      % [N/m^2] Shock Chord Elastic Constant
-% parachute.para(1, 1).chordC = 0;         % [Ns/m] Shock Chord Dynamic Coefficient
-% parachute.para(1, 1).m = 1;         % [m^2/s] Coefficient of the surface vs. time opening model
-% parachute.para(1, 1).nf = 12;       % [/] Adimensional Opening Time
-% parachute.para(1, 1).expulsionSpeed = 5;     % [m/s] Expulsion Speed
-% 
-% % parachute 2
-% parachute.para(2, 1).name = 'MAIN chute';
-% parachute.para(2, 1).surface = 7.34;      % [m^2]   Surface
-% parachute.para(2, 1).mass = 1.05;   % [kg]   Parachute Mass
-% parachute.para(2, 1).cd = 1.75;     % [/] Parachute Drag Coefficient
-% parachute.para(2, 1).cl = 0;        % [/] Parachute Lift Coefficient
-% parachute.para(2, 1).finalAltitude = 0;     % [m] Final altitude of the parachute
-% parachute.para(2, 1).cx = 1.2;      % [/] Parachute Longitudinal Drag Coefficient
-% parachute.para(2, 1).chordLength = 6;         % [m] Shock Chord Length
-% parachute.para(2, 1).chordK = 3000;      % [N/m^2] Shock Chord Elastic Constant
-% parachute.para(2, 1).chordC = 0;         % [Ns/m] Shock Chord Dynamic Coefficient
-% parachute.para(2, 1).m = 1;         % [m^2/s] Coefficient of the surface vs. time opening model
-% parachute.para(2, 1).nf = 8.7;      % [/] Adimensional Opening Time
+% parachute 2
+parachute(2, 1) = Parachute();
+
+parachute(2, 1).name = 'MAIN chute';
+parachute(2, 1).surface = 7.34;      % [m^2]   Surface
+parachute(2, 1).mass = 1.05;   % [kg]   Parachute Mass
+parachute(2, 1).cd = 1.75;     % [/] Parachute Drag Coefficient
+parachute(2, 1).cl = 0;        % [/] Parachute Lift Coefficient
+parachute(2, 1).finalAltitude = 0;     % [m] Final altitude of the parachute
+parachute(2, 1).cx = 1.2;      % [/] Parachute Longitudinal Drag Coefficient
+parachute(2, 1).chordLength = 6;         % [m] Shock Chord Length
+parachute(2, 1).chordK = 3000;      % [N/m^2] Shock Chord Elastic Constant
+parachute(2, 1).chordC = 0;         % [Ns/m] Shock Chord Dynamic Coefficient
+parachute(2, 1).m = 1;         % [m^2/s] Coefficient of the surface vs. time opening model
+parachute(2, 1).nf = 8.7;      % [/] Adimensional Opening Time
 % 
 % %% PAYLOAD CHUTES
 % % parachute 1
-% parachute.para(1, 2).name = "Payload DROGUE";
-% parachute.para(1, 2).surface = 0.11;      % [m^2]   Surface
-% parachute.para(1, 2).mass = 0.15;   % [kg]   Parachute Mass
-% parachute.para(1, 2).cd = 1.2;      % [/] Parachute Drag Coefficient
-% parachute.para(1, 2).cl = 0;        % [/] Parachute Lift Coefficient
-% parachute.para(1, 2).openingDelay = 1;     % [s] drogue opening delay
-% parachute.para(1, 2).finalAltitude = 300;   % [m] Final altitude of the parachute
-% parachute.para(1, 2).cx = 1.4;      % [/] Parachute Longitudinal Drag Coefficient
-% parachute.para(1, 2).chordLength = 1.5;       % [m] Shock Chord Length
-% parachute.para(1, 2).chordK = 7200;      % [N/m^2] Shock Chord Elastic Constant
-% parachute.para(1, 2).chordC = 0;         % [Ns/m] Shock Chord Dynamic Coefficient
-% parachute.para(1, 2).m = 1;         % [m^2/s] Coefficient of the surface vs. time opening model
-% parachute.para(1, 2).nf = 12;       % [/] Adimensional Opening Time
-% parachute.para(1, 2).expulsionSpeed = 10;     % [m/s] Expulsion Speed
+parachute(1, 2) = Parachute();
+
+parachute(1, 2).name = "Payload DROGUE";
+parachute(1, 2).surface = 0.11;      % [m^2]   Surface
+parachute(1, 2).mass = 0.15;   % [kg]   Parachute Mass
+parachute(1, 2).cd = 1.2;      % [/] Parachute Drag Coefficient
+parachute(1, 2).cl = 0;        % [/] Parachute Lift Coefficient
+parachute(1, 2).openingDelay = 1;     % [s] drogue opening delay
+parachute(1, 2).finalAltitude = 300;   % [m] Final altitude of the parachute
+parachute(1, 2).cx = 1.4;      % [/] Parachute Longitudinal Drag Coefficient
+parachute(1, 2).chordLength = 1.5;       % [m] Shock Chord Length
+parachute(1, 2).chordK = 7200;      % [N/m^2] Shock Chord Elastic Constant
+parachute(1, 2).chordC = 0;         % [Ns/m] Shock Chord Dynamic Coefficient
+parachute(1, 2).m = 1;         % [m^2/s] Coefficient of the surface vs. time opening model
+parachute(1, 2).nf = 12;       % [/] Adimensional Opening Time
+parachute(1, 2).expulsionSpeed = 10;     % [m/s] Expulsion Speed
 % 
 % % parachute 2
-% parachute.para(2, 2).name = "Payload AIRFOIL";
-% parachute.para(2, 2).mass = 0.50;    % [kg]   Parachute Mass
-% parachute.para(2, 2).finalAltitude = 0;      % [m] Final altitude of the parachute
+parachute(2, 2) = Parachute();
+
+parachute(2, 2).name = "Payload AIRFOIL";
+parachute(2, 2).mass = 0.50;    % [kg]   Parachute Mass
+parachute(2, 2).finalAltitude = 0;      % [m] Final altitude of the parachute
-- 
GitLab