From f8b86ae0379b86157fc434611c6c54e523f16284 Mon Sep 17 00:00:00 2001
From: Mauco03 <marco.gaibotti@skywarder.eu>
Date: Wed, 6 Mar 2024 11:05:42 +0100
Subject: [PATCH] [msa-refactoring][classes] adding get/set methods for rocket

---
 classes/Bay.m                                 |  1 +
 classes/Component.m                           | 20 ++++--
 classes/Rocket.m                              | 71 ++++++++++++++++++-
 classes/bays/Airbrakes.m                      |  1 +
 classes/bays/Boat.m                           |  1 +
 classes/bays/Electronics.m                    |  1 +
 classes/bays/Motor.m                          |  2 +-
 classes/bays/Nose.m                           |  1 +
 classes/bays/Payload.m                        |  1 +
 classes/bays/Recovery.m                       |  1 +
 classes/components/Fins.m                     |  2 +
 classes/old/Control.m                         | 33 ---------
 .../config/rocketConfig.m                     | 12 ++--
 13 files changed, 98 insertions(+), 49 deletions(-)
 delete mode 100644 classes/old/Control.m

diff --git a/classes/Bay.m b/classes/Bay.m
index 0ddb41a..9e35314 100644
--- a/classes/Bay.m
+++ b/classes/Bay.m
@@ -7,6 +7,7 @@ classdef Bay < Component
         length      % [m] Total bay length
         diameter    % [m] Diameter of the bay
         mass        % [kg] Total bay mass
+        xCg         % [m] Cg relative to bay upper side
         inertia     % [kg*m^2] Total bay inertia (Body reference)
     end
 end
diff --git a/classes/Component.m b/classes/Component.m
index 6db8d02..9412cf2 100644
--- a/classes/Component.m
+++ b/classes/Component.m
@@ -36,16 +36,22 @@ classdef Component < Config
         end
     end
 
-    methods(Access = ?Rocket)
-        function setMission(obj, mission)
-            obj.mission = mission;
-        end
-    end
+    % methods(Access = ?Rocket)
+    %     function setMission(obj, mission)
+    %         obj.mission = mission;
+    %     end
+    % end
 
     methods(Access = protected)
         function loadConfig(obj, varargin)
-            % This method loads desired configs by running the corresponding script.
-            % The script name is specified as the "configName" for each subclass of "Config"
+            % This method loads desired configs into calling component.
+            % The component can chose between:
+            %   - Only specifying the configName (name of the config file):
+            %       The loader will look for a variable named like the
+            %       config file.
+            %   - Specifying both the configName and the variableName:
+            %       Useful for when you want to group multiple small
+            %       objects into a larger config file
             %
             % Syntax:
             %   obj.loadConfig()        - To load from a config file
diff --git a/classes/Rocket.m b/classes/Rocket.m
index 11e7907..755026d 100644
--- a/classes/Rocket.m
+++ b/classes/Rocket.m
@@ -13,12 +13,24 @@ classdef Rocket < Bay
 
         fins        Fins        = Fins()
         pitot       Pitot       = Pitot()
-        
+    end
+
+    properties(Dependent)
         length 
         diameter
         mass
-        massNoMotor
+        massNoMotor     % [kg] Mass of rocket with empty motr vane (includes motor fuselage weight)
         inertia
+        xCg
+    end
+
+    properties(Access = private, Hidden) % Overrides
+        length_
+        diameter_
+        mass_
+        massNoMotor_
+        inertia_
+        xCg_
     end
 
     properties(Access = protected)
@@ -27,11 +39,62 @@ classdef Rocket < Bay
         mission Mission
     end
     
