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); }
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(); } }