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