private TimeSpan GoingUp(ZH_L16 algorithm, ref Collection<DiveSegment> divetable, int runTime, double depth, WayPoint waypoint) { var ascdescTime = new TimeSpan(); double minDepthAscent = algorithm.MinDepthAscent(CalcGradient(firstDecoDepth, depth, pref)); //// No deco needed if (minDepthAscent <= waypoint.Depth) { algorithm.AscendDecsend(depth, waypoint.Depth, pref.AscRate); ascdescTime = CalcAscDescTime(depth - waypoint.Depth, pref.AscRate); int timespent = TimeHelper.MinutesRoundedUp(ascdescTime); double cns = CentralNervousSystem.AscendDescend(algorithm.ActiveGas, depth, waypoint.Depth, Math.Abs(pref.AscRate)); double otu = OxygenToxicityUnit.AscendDescend(algorithm.ActiveGas, depth, waypoint.Depth, Math.Abs(pref.AscRate)); // Round to complete minute double diffTime = Math.Abs(ascdescTime.TotalMinutes - timespent); double diffDepth = CalcHalfWayDepth(depth, waypoint.Depth); algorithm.AddRunTimeInMinutes(diffTime, diffDepth); ascdescTime = TimeSpan.FromMinutes(timespent); cns += CentralNervousSystem.ConstantDepth(algorithm.ActiveGas, diffDepth, diffTime); otu += OxygenToxicityUnit.ConstantDepth(algorithm.ActiveGas, diffDepth, diffTime); var seg = new DiveSegment(waypoint.Depth, ascdescTime, DiveState.Ascend, runTime, runTime + timespent, algorithm.ActiveGas, cns, otu); Logger.Trace("Calc => Segment:" + seg); divetable.Add(seg); } else { ascdescTime = GotoDecoDepth(algorithm, depth, waypoint.Depth, runTime, ref divetable, out depth); runTime += TimeHelper.MinutesRoundedUp(ascdescTime); if (Math.Abs(depth - waypoint.Depth) > 0.001) { TimeSpan decoTime = DoDeco(algorithm, depth, waypoint.Depth, runTime, ref divetable); ascdescTime += decoTime; } } return ascdescTime; }
private TimeSpan GoingDown(ZH_L16 algorithm, ref Collection<DiveSegment> divetable, int runTime, double currentDepth, WayPoint waypoint) { algorithm.AscendDecsend(currentDepth, waypoint.Depth, pref.DescRate); TimeSpan ascdescTime = CalcAscDescTime(waypoint.Depth - currentDepth, pref.DescRate); int timespent = TimeHelper.MinutesRoundedUp(ascdescTime); double cns = CentralNervousSystem.AscendDescend(algorithm.ActiveGas, currentDepth, waypoint.Depth, Math.Abs(pref.DescRate)); double otu = OxygenToxicityUnit.AscendDescend(algorithm.ActiveGas, currentDepth, waypoint.Depth, Math.Abs(pref.DescRate)); // Round to complete minute double diffTime = Math.Abs(ascdescTime.TotalMinutes - timespent); double diffDepth = CalcHalfWayDepth(currentDepth, waypoint.Depth); if (Math.Abs(diffTime - 0) > 0.001) { algorithm.AddRunTimeInMinutes(diffTime, diffDepth); ascdescTime = TimeSpan.FromMinutes(timespent); cns += CentralNervousSystem.ConstantDepth(algorithm.ActiveGas, diffDepth, diffTime); otu += OxygenToxicityUnit.ConstantDepth(algorithm.ActiveGas, diffDepth, diffTime); } var seg = new DiveSegment(waypoint.Depth, ascdescTime, DiveState.Desend, runTime, runTime + timespent, algorithm.ActiveGas, cns, otu); Logger.Trace("Calc => Segment:" + seg); divetable.Add(seg); return ascdescTime; }