示例#1
0
        public void AccelerometerProcessorTest()
        {
            AccelerometerDataAnalysis processor = new AccelerometerDataAnalysis();

            for (int i = 0; i < 8000; i++)
            {
                processor.ProcessData(GenerateData());
            }

            processor.PerformFFTAnalysis();

            Console.WriteLine("X Values:");
            Console.WriteLine("\t" + processor.X_Magnitudes);

            Console.WriteLine("Y Values:");
            Console.WriteLine("\t" + processor.Y_Magnitudes);

            Console.WriteLine("Z Values:");
            Console.WriteLine("\t" + processor.Z_Magnitudes);
        }
示例#2
0
        public static void ConvertAccelData()
        {
            string filename = Path.Combine("Data", "Accelerometer.binary");
            string fileDir  = Path.Combine("Converted", "AccelerometerFreqAnalysis");

            Directory.CreateDirectory("Converted");

            DateTime initialTime       = DateTime.Now;
            DateTime currentTime       = DateTime.Now;
            bool     isInitialDateTime = true;
            bool     writeHeader       = true;

            int fileCounter    = 0; //current files found and navigated
            int newFileCounter = 0; //current number of files converted based on fileLineSize
            int prevSecond     = 0;
            int sampleIndex    = 0; // initialize to 0 but will increment to 1 right away. Compare using <=, rathter than <
            int sps            = 7999;
            int fileSent       = 1;

            long index         = 1;
            long fileLineIndex = 0; //tracks amount of lines in current file
            long count         = 0; //keep track of records
            long indexTracker  = 0; //tracks the current index of each line over multiple files


            const int fileLineSize = 1000000;

            string searchFile = $"{filename}{fileCounter++}";
            string resultFile = $"{fileDir}{newFileCounter++}.csv";

            StreamWriter sw = File.CreateText(resultFile);
            AccelerometerDataAnalysis processor   = new AccelerometerDataAnalysis();
            TemperatureModel          temperature = new TemperatureModel();

            //get all accel binary files
            while (File.Exists(searchFile))
            {
                using (FileStream fs = new FileStream(searchFile, FileMode.Open, FileAccess.Read))
                {
                    int accelBytes         = 12;
                    int rtcBytes           = 8;
                    int cpuBytes           = 8;
                    int accelSegmentLength = accelBytes + rtcBytes + cpuBytes;

                    byte[] bytes = new byte[accelBytes + rtcBytes + cpuBytes];

                    if (writeHeader)
                    {
                        string header = $"ID,Timestamp,Second,Temp (F),SPS{processor.GenerateCsvHeaders()}";

                        sw.WriteLine(header);
                        writeHeader = false;
                    }

                    while (fs.Read(bytes) != 0)
                    {
                        Span <byte> data         = bytes;
                        Span <byte> accelSegment = data.Slice(0, accelBytes);
                        Span <byte> rtcSegment   = data.Slice(accelBytes, rtcBytes);
                        Span <byte> cpuSegment   = data.Slice(accelBytes + rtcBytes, cpuBytes);

                        currentTime = new DateTime(BitConverter.ToInt64(rtcSegment));

                        if (isInitialDateTime)
                        {
                            prevSecond        = currentTime.Second;
                            initialTime       = currentTime;
                            isInitialDateTime = false;
                        }

                        //as long as the seconds match, get the data
                        if (prevSecond == currentTime.Second && sampleIndex <= sps)
                        {
                            //add data for each second
                            temperature.GetNextAverage(BitConverter.ToDouble(cpuSegment));
                            processor.ProcessData(accelSegment);
                        }
                        else
                        {
                            //perform analysis and send message on second change
                            processor.PerformFFTAnalysis();

                            //iterate second and append all data. Processor data should already have commas
                            string csvLine = $"{indexTracker++},{currentTime.ToString("HH:mm:ss")},{(currentTime - initialTime).TotalSeconds.ToString("F3")}," +
                                             $"{(int)temperature.AverageCPUTemp},{processor.SampleSize}{processor.X_Magnitudes}{processor.Y_Magnitudes}{processor.Z_Magnitudes}";

                            try
                            {
                                if (fileLineIndex >= fileLineSize)
                                {
                                    //generate new csv file
                                    fileLineIndex = 0;
                                    resultFile    = $"{fileDir}{newFileCounter++}.csv";

                                    sw.Flush();
                                    sw.Close();
                                    sw.Dispose();
                                    sw          = File.CreateText(resultFile);
                                    writeHeader = true;
                                }

                                sw.WriteLine(csvLine);
                                count++;
                                fileLineIndex++;
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine($"Failed to write!\n{ex.Message}\n{ex.StackTrace}");
                            }

                            //reset processor and temperature averge and begin new data set here
                            processor.Reset();
                            temperature.Reset();
                            temperature.GetNextAverage(BitConverter.ToDouble(cpuSegment));
                            processor.ProcessData(accelSegment);
                            sampleIndex = 1; //start at one since we already have added our next first datapoint
                        }
                        prevSecond = currentTime.Second;

                        data.Clear(); // since we are reusing this array, clear the values for integrity
                    }
                    Console.WriteLine($"Finished writing file #{fileSent++} at {indexTracker} total lines transmitted!");
                }
                sw.Flush();
                searchFile = $"{filename}{fileCounter++}";
            }
            sw.Dispose();

            using (var writer = LogFile.AppendText())
            {
                writer.WriteLine("-------------------------------------------------------------------------------");
                writer.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")} - Accelerometer Frequency Analysis Records converted: {count}");
                writer.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")} - Accelerometer Frequency Analysis Files found: {fileCounter}");
                writer.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")} - Accelerometer Frequency Analysis Converted Files created: {newFileCounter}");
                writer.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")} - Accelerometer Frequency Analysis TotalSeconds: {(currentTime - initialTime).TotalSeconds.ToString("F3")}");
                writer.WriteLine();
            }
        }