diff Discovery/Src/timer.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children f11f0bf6ef2d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Discovery/Src/timer.c	Sat Apr 28 11:52:34 2018 +0200
@@ -0,0 +1,161 @@
+///////////////////////////////////////////////////////////////////////////////
+/// -*- coding: UTF-8 -*-
+///
+/// \file   Discovery/Src/timer.c
+/// \brief  Contains timer related functionality like stopwatch and security stop
+/// \author Peter Ryser & heinrichs weikamp gmbh
+/// \date   5. Feb.2015 (maybe)
+///
+/// \details
+///
+/// $Id$
+///////////////////////////////////////////////////////////////////////////////
+/// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh
+///
+///     This program is free software: you can redistribute it and/or modify
+///     it under the terms of the GNU General Public License as published by
+///     the Free Software Foundation, either version 3 of the License, or
+///     (at your option) any later version.
+///
+///     This program is distributed in the hope that it will be useful,
+///     but WITHOUT ANY WARRANTY; without even the implied warranty of
+///     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+///     GNU General Public License for more details.
+///
+///     You should have received a copy of the GNU General Public License
+///     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//////////////////////////////////////////////////////////////////////////////
+
+#include "data_central.h"
+
+long stopWatchTime_Second = 0;
+_Bool bStopWatch = false;
+float stopWatchAverageDepth_Meter = 0.0f;
+long safetyStopCountDown_Second = 0;
+_Bool bSafetyStop = false;
+
+void timer_init(void)
+{
+  stopWatchTime_Second = 0;
+  stopWatchAverageDepth_Meter = 0.0f;
+  bStopWatch = true;
+  safetyStopCountDown_Second = 0;
+
+}
+
+void timer_UpdateSecond(_Bool checkOncePerSecond)
+{
+    static int last_second = -1;
+    static _Bool bSafetyStop = false;
+    static float last_depth_meter = 0;
+    //static _Bool CountDownStarted = false;
+    if(checkOncePerSecond)
+    {
+        int now =  current_second();
+        if( last_second == now)
+            return;
+        last_second = now;
+    }
+
+    /** Stopwatch **/
+    if(bStopWatch && stateUsed->lifeData.depth_meter > 1)
+    {
+        if((stopWatchTime_Second == 0) && (stateUsed->lifeData.dive_time_seconds >= 1))
+        {
+            stopWatchTime_Second = stateUsed->lifeData.dive_time_seconds - 1;
+            stopWatchAverageDepth_Meter = stateUsed->lifeData.average_depth_meter * (stopWatchTime_Second - 1) / stopWatchTime_Second;
+        }
+        else
+        {
+            stopWatchAverageDepth_Meter = (stopWatchAverageDepth_Meter * stopWatchTime_Second + stateUsed->lifeData.depth_meter)/ (stopWatchTime_Second + 1);
+            stopWatchTime_Second++;
+        }
+    }
+
+    /** SafetyStop **/
+    float depthToStopSafetyStopCount;
+    if(settingsGetPointer()->safetystopDuration && (stateUsed->lifeData.max_depth_meter > 10.0f) && (stateUsed->lifeData.dive_time_seconds > 60))
+    {
+
+        //No deco when 10 meters are crossed from below => Activate SecurityStop
+        if( last_depth_meter > 10.0f && stateUsed->lifeData.depth_meter <= 10.0f)
+        {
+            if(stateUsed->diveSettings.deco_type.ub.standard == GF_MODE)
+            {
+                if(stateUsed->decolistBuehlmann.output_ndl_seconds >  0)
+                    bSafetyStop = true;
+            }
+            else
+            {
+                if(stateUsed->decolistVPM.output_ndl_seconds >  0)
+                    bSafetyStop = true;
+            }
+        }
+
+        //Countdown starts at 5 meters
+        if(bSafetyStop && (stateUsed->lifeData.depth_meter - 0.0001f <= (settingsGetPointer()->safetystopDepth) ))
+        {
+            if(safetyStopCountDown_Second == 0)
+            {
+                safetyStopCountDown_Second = (settingsGetPointer()->safetystopDuration) * 60;
+            }
+            else
+                safetyStopCountDown_Second--;
+        }
+
+        // after safetystopDuration minutes or below 3 (2) meter safetyStop is disabled
+        if(settingsGetPointer()->safetystopDepth == 3)
+            depthToStopSafetyStopCount = 1.999f; // instead of 2
+        else
+            depthToStopSafetyStopCount = 2.999f;// instead of 3
+
+        if((safetyStopCountDown_Second == 1) || (stateUsed->lifeData.depth_meter <= depthToStopSafetyStopCount))
+        {
+            bSafetyStop = false;
+            safetyStopCountDown_Second = 0;
+        }
+    }
+    else
+    {
+        bSafetyStop = false;
+        safetyStopCountDown_Second = 0;
+    }
+    last_depth_meter = stateUsed->lifeData.depth_meter;
+}
+
+
+void timer_Stopwatch_Restart(void)
+{
+  stopWatchTime_Second = 1;
+  stopWatchAverageDepth_Meter = stateUsed->lifeData.depth_meter;
+  bStopWatch = true;
+}
+
+void timer_Stopwatch_Stop(void)
+{
+   bStopWatch = false;
+}
+
+long timer_Stopwatch_GetTime(void)
+{
+  return stopWatchTime_Second;
+}
+
+float timer_Stopwatch_GetAvarageDepth_Meter(void)
+{
+  return stopWatchAverageDepth_Meter;
+}
+
+long timer_Safetystop_GetCountDown(void)
+{
+  return safetyStopCountDown_Second;
+}
+
+uint8_t timer_Safetystop_GetDepthUpperLimit(void)
+{
+    if(settingsGetPointer()->safetystopDepth == 3)
+        return 2;
+    else
+        return 3;
+}
+