private int CheckAgainstAirmassLimiters(SymbolCollection symbols, string filename, int rpm, int requestedairmass, bool autogearbox, ref limitType AirmassLimiter)
{
//AirmassLimiter = limitType.None;
//Y axis = BstKnkCal.n_EngYSP needed for interpolation (16)
//X axis = BstKnkCal.OffsetXSP needed for length (16)
// check against BstKnkCal.MaxAirmass
int cols = GetSymbolLength(symbols, "BstKnkCal.OffsetXSP") / 2;
int rows = GetSymbolLength(symbols, "BstKnkCal.n_EngYSP") / 2;
// only the right-most column (no knock)
int[] bstknk = readIntdatafromfile(filename, (int)GetSymbolAddress(symbols, "BstKnkCal.MaxAirmass"), GetSymbolLength(symbols, "BstKnkCal.MaxAirmass"));
if (autogearbox)
{
bstknk = readIntdatafromfile(filename, (int)GetSymbolAddress(symbols, "BstKnkCal.MaxAirmassAu"), GetSymbolLength(symbols, "BstKnkCal.MaxAirmassAu"));
}
int[] xaxis = readIntdatafromfile(filename, (int)GetSymbolAddress(symbols, "BstKnkCal.OffsetXSP"), GetSymbolLength(symbols, "BstKnkCal.OffsetXSP"));
for (int a = 0; a < xaxis.Length; a++)
{
int val = (int)xaxis.GetValue(a);
if (val > 32000) val = -(65536 - val);
xaxis.SetValue(val, a);
}
int[] yaxis = readIntdatafromfile(filename, (int)GetSymbolAddress(symbols, "BstKnkCal.n_EngYSP"), GetSymbolLength(symbols, "BstKnkCal.n_EngYSP"));
int airmasslimit = Convert.ToInt32(GetInterpolatedTableValue(bstknk, xaxis, yaxis, rpm, 0));
if (airmasslimit < requestedairmass)
{
requestedairmass = airmasslimit;
AirmassLimiter = limitType.AirmassLimiter;
//Console.WriteLine("Reduced airmass because of BstKnkCal.MaxAirmass: " + requestedairmass.ToString() + " rpm: " + rpm.ToString());
}
return requestedairmass;
}