Exemple #1
0
        private void compareTable(PcmFile cmpPCM)
        {
            int id = findTableDataId(td, cmpPCM.tableDatas);

            if (id < 0)
            {
                Logger("Table not found");
                return;
            }
            TableData cmpTd = cmpPCM.tableDatas[id];
            int       row   = dataGridView1.Rows.Add();

            dataGridView1.Rows[row].HeaderCell.Value       = cmpPCM.FileName;
            dataGridView1.Rows[row].Cells["OS"].Value      = cmpPCM.OS;
            dataGridView1.Rows[row].Cells["Segment"].Value = cmpPCM.GetSegmentName(cmpTd.addrInt);
            int segNr = cmpPCM.GetSegmentNumber(cmpTd.addrInt);

            if (segNr > -1)
            {
                dataGridView1.Rows[row].Cells["PN"].Value    = cmpPCM.segmentinfos[segNr].PN;
                dataGridView1.Rows[row].Cells["Stock"].Value = cmpPCM.segmentinfos[segNr].Stock;
            }
            dataGridView1.Rows[row].Cells["Table Name"].Value    = cmpTd.TableName;
            dataGridView1.Rows[row].Cells["Table Address"].Value = cmpTd.Address;
            dataGridView1.Rows[row].Cells["Current Value"].Value = peekTableValues(id, cmpPCM);
            //dataGridView1.Rows[row].Height = 50;
        }
        public string seekTables(PcmFile PCM1)
        {
            PCM = PCM1;
            string retVal = "";

            try
            {
                PCM.foundTables = new List <FoundTable>();

                PCM.tableCategories = new List <string>();
                PCM.tableCategories.Add("_All");
                if (PCM.segmentinfos == null)
                {
                    return("");
                }
                for (int c = 0; c < PCM.segmentinfos.Length; c++)
                {
                    PCM.tableCategories.Add("Seg-" + PCM.segmentinfos[c].Name);
                }
                string fileName = Path.Combine(Application.StartupPath, "XML", "TableSeek-" + PCM.configFile + ".xml");
                if (fileName != tableSeekFile)
                {
                    tableSeekFile = fileName;
                    if (File.Exists(fileName))
                    {
                        Debug.WriteLine("Loading " + fileName);
                        System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(List <TableSeek>));
                        System.IO.StreamReader file = new System.IO.StreamReader(fileName);
                        tableSeeks = (List <TableSeek>)reader.Deserialize(file);
                        file.Close();
                    }
                    else
                    {
                        if (PCM.Segments[0].CS1Address.StartsWith("GM-V6"))
                        {
                            if (!PCM.tableCategories.Contains("Fuel"))
                            {
                                PCM.tableCategories.Add("Fuel");
                            }
                            tableSeeks = new List <TableSeek>();
                            TableSeek  ts = new TableSeek();
                            FoundTable ft = new FoundTable(PCM);

                            ft.Address     = PCM.v6VeTable.address.ToString("X8");
                            ft.addrInt     = PCM.v6VeTable.address;
                            ft.Rows        = (byte)PCM.v6VeTable.rows;
                            ft.Columns     = 17;
                            ft.configId    = 0;
                            ft.Name        = "VE";
                            ft.Category    = "Fuel";
                            ft.Description = "Volumetric Efficiency";
                            PCM.foundTables.Add(ft);

                            ts.Name        = "VE";
                            ts.Description = "Volumetric Efficiency";
                            ts.DataType    = InDataType.UWORD;
                            //ts.Bits = 16;
                            //ts.Floating = true;
                            ts.OutputType = OutDataType.Float;
                            ts.Decimals   = 6;
                            ts.Math       = "X*0.0002441406";
                            ts.Offset     = 0;
                            ts.SavingMath = "X/0.0002441406";
                            //ts.Signed = false;
                            ts.Category   = "Fuel";
                            ts.ColHeaders = "RPM 0,400,800,1200,1600,2000,2400,2800,3200,3600,4000,4400,4800,5200,5600,6000,6400, 6800";
                            if (ft.Rows == 15)
                            {
                                ts.RowHeaders = "kpa 0,10,20,30,40,50,60,70,80,90,100,110,120,130,140";
                            }
                            else
                            {
                                ts.RowHeaders = "kpa 20,30,40,50,60,70,80,90,100,110,120,130,140";
                            }
                            ts.RowMajor = false;
                            tableSeeks.Add(ts);

                            ft = new FoundTable(PCM);
                            HexToUint(PCM.mafAddress, out ft.addrInt);
                            ft.Address     = ft.addrInt.ToString("X8");
                            ft.Rows        = 81;
                            ft.Columns     = 1;
                            ft.configId    = 1;
                            ft.Name        = "MAF";
                            ft.Category    = "Fuel";
                            ft.Description = "Grams Per Second";
                            PCM.foundTables.Add(ft);

                            ts          = new TableSeek();
                            ts.DataType = InDataType.UWORD;
                            //ts.Bits = 16;
                            ts.Name       = "MAF";
                            ts.Math       = "X*0.0078125";
                            ts.SavingMath = "X/0.0078125";
                            //ts.Floating = true;
                            ts.OutputType = OutDataType.Float;
                            ts.Decimals   = 4;
                            //ts.Signed = false;
                            ts.Category   = "Fuel";
                            ts.Units      = "grams/s";
                            ts.RowHeaders = "1500,";
                            for (int rh = 1; rh < 82; rh++)
                            {
                                ts.RowHeaders += (1500 + rh * 125).ToString();
                                if (rh < 81)
                                {
                                    ts.RowHeaders += ",";
                                }
                            }
                            ts.ColHeaders  = "g/s";
                            ts.Description = "Grams Per Second";
                            ts.RowMajor    = false;
                            tableSeeks.Add(ts);

                            retVal += "OK";
                            return(retVal);
                        }
                        else
                        {
                            tableSeeks = new List <TableSeek>();
                            retVal    += "Configuration not found." + Environment.NewLine;
                            return(retVal);
                        }
                    }
                }
                for (int s = 0; s < tableSeeks.Count; s++)
                {
                    if (tableSeeks[s].SearchStr.Length == 0)
                    {
                        continue;   //Can't search if string is empty!
                    }
                    if (tableSeeks[s].Category != null && !PCM.tableCategories.Contains(tableSeeks[s].Category))
                    {
                        PCM.tableCategories.Add(tableSeeks[s].Category);
                    }
                    uint            startAddr = 0;
                    uint            endAddr   = PCM.fsize;
                    List <Block>    addrList  = new List <Block>();
                    SearchedAddress sAddr;
                    sAddr.Addr    = uint.MaxValue;
                    sAddr.Rows    = 0;
                    sAddr.Columns = 0;
                    Block block = new Block();
                    if (tableSeeks[s].Range != null && tableSeeks[s].Range.Length > 0)
                    {
                        string[] rangeS = tableSeeks[s].Range.Split(',');
                        for (int r = 0; r < rangeS.Length; r++)
                        {
                            string[] range = rangeS[r].Split('-');
                            if (range.Length != 2)
                            {
                                throw new Exception("Unknown address range:" + rangeS[r]);
                            }
                            if (HexToUint(range[0], out block.Start) == false)
                            {
                                throw new Exception("Unknown HEX code:" + range[0]);
                            }
                            if (HexToUint(range[1], out block.End) == false)
                            {
                                throw new Exception("Unknown HEX code:" + range[1]);
                            }
                            addrList.Add(block);
                        }
                    }
                    else if (tableSeeks[s].Segments != null && tableSeeks[s].Segments.Length > 0)
                    {
                        string[] segStrings = tableSeeks[s].Segments.Split(',');
                        for (int y = 0; y < segStrings.Length; y++)
                        {
                            int segNr = 0;
                            if (int.TryParse(segStrings[y], out segNr) == false)
                            {
                                throw new Exception("Unknown segment: " + segStrings[y]);
                            }
                            for (int b = 0; b < PCM.segmentAddressDatas[segNr].SegmentBlocks.Count; b++)
                            {
                                addrList.Add(PCM.segmentAddressDatas[segNr].SegmentBlocks[b]);
                            }
                        }
                    }
                    else
                    {
                        block.Start = 0;
                        block.End   = PCM.fsize;
                        addrList.Add(block);
                    }
                    int           hit           = 0;
                    ushort        wantedHit     = 1;
                    List <ushort> wantedHitList = new List <ushort>();
                    string[]      hParts        = tableSeeks[s].UseHit.Split(',');
                    for (int h = 0; h < hParts.Length; h++)
                    {
                        if (hParts[h].Contains("-"))
                        {
                            string[] hParts2 = hParts[h].Split('-');
                            //It's range, loop through all values
                            ushort hStart = 0;
                            ushort hEnd   = 1;
                            ushort.TryParse(hParts2[0], out hStart);
                            ushort.TryParse(hParts2[1], out hEnd);
                            for (ushort x = hStart; x <= hEnd; x++)
                            {
                                wantedHitList.Add(x);
                            }
                        }
                        else
                        {
                            //Single value
                            if (ushort.TryParse(hParts[h], out wantedHit))
                            {
                                wantedHitList.Add(wantedHit);
                            }
                        }
                    }

                    int wHit = 0;
                    for (int b = 0; b < addrList.Count; b++)
                    {
                        startAddr = addrList[b].Start;
                        endAddr   = addrList[b].End;
                        while (startAddr < PCM.fsize)
                        {
                            wantedHit = wantedHitList[wHit];
                            string[] ssParts = tableSeeks[s].SearchStr.Split('+');     //At end of string can be +D4 +1W6 etc, for reading next address from found addr
                            Debug.WriteLine("TableSeek: Searching: " + tableSeeks[s].SearchStr + ", Start: " + startAddr.ToString("X") + ", end: " + endAddr.ToString("X"));
                            sAddr = getAddrbySearchString(PCM, ssParts[0], ref startAddr, endAddr, tableSeeks[s].ConditionalOffset, tableSeeks[s].ValidationSearchStr);
                            for (int jump = 1; jump < ssParts.Length && sAddr.Addr < PCM.fsize; jump++)
                            {
                                //Read table address from address we found by searchstring
                                string numOnly     = ssParts[jump].Replace("+", "").Replace("D", "").Replace("W", "");
                                int    offset      = Convert.ToInt32(numOnly); //For first jump, use tableseek offset, for other jumps use searchstring offset
                                uint   currentAddr = (uint)(sAddr.Addr + offset);
                                Debug.WriteLine("seekTables: Reading new address from:" + currentAddr.ToString("X"));
                                if (ssParts[jump].Contains("D"))
                                {
                                    sAddr.Addr = (uint)(BEToUint32(PCM.buf, currentAddr));
                                }
                                else
                                {
                                    sAddr.Addr = (uint)(BEToUint16(PCM.buf, currentAddr));
                                }
                                Debug.WriteLine("seekTables: New address:" + sAddr.Addr.ToString("X"));
                            }

                            if (sAddr.Addr < PCM.fsize)
                            {
                                hit++;
                                Debug.WriteLine("Found: " + sAddr.Addr.ToString("X") + ", Hit: " + hit.ToString() + " of " + wantedHit);
                            }
                            if (hit == wantedHit && sAddr.Addr < PCM.fsize)
                            {
                                FoundTable ft = new FoundTable(PCM);
                                ft.configId    = s;
                                ft.Name        = tableSeeks[s].Name.Replace("£", (wHit + 1).ToString());
                                ft.Description = tableSeeks[s].Description.Replace("£", (wHit + 1).ToString());
                                ft.addrInt     = (uint)(sAddr.Addr + tableSeeks[s].Offset);
                                if (tableSeeks[s].Category != null && tableSeeks[s].Category != "")
                                {
                                    ft.Category = tableSeeks[s].Category;
                                }
                                else
                                {
                                    ft.Category = "Seg-" + PCM.GetSegmentName(ft.addrInt);
                                }
                                ft.Address = ft.addrInt.ToString("X8");
                                if (tableSeeks[s].Rows > 0)
                                {
                                    ft.Rows = tableSeeks[s].Rows;
                                }
                                else
                                {
                                    ft.Rows = sAddr.Rows;
                                }
                                if (tableSeeks[s].Columns > 0)
                                {
                                    ft.Columns = tableSeeks[s].Columns;
                                }
                                else
                                {
                                    ft.Columns = sAddr.Columns;
                                }
                                PCM.foundTables.Add(ft);
                                wHit++;
                            }
                            if (wHit >= wantedHitList.Count)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                var st = new StackTrace(ex, true);
                // Get the top stack frame
                var frame = st.GetFrame(st.FrameCount - 1);
                // Get the line number from the stack frame
                var line = frame.GetFileLineNumber();
                return("Table seek, line " + line + ": " + ex.Message);
            }
            retVal += "Done";
            return(retVal);
        }
        private TableSearchResult parseMatch(PcmFile PCM, TableSearchConfig.ParsedTableSearchConfig parsedConfig, TableSearchConfig tableSearchConfig, uint addr)
        {
            TableSearchResult tsr = new TableSearchResult();

            tsr.OS     = PCM.OS;
            tsr.File   = PCM.FileName;
            tsr.Search = parsedConfig.searchString;
            tsr.Name   = tableSearchConfig.Name;
            tsr.Found  = addr.ToString("X8") + ":";
            for (uint t = 0; t < parsedConfig.searchParts.Count; t++)
            {
                if (t > 0)
                {
                    tsr.Found += " ";
                }
                tsr.Found += PCM.buf[addr + t].ToString("X2");
            }
            if (tableSearchConfig.Items.Length > 0)
            {
                string[] items = tableSearchConfig.Items.Split(',');
                for (int p = 0; p < items.Length; p++)
                {
                    string[] itemParts = items[p].Split(':');
                    uint     location  = (uint)(addr + int.Parse(itemParts[1]));
                    if (itemParts.Length == 3)
                    {
                        SearchVariable SV = new SearchVariable();
                        SV.Name = itemParts[0];
                        if (itemParts[2].ToLower() == "e")
                        {
                            location += (uint)parsedConfig.searchParts.Count;
                        }
                        tsr.AddressInt = location;
                        tsr.Data       = SV.Name;
                        SV.Data        = ((location & 0xFF000000) >> 24).ToString("X2") + " " + ((location & 0xFF0000) >> 16).ToString("X2") + " " + ((location & 0xFF00) >> 8).ToString("X2") + " " + (location & 0xFF).ToString("X2");
                        searchVariables.Add(SV);
                    }
                    else
                    {
                        if (itemParts.Length != 4)
                        {
                            throw new Exception("item needs 4 parts: name:location:bytes:type, for example: rows:1:2:int");
                        }

                        if (itemParts[0].StartsWith("@"))
                        {
                            tsr.AddressInt = BEToUint32(PCM.buf, location);
                        }
                        if (tsr.Data != null && tsr.Data.Length > 1)
                        {
                            tsr.Data += "; ";
                        }
                        tsr.Data += itemParts[0] + ":";       //Item name

                        string formatString = "";
                        if (itemParts[3].ToLower() == "hex")
                        {
                            formatString = "X";
                        }
                        if (itemParts[2] == "1")
                        {
                            tsr.Data += PCM.buf[location].ToString(formatString);
                        }
                        if (itemParts[2] == "2")
                        {
                            tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString);
                        }
                        if (itemParts[2] == "4")
                        {
                            tsr.Data += BEToUint32(PCM.buf, location).ToString(formatString);
                        }
                        if (itemParts[2] == "8")
                        {
                            tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString);
                        }
                    }
                    tsr.Segment = PCM.GetSegmentName(tsr.AddressInt);
                }
            }
            if (parsedConfig.searchString.Contains(":"))
            {
                int k = 0;
                while (k < parsedConfig.searchParts.Count)
                {
                    if (parsedConfig.searchParts[k].Contains(":"))
                    {
                        string[] varParts = parsedConfig.searchParts[k].Split(':');
                        if (varParts.Length == 2)
                        {
                            //Set variable
                            SearchVariable SV = new SearchVariable();
                            SV.Name   = varParts[0];
                            tsr.Data += SV.Name;
                            int  bytes    = int.Parse(varParts[1]);
                            uint location = (uint)(addr + k);
                            tsr.AddressInt = location;
                            for (uint l = 0; l < bytes; l++)
                            {
                                SV.Data += PCM.buf[location + l].ToString("X2") + " ";
                            }
                            SV.Data = SV.Data.Trim();
                            searchVariables.Add(SV);
                        }
                        else
                        {
                            //Its's item, show it.
                            uint location = (uint)(addr + k);
                            if (varParts[0].ToLower().StartsWith("@"))
                            {
                                tsr.AddressInt = BEToUint32(PCM.buf, location);
                            }
                            if (varParts[0].ToLower().StartsWith("row"))
                            {
                                tsr.Rows = PCM.buf[location];
                            }
                            if (tsr.Data != null && tsr.Data.Length > 1)
                            {
                                tsr.Data += "; ";
                            }
                            tsr.Data += varParts[0] + ":";
                            string formatString = "";
                            if (varParts[2].ToLower() == "hex")
                            {
                                formatString = "X";
                            }
                            if (varParts[1] == "1")
                            {
                                tsr.Data += PCM.buf[location].ToString(formatString);
                            }
                            if (varParts[1] == "2")
                            {
                                tsr.Data += BEToUint16(PCM.buf, location).ToString(formatString);
                            }
                            if (varParts[1] == "4")
                            {
                                tsr.Data += BEToUint32(PCM.buf, location).ToString(formatString);
                            }
                            if (varParts[1] == "8")
                            {
                                tsr.Data += BEToUint64(PCM.buf, location).ToString(formatString);
                            }
                        }
                        for (int seg = 0; seg < PCM.Segments.Count; seg++)
                        {
                            for (int b = 0; b < PCM.segmentAddressDatas[seg].SegmentBlocks.Count; b++)
                            {
                                if (tsr.AddressInt >= PCM.segmentAddressDatas[seg].SegmentBlocks[b].Start && tsr.AddressInt <= PCM.segmentAddressDatas[seg].SegmentBlocks[b].End)
                                {
                                    tsr.Segment = PCM.segmentinfos[seg].Name;
                                }
                            }
                        }
                        k += int.Parse(varParts[1]) - 1;
                    }
                    k++;
                }
            }
            for (int o = 0; o < PCM.osAddressList.Count; o++)
            {
                if (PCM.osAddressList[o].address == tsr.AddressInt)
                {
                    tsr.Category = PCM.osAddressList[o].category;
                    tsr.Label    = PCM.osAddressList[o].label;
                    tsr.Size     = PCM.osAddressList[o].size;
                    break;
                }
            }

            TableSearchResult tsrNoFilter = new TableSearchResult();

            tsrNoFilter.AddressInt = tsr.AddressInt;
            tsrNoFilter.Address    = tsr.AddressInt.ToString("X8");
            tsrNoFilter.Data       = tsr.Data;
            tsrNoFilter.File       = tsr.File;
            tsrNoFilter.Found      = tsr.Found;
            tsrNoFilter.hitCount   = 1;
            tsrNoFilter.Name       = tsr.Name;
            tsrNoFilter.OS         = tsr.OS;
            tsrNoFilter.Search     = tsr.Search;
            tsrNoFilter.Segment    = tsr.Segment;
            tsrNoFilter.Rows       = tsr.Rows;
            tsrNoFilter.Category   = tsr.Category;
            tsrNoFilter.Label      = tsr.Label;
            tsrNoFilter.Size       = tsr.Size;

            tableSearchResultNoFilters.Add(tsrNoFilter);
            return(tsr);
        }