From 6b93c9143105c4a4204824c60153a3d5aa04f868 Mon Sep 17 00:00:00 2001
From: Mauco03 <marco.gaibotti@skywarder.eu>
Date: Wed, 12 Feb 2025 22:43:02 +0100
Subject: [PATCH] [handle-value-conversion][Wind] Replaced WindCustom with Wind

---
 classes/@Rocket/Rocket.m                      | 10 ++-
 classes/bays/Airbrakes.m                      |  4 +-
 classes/misc/{WindCustom.m => Wind.m}         | 20 +++---
 classes/misc/WindMatlab.m                     | 62 -------------------
 functions/miscellaneous/singleGArun.m         |  2 +-
 functions/odeFunctions/ballistic.m            | 10 +--
 functions/odeFunctions/descentParachute.m     |  4 +-
 functions/odeFunctions/descentParafoil.m      |  2 +-
 functions/simulations/quickApogeeOnly.m       |  2 +-
 functions/simulations/stdAscent.m             |  2 +-
 functions/simulations/stdStability.m          |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       |  2 +-
 .../config/windConfig.m                       | 16 ++---
 .../config/windConfig.m                       |  2 +-
 21 files changed, 46 insertions(+), 108 deletions(-)
 rename classes/misc/{WindCustom.m => Wind.m} (90%)
 delete mode 100644 classes/misc/WindMatlab.m

diff --git a/classes/@Rocket/Rocket.m b/classes/@Rocket/Rocket.m
index 0e4be4a..8da0e3c 100644
--- a/classes/@Rocket/Rocket.m
+++ b/classes/@Rocket/Rocket.m
@@ -177,11 +177,19 @@ classdef Rocket < Config
         function obj = set.parafoil(obj, value), obj = obj.updateBay('PARAFOIL', value); end
         function obj = set.recovery(obj, value), obj = obj.updateBay('RECOVERY', value); end
         function obj = set.electronics(obj, value), obj = obj.updateBay('ELECTRONICS', value); end
-        function obj = set.airbrakes(obj, value), obj = obj.updateBay('AIRBRAKES', value); end
+        function obj = set.airbrakes(obj, value)
+            obj = obj.updateBay('AIRBRAKES', value); 
+            if ~isempty(obj.motor)
+                obj.AIRBRAKES.minTime = obj.motor.cutoffTime; 
+            end
+        end
         function obj = set.motor(obj, value)
             obj = obj.updateBay('MOTOR', value);
             obj.time = value.time;
             obj.cutoffTime = value.cutoffTime;
+            if ~isempty(obj.airbrakes)
+                obj.AIRBRAKES.minTime = obj.motor.cutoffTime; 
+            end
         end
         function obj = set.rear(obj, value), obj = obj.updateBay('REAR', value); end
 
diff --git a/classes/bays/Airbrakes.m b/classes/bays/Airbrakes.m
index 73495d5..b0e9823 100644
--- a/classes/bays/Airbrakes.m
+++ b/classes/bays/Airbrakes.m
@@ -39,7 +39,7 @@ classdef Airbrakes < Bay
     end 
 
     properties(SetAccess = ?Rocket, GetAccess = private)
-        minTime                         % [s] Minimum time since engine fire at which airbrakes can open
+        minTime = 0                     % [s] Minimum time since engine fire at which airbrakes can open
     end
 
     properties(SetAccess = private)
@@ -63,7 +63,7 @@ classdef Airbrakes < Bay
         end
 
         function obj = updateTime(obj)
-            if isempty(obj.deltaTime) || isempty(obj.minTime), return; end
+            if isempty(obj.deltaTime), return; end
             obj.time = cumsum(obj.deltaTime) + obj.minTime;
         end
     end
diff --git a/classes/misc/WindCustom.m b/classes/misc/Wind.m
similarity index 90%
rename from classes/misc/WindCustom.m
rename to classes/misc/Wind.m
index 9c927d0..109e646 100644
--- a/classes/misc/WindCustom.m
+++ b/classes/misc/Wind.m
@@ -1,8 +1,8 @@
-classdef WindCustom < Component
-% WindCustom: Represents Skyward's custom wind model.
+classdef Wind < Config
+% Wind: Represents Skyward's custom wind model.
 %
 %   Constructor:
-%       - WindCustom: Creates an instance of the WindCustom class.
+%       - Wind: Creates an instance of the Wind class.
 %           Loaded config: windConfig.m > windCustom
 %           Loaded data: -
 %           Arguments:
@@ -29,25 +29,23 @@ classdef WindCustom < Component
         magnitude
     end
     
-    properties(Access = protected)
+    properties(Constant, Access = protected)
         configName = 'windConfig.m'
         variableName = 'windCustom'
