00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00036 #define TABLELOOKUP_C
00037 #include "inc/freeEMS.h"
00038 #include "inc/commsISRs.h"
00039 #include "inc/tableLookup.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00112 unsigned short lookupPagedMainTableCellValue(mainTable* Table, unsigned short realRPM, unsigned short realLoad, unsigned char RAMPage){
00113
00114
00115 unsigned char oldRPage = RPAGE;
00116 RPAGE = RAMPage;
00117
00118
00119 unsigned char lowRPMIndex = 0;
00120 unsigned char highRPMIndex = Table->RPMLength - 1;
00121
00122 unsigned short lowRPMValue = Table->RPM[0];
00123 unsigned short highRPMValue = Table->RPM[Table->RPMLength -1];
00124
00125 unsigned char RPMIndex;
00126 for(RPMIndex=0;RPMIndex<Table->RPMLength;RPMIndex++){
00127 if(Table->RPM[RPMIndex] < realRPM){
00128 lowRPMValue = Table->RPM[RPMIndex];
00129 lowRPMIndex = RPMIndex;
00130 }else if(Table->RPM[RPMIndex] > realRPM){
00131 highRPMValue = Table->RPM[RPMIndex];
00132 highRPMIndex = RPMIndex;
00133 break;
00134 }else if(Table->RPM[RPMIndex] == realRPM){
00135 lowRPMValue = Table->RPM[RPMIndex];
00136 highRPMValue = Table->RPM[RPMIndex];
00137 lowRPMIndex = RPMIndex;
00138 highRPMIndex = RPMIndex;
00139 break;
00140 }
00141 }
00142
00143
00144 unsigned char lowLoadIndex = 0;
00145 unsigned char highLoadIndex = Table->LoadLength -1;
00146
00147 unsigned short lowLoadValue = Table->Load[0];
00148 unsigned short highLoadValue = Table->Load[Table->LoadLength -1];
00149
00150 unsigned char LoadIndex;
00151 for(LoadIndex=0;LoadIndex<Table->LoadLength;LoadIndex++){
00152 if(Table->Load[LoadIndex] < realLoad){
00153 lowLoadValue = Table->Load[LoadIndex];
00154 lowLoadIndex = LoadIndex;
00155 }else if(Table->Load[LoadIndex] > realLoad){
00156 highLoadValue = Table->Load[LoadIndex];
00157 highLoadIndex = LoadIndex;
00158 break;
00159 }else if(Table->Load[LoadIndex] == realLoad){
00160 lowLoadValue = Table->Load[LoadIndex];
00161 highLoadValue = Table->Load[LoadIndex];
00162 lowLoadIndex = LoadIndex;
00163 highLoadIndex = LoadIndex;
00164 break;
00165 }
00166 }
00167
00168
00169 unsigned short lowRPMLowLoad = Table->Table[(Table->LoadLength * lowRPMIndex) + lowLoadIndex];
00170 unsigned short lowRPMHighLoad = Table->Table[(Table->LoadLength * lowRPMIndex) + highLoadIndex];
00171 unsigned short highRPMLowLoad = Table->Table[(Table->LoadLength * highRPMIndex) + lowLoadIndex];
00172 unsigned short highRPMHighLoad = Table->Table[(Table->LoadLength * highRPMIndex) + highLoadIndex];
00173
00174
00175 RPAGE = oldRPage;
00176
00177
00178 unsigned short lowRPMIntLoad = lowRPMLowLoad + (((signed long)((signed long)lowRPMHighLoad - lowRPMLowLoad) * (realLoad - lowLoadValue))/ (highLoadValue - lowLoadValue));
00179 unsigned short highRPMIntLoad = highRPMLowLoad + (((signed long)((signed long)highRPMHighLoad - highRPMLowLoad) * (realLoad - lowLoadValue))/ (highLoadValue - lowLoadValue));
00180
00181
00182 return lowRPMIntLoad + (((signed long)((signed long)highRPMIntLoad - lowRPMIntLoad) * (realRPM - lowRPMValue))/ (highRPMValue - lowRPMValue));
00183 }
00184
00185
00197 unsigned short lookupTwoDTableUS(twoDTableUS * Table, unsigned short Value){
00198
00199
00200 unsigned char lowIndex = 0;
00201 unsigned char highIndex = 15;
00202
00203 unsigned short lowAxisValue = Table->Axis[0];
00204 unsigned short highAxisValue = Table->Axis[15];
00205 unsigned short lowLookupValue = Table->Values[0];
00206 unsigned short highLookupValue = Table->Values[15];
00207
00208 unsigned char Index;
00209 for(Index=0;Index<16;Index++){
00210 if(Table->Axis[Index] < Value){
00211 lowIndex = Index;
00212 lowAxisValue = Table->Axis[Index];
00213 lowLookupValue = Table->Values[Index];
00214 }else if(Table->Axis[Index] > Value){
00215 highIndex = Index;
00216 highAxisValue = Table->Axis[Index];
00217 highLookupValue = Table->Values[Index];
00218 break;
00219 }else if(Table->Axis[Index] == Value){
00220 return Table->Values[Index];
00221 }
00222 }
00223
00224
00225
00226 return lowLookupValue + (((signed long)((signed long)highLookupValue - lowLookupValue) * (Value - lowAxisValue))/ (highAxisValue - lowAxisValue));
00227 }
00228
00229
00245 unsigned short setAxisValue(unsigned short index, unsigned short value, unsigned short axis[], unsigned short length, unsigned short errorBase){
00246 if(index >= length){
00247 return errorBase + invalidAxisIndex;
00248 }else{
00249 if(index > 0){
00250
00251 if(axis[index - 1] > value){
00252 return errorBase + invalidAxisOrder;
00253 }
00254 }
00255 if(index < (length -1)){
00256
00257 if(value > axis[index + 1]){
00258 return errorBase + invalidAxisOrder;
00259 }
00260 }
00261 }
00262
00263
00264 axis[index] = value;
00265 return 0;
00266 }
00267
00268
00284 unsigned short setPagedMainTableCellValue(unsigned char RPageValue, mainTable* Table, unsigned short RPMIndex, unsigned short LoadIndex, unsigned short cellValue){
00285 unsigned char oldRPage = RPAGE;
00286 unsigned short errorID = 0;
00287 RPAGE = RPageValue;
00288 if(RPMIndex < Table->RPMLength){
00289 if(LoadIndex < Table->LoadLength){
00290 Table->Table[(Table->LoadLength * RPMIndex) + LoadIndex] = cellValue;
00291 }else{
00292 errorID = invalidMainTableLoadIndex;
00293 }
00294 }else{
00295 errorID = invalidMainTableRPMIndex;
00296 }
00297 RPAGE = oldRPage;
00298 return errorID;
00299 }
00300
00301
00316 unsigned short setPagedMainTableRPMValue(unsigned char RPageValue, mainTable* Table, unsigned short RPMIndex, unsigned short RPMValue){
00317 unsigned char oldRPage = RPAGE;
00318 RPAGE = RPageValue;
00319 unsigned short errorID = setAxisValue(RPMIndex, RPMValue, Table->RPM, Table->RPMLength, errorBaseMainTableRPM);
00320 RPAGE = oldRPage;
00321 return errorID;
00322 }
00323
00324
00339 unsigned short setPagedMainTableLoadValue(unsigned char RPageValue, mainTable* Table, unsigned short LoadIndex, unsigned short LoadValue){
00340 unsigned char oldRPage = RPAGE;
00341 RPAGE = RPageValue;
00342 unsigned short errorID = setAxisValue(LoadIndex, LoadValue, Table->Load, Table->LoadLength, errorBaseMainTableLoad);
00343 RPAGE = oldRPage;
00344 return errorID;
00345 }
00346
00347
00362 unsigned short setPagedTwoDTableCellValue(unsigned char RPageValue, twoDTableUS* Table, unsigned short cellIndex, unsigned short cellValue){
00363 if(cellIndex > 15){
00364 return invalidTwoDTableIndex;
00365 }else{
00366 unsigned char oldRPage = RPAGE;
00367 RPAGE = RPageValue;
00368 Table->Values[cellIndex] = cellValue;
00369 RPAGE = oldRPage;
00370 return 0;
00371 }
00372 }
00373
00374
00389 unsigned short setPagedTwoDTableAxisValue(unsigned char RPageValue, twoDTableUS* Table, unsigned short axisIndex, unsigned short axisValue){
00390 unsigned char oldRPage = RPAGE;
00391 RPAGE = RPageValue;
00392 unsigned short errorID = setAxisValue(axisIndex, axisValue, Table->Axis, 16, errorBaseTwoDTableAxis);
00393 RPAGE = oldRPage;
00394 return errorID;
00395 }
00396
00397
00409 unsigned short validateMainTable(mainTable* Table){
00410
00411
00412
00413 if(Table->RPMLength > MAINTABLE_MAX_RPM_LENGTH){
00414 return invalidMainTableRPMLength;
00415 }else if(Table->LoadLength > MAINTABLE_MAX_LOAD_LENGTH){
00416 return invalidMainTableLoadLength;
00417 }else if((Table->RPMLength * Table->LoadLength) > MAINTABLE_MAX_MAIN_LENGTH){
00418 return invalidMainTableMainLength;
00419 }else{
00420
00421 unsigned char i;
00422 for(i=0;i<(Table->RPMLength - 1);i++){
00423 if(Table->RPM[i] > Table->RPM[i+1]){
00424 return invalidMainTableRPMOrder;
00425 }
00426 }
00427
00428 unsigned char j;
00429 for(j=0;j<(Table->LoadLength - 1);j++){
00430 if(Table->Load[j] > Table->Load[j+1]){
00431 return invalidMainTableLoadOrder;
00432 }
00433 }
00434
00435 return 0;
00436 }
00437 }
00438
00439
00451 unsigned short validateTwoDTable(twoDTableUS* Table){
00452
00453 unsigned char i;
00454 for(i=0;i<(TWODTABLEUS_LENGTH - 1);i++){
00455 if(Table->Axis[i] > Table->Axis[i+1]){
00456 return invalidTwoDTableAxisOrder;
00457 }
00458 }
00459 return 0;
00460 }