/* VE Table RPM bin fitter written by Perry Harrington. * Designed for the MegaSquirt forum. * Original source at http://www.dainst.com/info/programs/ve_fitter/ * * Released into public domain. * * If you wish to contact me, go to http://www.dainst.com/ and use the * feedback form. */ #include #include #include #define MAXCELLS 50 #define MAXMAP 100.0 #define MAXVE 100.0 #define BINS 8 void insert_cell(int cell, int maxcell, int *vepoints, int ve[], int vesz[]); void write_vex_file(FILE *f, int x, int y, int ve[], int rpm[], float tq[], int maxtq); int main(int argc, char *argv[]) { int rpm[MAXCELLS]; int tq[MAXCELLS]; float work[MAXCELLS]; float err[MAXCELLS]; float maxerr=0; float maxtq=0; float map; int maxcell=0; int cells; int bins=BINS; int ve[MAXCELLS]; int vesz[MAXCELLS]; float f; int vepoints=0; int i,j,l,m; int write_vex=0; int write_canon=0; if (argc > 1) { for (i = 1; i < argc; i++) { if (strcmp(argv[i],"-v") == 0) { write_vex=1; } if (strcmp(argv[i],"-c") == 0) { write_canon=1; } } } else { write_canon=1; } for (i=0; i 1) { err[i] = err[i] - 1; } else { err[i] = 1 - err[i]; } } for (i=0; i maxerr) { maxerr = err[i]; maxcell = i; } } /* if error for all cells is zero, split the largest cell */ if (maxerr == 0.0) { j = 0; for (i=0; i< vepoints; i++) { if (vesz[i] > j) { j = vesz[i]; maxcell = i; } } maxcell = ve[maxcell] + (vesz[maxcell] / 2); } #ifdef DEBUG printf("max err percent = %f\n",maxerr); printf("max cell = %d\n",maxcell); #endif if (vepoints < bins) { #ifdef DEBUG printf("insert %f %d\n",maxerr,maxcell); #endif for (i=0; i maxcell) { insert_cell(i,maxcell,&vepoints,ve,vesz); break; } } } } while (vepoints maxtq) maxtq = work[ve[i]]; #ifdef VERBOSE printf("BIN %d err percent = %f\n",i,ver[i]); #endif for(j=l; j 0; i--) { map = (MAXMAP / vepoints * i); printf("Kpa %3d |",(int)map); for (j=0; j < vepoints; j++) { f = maxtq / work[ve[j]]; printf("%-4d\t", (int) (MAXVE / f * map / 100)); } printf("\n"); } } return 0; } void insert_cell(int cell, int maxcell, int *vepoints, int ve[], int vesz[]) { int j,m; #ifdef DEBUG for(m=0;m<*vepoints;m++) printf("before vesz[%d]=%d\n",m,vesz[m]); for(m=0;m<*vepoints;m++) printf("before ve[%d]=%d\n",m,ve[m]); #endif *vepoints = *vepoints+1; m = vesz[cell]; vesz[cell] = maxcell - ve[cell]; for(j=*vepoints-1; j>cell;j--) { ve[j+1] = ve[j]; vesz[j+1] = vesz[j]; } ve[cell+1]=maxcell; vesz[cell+1]= m - vesz[cell]; #ifdef DEBUG for(m=0;m<*vepoints;m++) printf("after vesz[%d]=%d\n",m,vesz[m]); for(m=0;m<*vepoints;m++) printf("after ve[%d]=%d\n",m,ve[m]); #endif } void write_vex_file(FILE *f, int x, int y, int ve[], int rpm[], float tq[], int maxtq) { int i,j; float map; float g; time_t t; struct tm *now; char timebuf[50]; time(&t); now = localtime(&t); fprintf(f,"EVEME 1.0\n"); fprintf(f,"UserRev: 1.0\n"); fprintf(f,"UserComment: Generated with ve mapper\n"); strftime(timebuf, sizeof(timebuf), "%m-%d-%Y", now); fprintf(f,"Date: %s\n",timebuf); strftime(timebuf, sizeof(timebuf), "%H:%M", now); fprintf(f,"Time: %s\n",timebuf); fprintf(f,"Page 0\n"); fprintf(f,"VE Table RPM Range [%2d]\n",x); for (i=0; i < x; i++) { fprintf(f," [%3d] = %3d\n",i,rpm[ve[i]] / 100); } fprintf(f,"VE Table Load Range (%s) [%2d]\n","MAP",y); for (i=1; i < y+1; i++) { map = (MAXMAP / y * i); fprintf(f," [%3d] = %3d\n",i-1,(int)map); } fprintf(f,"VE Table [%3d][%3d]\n",x,y); fprintf(f," "); for (i=0; i < x; i++) { fprintf(f," [%3d]",i); } fprintf(f,"\n"); for (i=0; i < x; i++) { fprintf(f," [%3d] =",i); map = (MAXMAP / x) * (i+1); for (j=0; j < y; j++) { g = maxtq / tq[ve[j]]; printf("%5d ", (int) (MAXVE / g * map / 100)); } fprintf(f,"\n"); } }