Initial memory reduction work on temp tables (WILL BREAK CALIBRATION)

This commit is contained in:
Josh Stewart 2020-06-16 08:09:14 +10:00
parent 1ec7e7ee86
commit ac6f1d1b25
9 changed files with 71 additions and 17 deletions

View File

@ -418,14 +418,14 @@ void command()
{ {
Serial.print(x); Serial.print(x);
Serial.print(", "); Serial.print(", ");
Serial.println(cltCalibrationTable[x]); //Serial.println(cltCalibrationTable[x]);
} }
Serial.println(F("Inlet temp")); Serial.println(F("Inlet temp"));
for (int x = 0; x < CALIBRATION_TABLE_SIZE; x++) for (int x = 0; x < CALIBRATION_TABLE_SIZE; x++)
{ {
Serial.print(x); Serial.print(x);
Serial.print(", "); Serial.print(", ");
Serial.println(iatCalibrationTable[x]); //Serial.println(iatCalibrationTable[x]);
} }
Serial.println(F("O2")); Serial.println(F("O2"));
for (int x = 0; x < CALIBRATION_TABLE_SIZE; x++) for (int x = 0; x < CALIBRATION_TABLE_SIZE; x++)
@ -1656,7 +1656,7 @@ void receiveCalibration(byte tableID)
{ {
case 0: case 0:
//coolant table //coolant table
pnt_TargetTable = (byte *)&cltCalibrationTable; //pnt_TargetTable = (byte *)&cltCalibrationTable;
OFFSET = CALIBRATION_TEMPERATURE_OFFSET; // OFFSET = CALIBRATION_TEMPERATURE_OFFSET; //
DIVISION_FACTOR = 10; DIVISION_FACTOR = 10;
BYTES_PER_VALUE = 2; BYTES_PER_VALUE = 2;
@ -1664,7 +1664,7 @@ void receiveCalibration(byte tableID)
break; break;
case 1: case 1:
//Inlet air temp table //Inlet air temp table
pnt_TargetTable = (byte *)&iatCalibrationTable; //pnt_TargetTable = (byte *)&iatCalibrationTable;
OFFSET = CALIBRATION_TEMPERATURE_OFFSET; OFFSET = CALIBRATION_TEMPERATURE_OFFSET;
DIVISION_FACTOR = 10; DIVISION_FACTOR = 10;
BYTES_PER_VALUE = 2; BYTES_PER_VALUE = 2;

View File

@ -92,6 +92,6 @@ byte checkAFRLimit()
{ {
byte checkAFRLimitActive = 0; byte checkAFRLimitActive = 0;
return checkAFRLimitActive ; return checkAFRLimitActive;
} }

View File

@ -1212,10 +1212,18 @@ extern struct config4 configPage4;
extern struct config6 configPage6; extern struct config6 configPage6;
extern struct config9 configPage9; extern struct config9 configPage9;
extern struct config10 configPage10; extern struct config10 configPage10;
extern byte cltCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the coolant sensor calibration values */ //extern byte cltCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the coolant sensor calibration values */
extern byte iatCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the inlet air temperature sensor calibration values */ //extern byte iatCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the inlet air temperature sensor calibration values */
extern byte o2CalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the O2 sensor calibration values */ extern byte o2CalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the O2 sensor calibration values */
extern uint16_t cltCalibration_bins[32];
extern uint16_t cltCalibration_values[32];
extern uint16_t iatCalibration_bins[32];
extern uint16_t iatCalibration_values[32];
extern struct table2D cltCalibrationTable_new; /**< A 32 bin array containing the coolant temperature sensor calibration values */
extern struct table2D iatCalibrationTable_new; /**< A 32 bin array containing the inlet air temperature sensor calibration values */
extern struct table2D o2CalibrationTable_new; /**< A 32 bin array containing the O2 sensor calibration values */
static_assert(sizeof(struct config2) == 128, "configPage2 size is not 128"); static_assert(sizeof(struct config2) == 128, "configPage2 size is not 128");
static_assert(sizeof(struct config4) == 128, "configPage4 size is not 128"); static_assert(sizeof(struct config4) == 128, "configPage4 size is not 128");
static_assert(sizeof(struct config6) == 128, "configPage6 size is not 128"); static_assert(sizeof(struct config6) == 128, "configPage6 size is not 128");

View File

@ -223,6 +223,13 @@ struct config6 configPage6;
struct config9 configPage9; struct config9 configPage9;
struct config10 configPage10; struct config10 configPage10;
byte cltCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the coolant sensor calibration values */ //byte cltCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the coolant sensor calibration values */
byte iatCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the inlet air temperature sensor calibration values */ //byte iatCalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the inlet air temperature sensor calibration values */
byte o2CalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the O2 sensor calibration values */ byte o2CalibrationTable[CALIBRATION_TABLE_SIZE]; /**< An array containing the O2 sensor calibration values */
uint16_t cltCalibration_bins[32];
uint16_t cltCalibration_values[32];
struct table2D cltCalibrationTable_new;
uint16_t iatCalibration_bins[32];
uint16_t iatCalibration_values[32];
struct table2D iatCalibrationTable_new;

View File

@ -188,6 +188,18 @@ void initialiseAll()
oilPressureProtectTable.values = configPage10.oilPressureProtMins; oilPressureProtectTable.values = configPage10.oilPressureProtMins;
oilPressureProtectTable.axisX = configPage10.oilPressureProtRPM; oilPressureProtectTable.axisX = configPage10.oilPressureProtRPM;
cltCalibrationTable_new.valueSize = SIZE_INT;
cltCalibrationTable_new.axisSize = SIZE_INT;
cltCalibrationTable_new.xSize = 32;
cltCalibrationTable_new.values = cltCalibration_values;
cltCalibrationTable_new.axisX = cltCalibration_bins;
iatCalibrationTable_new.valueSize = SIZE_INT;
iatCalibrationTable_new.axisSize = SIZE_INT;
iatCalibrationTable_new.xSize = 32;
iatCalibrationTable_new.values = iatCalibration_values;
iatCalibrationTable_new.axisX = iatCalibration_bins;
//Setup the calibration tables //Setup the calibration tables
loadCalibration(); loadCalibration();

View File

@ -409,7 +409,8 @@ void readCLT(bool useFilter)
if(useFilter == true) { currentStatus.cltADC = ADC_FILTER(tempReading, configPage4.ADCFILTER_CLT, currentStatus.cltADC); } if(useFilter == true) { currentStatus.cltADC = ADC_FILTER(tempReading, configPage4.ADCFILTER_CLT, currentStatus.cltADC); }
else { currentStatus.cltADC = tempReading; } else { currentStatus.cltADC = tempReading; }
currentStatus.coolant = cltCalibrationTable[currentStatus.cltADC] - CALIBRATION_TEMPERATURE_OFFSET; //Temperature calibration values are stored as positive bytes. We subtract 40 from them to allow for negative temperatures //currentStatus.coolant = cltCalibrationTable[currentStatus.cltADC] - CALIBRATION_TEMPERATURE_OFFSET; //Temperature calibration values are stored as positive bytes. We subtract 40 from them to allow for negative temperatures
currentStatus.coolant = table2D_getValue(&cltCalibrationTable_new, currentStatus.cltADC) - CALIBRATION_TEMPERATURE_OFFSET;
} }
void readIAT() void readIAT()
@ -422,7 +423,8 @@ void readIAT()
tempReading = fastMap1023toX(analogRead(pinIAT), 511); //Get the current raw IAT value tempReading = fastMap1023toX(analogRead(pinIAT), 511); //Get the current raw IAT value
#endif #endif
currentStatus.iatADC = ADC_FILTER(tempReading, configPage4.ADCFILTER_IAT, currentStatus.iatADC); currentStatus.iatADC = ADC_FILTER(tempReading, configPage4.ADCFILTER_IAT, currentStatus.iatADC);
currentStatus.IAT = iatCalibrationTable[currentStatus.iatADC] - CALIBRATION_TEMPERATURE_OFFSET; //currentStatus.IAT = iatCalibrationTable[currentStatus.iatADC] - CALIBRATION_TEMPERATURE_OFFSET;
currentStatus.IAT = table2D_getValue(&iatCalibrationTable_new, currentStatus.iatADC) - CALIBRATION_TEMPERATURE_OFFSET;
} }
void readBaro() void readBaro()
@ -581,12 +583,12 @@ byte getFuelPressure()
tempReading = analogRead(pinFuelPressure); tempReading = analogRead(pinFuelPressure);
tempFuelPressure = fastMap10Bit(tempReading, configPage10.fuelPressureMin, configPage10.fuelPressureMax); tempFuelPressure = fastMap10Bit(tempReading, configPage10.fuelPressureMin, configPage10.fuelPressureMax);
tempFuelPressure = ADC_FILTER(tempFuelPressure, 150, currentStatus.fuelPressure); //Apply speed smoothing factor
//Sanity checks //Sanity checks
if(tempFuelPressure < 0) { tempFuelPressure = 0; } if(tempFuelPressure < 0) { tempFuelPressure = 0; }
if(tempFuelPressure > configPage10.fuelPressureMax) { tempFuelPressure = configPage10.fuelPressureMax; } if(tempFuelPressure > configPage10.fuelPressureMax) { tempFuelPressure = configPage10.fuelPressureMax; }
} }
return (byte)tempFuelPressure; return (byte)tempFuelPressure;
} }
@ -603,6 +605,7 @@ byte getOilPressure()
tempOilPressure = fastMap10Bit(tempReading, configPage10.oilPressureMin, configPage10.oilPressureMax); tempOilPressure = fastMap10Bit(tempReading, configPage10.oilPressureMin, configPage10.oilPressureMax);
tempOilPressure = ADC_FILTER(tempOilPressure, 150, currentStatus.oilPressure); //Apply speed smoothing factor
//Sanity checks //Sanity checks
if(tempOilPressure < 0) { tempOilPressure = 0; } if(tempOilPressure < 0) { tempOilPressure = 0; }
if(tempOilPressure > configPage10.oilPressureMax) { tempOilPressure = configPage10.oilPressureMax; } if(tempOilPressure > configPage10.oilPressureMax) { tempOilPressure = configPage10.oilPressureMax; }