-        mission Mission 
     end
     
     methods
-        function obj = WindCustom(mission, varIn)
+        function obj = Wind(mission, varIn)
             arguments(Input)
                 mission Mission = Mission()
                 varIn = []
             end
-            obj@Component(mission, varIn);
-            obj.updateAll();
+            obj@Config(mission, varIn);
+            obj = obj.updateAll();
         end
 
         function [uw, vw, ww] = getVels(obj, z)
-            s = length(obj.altitudes);     % reference vectors length
-            if s==1
+            if isscalar(obj.altitudes)
                 uw = round( - obj.magnitude * cos(obj.azimuth) * cos(obj.elevation), 6);
                 vw = round( - obj.magnitude * sin(obj.azimuth) * cos(obj.elevation), 6);
                 ww = round( - obj.magnitude * (-sin(obj.elevation)), 6);
@@ -62,7 +60,7 @@ classdef WindCustom < Component
             end
         end
 
-        function updateAll(obj)
+        function obj = updateAll(obj)
             obj = obj.checkElevation();
 
             s = length(obj.altitudes);
diff --git a/classes/misc/WindMatlab.m b/classes/misc/WindMatlab.m
deleted file mode 100644
index 393a034..0000000
--- a/classes/misc/WindMatlab.m
+++ /dev/null
@@ -1,62 +0,0 @@
-classdef WindMatlab < Config
-% WindMatlab: Represents matlab wind variables.
-%
-%   Constructor:
-%       - WindMatlab: Creates an instance of the WindMatlab class.
-%           Loaded config: windConfig.m > windMatlab
-%           Loaded data: -
-%           Arguments:
-%               - mission: Mission, mission object
-%               - environment: Environment, used to get launch coordinates
-%               - varIn: (optional) config source. Alternative to config.m
-%               file
-    
-    properties
-        DayMin                                              % [d] Minimum Day of the launch
-        DayMax                                              % [d] Maximum Day of the launch
-        HourMin                                             % [h] Minimum Hour of the day
-        HourMax                                             % [h] Maximum Hour of the day
-        ww                                                  % [m/s] Vertical wind speed
-    end
-    
-    properties(Access = protected)
-        configName = 'windConfig.m'
-        variableName = 'windMatlab'
-        mission Mission 
-        environment Environment
-    end
-
-    methods
-        function obj = WindMatlab(mission, environment, varIn)
-            arguments(Input)
-                mission Mission = Mission()
-                environment Environment = Environment()
-                varIn = []
-            end
-            if nargin > 0 && nargin < 2, error('MATLAB:narginchk:notEnoughInputs', ...
-                    'Not enough input arguments.'); end
-            obj@Component(mission, varIn);
-            obj.environment = environment;
-        end
-
-        function [uw, vw, ww] = getVels(obj, z, t, Hour, Day)
-            h = z + obj.environment.z0;
-            if h < 0
-                h = 0;
-            end
-            
-            if nargin == 3
-                if obj.HourMin == obj.HourMax
-                    Day = obj.DayMin;
-                    Hour = obj.HourMin;
-                end
-            end
-            
-            Seconds = Hour*3600;
-            % horizontal wind
-            [uw,vw] = atmoshwm(obj.environment.lat0, obj.environment.lon0,h,'day',Day,...
-                'seconds',Seconds+t,'model','quiet','version','14');    % NED reference
-            ww = obj.ww;
-        end
-    end
-end
diff --git a/functions/miscellaneous/singleGArun.m b/functions/miscellaneous/singleGArun.m
index f30e478..e2ca504 100644
--- a/functions/miscellaneous/singleGArun.m
+++ b/functions/miscellaneous/singleGArun.m
@@ -6,7 +6,7 @@ arguments
     data_opt    struct
     rocket      Rocket
     environment Environment
-    wind        WindCustom
+    wind        Wind
     settings    Settings
     wrapper     DataWrapper
 end
diff --git a/functions/odeFunctions/ballistic.m b/functions/odeFunctions/ballistic.m
index cce9648..0e16abd 100644
--- a/functions/odeFunctions/ballistic.m
+++ b/functions/odeFunctions/ballistic.m
@@ -4,7 +4,7 @@ arguments
     Y
     rocket          Rocket
     environment     Environment
-    wind            % WindCustom {mustBeA(wind, {'WindCustom', 'WindMatlab'})}
+    wind            Wind
     control         struct = []
     t0              double = 0
     wrapper                = [] %DataWrapper = DataWrapper.empty
@@ -72,13 +72,7 @@ Q = [qw qx qy qz];
 Q = Q/norm(Q);
 
 %% ADDING WIND (supposed to be added in NED axes);
