using System; using Microsoft.SPOT; //using Microsoft.SPOT.Hardware; using Microsoft.SPOT.IO; using System.Text; using System.IO; using GHI.Premium.IO; namespace miniCPF { class Logger { private static StringBuilder columnNames = new StringBuilder(); private static PersistentStorage sdCard; private static VolumeInfo sdVol; private static FileStream logFile; private static StringBuilder sbTemp = new StringBuilder(256); private static StringBuilder sbWrite = new StringBuilder(256); private static StringBuilder sbPrefix = new StringBuilder(256); private static object loggerLock = new object(); private static byte[] writeArray = new byte[264]; private static DateTime timeNow; private static char token = '\t'; private static bool fileOpen = false; public enum ColumnNums : int { //After the date and time and current state goes the comment comment = 0, //Then the buoyancy control stuff pressure, platformLPFVel, platformDiffVel, platformLPFAcc, bellowsPosition, //Velocity PID stuff velPID_setPoint, velPID_PV, velPID_y1, velPID_y2, velPID_I, velPID_v, velPID_u, velPID_uCPS, //ADuC Stuff batteryBusVolts, batteryBusAmps, Amps12V, Amps33V, //GPS Stuff lat, lon, lastColumn, } public static void init() { //Column names need to be appended in the same order as ColumnNum enum above columnNames.Clear(); columnNames.Append("Date\tTime\tState\tComment\t"); columnNames.Append("Pressure\t"); columnNames.Append("Plat LPF Vel\tPlat Diff Vel\tPlat LPF Acc\t"); columnNames.Append("Bel Pos\t"); columnNames.Append("PID SP\tPID PV\ty1\ty2\tI\tv\tu\tuCPS\t"); columnNames.Append("Batt Volt\tBatt Cur\t12V Cur\t3.3V Cur\t"); columnNames.Append("Lat\tLon\r\n"); sdCard = new PersistentStorage("SD"); sdCard.MountFileSystem(); sdVol = new VolumeInfo("SD"); openFile(); lock (loggerLock) { logFile.Write(UTF8Encoding.UTF8.GetBytes(columnNames.ToString()), 0, columnNames.Length); } BTConsole.SendLine(columnNames); Debug.Print(columnNames.ToString()); sbTemp.Clear(); sbTemp.Append("File Name = "); sbTemp.Append(fileName.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Volume Total Size: "); sbTemp.Append(sdVol.TotalSize.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Volume Free Space: "); sbTemp.Append(sdVol.TotalFreeSpace.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID K = "); sbTemp.Append(configFile.KVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID Ti = "); sbTemp.Append(configFile.TiVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID Td = "); sbTemp.Append(configFile.TdVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID Tf = "); sbTemp.Append(configFile.TfVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID Tt = "); sbTemp.Append(configFile.TfVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID B = "); sbTemp.Append(configFile.BVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID uLow = "); sbTemp.Append(configFile.uLowVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID uHigh = "); sbTemp.Append(configFile.uHighVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } sbTemp.Clear(); sbTemp.Append("Vel PID h = "); sbTemp.Append(configFile.hVel.ToString()); lock (loggerLock) { write(ColumnNums.comment, getPrefix(sbTemp)); } } public static void write(params object[] values) { lock (loggerLock) { int lastValueIndex = values.Length - 1; sbWrite.Clear(); for (int columnNum = 0; columnNum < (int)ColumnNums.lastColumn; columnNum++) { for (int valueNum = 0; valueNum < lastValueIndex; valueNum = valueNum + 2) { if ((int)values[valueNum] == columnNum) { //TODO need to do a better job formatting values to minimize length if (columnNum == (int)ColumnNums.comment) sbWrite.Append(values[valueNum + 1].ToString()); else sbWrite.Append(((double)values[valueNum + 1]).ToString("f6")); break; } } sbWrite.Append(token); } Debug.Print(sbWrite.ToString()); sbWrite.AppendLine(); Array.Clear(writeArray, 0, writeArray.Length); Array.Copy(UTF8Encoding.UTF8.GetBytes(sbWrite.ToString()), writeArray, sbWrite.Length); logFile.Write(writeArray, 0, Array.IndexOf(writeArray, 0)); BTConsole.SendLine(sbWrite); } } private static void printVolInfo() { sbTemp.Clear(); sbTemp.Append("Volume Total Size: "); sbTemp.Append(sdVol.TotalSize.ToString()); lock (loggerLock) { write(ColumnNums.comment, sbTemp); } sbTemp.Clear(); sbTemp.Append("Volume Free Space: "); sbTemp.Append(sdVol.TotalFreeSpace.ToString()); lock (loggerLock) { write(ColumnNums.comment, sbTemp); } //String[] fileNames = Directory.GetFiles(sdVol.RootDirectory); //for (int i = 0; i < fileNames.Length; i++) //{ // FileInfo fileInfo = new FileInfo(fileNames[i]); // Debug.Print(i.ToString() + " File name: " + fileNames[i] // + " Creation Date = " + fileInfo.CreationTime.ToString() // + " Length = " + fileInfo.Length.ToString()); //} } public static void closeFile() { if (fileOpen) logFile.Close(); fileOpen = false; } public static StringBuilder fileName = new StringBuilder(128); public static void openFile() { if (fileOpen) closeFile(); timeNow = DateTime.Now; fileName.Clear(); fileName.Append(sdVol.RootDirectory); fileName.Append("\\"); fileName.Append(timeNow.Year.ToString()); fileName.Append("-"); fileName.Append(timeNow.Month.ToString()); fileName.Append("-"); fileName.Append(timeNow.Day.ToString()); fileName.Append("T"); fileName.Append(timeNow.Hour.ToString()); fileName.Append("-"); fileName.Append(timeNow.Minute.ToString()); fileName.Append("-"); fileName.Append(timeNow.Second.ToString()); logFile = new FileStream(fileName.ToString(), FileMode.OpenOrCreate, FileAccess.Write); fileOpen = true; } public static void unMount() { sdCard.UnmountFileSystem(); } public static StringBuilder getPrefix(StringBuilder comment) { timeNow = DateTime.Now; sbPrefix.Clear(); sbPrefix.Append(timeNow.ToString("MMM dd, yyyy")); sbPrefix.Append(token); sbPrefix.Append(timeNow.ToString("HH:mm:ss.fff")); sbPrefix.Append(token); sbPrefix.Append(Program.sbStateNames[(int)Program.CPFState]); sbPrefix.Append(Program.stateSuffix); sbPrefix.Append(token); sbPrefix.Append(comment); return (sbPrefix); } public static StringBuilder getPrefix(String comment) { timeNow = DateTime.Now; sbPrefix.Clear(); sbPrefix.Append(timeNow.ToString("MMM dd, yyyy")); sbPrefix.Append(token); sbPrefix.Append(timeNow.ToString("HH:mm:ss.fff")); sbPrefix.Append(token); sbPrefix.Append(Program.sbStateNames[(int)Program.CPFState]); sbPrefix.Append(Program.stateSuffix); sbPrefix.Append(token); sbPrefix.Append(comment); return (sbPrefix); } } }