void GenerateLogEntryClass()

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

        }