-switch class(wind)
-    case 'WindMatlab'
-        [uw, vw, ww] = wind.getVels(altitude, theta);
-    case 'WindCustom'
-        [uw, vw, ww] = wind.getVels(altitude);
-end
-
+[uw, vw, ww] = wind.getVels(altitude);
 dcm = quatToDcm(Q);
 windVels = dcm*[uw; vw; ww];
 
diff --git a/functions/odeFunctions/descentParachute.m b/functions/odeFunctions/descentParachute.m
index 6e3e77d..bbca96a 100644
--- a/functions/odeFunctions/descentParachute.m
+++ b/functions/odeFunctions/descentParachute.m
@@ -4,7 +4,7 @@ arguments
     Y
     rocket          Rocket
     environment     Environment
-    wind            % WindCustom {mustBeA(wind, {'WindCustom', 'WindMatlab'})}
+    wind            % Wind {mustBeA(wind, {'Wind', 'WindMatlab'})}
     descentData     struct
     wrapper                = [] %DataWrapper = DataWrapper.empty
     Q               = [1 0 0 0]
@@ -61,7 +61,7 @@ local = [environment.z0, environment.temperature, ...   % vector containing inpu
 switch class(wind)
     case 'WindMatlab'
         [uw, vw, ww] = wind.getVels(altitude, theta);
-    case 'WindCustom'
+    case 'Wind'
         [uw, vw, ww] = wind.getVels(altitude);
 end
 
diff --git a/functions/odeFunctions/descentParafoil.m b/functions/odeFunctions/descentParafoil.m
index 9deb592..ec73f32 100644
--- a/functions/odeFunctions/descentParafoil.m
+++ b/functions/odeFunctions/descentParafoil.m
@@ -4,7 +4,7 @@ arguments
     Y
     rocket      Rocket
     environment Environment
-    wind        % WindCustom {mustBeA(wind, {'WindCustom', 'WindMatlab'})}
+    wind        % Wind {mustBeA(wind, {'Wind', 'WindMatlab'})}
     descentData struct
     control     struct     = []
     t0          double     = 0
diff --git a/functions/simulations/quickApogeeOnly.m b/functions/simulations/quickApogeeOnly.m
index 7978ed8..f1bd167 100644
--- a/functions/simulations/quickApogeeOnly.m
+++ b/functions/simulations/quickApogeeOnly.m
@@ -2,7 +2,7 @@ function [apogee, maxAccel] = quickApogeeOnly(rocket, environment, wind, setting
 arguments
     rocket      Rocket
     environment Environment
-    wind        WindCustom
+    wind        Wind
     settings    Settings
     wrapper     = []; % DataWrapper (empty by default)
 end
diff --git a/functions/simulations/stdAscent.m b/functions/simulations/stdAscent.m
index cd89849..f0ef8d5 100644
--- a/functions/simulations/stdAscent.m
+++ b/functions/simulations/stdAscent.m
@@ -2,7 +2,7 @@ function [solution, ascent] = stdAscent(rocket, env, wind, settings, wrapper)
 arguments
     rocket      Rocket
     env         Environment
-    wind        WindCustom {mustBeA(wind, {'WindCustom', 'WindMatlab'})}
+    wind        Wind {mustBeA(wind, {'Wind', 'WindMatlab'})}
     settings    Settings
     wrapper     DataWrapper
 end
diff --git a/functions/simulations/stdStability.m b/functions/simulations/stdStability.m
index 7898fa5..bf03c01 100644
--- a/functions/simulations/stdStability.m
+++ b/functions/simulations/stdStability.m
@@ -2,7 +2,7 @@ function stabilityOut = stdStability(rocket, env, wind, settings, wrapper)
 arguments
     rocket      Rocket
     env         Environment
-    wind        WindCustom {mustBeA(wind, {'WindCustom', 'WindMatlab'})}
+    wind        Wind {mustBeA(wind, {'Wind', 'WindMatlab'})}
     settings    Settings
     wrapper     DataWrapper
 end
diff --git a/missions/2021_Lynx_Portugal_October/config/windConfig.m b/missions/2021_Lynx_Portugal_October/config/windConfig.m
index bba16a9..a2b384c 100644
--- a/missions/2021_Lynx_Portugal_October/config/windConfig.m
+++ b/missions/2021_Lynx_Portugal_October/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 200 2000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u", "u", "u"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2021_Lynx_Roccaraso_September/config/windConfig.m b/missions/2021_Lynx_Roccaraso_September/config/windConfig.m
index bba16a9..a2b384c 100644
--- a/missions/2021_Lynx_Roccaraso_September/config/windConfig.m
+++ b/missions/2021_Lynx_Roccaraso_September/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 200 2000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u", "u", "u"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2022_Pyxis_Portugal_October/config/windConfig.m b/missions/2022_Pyxis_Portugal_October/config/windConfig.m
index bba16a9..a2b384c 100644
--- a/missions/2022_Pyxis_Portugal_October/config/windConfig.m
+++ b/missions/2022_Pyxis_Portugal_October/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 200 2000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u", "u", "u"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2022_Pyxis_Roccaraso_September/config/windConfig.m b/missions/2022_Pyxis_Roccaraso_September/config/windConfig.m
index bba16a9..a2b384c 100644
--- a/missions/2022_Pyxis_Roccaraso_September/config/windConfig.m
+++ b/missions/2022_Pyxis_Roccaraso_September/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 200 2000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u", "u", "u"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2023_Gemini_Portugal_October/config/windConfig.m b/missions/2023_Gemini_Portugal_October/config/windConfig.m
index bba16a9..a2b384c 100644
--- a/missions/2023_Gemini_Portugal_October/config/windConfig.m
+++ b/missions/2023_Gemini_Portugal_October/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 200 2000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u", "u", "u"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2023_Gemini_Roccaraso_September/config/windConfig.m b/missions/2023_Gemini_Roccaraso_September/config/windConfig.m
index bba16a9..a2b384c 100644
--- a/missions/2023_Gemini_Roccaraso_September/config/windConfig.m
+++ b/missions/2023_Gemini_Roccaraso_September/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 200 2000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u", "u", "u"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2024_Lyra_Portugal_October/config/windConfig.m b/missions/2024_Lyra_Portugal_October/config/windConfig.m
index 48fd0be..28c8077 100644
--- a/missions/2024_Lyra_Portugal_October/config/windConfig.m
+++ b/missions/2024_Lyra_Portugal_October/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 10 150 500 1000 1500 2000 2500 3000 3500 4000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u","g", "g", "g", "g", "g", "g", "g", "g", "g", "g"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2024_Lyra_Roccaraso_September/config/windConfig.m b/missions/2024_Lyra_Roccaraso_September/config/windConfig.m
index 0f889ba..5e91be3 100644
--- a/missions/2024_Lyra_Roccaraso_September/config/windConfig.m
+++ b/missions/2024_Lyra_Roccaraso_September/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 10 500 900 1200];
 windCustom.magnitudeDistribution = ["u", "g", "g", "g", "g"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
diff --git a/missions/2025_Orion_Portugal_October/config/windConfig.m b/missions/2025_Orion_Portugal_October/config/windConfig.m
index 32bd11e..ec6df23 100644
--- a/missions/2025_Orion_Portugal_October/config/windConfig.m
+++ b/missions/2025_Orion_Portugal_October/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 140 500 1000 1500 2000 2500 3000 3500 4000];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["u", "g", "g", "g", "g", "g", "g", "g", "g", "g"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
@@ -26,10 +26,10 @@ windCustom.azimuthParameters = [270 270 270 280 270 260 260 240 240 240;
 % windCustom.azimuthParameters = [0 0; 359 359];
 %% MATLAB WIND MODEL
 
-windMatlab = WindMatlab();
-
-windMatlab.DayMin = 105;                                % [d] Minimum Day of the launch
-windMatlab.DayMax = 105;                                % [d] Maximum Day of the launch
-windMatlab.HourMin = 4;                                 % [h] Minimum Hour of the day
-windMatlab.HourMax = 4;                                 % [h] Maximum Hour of the day
-windMatlab.ww = 0;                                      % [m/s] Vertical wind speed
\ No newline at end of file
+% windMatlab = WindMatlab();
+% 
+% windMatlab.DayMin = 105;                                % [d] Minimum Day of the launch
+% windMatlab.DayMax = 105;                                % [d] Maximum Day of the launch
+% windMatlab.HourMin = 4;                                 % [h] Minimum Hour of the day
+% windMatlab.HourMax = 4;                                 % [h] Maximum Hour of the day
+% windMatlab.ww = 0;                                      % [m/s] Vertical wind speed
\ No newline at end of file
diff --git a/missions/2025_Orion_Roccaraso_September/config/windConfig.m b/missions/2025_Orion_Roccaraso_September/config/windConfig.m
index cd274da..31748d9 100644
--- a/missions/2025_Orion_Roccaraso_September/config/windConfig.m
+++ b/missions/2025_Orion_Roccaraso_September/config/windConfig.m
@@ -9,7 +9,7 @@
 
 %% CUSTOM WIND MODEL
 
-windCustom = WindCustom();
+windCustom = Wind();
 
 windCustom.altitudes = [0 500 900 1200];                    % [m] Altitudes at which a distribution change occurs
 windCustom.magnitudeDistribution = ["g", "g", "g", "g"];     % [-] Distribution type: "u" - uniform, "g" - gaussian
-- 
GitLab