From 44617c524432e4ba0e31d9b2eea71674a3d02e7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Federico=20Disar=C3=B2?= <federico.disaro@skywarder.eu>
Date: Thu, 15 Feb 2024 21:11:14 +0100
Subject: [PATCH]  [SFD] Added single spike fault

---
 .../sensors/Sensor_with_fault_sim.m           | 15 +++++++++++++-
 .../initSensorsGemini_Portugal_October_2023.m | 20 ++++++++++++++-----
 simulator/configs/configFaults.m              |  2 ++
 simulator/configs/config_sfd_hr.m             |  2 +-
 simulator/src/sensor_plots.m                  |  3 ++-
 5 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/commonFunctions/sensors/Sensor_with_fault_sim.m b/commonFunctions/sensors/Sensor_with_fault_sim.m
index 78b3c0b5..df90bce7 100644
--- a/commonFunctions/sensors/Sensor_with_fault_sim.m
+++ b/commonFunctions/sensors/Sensor_with_fault_sim.m
@@ -129,6 +129,13 @@ classdef Sensor_with_fault_sim < handle
                     if obj.settings.calerr
                         sensorData(i) = sensorData(i)*obj.gain;
                     end
+                    if obj.settings.ss
+                        if sensorData(i) == obj.value
+                            obj.settings.ss = false;
+                        else
+                            sensorData(i) = obj.value;
+                        end
+                    end
                     if obj.settings.fs
                         if rand > (1 - obj.likelihoodFS)
                             sensorData(i) = obj.value;
@@ -185,7 +192,12 @@ classdef Sensor_with_fault_sim < handle
             obj.gain = gain;
             obj.settings.calerr = true;
         end
-    
+        
+        function obj = setSingleSpike(obj, value)
+            obj.value = value;
+            obj.settings.ss = true;
+        end
+        
         function obj = setFixedSpiking(obj, value, likelihood)
             if (likelihood > 0 && likelihood  < 1)
                 obj.value = value;
@@ -380,6 +392,7 @@ classdef Sensor_with_fault_sim < handle
                 obj.settings.degradation = false;
                 obj.settings.freezing = false;
                 obj.settings.calerr = false;
+                obj.settings.ss = false;
                 obj.settings.fs = false;
                 obj.settings.is = false;
     
diff --git a/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m b/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m
index 71621e87..156f11e2 100644
--- a/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m
+++ b/data/Gemini_Portugal_October_2023/initSensorsGemini_Portugal_October_2023.m
@@ -16,7 +16,7 @@ sensorSettings.barometer1.noiseVariance        =   0.1;                     % mb
 
 if settings.montecarlo && settings.montecarlo_only_fault_sim
 
-    sensorSettings.barometer2.fault_time = settings_mont.fault.time(1);
+    sensorSettings.barometer1.fault_time = settings_mont.fault.time(1);
     
     switch  settings_mont.fault.type(1)
         case 1
@@ -30,15 +30,14 @@ if settings.montecarlo && settings.montecarlo_only_fault_sim
             [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds
         case 4
             sensorSettings.barometer1.setDrift( settings_mont.fault.amp(1) );
-            [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds
-    
+            [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds            
         otherwise
     end
 
 else
 
     sensorSettings.barometer1.fault_time = -1; %if negative it will be generated at random between a max and a min value
-    sensorSettings.barometer1.max_fault_time = 96; %max seconds to wait before possible fault
+    sensorSettings.barometer1.max_fault_time = 16; %max seconds to wait before possible fault
     sensorSettings.barometer1.min_fault_time = 6; %min seconds to wait before possible fault
     
     % fault generation
@@ -58,7 +57,10 @@ else
             drift_value_1 = round( settings.fault_sim.min_drift_value + rand()*settings.fault_sim.max_drift_value );
             sensorSettings.barometer1.setDrift(drift_value_1);
             [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds
-    
+        case "sSpike"
+            value_1 = 1e5;
+            sensorSettings.barometer1.setSingleSpike(value_1);
+            [sensorSettings.barometer1, fault_time_1] = sensorSettings.barometer1.setErrorTime(); % in seconds
         otherwise
     end
 
@@ -116,6 +118,10 @@ else
             drift_value_2 = round( settings.fault_sim.min_drift_value + rand()*settings.fault_sim.max_drift_value );
             sensorSettings.barometer2.setDrift(drift_value_2);
             [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds
+        case "sSpike"
+            value_2 = 1e5;
+            sensorSettings.barometer2.setSingleSpike(value_2);
+            [sensorSettings.barometer2, fault_time_2] = sensorSettings.barometer2.setErrorTime(); % in seconds
         otherwise
     end
 
@@ -176,6 +182,10 @@ else
             drift_value_3 = round( settings.fault_sim.min_drift_value + rand()*settings.fault_sim.max_drift_value  );
             sensorSettings.barometer3.setDrift(drift_value_3);
             [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds
+        case "sSpike"
+            value_3 = 1e5;
+            sensorSettings.barometer3.setSingleSpike(value_3);
+            [sensorSettings.barometer3, fault_time_3] = sensorSettings.barometer3.setErrorTime(); % in seconds
         otherwise
     end
 
diff --git a/simulator/configs/configFaults.m b/simulator/configs/configFaults.m
index 9e915f63..3971f284 100644
--- a/simulator/configs/configFaults.m
+++ b/simulator/configs/configFaults.m
@@ -59,6 +59,8 @@ else % fault generation is done randomly between a set of parameters in configfa
                 settings.fault_sim.fault_type(rand_sensor) = "freezing";
             case 4
                 settings.fault_sim.fault_type(rand_sensor) = "drift";
+            case 5
+                settings.fault_sim.fault_type(rand_sensor) = "sSpike";
         end
     end
 end
diff --git a/simulator/configs/config_sfd_hr.m b/simulator/configs/config_sfd_hr.m
index a8a7cf23..9404cc0d 100644
--- a/simulator/configs/config_sfd_hr.m
+++ b/simulator/configs/config_sfd_hr.m
@@ -1,6 +1,6 @@
 
 %% settings parameters for SFD_HR algorithm
-settings.flagSFD_HR = true;
+settings.flagSFD_HR = false;
 
 % number of consecutive constant values after which a sensor is labled frozen
 settings.sfd_hr.n_freeze = 5;
diff --git a/simulator/src/sensor_plots.m b/simulator/src/sensor_plots.m
index 59246920..79c21996 100644
--- a/simulator/src/sensor_plots.m
+++ b/simulator/src/sensor_plots.m
@@ -18,7 +18,8 @@ xline( [simOutput.sensors.ada.t_apogee], '-', {'ADA apogee detection'}, 'HandleV
 xline( [simOutput.apogee.time], '-', {'SIMULATION apogee time'}, 'HandleVisibility','off' );
 
 legend
-title('Barometer measurements')
+xlabel('Time (s)')
+ylabel('Pressure (Pa)')
 
 %% static pitot vs static presure
 figure
-- 
GitLab