#include const byte ms_version = 20; const byte data_structure_version = 1; //This identifies the data structure when reading / writing. const byte page_size = 125; //Handy bitsetting macros #define BIT_SET(a,b) ((a) |= (1<<(b))) #define BIT_CLEAR(a,b) ((a) &= ~(1<<(b))) //The status struct contains the current values for all 'live' variables //In current version this is 64 bytes struct statuses { volatile boolean hasSync; unsigned int RPM; byte MAP; byte TPS; byte VE; byte O2; byte advance; volatile byte squirt; byte engine; unsigned long PW; //In uS //Helpful bitwise operations: //Useful reference: http://playground.arduino.cc/Code/BitMath // y = (x >> n) & 1; // n=0..15. stores nth bit of x in y. y becomes 0 or 1. // x &= ~(1 << n); // forces nth bit of x to be 0. all other bits left alone. // x |= (1 << n); // forces nth bit of x to be 1. all other bits left alone. }; //Page 1 of the config - See the ini file for further reference //This mostly covers off variables that are required for fuel struct config1 { /* byte engineCylinders; 1 // May support more than 1 cyl later. Always will assume 1 injector per cylinder. byte engineInjectorSize; 80 // In cc/min byte engineStoich; 14.7 // Stoichiometric ratio of fuel used byte engineStrokes; 4 //Can be 2 stroke or 4 stroke, any other value will cause problems byte engineDwell; 3000 //The spark dwell time in uS */ byte crankCold; //Cold cranking pulsewidth modifier. This is added to the fuel pulsewidth when cranking under a certain temp threshold (ms) byte crankHot; //Warm cranking pulsewidth modifier. This is added to the fuel pulsewidth when cranking (ms) byte asePct; //Afterstart enrichment (%) byte aseCount; //Afterstart enrichment cycles. This is the number of ignition cycles that the afterstart enrichment % lasts for byte wueBins[10]; //Warm up enrichment array (10 bytes) byte taeBins[4]; //TPS based acceleration enrichment bin 1 of 4 (ms) byte taeColdA; byte tpsThresh; byte taeTime; byte tdePct; byte egoTemp; //The temperature at which the EGO / O2 sensor values start being used (Degrees) byte egoCount; byte egoDelta; byte egoLimit; byte reqFuel; byte divider; byte alternate; byte injOpen; byte injOCfuel; byte injPwmP; byte injPwmT; byte battFac; //Whether to compensate pulsewidth for battery voltage (ms/v) int rpmk; //config1 in ini byte mapType : 2; byte strokes : 1; byte injType : 1; byte nCylinders : 4; //Number of cylinders //config2 in ini byte cltType : 2; byte matType : 2; byte nInjectors : 4; //Number of injectors //config3 in ini byte engineType : 1; byte egoType : 1; byte algorithm : 1; //"Speed Density", "Alpha-N" byte baroCorr : 1; byte primePulse; byte egoRPM; byte fastIdleT; //Fast idle temperature byte egoSwitch; byte taeColdM; byte unused1; byte unused2; byte unused3; byte unused4; byte unused5; byte unused6; }; //Page 2 of the config - See the ini file for further reference //This mostly covers off variables that are required for ignition struct config2 { byte triggerAngle; byte FixAng; byte Trim; byte CrankAng; byte IgHold; byte Trig_plus : 2; byte TrigCrank : 1; byte IgInv : 1; byte oddfire : 4; byte IdleAdv; byte IdleAdvTPS; byte IdleAdvRPM; byte IdleAdvCLT; byte IdleDelayTime; byte StgCycles; byte dwellCont; //Fixed duty dwell control byte dwellCrank; byte dwellRun; byte triggerTeeth; //The full count of teeth on the trigger wheel if there were no gaps byte triggerMissingTeeth; //The size of the tooth gap (ie number of missing teeth) byte crankRPM; //RPM below which the engine is considered to be cranking byte floodClear; //TPS value that triggers flood clear mode (No fuel whilst cranking) byte SoftRevLim; //Soft rev limit (RPM/100) byte SoftLimRetard; //Amount soft limit retards (degrees) byte SoftLimMax; //Time the soft limit can run byte HardRevLim; //Hard rev limit (RPM/100) byte unused7; byte unused8; byte unused9; byte unused10; byte unused11; byte unused12; byte unused13; byte unused14; byte unused15; byte unused16; byte unused17; byte unused18; byte unused19; byte unused20; byte unused21; byte unused22; byte unused23; byte unused24; byte unused25; byte unused26; byte unused27; byte unused28; byte unused29; //128 };