Allow for dynamically sized 3d tables

This commit is contained in:
Josh Stewart 2015-09-18 15:06:21 +10:00
parent d2516460d3
commit f8fd0f9692
4 changed files with 27 additions and 7 deletions

View File

@ -201,7 +201,7 @@ void receiveValue(int offset, byte newValue)
if (offset < 272)
{
//X Axis
fuelTable.axisX[(offset-256)] = ((int)(newValue) * 100); //The RPM values sent by megasquirt are divided by 100, need to multiple it back by 100 to make it correct
fuelTable.axisX[(offset-256)] = ((int)(newValue) * 100); //The RPM values sent by tunerstudio are divided by 100, need to multiple it back by 100 to make it correct
}
else
{

View File

@ -108,6 +108,10 @@ void setup()
//Setup the dummy fuel and ignition tables
//dummyFuelTable(&fuelTable);
//dummyIgnitionTable(&ignitionTable);
table3D_setSize(&fuelTable, 16);
table3D_setSize(&ignitionTable, 16);
table3D_setSize(&afrTable, 16);
loadConfig();
//Repoint the 2D table structs to the config pages that were just loaded

16
table.h
View File

@ -26,19 +26,23 @@ struct table2D {
void table2D_setSize(struct table2D targetTable, byte newSize);
struct table3D {
//All tables must be the same size for simplicity
const static byte xSize = 16;
const static byte ySize = 16;
byte values[ySize][xSize];
int axisX[xSize];
int axisY[ySize];
//All tables must be the same size for simplicity
byte xSize;
byte ySize;
byte **values;
int *axisX;
int *axisY;
//Store the last X and Y coordinates in the table. This is used to make the next check faster
byte lastXMax, lastXMin;
byte lastYMax, lastYMin;
};
void table3D_setSize(struct table3D *targetTable, byte newSize);
/*
3D Tables have an origin (0,0) in the top left hand corner. Vertical axis is expressed first.
Eg: 2x2 table

View File

@ -28,6 +28,18 @@ void table2D_setSize(struct table2D* targetTable, byte newSize)
}
}
void table3D_setSize(struct table3D *targetTable, byte newSize)
{
targetTable->values = (byte **)malloc(newSize * sizeof(byte*));
for(byte i = 0; i < newSize; i++) { targetTable->values[i] = (byte *)malloc(newSize * sizeof(byte)); }
targetTable->axisX = (int *)malloc(newSize * sizeof(int));
targetTable->axisY = (int *)malloc(newSize * sizeof(int));
targetTable->xSize = newSize;
targetTable->ySize = newSize;
}
/*
This function simply pulls a 1D linear interpolated (ie averaged) value from a 2D table
ie: Given a value on the X axis, it returns a Y value that coresponds to the point on the curve between the nearest two defined X values