Switch 2D tables to pointers

This commit is contained in:
Josh Stewart 2015-06-05 18:02:47 +10:00
parent e65ed37fea
commit 372f6da64e
5 changed files with 36 additions and 32 deletions

View File

@ -54,7 +54,7 @@ byte correctionWUE()
//Possibly reduce the frequency this runs at (Costs about 50 loops per second) //Possibly reduce the frequency this runs at (Costs about 50 loops per second)
if (currentStatus.coolant > (WUETable.axisX[9] - CALIBRATION_TEMPERATURE_OFFSET)) { BIT_CLEAR(currentStatus.engine, BIT_ENGINE_WARMUP); return 100; } //This prevents us doing the 2D lookup if we're already up to temp if (currentStatus.coolant > (WUETable.axisX[9] - CALIBRATION_TEMPERATURE_OFFSET)) { BIT_CLEAR(currentStatus.engine, BIT_ENGINE_WARMUP); return 100; } //This prevents us doing the 2D lookup if we're already up to temp
BIT_SET(currentStatus.engine, BIT_ENGINE_WARMUP); BIT_SET(currentStatus.engine, BIT_ENGINE_WARMUP);
return table2D_getValue(WUETable, currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET); return table2D_getValue(&WUETable, currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET);
} }
/* /*
@ -121,7 +121,7 @@ byte correctionAccel()
{ {
BIT_SET(currentStatus.engine, BIT_ENGINE_ACC); //Mark accleration enrichment as active. BIT_SET(currentStatus.engine, BIT_ENGINE_ACC); //Mark accleration enrichment as active.
currentStatus.TAEEndTime = micros() + ((unsigned long)configPage1.taeTime * 10000); //Set the time in the future where the enrichment will be turned off. taeTime is stored as mS / 10, so multiply it by 100 to get it in uS currentStatus.TAEEndTime = micros() + ((unsigned long)configPage1.taeTime * 10000); //Set the time in the future where the enrichment will be turned off. taeTime is stored as mS / 10, so multiply it by 100 to get it in uS
return 100 + table2D_getValue(taeTable, currentStatus.tpsDOT); return 100 + table2D_getValue(&taeTable, currentStatus.tpsDOT);
} }
//If we reach here then TAE is neither on, nor does it need to be turned on. //If we reach here then TAE is neither on, nor does it need to be turned on.
@ -154,7 +154,7 @@ Uses a 2D enrichment table (WUETable) where the X axis is engine temp and the Y
byte correctionsBatVoltage() byte correctionsBatVoltage()
{ {
if (currentStatus.battery10 > (injectorVCorrectionTable.axisX[5])) { return injectorVCorrectionTable.values[injectorVCorrectionTable.xSize-1]; } //This prevents us doing the 2D lookup if the voltage is above maximum if (currentStatus.battery10 > (injectorVCorrectionTable.axisX[5])) { return injectorVCorrectionTable.values[injectorVCorrectionTable.xSize-1]; } //This prevents us doing the 2D lookup if the voltage is above maximum
return table2D_getValue(injectorVCorrectionTable, currentStatus.battery10); return table2D_getValue(&injectorVCorrectionTable, currentStatus.battery10);
} }
/* /*

View File

@ -36,10 +36,11 @@ void triggerPri_missingTooth()
{ {
// http://www.msextra.com/forums/viewtopic.php?f=94&t=22976 // http://www.msextra.com/forums/viewtopic.php?f=94&t=22976
// http://www.megamanual.com/ms2/wheel.htm // http://www.megamanual.com/ms2/wheel.htm
noInterrupts();
curTime = micros(); curTime = micros();
curGap = curTime - toothLastToothTime; curGap = curTime - toothLastToothTime;
if ( curGap < triggerFilterTime ) { return; } //Debounce check. Pulses should never be less than triggerFilterTime, so if they are it means a false trigger. (A 36-1 wheel at 8000pm will have triggers approx. every 200uS) if ( curGap < triggerFilterTime ) { interrupts(); return; } //Debounce check. Pulses should never be less than triggerFilterTime, so if they are it means a false trigger. (A 36-1 wheel at 8000pm will have triggers approx. every 200uS)
toothCurrentCount++; //Increment the tooth counter toothCurrentCount++; //Increment the tooth counter
//High speed tooth logging history //High speed tooth logging history
@ -66,7 +67,7 @@ void triggerPri_missingTooth()
toothLastMinusOneToothTime = toothLastToothTime; toothLastMinusOneToothTime = toothLastToothTime;
toothLastToothTime = curTime; toothLastToothTime = curTime;
interrupts();
} }
void triggerSec_missingTooth(){ return; } //This function currently is not used void triggerSec_missingTooth(){ return; } //This function currently is not used

View File

@ -485,7 +485,7 @@ void loop()
if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) { currentStatus.dwell = (configPage2.dwellCrank * 100); } if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) ) { currentStatus.dwell = (configPage2.dwellCrank * 100); }
else { currentStatus.dwell = (configPage2.dwellRun * 100); } else { currentStatus.dwell = (configPage2.dwellRun * 100); }
//Pull battery voltage based dwell correction and apply if needed //Pull battery voltage based dwell correction and apply if needed
currentStatus.dwellCorrection = table2D_getValue(dwellVCorrectionTable, currentStatus.battery10); currentStatus.dwellCorrection = table2D_getValue(&dwellVCorrectionTable, currentStatus.battery10);
if (currentStatus.dwellCorrection != 100) { currentStatus.dwell = divs100(currentStatus.dwell) * currentStatus.dwellCorrection; } if (currentStatus.dwellCorrection != 100) { currentStatus.dwell = divs100(currentStatus.dwell) * currentStatus.dwellCorrection; }
int dwellAngle = (div(currentStatus.dwell, timePerDegree).quot ); //Convert the dwell time to dwell angle based on the current engine speed int dwellAngle = (div(currentStatus.dwell, timePerDegree).quot ); //Convert the dwell time to dwell angle based on the current engine speed

View File

@ -18,6 +18,9 @@ struct table2D {
int *values16; int *values16;
int *axisX16; int *axisX16;
//Store the last X and Y coordinates in the table. This is used to make the next check faster
byte lastXMax, lastXMin;
}; };
void table2D_setSize(struct table2D targetTable, byte newSize); void table2D_setSize(struct table2D targetTable, byte newSize);
@ -50,6 +53,6 @@ Eg: 2x2 table
*/ */
int get3DTableValue(struct table3D *fromTable, int, int); int get3DTableValue(struct table3D *fromTable, int, int);
int table2D_getValue(struct table2D, int); int table2D_getValue(struct table2D *fromTable, int);
#endif // TABLE_H #endif // TABLE_H

