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 { class EngrLogger { //create SDCard object; private static SDCard sdCard = new SDCard(); // create FileStream to represent the logfile private static FileStream logFile; // create new string builder for header information private static StringBuilder columnName = new StringBuilder(360); //----------------------------------------- // Initialize the logger //------------------------------------------ public static void init(string fileName) { #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.AppendLine(); #endregion // Output human readable text for debugging //Debug.Print(columnName.ToString()); sdCard.Mount(); // Assume only one storage device is available // and that the media is formatted string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory; logFile = new FileStream(rootDirectory + fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite); // Encode the data byte[] data = Encoding.UTF8.GetBytes(columnName.ToString()); // Write the data to the FileStream logFile.Write(data, 0, data.Length); //logFile.Close(); // flush the volume to ensure all data is writtent to media VolumeInfo.GetVolumes()[0].FlushAll(); // Unmount when done //sdCard.Unmount(); } // create new string builder for saving sensor data to SD card private static StringBuilder dataString = new StringBuilder(512); //----------------------------------------- // Save sensor data to SD //------------------------------------------ public static void saveData(string fileName, float[] sensorData) { //sdCard.Mount(); //bool fs_ready = false; //RemovableMedia.Insert += (a, b) => //{ // fs_ready = true; //}; //while (!fs_ready) //{ // System.Threading.Thread.Sleep(1); //} dataString.Clear(); #region Define Output Format // Date and time dataString.Append(Real_Time_Clock.readClock()); dataString.Append("\t"); // Accelerometer dataString.Append(sensorData[0].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[1].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[2].ToString("f3")); dataString.Append("\t"); // Gyroscope dataString.Append(sensorData[3].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[4].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[5].ToString("f3")); dataString.Append("\t"); // Magnetometer dataString.Append(sensorData[6].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[7].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[8].ToString("f3")); dataString.Append("\t"); // Euler Angles dataString.Append(sensorData[9].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[10].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[11].ToString("f3")); dataString.Append("\t"); // Quaternions dataString.Append(sensorData[12].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[13].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[14].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[15].ToString("f3")); dataString.Append("\t"); // Linear Acceleration dataString.Append(sensorData[16].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[17].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[18].ToString("f3")); dataString.Append("\t"); // Gravity dataString.Append(sensorData[19].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[20].ToString("f3")); dataString.Append("\t"); dataString.Append(sensorData[21].ToString("f3")); dataString.Append("\t"); // Temperature dataString.Append(sensorData[22].ToString("f3")); dataString.AppendLine(); #endregion // Output human readable text for debugging //Debug.Print(dataString.ToString()); // Assume only one storage device is available // and that the media is formatted //string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory; //FileStream logFile = new FileStream(rootDirectory + fileName, FileMode.Append, FileAccess.Write); // Encode the data byte[] data = Encoding.UTF8.GetBytes(dataString.ToString()); // Write the data to the FileStream logFile.Write(data, 0, data.Length); //logFile.Close(); // flush the volume to ensure all data is writtent to media VolumeInfo.GetVolumes()[0].FlushAll(); // Unmount when done //sdCard.Unmount(); } //----------------------------------------- // Show files in the Root Directory //------------------------------------------ public static void getDirectory() { // ... // assume SD Card is inserted // Create a new storage device // NETMF only allows one SD card // to be supported at the same time. //sdCard = new SDCard(); // this is a non-blocking call // it fires the RemovableMedia.Insert event after // the mount is finished. //sdCard.Mount(); // for some cases, a simple sleep might suffice // This example just waits on the event before proceeding // (After first time firing of the event, you may want // to disable the handler or re-assign it //bool fs_ready = false; //RemovableMedia.Insert += (a, b) => //{ // fs_ready = true; //}; //while (!fs_ready) //{ // System.Threading.Thread.Sleep(50); //} // Assume one storage device is available, access it through // NETMF and display the available files and folders: Debug.Print("Getting files and folders:"); if (VolumeInfo.GetVolumes()[0].IsFormatted) { string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory; string[] files = Directory.GetFiles(rootDirectory); string[] folders = Directory.GetDirectories(rootDirectory); Debug.Print("Files available on " + rootDirectory + ":"); for (int i = 0; i < files.Length; i++) Debug.Print(files[i]); Debug.Print("Folders available on " + rootDirectory + ":"); for (int i = 0; i < folders.Length; i++) Debug.Print(folders[i]); } else { Debug.Print("Storage is not formatted. " + "Format on PC with FAT32/FAT16 first!"); } // flush the volume to ensure all data is writtent to media VolumeInfo.GetVolumes()[0].FlushAll(); // Unmount when done sdCard.Unmount(); } //--------------------------------------------------- // Read information from a text file in SD directory //--------------------------------------------------- public static void fileRead( string fileName) { // ... If desired, check if SD is inserted // SD Card is inserted // Create a new storage device //sdCard = new SDCard(); // MIGHT NOT NEED // Mount the file system //sdCard.Mount(); //bool fs_ready = false; //RemovableMedia.Insert += (a, b) => //{ // fs_ready = true; //}; //while (!fs_ready) //{ // System.Threading.Thread.Sleep(1); //} sdCard.Mount(); // Assume one storage device is available, // access it through NETMF string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory; logFile = new FileStream(rootDirectory + fileName, FileMode.Open, FileAccess.Read); byte[] data = new byte[100]; int read_count = logFile.Read(data, 0, data.Length); logFile.Close(); Debug.Print("The size of data read is: " + read_count.ToString()); Debug.Print("Data from file:"); Debug.Print(new string(Encoding.UTF8.GetChars(data), 0, read_count)); VolumeInfo.GetVolumes()[0].FlushAll(); sdCard.Unmount(); } } }