From f327b961f7e6a392c0167ba2d6b0b7cb1de507df Mon Sep 17 00:00:00 2001 From: rusefi Date: Fri, 14 Jun 2019 00:47:28 -0400 Subject: [PATCH] Annotations in C++ code to produce formulas in rusEfi console #807 reducing hard-coded constants in generator and etc --- firmware/gen_config.bat | 4 +- java_console/.gitignore | 2 +- .../models/src/com/rusefi/config/Field.java | 12 - .../models/src/com/rusefi/config/Fields.java | 771 +++++++++++++++++- .../src/com/rusefi/config/FieldsMap.java | 13 + java_console/ui/src/com/rusefi/Launcher.java | 2 +- .../ui/src/com/rusefi/ui/SettingsTab.java | 3 +- java_tools/ConfigDefinition.jar | Bin 87699 -> 87697 bytes .../src/com/rusefi/ConfigDefinition.java | 25 +- .../src/com/rusefi/ConfigField.java | 7 - .../com/rusefi/output/JavaFieldsConsumer.java | 51 +- .../src/com/rusefi/util/LazyFile.java | 2 +- 12 files changed, 835 insertions(+), 57 deletions(-) create mode 100644 java_console/models/src/com/rusefi/config/FieldsMap.java diff --git a/firmware/gen_config.bat b/firmware/gen_config.bat index 139b7aa04d..cbe22acfcd 100644 --- a/firmware/gen_config.bat +++ b/firmware/gen_config.bat @@ -15,7 +15,9 @@ java -Drusefi.generator.lazyfile.enabled=true ^ -ts_destination tunerstudio ^ -c_defines controllers\algo\rusefi_generated.h ^ -c_destination controllers\algo\engine_configuration_generated_structures.h ^ - -java_destination ../java_console -skip build/config.gen + -java_destination ../java_console/models/src/com/rusefi/config/Fields.java ^ + -romraider_destination ../java_console/rusefi.xml ^ + -skip build/config.gen IF NOT ERRORLEVEL 0 echo ERROR generating IF NOT ERRORLEVEL 0 EXIT /B 1 diff --git a/java_console/.gitignore b/java_console/.gitignore index 4af1a17db9..57bddcd111 100644 --- a/java_console/.gitignore +++ b/java_console/.gitignore @@ -1,4 +1,4 @@ -out/ +logs/ rusefi_console_properties.xml output.c currenttune.msq diff --git a/java_console/models/src/com/rusefi/config/Field.java b/java_console/models/src/com/rusefi/config/Field.java index 97a4141f69..199dd0f0f5 100644 --- a/java_console/models/src/com/rusefi/config/Field.java +++ b/java_console/models/src/com/rusefi/config/Field.java @@ -2,9 +2,6 @@ package com.rusefi.config; import com.rusefi.core.Pair; -import java.util.HashMap; -import java.util.Map; - import static com.rusefi.config.FieldType.*; /** @@ -17,8 +14,6 @@ public class Field { private static final String FLOAT_VALUE_PREFIX = FLOAT_TYPE_STRING + Fields.CONSOLE_DATA_PROTOCOL_TAG; public static final int NO_BIT_OFFSET = -1; - public final static Map VALUES = new HashMap<>(); - private final String name; private final int offset; private final FieldType type; @@ -129,25 +124,18 @@ public class Field { '}'; } - private static void register(Field field) { - VALUES.put(field.name, field); - } - public static Field create(String name, int offset, FieldType type, int bitOffset) { Field field = new Field(name, offset, type, bitOffset); - register(field); return field; } public static Field create(String name, int offset, FieldType type, String... options) { Field field = new Field(name, offset, type, options); - register(field); return field; } public static Field create(String name, int offset, FieldType type) { Field field = new Field(name, offset, type); - register(field); return field; } } \ No newline at end of file diff --git a/java_console/models/src/com/rusefi/config/Fields.java b/java_console/models/src/com/rusefi/config/Fields.java index 53890c297e..90dfab2356 100644 --- a/java_console/models/src/com/rusefi/config/Fields.java +++ b/java_console/models/src/com/rusefi/config/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config; -// this file was generated automatically by ConfigDefinition.jar based on integration\rusefi_config.txt Tue Jun 11 21:30:38 EDT 2019 +// this file was generated automatically by ConfigDefinition.jar based on integration\rusefi_config.txt Fri Jun 14 00:38:21 EDT 2019 public class Fields { public static final int accelerometerSpiDevice_offset = 2736; public static final int acCutoffHighRpm_offset = 1498; @@ -2029,4 +2029,773 @@ public class Fields { public static final Field FSIOTABLE2 = Field.create("FSIOTABLE2", 19616, FieldType.INT); public static final Field FSIOTABLE3 = Field.create("FSIOTABLE3", 19744, FieldType.INT); public static final Field FSIOTABLE4 = Field.create("FSIOTABLE4", 19872, FieldType.INT); + public static final Field[] VALUES = { + ENGINETYPE, + ENGINESNIFFERRPMTHRESHOLD, + INJECTOR_FLOW, + DIRECTSELFSTIMULATION, + ACTIVATEAUXPID1, + ISVERBOSEAUXPID1, + ACTIVATEAUXPID2, + ISVERBOSEAUXPID2, + ACTIVATEAUXPID3, + ISVERBOSEAUXPID3, + ACTIVATEAUXPID4, + ISVERBOSEAUXPID4, + USEBIQUADANALOGFILTERING, + CJ125ISUADIVIDED, + CJ125ISLSU49, + ETB1_USE_TWO_WIRES, + ETB2_USE_TWO_WIRES, + SHOWSDCARDWARNING, + ISSUE_294_15, + ISSUE_294_16, + ISSUE_294_17, + ISSUE_294_18, + ISSUE_294_19, + ISSUE_294_21, + ISSUE_294_22, + ISSUE_294_23, + ISSUE_294_24, + ISSUE_294_25, + ISSUE_294_26, + ISSUE_294_27, + ISSUE_294_28, + ISSUE_294_29, + ISSUE_294_30, + ISSUE_294_31, + TPSMIN, + TPSMAX, + TPSERRORDETECTIONTOOLOW, + TPSERRORDETECTIONTOOHIGH, + CRANKING_BASEFUEL, + CRANKING_RPM, + PRIMINGSQUIRTDURATIONMS, + IGNITIONDWELLFORCRANKINGMS, + CRANKINGCHARGEANGLE, + MAP_SENSOR_LOWVALUE, + MAP_SENSOR_HIGHVALUE, + MAP_SENSOR_TYPE, + MAP_SENSOR_HWCHANNEL, + CLT_TEMPC_1, + CLT_TEMPC_2, + CLT_TEMPC_3, + CLT_RESISTANCE_1, + CLT_RESISTANCE_2, + CLT_RESISTANCE_3, + CLT_BIAS_RESISTOR, + CLT_ADCCHANNEL, + IAT_TEMPC_1, + IAT_TEMPC_2, + IAT_TEMPC_3, + IAT_RESISTANCE_1, + IAT_RESISTANCE_2, + IAT_RESISTANCE_3, + IAT_BIAS_RESISTOR, + IAT_ADCCHANNEL, + STEP1RPM, + STEP1TIMING, + HIP9011PRESCALERANDSDO, + KNOCKBANDCUSTOM, + DISPLACEMENT, + CYLINDERSCOUNT, + FIRINGORDER, + CYLINDERBORE, + SENSORSNIFFERRPMTHRESHOLD, + RPMHARDLIMIT, + FUELALGORITHM, + CRANKINGINJECTIONMODE, + INJECTIONMODE, + EXTRAINJECTIONOFFSET, + CRANKINGTIMINGANGLE, + IGNITIONMODE, + IGNITIONOFFSET, + TIMINGMODE, + FIXEDMODETIMING, + GLOBALTRIGGERANGLEOFFSET, + ANALOGINPUTDIVIDERCOEFFICIENT, + VBATTDIVIDERCOEFF, + FANONTEMPERATURE, + FANOFFTEMPERATURE, + VEHICLESPEEDCOEF, + CANNBCTYPE, + CANSLEEPPERIODMS, + OPERATIONMODE, + DISPLAYMODE, + LOGFORMAT, + BYFIRMWAREVERSION, + HD44780WIDTH, + HD44780HEIGHT, + TPS1_1ADCCHANNEL, + VBATTADCCHANNEL, + FUELLEVELSENSOR, + TPS2_1ADCCHANNEL, + OVERRIDECRANKINGIGNITION, + SENSORCHARTFREQUENCY, + TRIGGER_TYPE, + TRIGGER_UNUSEDCUSTOMISSYNCHRONIZATIONNEEDED, + TRIGGER_UNUSEDCUSTOMNEEDSECONDTRIGGERINPUT, + TRIGGER_USEONLYFIRSTCHANNEL, + TRIGGER_CUSTOMTOTALTOOTHCOUNT, + TRIGGER_CUSTOMSKIPPEDTOOTHCOUNT, + HIP9011SPIDEVICE, + HIGH_FUEL_PRESSURE_SENSOR_1, + HIGH_FUEL_PRESSURE_SENSOR_2, + UNUSEDSPIPADDING1, + GLOBALFUELCORRECTION, + ADCVCC, + MAXKNOCKSUBDEG, + MAFADCCHANNEL, + AFR_HWCHANNEL, + AFR_V1, + AFR_VALUE1, + AFR_V2, + AFR_VALUE2, + THROTTLEPEDALPOSITIONADCCHANNEL, + TLE6240_CS, + TLE6240_CSPINMODE, + UNUSEDT, + BAROSENSOR_LOWVALUE, + BAROSENSOR_HIGHVALUE, + BAROSENSOR_TYPE, + BAROSENSOR_HWCHANNEL, + IDLE_SOLENOIDFREQUENCY, + IDLE_SOLENOIDPIN, + IDLE_STEPPERDIRECTIONPIN, + IDLE_STEPPERSTEPPIN, + IDLE_SOLENOIDPINMODE, + MANIDLEPOSITION, + MAPFREQUENCY0KPA, + MAPFREQUENCY100KPA, + TRIGGERSIMULATORFREQUENCY, + INJECTIONPINS1, + INJECTIONPINS2, + INJECTIONPINS3, + INJECTIONPINS4, + INJECTIONPINS5, + INJECTIONPINS6, + INJECTIONPINS7, + INJECTIONPINS8, + INJECTIONPINS9, + INJECTIONPINS10, + INJECTIONPINS11, + INJECTIONPINS12, + IGNITIONPINS1, + IGNITIONPINS2, + IGNITIONPINS3, + IGNITIONPINS4, + IGNITIONPINS5, + IGNITIONPINS6, + IGNITIONPINS7, + IGNITIONPINS8, + IGNITIONPINS9, + IGNITIONPINS10, + IGNITIONPINS11, + IGNITIONPINS12, + INJECTIONPINMODE, + IGNITIONPINMODE, + HD44780_RS, + HD44780_E, + HD44780_DB4, + HD44780_DB5, + HD44780_DB6, + HD44780_DB7, + GPS_RX_PIN, + GPS_TX_PIN, + FUELPUMPPIN, + FUELPUMPPINMODE, + MALFUNCTIONINDICATORPIN, + MALFUNCTIONINDICATORPINMODE, + FANPINMODE, + FANPIN, + CLUTCHDOWNPIN, + ALTERNATORCONTROLPIN, + ALTERNATORCONTROLPINMODE, + CLUTCHDOWNPINMODE, + DIGITALPOTENTIOMETERCHIPSELECT1, + DIGITALPOTENTIOMETERCHIPSELECT2, + DIGITALPOTENTIOMETERCHIPSELECT3, + DIGITALPOTENTIOMETERCHIPSELECT4, + ELECTRONICTHROTTLEPIN1MODE, + WBOHEATERPIN, + CJ125CSPIN, + UNUSEDETBM, + UNUSEDSPIPADDING9, + DIGITALPOTENTIOMETERSPIDEVICE, + MC33972_CS, + MC33972_CSPINMODE, + ETB1_DIRECTIONPIN1, + ETB1_DIRECTIONPIN2, + ETB1_CONTROLPIN1, + ETB1_CONTROLPIN2, + FUELLEVELEMPTYTANKVOLTAGE, + FUELLEVELFULLTANKVOLTAGE, + AFR_TYPE, + FUELCLOSEDLOOPAFRLOWTHRESHOLD, + TRIGGERINPUTPINS1, + TRIGGERINPUTPINS2, + TRIGGERINPUTPINS3, + HIP9011CSPINMODE, + TACHOUTPUTPIN, + TACHOUTPUTPINMODE, + MAINRELAYPIN, + SDCARDCSPIN, + CANTXPIN, + CANRXPIN, + BOARDTESTMODEJUMPERPIN, + UNUSEDMA2, + IDLETHREADPERIODMS, + CONSOLELOOPPERIODMS, + LCDTHREADPERIODMS, + GENERALPERIODICTHREADPERIODMS, + TUNERSTUDIOSERIALSPEED, + CANDEVICEMODE, + TRIGGERSIMULATORPINS1, + TRIGGERSIMULATORPINS2, + TRIGGERSIMULATORPINS3, + TRIGGERSIMULATORPINMODES1, + TRIGGERSIMULATORPINMODES2, + TRIGGERSIMULATORPINMODES3, + O2HEATERPIN, + O2HEATERPINMODETODO, + IS_ENABLED_SPI_1, + IS_ENABLED_SPI_2, + IS_ENABLED_SPI_3, + ISSDCARDENABLED, + ISFASTADCENABLED, + ISENGINECONTROLENABLED, + ISHIP9011ENABLED, + ISVERBOSEALTERNATOR, + USESERIALPORT, + USESTEPPERIDLE, + ENABLEDSTEP1LIMITER, + USETPICADVANCEDMODE, + USELCDSCREEN, + UNUSEDANOTHERONE, + USEWARMUPPIDAFR, + ONOFFALTERNATORLOGIC, + ISCJ125ENABLED, + VVTCAMSENSORUSERISE, + MEASUREMAPONLYINONECYLINDER, + STEPPERFORCEPARKINGEVERYRESTART, + ISFASTERENGINESPINUPENABLED, + COASTINGFUELCUTENABLED, + USEIACTABLEFORCOASTING, + USENOISELESSTRIGGERDECODER, + USEIDLETIMINGPIDCONTROL, + USETPSBASEDVETABLE, + IS_ENABLED_SPI_4, + PAUSEETBCONTROL, + ALIGNENGINESNIFFERATTDC, + USEETBFORIDLECONTROL, + IDLEINCREMENTALPIDCIC, + UNUSED_BOARD_984_31, + LOGICANALYZERPINS1, + LOGICANALYZERPINS2, + LOGICANALYZERPINS3, + LOGICANALYZERPINS4, + MAINRELAYPINMODE, + HIP9011CSPIN, + HIP9011INTHOLDPIN, + HIP9011INTHOLDPINMODE, + UNREALISTICRPMTHREASHOLD, + GPIOPINMODES1, + GPIOPINMODES2, + GPIOPINMODES3, + GPIOPINMODES4, + GPIOPINMODES5, + GPIOPINMODES6, + GPIOPINMODES7, + GPIOPINMODES8, + GPIOPINMODES9, + GPIOPINMODES10, + GPIOPINMODES11, + GPIOPINMODES12, + GPIOPINMODES13, + GPIOPINMODES14, + GPIOPINMODES15, + GPIOPINMODES16, + FSIOOUTPUTPINS1, + FSIOOUTPUTPINS2, + FSIOOUTPUTPINS3, + FSIOOUTPUTPINS4, + FSIOOUTPUTPINS5, + FSIOOUTPUTPINS6, + FSIOOUTPUTPINS7, + FSIOOUTPUTPINS8, + FSIOOUTPUTPINS9, + FSIOOUTPUTPINS10, + FSIOOUTPUTPINS11, + FSIOOUTPUTPINS12, + FSIOOUTPUTPINS13, + FSIOOUTPUTPINS14, + FSIOOUTPUTPINS15, + FSIOOUTPUTPINS16, + MAX31855_CS1, + MAX31855_CS2, + MAX31855_CS3, + MAX31855_CS4, + MAX31855_CS5, + MAX31855_CS6, + MAX31855_CS7, + MAX31855_CS8, + MAX31855SPIDEVICE, + CONSOLEUARTDEVICE, + MAPMINBUFFERLENGTH, + IDLEPIDDEACTIVATIONTPSTHRESHOLD, + STEPPERPARKINGEXTRASTEPS, + NB2RATIOFROM, + NB2RATIOTO, + TRIGGERERRORPIN, + TRIGGERERRORPINMODE, + ACRELAYPIN, + ACRELAYPINMODE, + FSIOFREQUENCY1, + FSIOFREQUENCY2, + FSIOFREQUENCY3, + FSIOFREQUENCY4, + FSIOFREQUENCY5, + FSIOFREQUENCY6, + FSIOFREQUENCY7, + FSIOFREQUENCY8, + FSIOFREQUENCY9, + FSIOFREQUENCY10, + FSIOFREQUENCY11, + FSIOFREQUENCY12, + FSIOFREQUENCY13, + FSIOFREQUENCY14, + FSIOFREQUENCY15, + FSIOFREQUENCY16, + FSIO_SETTING1, + FSIO_SETTING2, + FSIO_SETTING3, + FSIO_SETTING4, + FSIO_SETTING5, + FSIO_SETTING6, + FSIO_SETTING7, + FSIO_SETTING8, + FSIO_SETTING9, + FSIO_SETTING10, + FSIO_SETTING11, + FSIO_SETTING12, + FSIO_SETTING13, + FSIO_SETTING14, + FSIO_SETTING15, + FSIO_SETTING16, + SPI1MOSIPIN, + SPI1MISOPIN, + SPI1SCKPIN, + SPI2MOSIPIN, + SPI2MISOPIN, + SPI2SCKPIN, + SPI3MOSIPIN, + SPI3MISOPIN, + SPI3SCKPIN, + CDMINPUTPIN, + JOYSTICKCENTERPIN, + JOYSTICKAPIN, + JOYSTICKBPIN, + JOYSTICKCPIN, + JOYSTICKDPIN, + UNUSEDJOY, + SENSORCHARTMODE, + MAFSENSORTYPE, + FSIODIGITALINPUTS1, + FSIODIGITALINPUTS2, + FSIODIGITALINPUTS3, + FSIODIGITALINPUTS4, + FSIODIGITALINPUTS5, + FSIODIGITALINPUTS6, + FSIODIGITALINPUTS7, + FSIODIGITALINPUTS8, + FSIODIGITALINPUTS9, + FSIODIGITALINPUTS10, + FSIODIGITALINPUTS11, + FSIODIGITALINPUTS12, + FSIODIGITALINPUTS13, + FSIODIGITALINPUTS14, + FSIODIGITALINPUTS15, + FSIODIGITALINPUTS16, + VEHICLESPEEDSENSORINPUTPIN, + CLUTCHUPPIN, + FREQUENCYREPORTINGMAPINPUTPIN, + CLUTCHUPPINMODE, + ETBIDLERANGE, + VVTDISPLAYINVERTED, + FUELCLOSEDLOOPCORRECTIONENABLED, + ISVERBOSEIAC, + ISVERBOSEETB, + USECONSTANTDWELLDURINGCRANKING, + ISENGINECHARTENABLED, + SILENTTRIGGERERROR, + USELINEARCLTSENSOR, + CANREADENABLED, + CANWRITEENABLED, + USELINEARIATSENSOR, + USEFSIO16FORTIMINGADJUSTMENT, + TACHPULSEDURATIONASDUTYCYCLE, + ISALTERNATORCONTROLENABLED, + INVERTPRIMARYTRIGGERSIGNAL, + INVERTSECONDARYTRIGGERSIGNAL, + CUTFUELONHARDLIMIT, + CUTSPARKONHARDLIMIT, + STEP1FUELCUTENABLE, + STEP1SPARKCUTENABLE, + HASFREQUENCYREPORTINGMAPSENSOR, + USEFSIO8FORSERVO1, + USEFSIO9FORSERVO2, + USEFSIO10FORSERVO3, + USEFSIO11FORSERVO4, + USEFSIO12FORSERVO5, + USEFSIO15FORIDLERPMADJUSTMENT, + USEFSIO5FORCRITICALISSUEENGINESTOP, + USEFSIO4FORSERIOUSENGINEWARNING, + UNUSED_BIT_1472_29, + UNUSED_BIT_1472_30, + HIPOUTPUTCHANNEL, + IDLEMODE, + ISINJECTIONENABLED, + ISIGNITIONENABLED, + ISCYLINDERCLEANUPENABLED, + SECONDTRIGGERCHANNELENABLED, + NEEDSECONDTRIGGERINPUTDEPRECATED, + ISMAPAVERAGINGENABLED, + OVERRIDECRANKINGIACSETTING, + USESEPARATEADVANCEFORIDLE, + ISTUNERSTUDIOENABLED, + ISWAVEANALYZERENABLED, + USESEPARATEVEFORIDLE, + ISPRINTTRIGGERSYNCHDETAILS, + ISMANUALSPINNINGMODE, + TWOWIREBATCHINJECTION, + USEONLYRISINGEDGEFORTRIGGER, + TWOWIREBATCHIGNITION, + USEFIXEDBAROCORRFROMMAP, + USESEPARATEADVANCEFORCRANKING, + USEADVANCECORRECTIONSFORCRANKING, + USETPSADVANCETABLE, + UNUSED_1484_BIT_20, + UNUSED_1484_BIT_21, + ENGINECHARTSIZE, + IDLEPIDRPMUPPERLIMIT, + PRIMEINJFALLOFFTEMPERATURE, + ACSWITCHADC, + IGNMATHCALCULATEATINDEX, + ACCUTOFFLOWRPM, + ACCUTOFFHIGHRPM, + ACIDLERPMBUMP, + WARNINGPERIOD, + VREFADCCHANNEL, + KNOCKDETECTIONWINDOWSTART, + KNOCKDETECTIONWINDOWEND, + IDLESTEPPERREACTIONTIME, + KNOCKVTHRESHOLD, + FSIOINPUTMODES1, + FSIOINPUTMODES2, + FSIOINPUTMODES3, + FSIOINPUTMODES4, + FSIOINPUTMODES5, + FSIOINPUTMODES6, + FSIOINPUTMODES7, + FSIOINPUTMODES8, + FSIOINPUTMODES9, + FSIOINPUTMODES10, + FSIOINPUTMODES11, + FSIOINPUTMODES12, + FSIOINPUTMODES13, + FSIOINPUTMODES14, + FSIOINPUTMODES15, + FSIOINPUTMODES16, + IDLESTEPPERTOTALSTEPS, + NOACCELAFTERHARDLIMITPERIODSECS, + MAPAVERAGINGSCHEDULINGATINDEX, + BAROCORRTABLE, + TACHPULSEDURACTIONMS, + TACHPULSETRIGGERINDEX, + WWAETAU, + ALTERNATORCONTROL_PFACTOR, + ALTERNATORCONTROL_IFACTOR, + ALTERNATORCONTROL_DFACTOR, + ALTERNATORCONTROL_OFFSET, + ALTERNATORCONTROL_PERIODMS, + ALTERNATORCONTROL_MINVALUE, + ALTERNATORCONTROL_MAXVALUE, + ETB_PFACTOR, + ETB_IFACTOR, + ETB_DFACTOR, + ETB_OFFSET, + ETB_PERIODMS, + ETB_MINVALUE, + ETB_MAXVALUE, + WARMUPAFRPID_PFACTOR, + WARMUPAFRPID_IFACTOR, + WARMUPAFRPID_DFACTOR, + WARMUPAFRPID_OFFSET, + WARMUPAFRPID_PERIODMS, + WARMUPAFRPID_MINVALUE, + WARMUPAFRPID_MAXVALUE, + MAPERRORDETECTIONTOOLOW, + MAPERRORDETECTIONTOOHIGH, + STEP1RPMWINDOW, + IDLERPMPID_PFACTOR, + IDLERPMPID_IFACTOR, + IDLERPMPID_DFACTOR, + IDLERPMPID_OFFSET, + IDLERPMPID_PERIODMS, + IDLERPMPID_MINVALUE, + IDLERPMPID_MAXVALUE, + WWAEBETA, + COMMUNICATIONLEDPIN, + RUNNINGLEDPIN, + BINARYSERIALTXPIN, + BINARYSERIALRXPIN, + AUXVALVES1, + AUXVALVES2, + CONSOLESERIALTXPIN, + CONSOLESERIALRXPIN, + THROTTLEPEDALUPVOLTAGE, + THROTTLEPEDALWOTVOLTAGE, + STARTUPFUELPUMPDURATION, + IDLEPIDRPMDEADZONE, + TARGETVBATT, + ALTERNATOROFFABOVETPS, + STARTOFCRANKINGPRIMINGPULSE, + AFTERCRANKINGIACTAPERDURATION, + IACBYTPSTAPER, + FATALERRORPIN, + WARNINGLEDPIN, + UNUSED1234234, + LIS302DLCSPIN, + TPSACCELLENGTH, + TPSACCELENRICHMENTTHRESHOLD, + VVTOFFSET, + ENGINELOADACCELLENGTH, + ENGINELOADDECELENLEANMENTTHRESHOLD, + ENGINELOADDECELENLEANMENTMULTIPLIER, + ENGINELOADACCELENRICHMENTTHRESHOLD, + ENGINELOADACCELENRICHMENTMULTIPLIER, + UARTCONSOLESERIALSPEED, + TPSDECELENLEANMENTTHRESHOLD, + TPSDECELENLEANMENTMULTIPLIER, + SLOWADCALPHA, + DEBUGMODE, + WARMUPAFRTHRESHOLD, + BOOSTCUTPRESSURE, + FSIOADC1, + FSIOADC2, + FSIOADC3, + FSIOADC4, + FIXEDTIMING, + MAPLOWVALUEVOLTAGE, + MAPHIGHVALUEVOLTAGE, + EGOVALUESHIFT, + AUXPIDPINS1, + AUXPIDPINS2, + AUXPIDPINS3, + AUXPIDPINS4, + CAMINPUT, + CJ125CSPINMODE, + DIZZYSPARKOUTPUTPIN, + DIZZYSPARKOUTPUTPINMODE, + CRANKINGIACPOSITION, + TCHARGEMINRPMMINTPS, + TCHARGEMINRPMMAXTPS, + TCHARGEMAXRPMMINTPS, + TCHARGEMAXRPMMAXTPS, + AUXPIDFREQUENCY1, + AUXPIDFREQUENCY2, + AUXPIDFREQUENCY3, + AUXPIDFREQUENCY4, + ALTERNATORPWMFREQUENCY, + STORAGEMODE, + CJ125SPIDEVICE, + VVTMODE, + BIQUAD_A0, + BIQUAD_A1, + BIQUAD_A2, + BIQUAD_B1, + BIQUAD_B2, + NBVVTINDEX, + AUTOTUNECLTTHRESHOLD, + AUTOTUNETPSROCTHRESHOLD, + AUTOTUNETPSQUIETPERIOD, + POSTCRANKINGTARGETCLT, + POSTCRANKINGFACTOR, + POSTCRANKINGDURATIONSEC, + AUXTEMPSENSOR1_TEMPC_1, + AUXTEMPSENSOR1_TEMPC_2, + AUXTEMPSENSOR1_TEMPC_3, + AUXTEMPSENSOR1_RESISTANCE_1, + AUXTEMPSENSOR1_RESISTANCE_2, + AUXTEMPSENSOR1_RESISTANCE_3, + AUXTEMPSENSOR1_BIAS_RESISTOR, + AUXTEMPSENSOR1_ADCCHANNEL, + AUXTEMPSENSOR2_TEMPC_1, + AUXTEMPSENSOR2_TEMPC_2, + AUXTEMPSENSOR2_TEMPC_3, + AUXTEMPSENSOR2_RESISTANCE_1, + AUXTEMPSENSOR2_RESISTANCE_2, + AUXTEMPSENSOR2_RESISTANCE_3, + AUXTEMPSENSOR2_BIAS_RESISTOR, + AUXTEMPSENSOR2_ADCCHANNEL, + FUELCLOSEDLOOPCLTTHRESHOLD, + FUELCLOSEDLOOPTPSTHRESHOLD, + FUELCLOSEDLOOPRPMTHRESHOLD, + ETBFREQ, + FUELCLOSEDLOOPPID_PFACTOR, + FUELCLOSEDLOOPPID_IFACTOR, + FUELCLOSEDLOOPPID_DFACTOR, + FUELCLOSEDLOOPPID_OFFSET, + FUELCLOSEDLOOPPID_PERIODMS, + FUELCLOSEDLOOPPID_MINVALUE, + FUELCLOSEDLOOPPID_MAXVALUE, + FUELCLOSEDLOOPAFRHIGHTHRESHOLD, + TIMING_OFFSET_CYLINDER1, + TIMING_OFFSET_CYLINDER2, + TIMING_OFFSET_CYLINDER3, + TIMING_OFFSET_CYLINDER4, + TIMING_OFFSET_CYLINDER5, + TIMING_OFFSET_CYLINDER6, + TIMING_OFFSET_CYLINDER7, + TIMING_OFFSET_CYLINDER8, + TIMING_OFFSET_CYLINDER9, + TIMING_OFFSET_CYLINDER10, + TIMING_OFFSET_CYLINDER11, + TIMING_OFFSET_CYLINDER12, + IDLEPIDACTIVATIONTIME, + SDCARDSPIDEVICE, + SPI1SCKMODE, + SPI1MOSIMODE, + SPI1MISOMODE, + SPI2SCKMODE, + SPI2MOSIMODE, + SPI2MISOMODE, + SPI3SCKMODE, + SPI3MOSIMODE, + SPI3MISOMODE, + STEPPERENABLEPINMODE, + MC33816_RSTB, + MC33816_DRIVEN, + BRAKEPEDALPIN, + CJ125UA, + CJ125UR, + BRAKEPEDALPINMODE, + AUXPID1_PFACTOR, + AUXPID1_IFACTOR, + AUXPID1_DFACTOR, + AUXPID1_OFFSET, + AUXPID1_PERIODMS, + AUXPID1_MINVALUE, + AUXPID1_MAXVALUE, + AUXPID2_PFACTOR, + AUXPID2_IFACTOR, + AUXPID2_DFACTOR, + AUXPID2_OFFSET, + AUXPID2_PERIODMS, + AUXPID2_MINVALUE, + AUXPID2_MAXVALUE, + AUXPID3_PFACTOR, + AUXPID3_IFACTOR, + AUXPID3_DFACTOR, + AUXPID3_OFFSET, + AUXPID3_PERIODMS, + AUXPID3_MINVALUE, + AUXPID3_MAXVALUE, + AUXPID4_PFACTOR, + AUXPID4_IFACTOR, + AUXPID4_DFACTOR, + AUXPID4_OFFSET, + AUXPID4_PERIODMS, + AUXPID4_MINVALUE, + AUXPID4_MAXVALUE, + OILPRESSURE_HWCHANNEL, + OILPRESSURE_V1, + OILPRESSURE_VALUE1, + OILPRESSURE_V2, + OILPRESSURE_VALUE2, + ACCELEROMETERSPIDEVICE, + FLEXFUELSENSOR, + TEST557PIN, + STEPPERDIRECTIONPINMODE, + EXTERNALKNOCKSENSEADC, + STEPPERENABLEPIN, + TLE8888_CS, + TLE8888_CSPINMODE, + MC33816_CS, + SERVOOUTPUTPINS1, + SERVOOUTPUTPINS2, + SERVOOUTPUTPINS3, + SERVOOUTPUTPINS4, + SERVOOUTPUTPINS5, + SERVOOUTPUTPINS6, + SERVOOUTPUTPINS7, + SERVOOUTPUTPINS8, + COASTINGFUELCUTRPMHIGH, + COASTINGFUELCUTRPMLOW, + COASTINGFUELCUTTPS, + COASTINGFUELCUTCLT, + PIDEXTRAFORLOWRPM, + COASTINGFUELCUTMAP, + IGNITIONTPSTABLE, + TCHARGEAIRCOEFMIN, + TCHARGEAIRCOEFMAX, + TCHARGEAIRFLOWMAX, + TCHARGEAIRINCRLIMIT, + TCHARGEAIRDECRLIMIT, + TCHARGEMODE, + HIP9011GAIN, + ETB_ITERMMIN, + ETB_ITERMMAX, + ETBDEADBAND, + ETB2_DIRECTIONPIN1, + ETB2_DIRECTIONPIN2, + ETB2_CONTROLPIN1, + ETB2_CONTROLPIN2, + IDLETIMINGPID_PFACTOR, + IDLETIMINGPID_IFACTOR, + IDLETIMINGPID_DFACTOR, + IDLETIMINGPID_OFFSET, + IDLETIMINGPID_PERIODMS, + IDLETIMINGPID_MINVALUE, + IDLETIMINGPID_MAXVALUE, + IDLETIMINGPIDWORKZONE, + IDLETIMINGPIDDEADZONE, + IDLEPIDFALLOFFDELTARPM, + TPSACCELFRACTIONPERIOD, + TPSACCELFRACTIONDIVISOR, + TLE8888SPIDEVICE, + MC33816SPIDEVICE, + TLE6240SPIDEVICE, + MC33972SPIDEVICE, + PEDALTOTPSTABLE, + FSIOFORMULAS1, + FSIOFORMULAS2, + FSIOFORMULAS3, + FSIOFORMULAS4, + FSIOFORMULAS5, + FSIOFORMULAS6, + FSIOFORMULAS7, + FSIOFORMULAS8, + FSIOFORMULAS9, + FSIOFORMULAS10, + FSIOFORMULAS11, + FSIOFORMULAS12, + FSIOFORMULAS13, + FSIOFORMULAS14, + FSIOFORMULAS15, + FSIOFORMULAS16, + TIMINGMULTIPLIER, + TIMINGADDITIVE, + IGNITIONIATCORRTABLE, + INJECTIONPHASE, + FUELTABLE, + IGNITIONTABLE, + VETABLE, + AFRTABLE, + TPSTPSACCELTABLE, + FSIOTABLE1, + FSIOTABLE2, + FSIOTABLE3, + FSIOTABLE4, + }; } diff --git a/java_console/models/src/com/rusefi/config/FieldsMap.java b/java_console/models/src/com/rusefi/config/FieldsMap.java new file mode 100644 index 0000000000..f3136711e0 --- /dev/null +++ b/java_console/models/src/com/rusefi/config/FieldsMap.java @@ -0,0 +1,13 @@ +package com.rusefi.config; + +import java.util.HashMap; +import java.util.Map; + +public class FieldsMap { + public final static Map VALUES = new HashMap<>(); + + static { + for (Field field : Fields.VALUES) + VALUES.put(field.getName(), field); + } +} diff --git a/java_console/ui/src/com/rusefi/Launcher.java b/java_console/ui/src/com/rusefi/Launcher.java index 99d802db16..1c3e61f6a7 100644 --- a/java_console/ui/src/com/rusefi/Launcher.java +++ b/java_console/ui/src/com/rusefi/Launcher.java @@ -46,7 +46,7 @@ import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; * @see EngineSnifferPanel */ public class Launcher { - public static final int CONSOLE_VERSION = 20190610; + public static final int CONSOLE_VERSION = 20190614; public static final boolean SHOW_STIMULATOR = false; public static final String INPUT_FILES_PATH = ".."; private static final String TAB_INDEX = "main_tab"; diff --git a/java_console/ui/src/com/rusefi/ui/SettingsTab.java b/java_console/ui/src/com/rusefi/ui/SettingsTab.java index 3411045589..13750beaa1 100644 --- a/java_console/ui/src/com/rusefi/ui/SettingsTab.java +++ b/java_console/ui/src/com/rusefi/ui/SettingsTab.java @@ -2,6 +2,7 @@ package com.rusefi.ui; import com.rusefi.config.Field; import com.rusefi.config.FieldType; +import com.rusefi.config.FieldsMap; import com.rusefi.ui.config.*; import com.rusefi.ui.util.UiUtils; @@ -130,7 +131,7 @@ public class SettingsTab { if (f.getKey() == null) continue; - Field field = Field.VALUES.get(f.getKey().toUpperCase()); + Field field = FieldsMap.VALUES.get(f.getKey().toUpperCase()); if (field == null) throw new NullPointerException("No field for " + f.getKey()); // System.out.println("Located " + field); diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 6996ca58b17e09dbcddfc5180bee0f4331e87d6c..99fee0da695119c3b847b7e116aff1a669251800 100644 GIT binary patch delta 22329 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 KR|4>~t^XJ1ixXY| delta 22395 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 Ly&{0OgZ{q&wfWxt diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java index 87e3cb8b00..64c16d2255 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java @@ -28,13 +28,13 @@ public class ConfigDefinition { public static String MESSAGE; private static final String ROM_RAIDER_XML_TEMPLATE = "rusefi_template.xml"; - private static final String ROM_RAIDER_XML_OUTPUT = "rusefi.xml"; public static final String KEY_DEFINITION = "-definition"; private static final String KEY_ROM_INPUT = "-romraider"; public static final String KEY_TS_DESTINATION = "-ts_destination"; private static final String KEY_C_DESTINATION = "-c_destination"; private static final String KEY_C_DEFINES = "-c_defines"; - private static final String KEY_CONSOLE_DESTINATION = "-java_destination"; + private static final String KEY_JAVA_DESTINATION = "-java_destination"; + private static final String KEY_ROMRAIDER_DESTINATION = "-romraider_destination"; public static final String KEY_PREPEND = "-prepend"; private static final String KEY_SKIP = "-skip"; public static String definitionInputFile = null; @@ -55,7 +55,7 @@ public class ConfigDefinition { + KEY_DEFINITION + " x\r\n" + KEY_TS_DESTINATION + " x\r\n" + KEY_C_DESTINATION + " x\r\n" - + KEY_CONSOLE_DESTINATION + " x\r\n" + + KEY_JAVA_DESTINATION + " x\r\n" ); return; } @@ -63,7 +63,8 @@ public class ConfigDefinition { String tsPath = null; String destCHeader = null; String destCDefines = null; - String javaConsolePath = null; + String javaDestination = null; + String romRaiderDestination = null; List prependFiles = new ArrayList<>(); String skipRebuildFile = null; String romRaiderInputFile = null; @@ -78,8 +79,10 @@ public class ConfigDefinition { destCHeader = args[i + 1]; } else if (key.equals(KEY_C_DEFINES)) { destCDefines = args[i + 1]; - } else if (key.equals(KEY_CONSOLE_DESTINATION)) { - javaConsolePath = args[i + 1]; + } else if (key.equals(KEY_JAVA_DESTINATION)) { + javaDestination = args[i + 1]; + } else if (key.equals(KEY_ROMRAIDER_DESTINATION)) { + romRaiderDestination = args[i + 1]; } else if (key.equals(KEY_PREPEND)) { prependFiles.add(args[i + 1]); } else if (key.equals(KEY_SKIP)) { @@ -119,9 +122,8 @@ public class ConfigDefinition { CharArrayWriter tsWriter = new CharArrayWriter(); destinations.add(new TSProjectConsumer(tsWriter, tsPath, state)); } - if (javaConsolePath != null) { - CharArrayWriter javaFieldsWriter = new CharArrayWriter(); - destinations.add(new JavaFieldsConsumer(javaFieldsWriter, state, javaConsolePath)); + if (javaDestination != null) { + destinations.add(new JavaFieldsConsumer(state, javaDestination)); } if (destinations.isEmpty()) @@ -134,10 +136,9 @@ public class ConfigDefinition { if (destCDefines != null) VariableRegistry.INSTANCE.writeNumericsToFile(destCDefines); - if (javaConsolePath != null && romRaiderInputFile != null) { + if (romRaiderDestination != null && romRaiderInputFile != null) { String inputFileName = romRaiderInputFile + File.separator + ROM_RAIDER_XML_TEMPLATE; - String outputFileName = javaConsolePath + File.separator + ROM_RAIDER_XML_OUTPUT; - processTextTemplate(inputFileName, outputFileName); + processTextTemplate(inputFileName, romRaiderDestination); } if (skipRebuildFile != null) { System.out.println("Writing " + currentMD5 + " to " + skipRebuildFile); diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java index 68fcf8baab..7c19487760 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java @@ -126,13 +126,6 @@ public class ConfigField { } - public void writeJavaFieldName(Writer javaFieldsWriter, String nameWithPrefix, int tsPosition) throws IOException { - javaFieldsWriter.write("\tpublic static final Field "); - javaFieldsWriter.write(nameWithPrefix.toUpperCase()); - javaFieldsWriter.write(" = Field.create(\"" + nameWithPrefix.toUpperCase() + "\", " - + tsPosition + ", "); - } - public String getCommentContent() { if (comment == null || comment.isEmpty()) return comment; diff --git a/java_tools/configuration_definition/src/com/rusefi/output/JavaFieldsConsumer.java b/java_tools/configuration_definition/src/com/rusefi/output/JavaFieldsConsumer.java index 46f12cdead..d2ed6d1ed1 100644 --- a/java_tools/configuration_definition/src/com/rusefi/output/JavaFieldsConsumer.java +++ b/java_tools/configuration_definition/src/com/rusefi/output/JavaFieldsConsumer.java @@ -15,56 +15,55 @@ import static com.rusefi.ConfigDefinition.EOL; */ public class JavaFieldsConsumer implements ConfigurationConsumer { private static final Set javaEnums = new HashSet<>(); - private static final String JAVA_SOURCE_CODE_FILE_NAME = "models/src/com/rusefi/config/Fields.java"; - public static final String JAVA_PACKAGE = "com.rusefi.config"; + private static final String JAVA_PACKAGE = "com.rusefi.config"; private final CharArrayWriter javaFieldsWriter; private final ReaderState state; - private final String javaConsolePath; private final LazyFile javaFields; + private final StringBuffer allFields = new StringBuffer("\tpublic static final Field[] VALUES = {" + EOL); + private final String className; - public JavaFieldsConsumer(CharArrayWriter javaFieldsWriter, ReaderState state, String javaConsolePath) throws IOException { - this.javaFieldsWriter = javaFieldsWriter; + public JavaFieldsConsumer(ReaderState state, String javaDestination) { + this.javaFieldsWriter = new CharArrayWriter(); this.state = state; - this.javaConsolePath = javaConsolePath; - javaFields = new LazyFile(javaConsolePath + File.separator + JAVA_SOURCE_CODE_FILE_NAME); + javaFields = new LazyFile(javaDestination); + String className = new File(javaDestination).getName(); + this.className = className.substring(0, className.indexOf('.')); } - public static int writeJavaFields(List tsFields, ReaderState state, String prefix, Writer javaFieldsWriter, int tsPosition) throws IOException { + private int writeJavaFields(List tsFields, String prefix, int tsPosition) throws IOException { FieldIterator fieldIterator = new FieldIterator(); for (int i = 0; i < tsFields.size(); i++) { ConfigField next = i == tsFields.size() - 1 ? ConfigField.VOID : tsFields.get(i + 1); ConfigField cf = tsFields.get(i); - tsPosition = writeJavaFields(cf, prefix, javaFieldsWriter, tsPosition, next, fieldIterator.bitState.get()); + tsPosition = writeJavaFields(cf, prefix, tsPosition, next, fieldIterator.bitState.get()); fieldIterator.bitState.incrementBitIndex(cf, next); } return tsPosition; } - public static int writeJavaFields(ConfigField configField, String prefix, Writer javaFieldsWriter, int tsPosition, ConfigField next, int bitIndex) throws IOException { + private int writeJavaFields(ConfigField configField, String prefix, int tsPosition, ConfigField next, int bitIndex) throws IOException { ConfigStructure cs = configField.getState().structures.get(configField.getType()); if (cs != null) { String extraPrefix = cs.withPrefix ? configField.getName() + "_" : ""; - return writeJavaFields(cs.tsFields, configField.getState(), prefix + extraPrefix, javaFieldsWriter, tsPosition); + return writeJavaFields(cs.tsFields, prefix + extraPrefix, tsPosition); } String nameWithPrefix = prefix + configField.getName(); - if (configField.isBit()) { - configField.writeJavaFieldName(javaFieldsWriter, nameWithPrefix, tsPosition); + writeJavaFieldName(nameWithPrefix, tsPosition); javaFieldsWriter.append("FieldType.BIT, " + bitIndex + ");" + EOL); tsPosition += configField.getSize(next); return tsPosition; } - if (configField.getArraySize() != 1) { // todo: array support } else if (TypesHelper.isFloat(configField.getType())) { - configField.writeJavaFieldName(javaFieldsWriter, nameWithPrefix, tsPosition); + writeJavaFieldName(nameWithPrefix, tsPosition); javaFieldsWriter.write("FieldType.FLOAT);" + EOL); } else { String enumOptions = VariableRegistry.INSTANCE.get(configField.getType() + ConfigField.ENUM_SUFFIX); @@ -74,11 +73,11 @@ public class JavaFieldsConsumer implements ConfigurationConsumer { javaFieldsWriter.write("\tpublic static final String[] " + configField.getType() + " = {" + enumOptions + "};" + EOL); } - configField.writeJavaFieldName(javaFieldsWriter, nameWithPrefix, tsPosition); + writeJavaFieldName(nameWithPrefix, tsPosition); if (configField.getElementSize() == 1) { javaFieldsWriter.write("FieldType.INT8"); } else if (configField.getElementSize() == 2) { - javaFieldsWriter.write("FieldType.INT16"); + javaFieldsWriter.write("FieldType.INT16"); } else { javaFieldsWriter.write("FieldType.INT"); } @@ -93,18 +92,26 @@ public class JavaFieldsConsumer implements ConfigurationConsumer { return tsPosition; } + private void writeJavaFieldName(String nameWithPrefix, int tsPosition) throws IOException { + javaFieldsWriter.write("\tpublic static final Field "); + allFields.append("\t" + nameWithPrefix.toUpperCase() + "," + EOL); + javaFieldsWriter.write(nameWithPrefix.toUpperCase()); + javaFieldsWriter.write(" = Field.create(\"" + nameWithPrefix.toUpperCase() + "\", " + + tsPosition + ", "); + } + @Override - public void startFile() throws IOException { + public void startFile() { javaFields.write("package " + JAVA_PACKAGE + ";" + ConfigDefinition.EOL + ConfigDefinition.EOL); javaFields.write("// this file " + ConfigDefinition.MESSAGE + ConfigDefinition.EOL); - javaFields.write("public class Fields {" + ConfigDefinition.EOL); + javaFields.write("public class " + className + " {" + ConfigDefinition.EOL); } @Override public void handleEndStruct(ConfigStructure structure) throws IOException { if (state.stack.isEmpty()) { - writeJavaFields(structure.tsFields, state, "", javaFieldsWriter, 0); + writeJavaFields(structure.tsFields, "", 0); } } @@ -112,6 +119,10 @@ public class JavaFieldsConsumer implements ConfigurationConsumer { public void endFile() throws IOException { javaFields.write(VariableRegistry.INSTANCE.getJavaConstants()); javaFields.write(javaFieldsWriter.toString()); + + allFields.append("\t};" + EOL); + javaFields.write(allFields.toString()); + javaFields.write("}" + ConfigDefinition.EOL); javaFields.close(); } diff --git a/java_tools/configuration_definition/src/com/rusefi/util/LazyFile.java b/java_tools/configuration_definition/src/com/rusefi/util/LazyFile.java index fdfbb66be1..90822376bd 100644 --- a/java_tools/configuration_definition/src/com/rusefi/util/LazyFile.java +++ b/java_tools/configuration_definition/src/com/rusefi/util/LazyFile.java @@ -45,7 +45,7 @@ public class LazyFile { for (int i = 0; i < Math.min(fileContent.length(), newContent.length()); i++) { if (fileContent.charAt(i) != newContent.charAt(i)) { System.out.println(getClass().getSimpleName() + " " + filename + ": Not same at " + i); - if (i > 15) { + if (i > 15 && i < fileContent.length() - 6 && i < newContent.length() - 6) { System.out.println("file " + fileContent.substring(i - 15, i + 5)); System.out.println("newContent " + newContent.substring(i - 15, i + 5)); }