in LogViewer/LogViewer/Utilities/PX4BinaryLog.cs [250:431]
void GenerateLogEntryClass(LogEntryFMT fmt, TextWriter writer)
{
const string LogEntryPrefix = "LogEntry";
string className = LogEntryPrefix + fmt.Name;
writer.WriteLine("class " + className + " : LogEntry {");
writer.WriteLine(" public override string GetName() { return \"" + fmt.Name + "\"; }");
writer.WriteLine(" public override DataValue GetDataValue(string field) {");
writer.WriteLine(" switch (field) {");
bool hasTime = fmt.Columns.Contains("TimeMS");
string x = hasTime ? "this.TimeMS" : "0";
int i = 0;
foreach (var c in fmt.Columns)
{
writer.WriteLine(" case \"" + c + "\":");
switch (fmt.FormatString[i])
{
case 'n':
case 'N':
case 'Z':
writer.WriteLine(" return new DataValue() { X = " + x + ", Y = 0 };");
break;
default:
writer.WriteLine(" return new DataValue() { X = " + x + ", Y = this." + c + " };");
break;
}
i++;
}
writer.WriteLine(" }");
writer.WriteLine(" return null;");
writer.WriteLine(" }");
int k = 0;
int n = 0;
string format = fmt.FormatString;
for (k = 0, n = format.Length; k < n; k++)
{
char ch = format[k];
switch (ch)
{
case 'b':
writer.WriteLine(" public sbyte " + fmt.Columns[k] + ";");
break;
case 'B':
writer.WriteLine(" public byte " + fmt.Columns[k] + ";");
break;
case 'h':
writer.WriteLine(" public Int16 " + fmt.Columns[k] + ";");
break;
case 'H':
writer.WriteLine(" public UInt16 " + fmt.Columns[k] + ";");
break;
case 'i':
writer.WriteLine(" public Int32 " + fmt.Columns[k] + ";");
break;
case 'I':
writer.WriteLine(" public UInt32 " + fmt.Columns[k] + ";");
break;
case 'q':
writer.WriteLine(" public Int64 " + fmt.Columns[k] + ";");
break;
case 'Q':
writer.WriteLine(" public UInt64 " + fmt.Columns[k] + ";");
break;
case 'f':
writer.WriteLine(" public float " + fmt.Columns[k] + ";");
break;
case 'd':
writer.WriteLine(" public double " + fmt.Columns[k] + ";");
break;
case 'c':
writer.WriteLine(" public double " + fmt.Columns[k] + ";"); // divide by 100.0
break;
case 'C':
writer.WriteLine(" public double " + fmt.Columns[k] + ";"); // divide by 100.0
break;
case 'e':
writer.WriteLine(" public double " + fmt.Columns[k] + ";"); // divide by 100.0
break;
case 'E':
writer.WriteLine(" public double " + fmt.Columns[k] + ";"); // divide by 100.0
break;
case 'L':
writer.WriteLine(" public double " + fmt.Columns[k] + ";"); // divide by 10000000.0
break;
case 'n':
writer.WriteLine(" public string " + fmt.Columns[k] + ";");
break;
case 'N':
writer.WriteLine(" public string " + fmt.Columns[k] + ";");
break;
case 'M':
writer.WriteLine(" public byte " + fmt.Columns[k] + ";");
break;
case 'Z':
writer.WriteLine(" public string " + fmt.Columns[k] + ";");
break;
default:
writer.WriteLine(" // Unexpected format specifier '{0}'", ch);
break;
}
}
writer.WriteLine("");
writer.WriteLine(" public static " + className + " Read(BinaryReader reader) {");
writer.WriteLine(" " + className + " result = new " + className + "();");
for (k = 0, n = format.Length; k < n; k++)
{
char ch = format[k];
writer.Write(" result." + fmt.Columns[k] + " = ");
switch (ch)
{
case 'b':
writer.WriteLine("(sbyte)reader.ReadByte();");
break;
case 'B':
writer.WriteLine("reader.ReadByte();");
break;
case 'h':
writer.WriteLine("reader.ReadInt16();");
break;
case 'H':
writer.WriteLine("reader.ReadUInt16();");
break;
case 'i':
writer.WriteLine("reader.ReadInt32();");
break;
case 'I':
writer.WriteLine("reader.ReadUInt32();");
break;
case 'q':
writer.WriteLine("reader.ReadInt64();");
break;
case 'Q':
writer.WriteLine("reader.ReadUInt64();");
break;
case 'f':
writer.WriteLine("reader.ReadSingle();");
break;
case 'd':
writer.WriteLine("reader.ReadDouble();");
break;
case 'c':
writer.WriteLine("reader.ReadInt16() / 100.0;");
break;
case 'C':
writer.WriteLine("reader.ReadUInt16() / 100.0;");
break;
case 'e':
writer.WriteLine("reader.ReadInt32() / 100.0;");
break;
case 'E':
writer.WriteLine("reader.ReadUInt32() / 100.0;");
break;
case 'L':
writer.WriteLine("reader.ReadInt32() / 10000000.0;");
break;
case 'n':
writer.WriteLine("ReadAsciiString(reader, 4);");
break;
case 'N':
writer.WriteLine("ReadAsciiString(reader, 16);");
break;
case 'M':
writer.WriteLine("reader.ReadByte();");
break;
case 'Z':
writer.WriteLine("ReadAsciiString(reader, 64);");
break;
default:
break;
}
}
writer.WriteLine(" return result;");
writer.WriteLine(" }");
writer.WriteLine("}");
}