+    methods % Getters / Setters
+        function out = get.length(obj)
+            if ~isempty(obj.length_), out = obj.length_; return; end
+            out = obj.nose.length + obj.payload.length + obj.recovery.length + ...
+                obj.electronics.length + obj.airbrakes.length + obj.motor.length + ...
+                obj.boat.length;
+        end
+        function out = get.diameter(obj)
+            if ~isempty(obj.diameter_), out = obj.diameter_; return; end
+            out = obj.payload.diameter;
+        end
+        function out = get.mass(obj)
+            if ~isempty(obj.mass_), out = obj.mass_; return; end
+            out = obj.nose.mass + obj.payload.mass + obj.recovery.mass + ...
+                obj.electronics.mass + obj.airbrakes.mass + obj.motor.mass + ...
+                obj.boat.mass + obj.fins.mass;
+        end
+        function out = get.massNoMotor(obj)
+            if ~isempty(obj.massNoMotor_), out = obj.massNoMotor_; return; end
+            out = obj.nose.mass + obj.payload.mass + obj.recovery.mass + ...
+                obj.electronics.mass + obj.airbrakes.mass + obj.motor.fuselageMass + ...
+                obj.boat.mass + obj.fins.mass;
+        end
+        function out = get.inertia(obj) % WIP
+            if ~isempty(obj.inertia_), out = obj.inertia_; return; end
+            xCgRelative = [obj.nose.xCg, obj.payload.xCg, obj.recovery.xCg, ...
+                obj.electronics.xCg, obj.airbrakes.xCg, obj.motor.xCg, ...
+                obj.boat.xCg, obj.fins.xCg];
+            lengths = [obj.nose.length, obj.payload.length, obj.recovery.length, ...
+                obj.electronics.length, obj.airbrakes.length, obj.motor.length, ...
+                obj.boat.length];
+            lengthsAbsolute = zeros(1, size(lengths, 2));
+            for i = 1:size(lengths, 2), lengthsAbsolute(i) = sum(lengths(1:i)); end
+            xCgAbsolute = xCgRelative + lengthsAbsolute;
+
+        end
+        function out = get.xCg(obj)
+            if ~isempty(obj.xCg_), out = obj.xCg_; return; end
+            %out = 
+        end
+
+        function set.length(obj, value), obj.length_ = value; end
+        function set.diameter(obj, value), obj.diameter_ = value; end
+        function set.mass(obj, value), obj.mass_ = value; end
+        function set.massNoMotor(obj, value), obj.massNoMotor_ = value; end
+        function set.inertia(obj, value), obj.inertia_ = value; end
+        function set.xCg(obj, value), obj.xCg_ = value; end
+    end
+
     methods
-        function obj = Rocket(mission)
+        function obj = Rocket(mission, varIn)
             arguments
                 mission Mission = Mission()
+                varIn = []
             end
+            obj@Bay(mission, varIn);
             obj.mission = mission;
 
             %% Loading data
@@ -46,6 +109,8 @@ classdef Rocket < Bay
             obj.boat         = Boat(mission, vars);
             obj.fins         = Fins(mission, vars);
             obj.pitot        = Pitot(mission, vars);
+
+            %obj.getAvailableProperties()
         end
     end
 end
diff --git a/classes/bays/Airbrakes.m b/classes/bays/Airbrakes.m
index d7e5e7f..6974f62 100644
--- a/classes/bays/Airbrakes.m
+++ b/classes/bays/Airbrakes.m
@@ -18,6 +18,7 @@ classdef Airbrakes < Bay
         diameter    % [m] Diameter of the bay
         mass        % [kg] Total bay mass
         inertia     % [kg*m^2] Total bay inertia (Body reference)
+        xCg         % [m] Cg relative to bay upper side
     end
     
     properties(Access = protected)
diff --git a/classes/bays/Boat.m b/classes/bays/Boat.m
index 4747c7a..20d282c 100644
--- a/classes/bays/Boat.m
+++ b/classes/bays/Boat.m
@@ -6,6 +6,7 @@ classdef Boat < Bay
         diameter    % [m] Diameter of the bay
         mass        % [kg] Total bay mass
         inertia     % [kg*m^2] Total bay inertia (Body reference)
+        xCg         % [m] Cg relative to bay upper side
     end
 
     properties(Access = protected)
diff --git a/classes/bays/Electronics.m b/classes/bays/Electronics.m
index 30add52..a0e1a7a 100644
--- a/classes/bays/Electronics.m
+++ b/classes/bays/Electronics.m
@@ -7,6 +7,7 @@ classdef Electronics < Bay
         diameter    % [m] Diameter of the bay
         mass        % [kg] Total bay mass
         inertia     % [kg*m^2] Total bay inertia (Body reference)
+        xCg         % [m] Cg relative to bay upper side
     end
 
     properties(Access = protected)
diff --git a/classes/bays/Motor.m b/classes/bays/Motor.m
index 7226780..8d3fa37 100644
--- a/classes/bays/Motor.m
+++ b/classes/bays/Motor.m
@@ -16,7 +16,7 @@ classdef Motor < Bay
         oxidizerMass    double                  % [kg] Oxidizer initial mass
         structureMass   double                  % [kg] Engine Structural Mass
         fuselageMass    double                  % [kg] Fuselage of the engine only
-        xCg             double                  % [m]  Engine xcg from tank tip
+        xCg                                     % [m]  Engine xcg from tank tip
         pe              double                  % [Pa] Eflux pressure
         ae              double                  % [Pa] Eflux Area
     end
diff --git a/classes/bays/Nose.m b/classes/bays/Nose.m
index 297c224..0bc382e 100644
--- a/classes/bays/Nose.m
+++ b/classes/bays/Nose.m
@@ -11,6 +11,7 @@ classdef Nose < Bay
         diameter    % [m] Diameter of the bay
         mass        % [kg] Total bay mass
         inertia     % [kg*m^2] Total bay inertia (Body reference)
