using System; using System.Text; using System.IO; using System.Threading; using Microsoft.SPOT; using Microsoft.SPOT.IO; using GHI.Processor; using GHI.IO.Storage; #if(USB_STORAGE) using GHI.Usb; using GHI.Usb.Host; #endif namespace IMULogger { public class EngrLogger { private static StringBuilder columnName = new StringBuilder(360); private static SDCard sdCard; private static StreamWriter logFileStreamWriter; private static FileStream logFileFileStream; public enum ColumnNums : int { //First the prefix for all records date = 0, time, accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z, mag_x, mag_y, mag_z, euler_x, euler_y, euler_z, quat_w, quat_x, quat_y, quat_z, linearAccel_x, linearAccel_y, linearAccel_z, gravity_x, gravity_y, gravity_z, temp, } //----------------------------------------------------------------------------------------------------------------- // Setup the header for the output data. //----------------------------------------------------------------------------------------------------------------- public static void init(string fileName) { sdCard = new SDCard(); sdCard.Mount(); bool fs_ready = false; RemovableMedia.Insert += (a, b) => { fs_ready = true; }; while (!fs_ready) { System.Threading.Thread.Sleep(1); } string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory; // Setup the FileStream for saving bytes logFileFileStream = new FileStream(rootDirectory + fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); //logFileFileStream = new FileStream(@fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); // setup the StreamWriter for saving text //logFileStreamWriter = new StreamWriter(rootDirectory + fileName, false); //logFileStreamWriter = new StreamWriter(logFileFileStream); logFileStreamWriter = new System.IO.StreamWriter(logFileFileStream); #region define and write header row columnName.Clear(); columnName.Append("Date"); columnName.Append("\t"); columnName.Append("Time"); columnName.Append("\t"); // Accelerometer columnName.Append("Accel X [m/s/s]"); columnName.Append("\t"); columnName.Append("Accel Y [m/s/s]"); columnName.Append("\t"); columnName.Append("Accel Z [m/s/s]"); columnName.Append("\t"); // Gyroscope columnName.Append("Gyro X [Deg/s]"); columnName.Append("\t"); columnName.Append("Gyro Y [Deg/s]"); columnName.Append("\t"); columnName.Append("Gyro Z [Deg/s]"); columnName.Append("\t"); // Magnetomter columnName.Append("Mag X [uT]"); columnName.Append("\t"); columnName.Append("Mag Y [uT]"); columnName.Append("\t"); columnName.Append("Mag Z [uT]"); columnName.Append("\t"); // Euler Angles columnName.Append("Euler X [Deg]"); columnName.Append("\t"); columnName.Append("Euler Y [Deg]"); columnName.Append("\t"); columnName.Append("Euler Z [Deg]"); columnName.Append("\t"); // Quaternions columnName.Append("Quat W [Na]"); columnName.Append("\t"); columnName.Append("Quat X [Na]"); columnName.Append("\t"); columnName.Append("Quat Y [Na]"); columnName.Append("\t"); columnName.Append("Quat Z [Na]"); columnName.Append("\t"); // Linear Acceleration columnName.Append("Linear Accel X [m/s/s]"); columnName.Append("\t"); columnName.Append("Linear Accel Y [m/s/s]"); columnName.Append("\t"); columnName.Append("Linear Accel Z [m/s/s]"); columnName.Append("\t"); // Gravity columnName.Append("Gravity X [m/s/s]"); columnName.Append("\t"); columnName.Append("Gravity Y [m/s/s]"); columnName.Append("\t"); columnName.Append("Gravity Z [m/s/s]"); columnName.Append("\t"); // Temperature columnName.Append("Temp [C]"); columnName.Append("\t"); #endregion // Save header information as human readable text logFileStreamWriter.WriteLine(columnName.ToString()); logFileStreamWriter.Flush(); // alternative flushing - more effective? //VolumeInfo.GetVolumes()[0].FlushAll(); //Debug.Print(columnName.ToString()); } //----------------------------------------------------------------------------------------------------------------- // Save sensor data - QUICK //----------------------------------------------------------------------------------------------------------------- private static StringBuilder dataString = new StringBuilder(512); //public static void saveDataQuickFloats(float[] sensorData) //{ // for(int i = 0; i< 23; i++) // { // logFileStreamWriter.Write(sensorData[i].ToString("f2")); // logFileStreamWriter.Write("\t"); // logFileStreamWriter.Flush(); // } //} //----------------------------------------------------------------------------------------------------------------- // Save sensor data as human readable text - use StreamWriter //----------------------------------------------------------------------------------------------------------------- public static void saveDataFloats(ref float[] sensorData) { dataString.Clear(); // Date and time dataString.Append(Real_Time_Clock.readClock()); dataString.Append("\t"); // Accelerometer dataString.Append(sensorData[0].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[1].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[2].ToString("f4")); dataString.Append("\t"); // Gyroscope dataString.Append(sensorData[3].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[4].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[5].ToString("f4")); dataString.Append("\t"); // Magnetometer dataString.Append(sensorData[6].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[7].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[8].ToString("f4")); dataString.Append("\t"); // Euler Angles dataString.Append(sensorData[9].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[10].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[11].ToString("f4")); dataString.Append("\t"); // Quaternions dataString.Append(sensorData[12].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[13].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[14].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[15].ToString("f4")); dataString.Append("\t"); // Linear Acceleration dataString.Append(sensorData[16].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[17].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[18].ToString("f4")); dataString.Append("\t"); // Gravity dataString.Append(sensorData[19].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[20].ToString("f4")); dataString.Append("\t"); dataString.Append(sensorData[21].ToString("f4")); dataString.Append("\t"); // Temperature dataString.Append(sensorData[22].ToString("f1")); //dataString.AppendLine(); // Output human readable text for debugging //Debug.Print(dataString.ToString()); // Save human readable text to SD card using StreamWriter logFileStreamWriter.WriteLine(dataString.ToString()); } //----------------------------------------------------------------------------------------------------------------- // Save sensor data as human readable text - use StreamWriter //----------------------------------------------------------------------------------------------------------------- public static void saveDataBytes(ref byte[] sensorData) { // save the data and time as text, add a tab, then save sensor readings as chain of bytes dataString.Clear(); // Date and time dataString.Append(Real_Time_Clock.readClock()); dataString.Append("\t"); logFileStreamWriter.WriteLine(dataString.ToString()); logFileStreamWriter.Flush(); logFileFileStream.Write(sensorData, 0, sensorData.Length); logFileFileStream.Flush(); } //---------------------------------------------------------------------------------------------------- // Method: Read data from SD card file //---------------------------------------------------------------------------------------------------- public static void close() { sdCard.Unmount(); sdCard.Dispose(); } } }