View File

@ -35,21 +35,21 @@ ie: Given a value on the X axis, it returns a Y value that coresponds to the poi
This function must take into account whether a table contains 8-bit or 16-bit values. This function must take into account whether a table contains 8-bit or 16-bit values.
Unfortunately this means many of the lines are duplicated depending on this Unfortunately this means many of the lines are duplicated depending on this
*/ */
int table2D_getValue(struct table2D fromTable, int X) int table2D_getValue(struct table2D *fromTable, int X)
{ {
int xMinValue, xMaxValue; int xMinValue, xMaxValue;
if (fromTable.valueSize == SIZE_BYTE) if (fromTable->valueSize == SIZE_BYTE)
{ {
//Byte version //Byte version
xMinValue = fromTable.axisX[0]; xMinValue = fromTable->axisX[0];
xMaxValue = fromTable.axisX[fromTable.xSize-1]; xMaxValue = fromTable->axisX[fromTable->xSize-1];
} }
else else
{ {
//int version //int version
xMinValue = fromTable.axisX16[0]; xMinValue = fromTable->axisX16[0];
xMaxValue = fromTable.axisX16[fromTable.xSize-1]; xMaxValue = fromTable->axisX16[fromTable->xSize-1];
} }
int xMin = 0; int xMin = 0;
int xMax = 0; int xMax = 0;
@ -58,21 +58,21 @@ int table2D_getValue(struct table2D fromTable, int X)
if(X > xMaxValue) { X = xMaxValue; } if(X > xMaxValue) { X = xMaxValue; }
if(X < xMinValue) { X = xMinValue; } if(X < xMinValue) { X = xMinValue; }
for (int x = fromTable.xSize-1; x >= 0; x--) for (int x = fromTable->xSize-1; x >= 0; x--)
{ {
if (fromTable.valueSize == SIZE_BYTE) if (fromTable->valueSize == SIZE_BYTE)
{ {
//Byte version //Byte version
//Checks the case where the X value is exactly what was requested //Checks the case where the X value is exactly what was requested
if ( (X == fromTable.axisX[x]) || (x == 0) ) if ( (X == fromTable->axisX[x]) || (x == 0) )
{ {
return fromTable.values[x]; //Simply return the coresponding value return fromTable->values[x]; //Simply return the coresponding value
} }
//Normal case //Normal case
if ( (X <= fromTable.axisX[x]) && (X > fromTable.axisX[x-1]) ) if ( (X <= fromTable->axisX[x]) && (X > fromTable->axisX[x-1]) )
{ {
xMaxValue = fromTable.axisX[x]; xMaxValue = fromTable->axisX[x];
xMinValue = fromTable.axisX[x-1]; xMinValue = fromTable->axisX[x-1];
xMax = x; xMax = x;
xMin = x-1; xMin = x-1;
break; break;
@ -81,15 +81,15 @@ int table2D_getValue(struct table2D fromTable, int X)
else else
{ {
//int version //int version
if ( (X == fromTable.axisX16[x]) || (x == 0) ) if ( (X == fromTable->axisX16[x]) || (x == 0) )
{ {
return fromTable.values16[x]; //Simply return the coresponding value return fromTable->values16[x]; //Simply return the coresponding value
} }
//Normal case //Normal case
if ( (X <= fromTable.axisX16[x]) && (X > fromTable.axisX16[x-1]) ) if ( (X <= fromTable->axisX16[x]) && (X > fromTable->axisX16[x-1]) )
{ {
xMaxValue = fromTable.axisX16[x]; xMaxValue = fromTable->axisX16[x];
xMinValue = fromTable.axisX16[x-1]; xMinValue = fromTable->axisX16[x-1];
xMax = x; xMax = x;
xMin = x-1; xMin = x-1;
break; break;
@ -107,23 +107,23 @@ int table2D_getValue(struct table2D fromTable, int X)
//Non-Float version //Non-Float version
int yVal; int yVal;
if (fromTable.valueSize == SIZE_BYTE) if (fromTable->valueSize == SIZE_BYTE)
{ {
//Byte version //Byte version
yVal = ((long)(m << 6) / n) * (abs(fromTable.values[xMax] - fromTable.values[xMin])); yVal = ((long)(m << 6) / n) * (abs(fromTable->values[xMax] - fromTable->values[xMin]));
yVal = (yVal >> 6); yVal = (yVal >> 6);
if (fromTable.values[xMax] > fromTable.values[xMin]) { yVal = fromTable.values[xMin] + yVal; } if (fromTable->values[xMax] > fromTable->values[xMin]) { yVal = fromTable->values[xMin] + yVal; }
else { yVal = fromTable.values[xMin] - yVal; } else { yVal = fromTable->values[xMin] - yVal; }
} }
else else
{ {
//int version //int version
yVal = ((long)(m << 6) / n) * (abs(fromTable.values16[xMax] - fromTable.values16[xMin])); yVal = ((long)(m << 6) / n) * (abs(fromTable->values16[xMax] - fromTable->values16[xMin]));
yVal = (yVal >> 6); yVal = (yVal >> 6);
if (fromTable.values[xMax] > fromTable.values16[xMin]) { yVal = fromTable.values16[xMin] + yVal; } if (fromTable->values[xMax] > fromTable->values16[xMin]) { yVal = fromTable->values16[xMin] + yVal; }
else { yVal = fromTable.values16[xMin] - yVal; } else { yVal = fromTable->values16[xMin] - yVal; }
} }
return yVal; return yVal;