+        xCg         % [m] Cg relative to bay upper side
     end
 
     properties(Access = protected)
diff --git a/classes/bays/Payload.m b/classes/bays/Payload.m
index 9aedec3..0b76fe7 100644
--- a/classes/bays/Payload.m
+++ b/classes/bays/Payload.m
@@ -6,6 +6,7 @@ classdef Payload < Bay
         diameter    % [m] Diameter of the bay
         mass        % [kg] Total bay mass
         inertia     % [kg*m^2] Total bay inertia (Body reference)
+        xCg         % [m] Cg relative to bay upper side
     end
 
     properties(Access = protected)
diff --git a/classes/bays/Recovery.m b/classes/bays/Recovery.m
index 802272b..09b56ae 100644
--- a/classes/bays/Recovery.m
+++ b/classes/bays/Recovery.m
@@ -6,6 +6,7 @@ classdef Recovery < Bay
         diameter    % [m] Diameter of the bay
         mass        % [kg] Total bay mass
         inertia     % [kg*m^2] Total bay inertia (Body reference)
+        xCg         % [m] Cg relative to bay upper side
     end
 
     properties(Access = protected)
diff --git a/classes/components/Fins.m b/classes/components/Fins.m
index bf20b06..c5b214d 100644
--- a/classes/components/Fins.m
+++ b/classes/components/Fins.m
@@ -3,6 +3,8 @@ classdef Fins < Component
     %   Detailed explanation goes here
 
     properties
+        mass                    double      % [kg] Fins mass 
+        xCg                     double      % [m] Cg from fins root chord tip
         rootChord               double      % [m] attached chord length
         freeChord               double      % [m] free chord length
         height                  double      % [m] fin heigth
diff --git a/classes/old/Control.m b/classes/old/Control.m
deleted file mode 100644
index 1a550e5..0000000
--- a/classes/old/Control.m
+++ /dev/null
@@ -1,33 +0,0 @@
-classdef Control < Config
-    % CONTROL Summary of this class goes here
-    %   Detailed explanation goes here
-
-    properties
-        multipleAB      logical     % If true, multiple and smooth airbrakes opening will be simulated
-        opening         double      % aerobrakes, 1-2-3 for 0%, 50% or 100% opened
-        deltaTime       double      % aerobrakes, configurations usage time
-        minTime         double      % [s] time after which the airbrakes can be used
-        maxMach         double      % [-] Maximum Mach at which airbrakes can be used
-        servoOmega      double      % [rad/s] Servo-motor angular velocity
-        height          double      % [m] Block airbrakes opening coordinate ( First entry must be 0! )
-    end
-
-    properties(Access = protected)
-        configName = 'controlConfig.m'
-        mission Mission
-        motor Motor
-    end
-
-    methods
-        function obj = Control(mission, motor)
-            arguments
-                mission Mission = Mission()
-                motor Motor = Motor()
-            end
-            obj.mission = mission;
-            obj.motor = motor;
-            if nargin == 0, return; end
-            obj.loadConfig();
-        end
-    end
-end
diff --git a/missions/2024_Lyra_Roccaraso_September/config/rocketConfig.m b/missions/2024_Lyra_Roccaraso_September/config/rocketConfig.m
index 5f16058..f8c35ee 100644
--- a/missions/2024_Lyra_Roccaraso_September/config/rocketConfig.m
+++ b/missions/2024_Lyra_Roccaraso_September/config/rocketConfig.m
@@ -3,11 +3,11 @@
 %% ROCKET - OVERRIDES BAYS CONFIG
 rocket = Rocket();
 
-rocket.length = NaN;        % [m]  OVERRIDE total length
-rocket.diameter = NaN;      % [m]  OVERRIDE diameter
-rocket.mass = NaN;          % [kg] OVERRIDE total mass
-rocket.massNoMotor = NaN;   % [kg] OVERRIDE mass without motor
-rocket.inertia = NaN;       % []   OVERRIDE total inertia
+rocket.length = [];        % [m]  OVERRIDE total length
+rocket.diameter = [];      % [m]  OVERRIDE diameter
+rocket.mass = [];          % [kg] OVERRIDE total mass
+rocket.massNoMotor = [];   % [kg] OVERRIDE mass without motor
+rocket.inertia = [];       % []   OVERRIDE total inertia
 
 %% NOSE
 nose = Nose();
@@ -86,6 +86,8 @@ boat.inertia = 0;
 %% FINS
 fins = Fins();
 
+fins.mass = 0;
+fins.xCg = 0;
 fins.rootChord = 0.30;                        % [m] attached chord length
 fins.freeChord = 0.14;                                       % [m] free chord length
 fins.height = 0.11;                                       % [m] fin heigth
-- 
GitLab