View File

@ -729,6 +729,10 @@ void loop()
{ {
switch(configPage6.engineProtectType) switch(configPage6.engineProtectType)
{ {
case PROTECT_CUT_OFF:
ignitionOn = true;
fuelOn = true;
break;
case PROTECT_CUT_IGN: case PROTECT_CUT_IGN:
ignitionOn = false; ignitionOn = false;
break; break;
@ -767,6 +771,7 @@ void loop()
} }
} //Hard/Rolling cut check } //Hard/Rolling cut check
} //RPM Check } //RPM Check
else { currentStatus.engineProtectStatus = 0; } //Force all engine protection flags to be off as we're below the minimum RPM
} //Protection active check } //Protection active check
else { curRollingCut = 0; } //Disables the rolling hard cut else { curRollingCut = 0; } //Disables the rolling hard cut

View File

@ -667,10 +667,10 @@ void loadCalibration()
for(int x=0; x<CALIBRATION_TABLE_SIZE; x++) //Each calibration table is 512 bytes long for(int x=0; x<CALIBRATION_TABLE_SIZE; x++) //Each calibration table is 512 bytes long
{ {
int y = EEPROM_CALIBRATION_CLT + x; int y = EEPROM_CALIBRATION_CLT + x;
cltCalibrationTable[x] = EEPROM.read(y); //cltCalibrationTable[x] = EEPROM.read(y);
y = EEPROM_CALIBRATION_IAT + x; y = EEPROM_CALIBRATION_IAT + x;
iatCalibrationTable[x] = EEPROM.read(y); //iatCalibrationTable[x] = EEPROM.read(y);
y = EEPROM_CALIBRATION_O2 + x; y = EEPROM_CALIBRATION_O2 + x;
o2CalibrationTable[x] = EEPROM.read(y); o2CalibrationTable[x] = EEPROM.read(y);
@ -688,10 +688,10 @@ void writeCalibration()
for(int x=0; x<CALIBRATION_TABLE_SIZE; x++) //Each calibration table is 512 bytes long for(int x=0; x<CALIBRATION_TABLE_SIZE; x++) //Each calibration table is 512 bytes long
{ {
int y = EEPROM_CALIBRATION_CLT + x; int y = EEPROM_CALIBRATION_CLT + x;
if(EEPROM.read(y) != cltCalibrationTable[x]) { EEPROM.write(y, cltCalibrationTable[x]); } //if(EEPROM.read(y) != cltCalibrationTable[x]) { EEPROM.write(y, cltCalibrationTable[x]); }
y = EEPROM_CALIBRATION_IAT + x; y = EEPROM_CALIBRATION_IAT + x;
if(EEPROM.read(y) != iatCalibrationTable[x]) { EEPROM.write(y, iatCalibrationTable[x]); } //if(EEPROM.read(y) != iatCalibrationTable[x]) { EEPROM.write(y, iatCalibrationTable[x]); }
y = EEPROM_CALIBRATION_O2 + x; y = EEPROM_CALIBRATION_O2 + x;
if(EEPROM.read(y) != o2CalibrationTable[x]) { EEPROM.write(y, o2CalibrationTable[x]); } if(EEPROM.read(y) != o2CalibrationTable[x]) { EEPROM.write(y, o2CalibrationTable[x]); }

View File

@ -362,6 +362,25 @@ void doUpdates()
configPage2.SoftLimitMode = SOFT_LIMIT_FIXED; configPage2.SoftLimitMode = SOFT_LIMIT_FIXED;
} }
if(EEPROM.read(EEPROM_DATA_VERSION) == 14)
{
//202006
//MAJOR update to move the coolant, IAT and O2 calibrations to 2D tables
int y;
for(int x=0; x<(CALIBRATION_TABLE_SIZE/16); x++) //Each calibration table is 512 bytes long
{
y = EEPROM_CALIBRATION_CLT + (x * 16);
cltCalibration_values[x] = EEPROM.read(y);
cltCalibration_bins[x] = (x * 16);
y = EEPROM_CALIBRATION_IAT + (x * 16);
iatCalibration_values[x] = EEPROM.read(y);
iatCalibration_bins[x] = (x * 16);
}
}
//Final check is always for 255 and 0 (Brand new arduino) //Final check is always for 255 and 0 (Brand new arduino)
if( (EEPROM.read(EEPROM_DATA_VERSION) == 0) || (EEPROM.read(EEPROM_DATA_VERSION) == 255) ) if( (EEPROM.read(EEPROM_DATA_VERSION) == 0) || (EEPROM.read(EEPROM_DATA_VERSION) == 255) )
{ {