private void AnalysisVectorLength(EvaluationDataModel evaluationData, EvaluationResultModel evaluationResultModel)
        {
            var accelerometerList = evaluationData.AccelerometerSampleAnalysisList;
            var gyrometerList = evaluationData.GyrometerSampleAnalysisList;

            if (accelerometerList != null && accelerometerList.Count > 1 &&
                gyrometerList != null && gyrometerList.Count > 1)
            {
                int minListsCount = Math.Min(accelerometerList.Count, gyrometerList.Count);

                for (int i = 0; i < minListsCount; i++)
                {
                    // Vectorlength Accelerometer
                    TimeSpan currentTimeSpan = accelerometerList.ElementAt(i).MeasurementTime;
                    float currentAccelerometerX = accelerometerList.ElementAt(i).CoordinateX;
                    float currentAccelerometerY = accelerometerList.ElementAt(i).CoordinateY;
                    float currentAccelerometerZ = accelerometerList.ElementAt(i).CoordinateZ;
                    // In kartesischen Koordinaten kann die Länge von Vektoren nach dem Satz des Pythagoras berechnet werden.
                    float accelerometerVectorLength = Convert.ToSingle(Math.Sqrt(Math.Pow(currentAccelerometerX, 2d) + Math.Pow(currentAccelerometerY, 2) + Math.Pow(currentAccelerometerZ, 2)));

                    // Vectorlength Gyrometer
                    float currentGyrometerVelocityX = gyrometerList.ElementAt(i).VelocityX;
                    float currentGyrometerVelocityY = gyrometerList.ElementAt(i).VelocityY;
                    float currentGyrometerVelocityZ = gyrometerList.ElementAt(i).VelocityZ;
                    // In kartesischen Koordinaten kann die Länge von Vektoren nach dem Satz des Pythagoras berechnet werden.
                    float gyrometerVectorLength = Convert.ToSingle(Math.Sqrt(Math.Pow(currentGyrometerVelocityX, 2d) + Math.Pow(currentGyrometerVelocityY, 2) + Math.Pow(currentGyrometerVelocityZ, 2)));

                    evaluationResultModel.EvaluationResultList.Add(new EvaluationSample(currentTimeSpan, accelerometerVectorLength, gyrometerVectorLength));
                }
            }
        }
 private EvaluationResultModel Run(EvaluationDataModel evaluationData, EvaluationSettingModel evaluationSetting)
 {
     EvaluationResultModel evaluationResult = new EvaluationResultModel();
     AnalysisVectorLength(evaluationData, evaluationResult);
     AssumingAcceleromterSteps(evaluationResult, evaluationSetting);
     AssumingGyrometerSteps(evaluationResult, evaluationSetting);
     DetectSteps(evaluationResult, evaluationSetting);
     return evaluationResult;
 }
        private void AssumingAcceleromterSteps(EvaluationResultModel evaluationResultModel, EvaluationSettingModel evaluationSetting)
        {
            double accelerometerThreshold = evaluationSetting.AccelermeterVectorLengthThreshold;
            var evaluationList = evaluationResultModel.EvaluationResultList;

            if (evaluationList != null && evaluationList.Count > 2)
            {
                // detect Steps
                for (int i = 1; i < evaluationList.Count - 1; i++)
                {
                    double twicePreviousAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength;
                    double previousAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength;
                    double currentAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength;
                    double nextAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength;
                    double twiceNextAccelerometerVectorLength = evaluationList.ElementAt(i).AccelerometerVectorLength;

                    // is evaluation value not the first one && is evaluation value not the last one
                    if (i > 0)
                    {
                        previousAccelerometerVectorLength = evaluationList.ElementAt(i - 1).AccelerometerVectorLength;
                    }
                    if (i > 1)
                    {
                        twicePreviousAccelerometerVectorLength = evaluationList.ElementAt(i - 2).AccelerometerVectorLength;
	                }

                    if (i < evaluationList.Count - 1)
                    {
                        nextAccelerometerVectorLength = evaluationList.ElementAt(i + 1).AccelerometerVectorLength;
                    }
                    if (i < evaluationList.Count - 2)
                    {
                        twiceNextAccelerometerVectorLength = evaluationList.ElementAt(i + 2).AccelerometerVectorLength;
                    }

                    // Assume accelerometer step
                    if (// find peak
                        (currentAccelerometerVectorLength - previousAccelerometerVectorLength) * (currentAccelerometerVectorLength - nextAccelerometerVectorLength) > 0d &&
                        (currentAccelerometerVectorLength - twicePreviousAccelerometerVectorLength) * (currentAccelerometerVectorLength - twiceNextAccelerometerVectorLength) > 0d &&
                        // check threshold
                        currentAccelerometerVectorLength.CompareTo(accelerometerThreshold) > 0)
                    {
                        // Set assumed step
                        evaluationList.ElementAt(i).IsAssumedAccelerometerStep = true;
                    }
                }
            }
        }
        //##################################################################################################################################
        //################################################## Save Evaluation data ##########################################################
        //##################################################################################################################################

        internal static async Task SaveEvaluationDataToFileAsync(String filename, EvaluationResultModel evaluationResultModel)
        {
            if (filename != null && filename != String.Empty && evaluationResultModel.EvaluationResultList.Count > 0)
            {
                // convert data into byte array
                byte[] bytes = evaluationResultModel.ToEvaluationBytes();
                if (bytes != null && bytes.Length > 0)
                {
                    // find folder
                    StorageFolder folder = await FileService.FindStorageFolder(FileService.GetEvaluationPath());
                    // delete old evaluationData
                    await FileService.DeleteFileAsync(folder, filename);
                    // save byte array
                    await FileService.SaveBytesToEndOfFileAsync(bytes, folder, filename);
                }
            }
            return;
        }
        private void DetectSteps(EvaluationResultModel evaluationResultModel, EvaluationSettingModel evaluationSetting)
        {
            TimeSpan stepTimeDistence = evaluationSetting.StepDistance;
            TimeSpan assumedStepsPairingThreshold = evaluationSetting.PeakJoinDistance;
            
            var evaluationList = evaluationResultModel.EvaluationResultList;

            if (evaluationList != null && evaluationList.Count > 0)
            {
                // detect Steps
                for (int i = 0; i < evaluationList.Count; i++)
                {
                    // check timespan between to detected steps
                    if (evaluationList.ElementAt(i).MeasurementTime.Subtract(_lastKnownStep) > stepTimeDistence)
                    {
                        // Set assumed accelerometer step
                        if (evaluationList.ElementAt(i).IsAssumedAccelerometerStep)
                        {
                            lastAssumedAcclerometerStepTime = evaluationList.ElementAt(i).MeasurementTime;
                        }

                        // Set assumed gyrometer step
                        if (evaluationList.ElementAt(i).IsAssumedGyrometerStep)
                        {
                            lastAssumedGyrometerStepTime = evaluationList.ElementAt(i).MeasurementTime;
                        }

                        // Vergleichen der zuletzt gefundenen peaks
                        if (lastAssumedAcclerometerStepTime != TimeSpan.Zero &&
                            lastAssumedGyrometerStepTime != TimeSpan.Zero)
                        {
                            //Tritt ein, wenn der zuletzt vermutete Accelerometerschritt nach dem zuletzt vermuteten Gyrometerschritt liegt und kleiner als der Schwellwert ist.
                            //oder
                            //Tritt ein, wenn der zuletzt vermutete Acceleroemeterschritt vor dem zuletzt vermuteten Gyrometerschritt liegt und kleiner als der Schwellwert ist.
                            if ((lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) >= 0 &&
                                lastAssumedAcclerometerStepTime.Subtract(lastAssumedGyrometerStepTime) < assumedStepsPairingThreshold)
                                ||
                                (lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) < 0 &&
                                    lastAssumedGyrometerStepTime.Subtract(lastAssumedAcclerometerStepTime) < assumedStepsPairingThreshold))
                            {
                                evaluationList.ElementAt(i).IsDetectedStep = true;
                                _lastKnownStep = evaluationList.ElementAt(i).MeasurementTime;
                                lastAssumedGyrometerStepTime = TimeSpan.Zero;
                                lastAssumedAcclerometerStepTime = TimeSpan.Zero;
                            }

                            // Tritt ein, wenn der zuletzt vermutete Acceleroemeterschritt nach dem zuletzt vermuteten Gyrometerschritt liegt und größer als der Schwellwert ist.
                            else if (lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) > 0 &&
                                    lastAssumedAcclerometerStepTime.Subtract(lastAssumedGyrometerStepTime) > assumedStepsPairingThreshold)
                            {
                                // Setzt den vermuteten Gyrometerschritt auf null zurück, weil der pairing Schwellwert überschritten wurde.
                                lastAssumedGyrometerStepTime = TimeSpan.Zero;
                            }

                            //Tritt ein, wenn der zuletzt vermutete Acceleroemeterschritt vor dem zuletzt vermuteten Gyrometerschritt liegt und größer als der Schwellwert ist.
                            else if (lastAssumedAcclerometerStepTime.CompareTo(lastAssumedGyrometerStepTime) < 0 &&
                                    lastAssumedGyrometerStepTime.Subtract(lastAssumedAcclerometerStepTime) < assumedStepsPairingThreshold)
                            {
                                // Setzt den vermuteten Accelerometerschritt auf null zurück, weil der pairing Schwellwert überschritten wurde.
                                lastAssumedAcclerometerStepTime = TimeSpan.Zero;
                            }
                        }
                    }
                }
            }
        }
        //##################################################################################################################################
        //################################################## Save Evaluation data ##########################################################
        //##################################################################################################################################

        /// <summary>
        /// 
        /// </summary>
        /// <param name="evaluationResultModel"></param>
        /// <returns></returns>
        public static async Task AppendEvaluationDataToFileAsync(TaskArguments taskArguments, EvaluationResultModel evaluationResultModel)
        {
            if (taskArguments.IsUsedEvaluation && taskArguments.IsRecordSamplesEvaluation && 
                taskArguments.Filename != null && taskArguments.Filename != String.Empty && 
                evaluationResultModel.EvaluationResultList.Count > 0)
            {
                // convert data into byte array
                byte[] bytes = evaluationResultModel.ToEvaluationBytes();
                if (bytes != null && bytes.Length > 0)
                {
                    // find folder
                    StorageFolder folder = await FindStorageFolder(_evaluationPath);
                    // save byte array
                    await SaveBytesToEndOfFileAsync(bytes, folder, taskArguments.Filename);
                }
            }
            return;
        }