From cc6257bf5c9d9c59e66cd49a17c9425ae4113fec Mon Sep 17 00:00:00 2001 From: rusefi Date: Sat, 20 Jul 2019 14:56:56 -0400 Subject: [PATCH] trigger counters to formula, docs & improvements --- firmware/console/binary/tunerstudio.cpp | 2 ++ firmware/controllers/engine_controller.cpp | 2 +- .../generated/engine_state_generated.h | 5 ++-- firmware/controllers/generated/readme.md | 6 ++++- firmware/controllers/generated/thermistor.h | 5 ++-- .../controllers/generated/trigger_structs.h | 5 ++-- firmware/controllers/generated/wall_fuel.h | 5 ++-- .../controllers/trigger/trigger_decoder.cpp | 13 ++++++++++ firmware/gen_config2.bat | 1 + firmware/integration/trigger.txt | 4 +-- .../rusefi/config/generated/EngineState.java | 3 ++- .../com/rusefi/config/generated/Fields.java | 3 ++- .../config/generated/ThermistorState.java | 3 ++- .../rusefi/config/generated/TriggerState.java | 24 ++++++++++++++++++ .../config/generated/WallFuelState.java | 3 ++- java_console/ui/src/com/rusefi/Launcher.java | 2 +- .../ldmp/generated/TriggerDecoderMeta.java | 19 ++++++++++++++ .../com/rusefi/ui/livedocs/LiveDocPanel.java | 5 ++++ java_tools/ConfigDefinition.jar | Bin 111459 -> 111995 bytes .../src/com/rusefi/ConfigStructure.java | 8 +++++- .../src/com/rusefi/ReaderState.java | 12 ++++++++- .../com/rusefi/output/CHeaderConsumer.java | 6 ++++- .../com/rusefi/output/JavaFieldsConsumer.java | 1 + 23 files changed, 117 insertions(+), 20 deletions(-) create mode 100644 java_console/models/src/com/rusefi/config/generated/TriggerState.java create mode 100644 java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java diff --git a/firmware/console/binary/tunerstudio.cpp b/firmware/console/binary/tunerstudio.cpp index 6404fd8144..7f82f86475 100644 --- a/firmware/console/binary/tunerstudio.cpp +++ b/firmware/console/binary/tunerstudio.cpp @@ -258,6 +258,8 @@ static const void * getStructAddr(int structId) { return static_cast(&engine->engineState); case LDS_FUEL_TRIM_INDEX: return static_cast(&engine->wallFuel); + case LDS_TRIGGER_INDEX: + return static_cast(&engine->triggerCentral); default: return NULL; } diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index c25e0c02b1..b3fa65529f 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -812,6 +812,6 @@ int getRusEfiVersion(void) { if (initBootloader() != 0) return 123; #endif /* EFI_BOOTLOADER_INCLUDE_CODE */ - return 20190713; + return 20190720; } #endif /* EFI_UNIT_TEST */ diff --git a/firmware/controllers/generated/engine_state_generated.h b/firmware/controllers/generated/engine_state_generated.h index d83e6892a2..29f6af3067 100644 --- a/firmware/controllers/generated/engine_state_generated.h +++ b/firmware/controllers/generated/engine_state_generated.h @@ -1,4 +1,5 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Wed Jun 19 22:24:15 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sat Jul 20 12:28:04 EDT 2019 +// by class com.rusefi.output.CHeaderConsumer // begin #ifndef CONTROLLERS_GENERATED_ENGINE_STATE_GENERATED_H #define CONTROLLERS_GENERATED_ENGINE_STATE_GENERATED_H @@ -85,4 +86,4 @@ typedef struct engine_state2_s engine_state2_s; #endif // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Wed Jun 19 22:24:15 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sat Jul 20 12:28:04 EDT 2019 diff --git a/firmware/controllers/generated/readme.md b/firmware/controllers/generated/readme.md index 19cd4a55b5..c754e5d81a 100644 --- a/firmware/controllers/generated/readme.md +++ b/firmware/controllers/generated/readme.md @@ -1 +1,5 @@ -All the code here was generated by tools. \ No newline at end of file +All the code here was generated by tools. + +See gen_config.bat +See gen_config2.bat +See java_console\models\src\com\rusefi\config\generated diff --git a/firmware/controllers/generated/thermistor.h b/firmware/controllers/generated/thermistor.h index 973faea12f..e6c9ca506a 100644 --- a/firmware/controllers/generated/thermistor.h +++ b/firmware/controllers/generated/thermistor.h @@ -1,4 +1,5 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor.txt Mon Jun 17 20:32:33 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor.txt Sat Jul 20 12:28:04 EDT 2019 +// by class com.rusefi.output.CHeaderConsumer // begin #ifndef CONTROLLERS_GENERATED_THERMISTOR_H #define CONTROLLERS_GENERATED_THERMISTOR_H @@ -24,4 +25,4 @@ typedef struct thermistor_state_s thermistor_state_s; #endif // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor.txt Mon Jun 17 20:32:33 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor.txt Sat Jul 20 12:28:04 EDT 2019 diff --git a/firmware/controllers/generated/trigger_structs.h b/firmware/controllers/generated/trigger_structs.h index 058bdee12e..980221ad61 100644 --- a/firmware/controllers/generated/trigger_structs.h +++ b/firmware/controllers/generated/trigger_structs.h @@ -1,4 +1,5 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/trigger.txt Sat Jun 29 20:53:25 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/trigger.txt Sat Jul 20 12:29:51 EDT 2019 +// by class com.rusefi.output.CHeaderConsumer // begin #ifndef CONTROLLERS_GENERATED_TRIGGER_STRUCTS_H #define CONTROLLERS_GENERATED_TRIGGER_STRUCTS_H @@ -18,4 +19,4 @@ typedef struct trigger_central_s trigger_central_s; #endif // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/trigger.txt Sat Jun 29 20:53:25 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/trigger.txt Sat Jul 20 12:29:51 EDT 2019 diff --git a/firmware/controllers/generated/wall_fuel.h b/firmware/controllers/generated/wall_fuel.h index fcced07ca5..c4a48a3e9b 100644 --- a/firmware/controllers/generated/wall_fuel.h +++ b/firmware/controllers/generated/wall_fuel.h @@ -1,4 +1,5 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel.txt Fri Jul 12 22:41:50 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel.txt Sat Jul 20 12:28:05 EDT 2019 +// by class com.rusefi.output.CHeaderConsumer // begin #ifndef CONTROLLERS_GENERATED_WALL_FUEL_H #define CONTROLLERS_GENERATED_WALL_FUEL_H @@ -22,4 +23,4 @@ typedef struct wall_fuel_state wall_fuel_state; #endif // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel.txt Fri Jul 12 22:41:50 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel.txt Sat Jul 20 12:28:05 EDT 2019 diff --git a/firmware/controllers/trigger/trigger_decoder.cpp b/firmware/controllers/trigger/trigger_decoder.cpp index dd44ae144c..8f01fdc7a2 100644 --- a/firmware/controllers/trigger/trigger_decoder.cpp +++ b/firmware/controllers/trigger/trigger_decoder.cpp @@ -474,6 +474,19 @@ void TriggerState::decodeTriggerEvent(trigger_event_e const signal, efitime_t no bool isSynchronizationPoint; bool wasSynchronized = shaft_is_synchronized; + DISPLAY(DISPLAY_CONFIG(TRIGGERINPUTPINS1)); + DISPLAY_TEXT(Trigger_1_Fall); + DISPLAY(DISPLAY_FIELD(HWEVENTCOUNTERS1)); + DISPLAY_TEXT(Rise); + DISPLAY(DISPLAY_FIELD(HWEVENTCOUNTERS2)); + DISPLAY_TEXT(EOL); + + DISPLAY(DISPLAY_CONFIG(TRIGGERINPUTPINS2)); + DISPLAY_TEXT(Trigger_2_Fall); + DISPLAY(DISPLAY_FIELD(HWEVENTCOUNTERS3)); + DISPLAY_TEXT(Rise); + DISPLAY(DISPLAY_FIELD(HWEVENTCOUNTERS4)); + if (triggerShape->isSynchronizationNeeded) { // this is getting a little out of hand, any ideas? diff --git a/firmware/gen_config2.bat b/firmware/gen_config2.bat index d47d759f8e..550974036a 100644 --- a/firmware/gen_config2.bat +++ b/firmware/gen_config2.bat @@ -29,6 +29,7 @@ java -DSystemOut.name=gen_config2 ^ -java_destination ../java_console/models/src/com/rusefi/config/generated/TriggerState.java ^ -c_destination controllers/generated/trigger_structs.h +%LIVE_DOCS_COMMAND% controllers/trigger/trigger_decoder.cpp %LIVE_DOCS_COMMAND% controllers/sensors/thermistors.cpp %LIVE_DOCS_COMMAND% controllers/sensors/tps.cpp %LIVE_DOCS_COMMAND% controllers/math/speed_density.cpp diff --git a/firmware/integration/trigger.txt b/firmware/integration/trigger.txt index 66cd161965..63a57d8494 100644 --- a/firmware/integration/trigger.txt +++ b/firmware/integration/trigger.txt @@ -1,8 +1,8 @@ #define HW_EVENT_TYPES 6 -struct_no_prefix trigger_central_s +struct_no_prefix define_contructor trigger_central_s - int[HW_EVENT_TYPES] hwEventCounters; + int[HW_EVENT_TYPES iterate] hwEventCounters; end_struct diff --git a/java_console/models/src/com/rusefi/config/generated/EngineState.java b/java_console/models/src/com/rusefi/config/generated/EngineState.java index 0e93a11685..5e599612c2 100644 --- a/java_console/models/src/com/rusefi/config/generated/EngineState.java +++ b/java_console/models/src/com/rusefi/config/generated/EngineState.java @@ -1,7 +1,8 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Wed Jun 19 22:24:15 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sat Jul 20 12:28:04 EDT 2019 +// by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; public class EngineState { diff --git a/java_console/models/src/com/rusefi/config/generated/Fields.java b/java_console/models/src/com/rusefi/config/generated/Fields.java index 32af0c1719..f3e5549317 100644 --- a/java_console/models/src/com/rusefi/config/generated/Fields.java +++ b/java_console/models/src/com/rusefi/config/generated/Fields.java @@ -1,7 +1,8 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration\rusefi_config.txt Thu Jul 18 18:26:35 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration\rusefi_config.txt Sat Jul 20 12:06:16 EDT 2019 +// class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; public class Fields { diff --git a/java_console/models/src/com/rusefi/config/generated/ThermistorState.java b/java_console/models/src/com/rusefi/config/generated/ThermistorState.java index 94287a586b..0b45c84412 100644 --- a/java_console/models/src/com/rusefi/config/generated/ThermistorState.java +++ b/java_console/models/src/com/rusefi/config/generated/ThermistorState.java @@ -1,7 +1,8 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor.txt Mon Jun 17 20:32:33 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor.txt Sat Jul 20 12:28:04 EDT 2019 +// by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; public class ThermistorState { diff --git a/java_console/models/src/com/rusefi/config/generated/TriggerState.java b/java_console/models/src/com/rusefi/config/generated/TriggerState.java new file mode 100644 index 0000000000..f66aa6e84b --- /dev/null +++ b/java_console/models/src/com/rusefi/config/generated/TriggerState.java @@ -0,0 +1,24 @@ +package com.rusefi.config.generated; + +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/trigger.txt Sat Jul 20 12:28:04 EDT 2019 + +// by class com.rusefi.output.JavaFieldsConsumer +import com.rusefi.config.*; + +public class TriggerState { + public static final int HW_EVENT_TYPES = 6; + public static final Field HWEVENTCOUNTERS1 = Field.create("HWEVENTCOUNTERS1", 0, FieldType.INT); + public static final Field HWEVENTCOUNTERS2 = Field.create("HWEVENTCOUNTERS2", 4, FieldType.INT); + public static final Field HWEVENTCOUNTERS3 = Field.create("HWEVENTCOUNTERS3", 8, FieldType.INT); + public static final Field HWEVENTCOUNTERS4 = Field.create("HWEVENTCOUNTERS4", 12, FieldType.INT); + public static final Field HWEVENTCOUNTERS5 = Field.create("HWEVENTCOUNTERS5", 16, FieldType.INT); + public static final Field HWEVENTCOUNTERS6 = Field.create("HWEVENTCOUNTERS6", 20, FieldType.INT); + public static final Field[] VALUES = { + HWEVENTCOUNTERS1, + HWEVENTCOUNTERS2, + HWEVENTCOUNTERS3, + HWEVENTCOUNTERS4, + HWEVENTCOUNTERS5, + HWEVENTCOUNTERS6, + }; +} diff --git a/java_console/models/src/com/rusefi/config/generated/WallFuelState.java b/java_console/models/src/com/rusefi/config/generated/WallFuelState.java index f1283baca3..dcf6e09894 100644 --- a/java_console/models/src/com/rusefi/config/generated/WallFuelState.java +++ b/java_console/models/src/com/rusefi/config/generated/WallFuelState.java @@ -1,7 +1,8 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel.txt Fri Jul 12 22:41:50 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel.txt Sat Jul 20 12:28:05 EDT 2019 +// by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; public class WallFuelState { diff --git a/java_console/ui/src/com/rusefi/Launcher.java b/java_console/ui/src/com/rusefi/Launcher.java index 04efe7b225..64d4bddc84 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 = 20190714; + public static final int CONSOLE_VERSION = 20190720; public static final String INPUT_FILES_PATH = ".."; private static final String TAB_INDEX = "main_tab"; protected static final String PORT_KEY = "port"; diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java new file mode 100644 index 0000000000..b12671c5f2 --- /dev/null +++ b/java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java @@ -0,0 +1,19 @@ +package com.rusefi.ldmp.generated; + +import com.rusefi.ldmp.*; + +public class TriggerDecoderMeta { + public static final Request[] CONTENT = new Request[]{ + new ConfigRequest("TRIGGERINPUTPINS1"), + new TextRequest("Trigger_1_Fall"), + new FieldRequest("HWEVENTCOUNTERS1"), + new TextRequest("Rise"), + new FieldRequest("HWEVENTCOUNTERS2"), + new TextRequest("EOL"), + new ConfigRequest("TRIGGERINPUTPINS2"), + new TextRequest("Trigger_2_Fall"), + new FieldRequest("HWEVENTCOUNTERS3"), + new TextRequest("Rise"), + new FieldRequest("HWEVENTCOUNTERS4"), + }; +} \ No newline at end of file diff --git a/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java b/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java index 721ff8469d..1a656d9132 100644 --- a/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java +++ b/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java @@ -6,12 +6,14 @@ import com.rusefi.config.Field; import com.rusefi.config.generated.EngineState; import com.rusefi.config.generated.Fields; import com.rusefi.config.generated.ThermistorState; +import com.rusefi.config.generated.TriggerState; import com.rusefi.core.Sensor; import com.rusefi.core.SensorCentral; import com.rusefi.ldmp.*; import com.rusefi.ldmp.generated.SpeedDensityMeta; import com.rusefi.ldmp.generated.ThermistorsMeta; import com.rusefi.ldmp.generated.TpsMeta; +import com.rusefi.ldmp.generated.TriggerDecoderMeta; import com.rusefi.ui.livedocs.controls.Toolbox; import com.rusefi.ui.util.UiUtils; import org.jetbrains.annotations.NotNull; @@ -177,6 +179,9 @@ public class LiveDocPanel { liveDocs.add(getPanel("tCharge", "", Fields.LDS_ENGINE_STATE_INDEX, EngineState.VALUES, SpeedDensityMeta.CONTENT)); + liveDocs.add(getPanel("Trigger", "", Fields.LDS_TRIGGER_INDEX, + TriggerState.VALUES, TriggerDecoderMeta.CONTENT)); + return liveDocs; } } diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 553406c65826b4b9d8354335369ae60278f08183..5075da40f4603ae6826fbb7f72321d45021baa01 100644 GIT binary patch delta 18301 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 AM*si- delta 17730 zcmeI3bypnE*6*1K1b6ok+}+*XJ-E9=f@Xr-paTrS-JO8|L4pkK?jdLh5Hvu7H;&wdjAkdiSpHu3BAPtE)e??|!`8*?)o#EOEK zB(xhysEU3gk7QFQCM zt^`D?6RpaK65?b-dTX>{eB~f#e9sG`K<^YO-M1|=MwP!)^||6WW(WBAt2Fj-T172d z-2Pna6l&q}0aWqpbiMg_U4k{+oF_e-68E*1m(YZl))`=5N~}mH`DDf3U-&YoN z`xxe)Dj`GSL+^0u@50LZQ%z5BYK!rc>9@8pzo=%#n#tAHR@%zF7}{R$FvLAkt-f=P z&7C%|pzvnuzFTL1W2heznIcvI7Nzg*<7BfZf!6MFL~lwT$q*6MY&+~N(H}ONt7U(- zPdhQo@f7`EyzmaHqLeW}+#mV}TKR|+QJ2<`jW(I%M=7l`>?(Em*$xIfXqB0K)GSkX z$hEA$4-8+WICs|*pD@<8Y(|nzf zce8-2Q70iifH~zpkMp~?|Lxzq^jX}}dwhaZj*hfJmHfEJ80VQ6S2b9Qlk$JCrZtDi zV=xxIB;E{ZQ4+r5NQF(?mv7)v@J@l{Y_T39yepNDXg9`z$` zWrVJS{aDU9Gyh@i;oj&Q+{-OM8Bm4`RP(O7GM5j-dDNtfzp?9h%(nCd&0ZcgR zDx$|EF0AdhcBQTl>?)XS`1%|l4w`q=PENSFzs0_ub~3TWztIxB@jbm+pYK}l7tcj| zd$69(r%aA>eMkRwC-~s8=d$}i;?MR2HiD3*oNebsc$d(tofE1y&jQfP7XN7QyFjfI z*G+i;=YTf(!CJJ-*jZj}L>6C&UCu!WiDzd8V9o_={_f*m!!vzss=j{k-4ZL8^0}WC194t^9-AZ2k&=eD!=+FOs#mNJDWZ7D!IKe%8Yg%en z+`_=;)6lXuO0vHt654T{_OXR;Znc!&yF=<%M(tWrV=c__>&nL50`t}i+1l*dMzf8B zsMWk^{HBrNX{l(;C66^*PCIHjDF2JtL0*m>-FK?jGyMD;g9Vkw?HFb=BA3A-iXfJi ztP#6kfa3IBQm&UEIacGOqi2IHRFw+D$U0E7iSew)IzO{@#t-|Rr zJg|(Sy`Kv;V4`wsmlqD$Wk+*H9-k==hG>BapF>k z;3eGt6}NESmfwjTvOqahQ*ma5RKP_4D$*v3ZZn6RWSTc{J;nT0nj)7@?VjS13V7AZ zmVH)fke4F2{~<7oerojg^OrgZ5)*od-lWPwO(&-}X~MY>x3{vW#&Tf1->SXunrZe+ zHgO*(hJ|{NLvu;W7vK@MmEmM=${x#0sj@6XI*TH^XeJ7MQzQ}fi{!p;?{z#R zCdxk;@!JM)$umvDzkNOW_sCOdF@7wM@dthpM=H*b%IM4IX3An?%}G|o zwHKKaUY>=0X)1!)wA<$Atz?YS@woH?m|j?6Ydju2nh8DG;gZdy(a(!+G=(jrObr zVvp0>Kg2EVVD73othtm0&XM*}VrfbIuC0wFWBpKT=bsb(G zi`0Zq1P8wSzRC-?Rw>D~2fa>T*asVCa*lw zd@BaF&do>91@_1*(c{Gu3Bbih>o1V?afzyx%x9|Nn&H9`n{^-UN70ty?8&bJUKl1L z1~G@d4ke-djwCz+cvFDTlQj`ihf^h#^g8XnNrBL9m)J`JoA|6DBfO^j`$AoJwXen% z=+DQ*GBjhgbS6TI36+$!1L9E=ST&tm6@G`XBj$<+n2B)DwT?4e@tj}L&>-+q6{eI5 z&t}bId0?KK#ei%&sH#*4-X&)oF4j+`Ja#;&BxCZ{VZXzqI4G6wMC7i(>zde4Hiaqw)$p{rzVc zxVL_l^3SVyac}+*SHp4Pz!7aF^6t|f<0FQOn^0v>7dW!LEk)?z3?MhWyv#W z$lRF;J6eWU?nK&nNhU>(US=z7e}yPZz0y%ZQ$dpv_C7@SHTR2y+gfS377UUMLM-KC zEY=cP>zYy)%c)NXTa|W{Ulw`?@s;2IQko)}Q(n?SNo%s*)gqm3;tpAE!cS_F<~dPM zpd?)bBX+^aSZ-(|rZAJ|zTBBnL#Yb&M^Vf|?x%uUCFtaC(wwHP|+l z&=%!*yl~>LFyUrbhV4W8CLDA@9HM-*Qkn!Lk9cmmkCt>Uha((`g2L);27SA?s@epL zx*YB*(?ha4f-42FAC-;Y2pDDB5$d!qoAE}kB{GJxm(NO4*JCBuC)D8MATp=GPUcxs z2nFqUR%7Of1P!Xbz?ZLZ-UYFYpow68Csp>bnW%Q1r%*~6j#z`pH`Anrr9LQ#oU*P6&UW|MQWu7F+V*5z2aY@jztL`1*h%gZbd(ogy^@fw zwjJ3l(XX=2e+l}aL#$+z!9+Yu%+Bv1#3&S6wPn?IttQoh?f%AKPNy4N#miXNH1Ow3 zSHH^WVcCS~N%c!YntG8$kjUYv*Enf8XJ7KC_Y{}zvThY~M+pgqGYsP%5E+hqzC@&4 zntWT{AuQQr)Ygc|r31V=R6eJG z4N@{{v}KbcNFvFuIH-nFwTEX(=$3k&BAnZPm=UKWwf`QG3=%h%1(gXCUI=7VYEhF6 z&7#Y46mi5vlCh@H>V#5xeGQ+xr@Lv2S>udkz;&!|}v|{W&+m zW{k|;{4z`oF%}Wg{WaaJ&B}GbyY?HfS5A8_3e9U@#G~-wcQy-@%Ot+LXqwwK0<%0g zUepSgdHqJp-DrWaU7*OnJ1Cl#3%L0Nt}sHI-YBe>hlSyd_-7DdlLj)EhA^OU`IbqF zpe23@^J~>aY{a|JC_`%bVt*{3*6Gwt_b&;yx;n~i$zkOZ_(g!~xtX`z-=w@ERx^J?y$F@hX|Yt9NCz{WPRYahSz}3ZFo!u(J@)THI|w`qIEe-Nty9m^OHYp+b>n%zxt2D3Abs#PU5T zB;>)mUCJzK2@jMlcPzL!_sb8qDVbYCyyo!5nUQ_fL$+bw%VgLI9zi;^ScD%hqt%fw z%dKgF8Zb@Ha z*JUlm8T6QA7_ap6$5f~l9w+PAM*0w%mu%DYrx<+Nwn&gY2hB=nSaF37QrDU>a`d8f zl^>D&A>CERtm+#kX6u3PR?hJdv%(AiODLTD+*dy(JC7|+khl(Ms6l!#+pRoDV2s&= z=A%bm9cfa(&DyC}GTx8b$qdDY&Ut3eDF?_q#ToLsRsM9(Su4TIU*o$r4udf;9|F-n zzSGoIx_k+__>Fhg;buHzxNQ~Y3MjA*TF17Wfcl1`O3`tN0Qh@lusS7;CXc4F_OHS} zOkq5m9or=LB|ZLBC;E72lFe$0{_?nMo|_skqUm_7kr5EYv7T1H&;knp5#$I=4D!TZ zB7I!UXx2QU7Xr$HbM1SbY>r9j)n^%EXj{3YYg3rK)iBHK*=vveO46I&02tJ#t~6#D z+~ztM)v*JSO>r1tPOG!9(wmU4HzDuJbjwcuo~m41(=lYN+&td&{O!)0e7s3f1gw7m zjc^gtanbL*MM}s-v&L)!3QHJuf_4cBJfks8Lc?BLhyqJr(H#>DeHji1&H)NBz^khy!nUCPIMq_E}43 z-`<;3S(?@BpNVvuZ%Ky=qI7aA-I9h1BAwfJ%5T*IJ@EZMf3Z^Nl-;5U1-;|BbCkbaq+{B9mN7ci$z;V1;DD#m9$=YtAyi)O=AyOhnJIj2@HD8OV_tV-8hB z)M#F!PCw@+O;XXi!;kF^?Y>=}9!>dM7Fw?bFgawHS9h^2}mcj+Wx+vh3PB0DIZ+FmzSpItMV ziEpA#o1Hjd?cx%c;d?cIvi7SlSt5_$HrP}qS*(Rpz);49m{s>B7N`syW}|~+E5=}T zSmIvVJoq7U*vR!= zm1wW-r}LBgt2sko9SL>PT9sq z?TB0x7R?T-NAL1GZ&;yLhve<4Y83896q~bqwq$sl#)X~-gCtb(l=}>geIc#ppE-)Q zU2Z$#Jhrk~x+8g6x)auHgB9WL&c(N91e}*t9AlE}@#MeXQN%`d;gU*foy$rfE*qiF zFJZdIsPuZdD2zEM%_L>YadfOO+K|IU_3ud}Q_gh>CHvdro|Zm5?<=jHA)b0tyH)oEUUBF})c%EV9|fqrZ^j zz)6A7zt}x_F=G3*mhUDDOG{SUg{4({_y=<_r>dWiE@pFHOkqjS%E(uR$rbG`C7tYX z>z>25%Ls)%JHD2p-=>L!mM{^_Y;?Y879~_lGycJausa^qm?L3C(;!lW5){H&xQ#K^`ZxbTx0d0 ztv~eD`#an&a(=m5=!0xKPUYa$ANF+6e}s@N<`f(JZ8)hf7^$}7pC$-eD4J9uY5r0IrcN3SSG*>)3N_krB36OsD93tQ+mFMQliE%4zH#wy# zx|-vIVZKcSgJ;^rn7;k#z%~>YlT^#$<_tga`z_r3cvF@Yp367sB%-EkYjeJmGgqOmiG6DzeU|iDQd4Pd3h0{$u8PJ)Ijj5I}rTX^d^1!a9YrpT_z{F6H zbl!9x?X0~wt<>j5GleybvML<|T;9S}SrDa9TUe=hY{oTD9flL4FIU5AIi2~pBRf-M z&fHGZJ>>wNe$Dd~YP*>epEeNg z(EW8CNZoo7>N>ud^2Me+=!Oh%3#{(O9ngsGqn_$DpbU+jadfU>a&GoF-_hmx&Rqu)c4D6z#+<*;3z4FU!tUUX z#Xdjox4T7=VEL9t{_8d~B8k-~a!0K_+95yrT$xI9OsJm%yCIL6LGzN0-X>}Uggq+6 zx0ry5obEV0(HAz7Hnt{=j*0pvpr9IkzLVuo|f! zz0CsGkKIOrJw|Ucz#e0_Sfcl4q+fS3Lo5cdZN)ggMf1EL&<@laOxnP?jRohA-hKq< zH^=vAovGf(sXt~(ClmKrIgx=tV=_IEvmm59AyQECnIhok{RvU6XljlUir&>l5x*1J zx5WbYR(yU(usk0x=@OE`zOLx8ol!iv<>f>hE~(2`IlLd&lf9E&qN1PcPS;o2x7t%x zEu{_lQn^}UgexK;9bidRJsy*!!e~W2S+D;29iX|%d`#=x1efzke^XJAD?}+AGN9fE zg9#GkIwmmU|EZYiP+d~E@=sw*XyWuWy{(gk}y_E4-x`TUwK8P?(J7WP2$MkoIx7?K?xDYQql!9 zQoXdl3SWrAmOltkEFQiBY0W@BZA8lij`J}!;61W=ZUp;LwhJ*o77u3HWu+PnOdEi> zQ-DCYkurWRAIp1|$l&}FDUNI6CXG;U-KZS~2c?4fDN(|mH@0*&?-UhcI7xYsGKi%d z=PE2~Jyip32Nr4GMf4r!uz!|uL|2bhn9)rc$VII7Bt*I0Xx#M#Eu;KyLvVT}%zoTV z(Q(f3)zabg=g$I<;?s)0xI8UfXP@3ZF_c~mZaM%$`Bdpo zHdO(XQ7V!nEbS`9}*akBks;GCg=}1~OalOt+ zPM^x)7Vk?3l_bGfBV46js;4Lf@erA7bOj8&&KF4W8y(l#UadQ#mv%K~F@>_6Q|iMP ztXt?7EBZ9si7<~7`$NFFoWct2&byE{uC>8dr&zBJ|BH(S$xe#{gNA(->XSEWc$=x7RD*3ON}WM@Z$)+F(xWkX9WC+~+C>D) zKgE_-eGw?_i_vmY|Bef}1|DaA>DY$KrGzAAt0By(xG;IjpPs=ZnSD3tdD!hYndAf-5SHFO*hX1O(}jic2W?#?N!Tn$*nW$iI&+S#x)&*RcK_wPreVZFoa5v<7}T zM+%*g+wZQ=0d44t^578|u};|5FIp4`HN9EdE7}U8ulSlXPfH^nUb^);_60u7*~xfj zz$>A0z(IL+yggv6jiL4M8woYTh|*O=ahCBeC?=U)<7jcJ#}~P!tv3m3_J<^ZN>VKp z^$H1DI@~u8%@*q@ljaQ=ffe?mqcFr<7-W?7sYXTM-Ei_`a^^+Nf?lG zK!u)sg*HeJ+9YMrkQk~n{$RqH;Iv28bW8B!4wqxs*EiH3qQBzs-JJ3EksY>MCR|-L zC&5E^z{3T&lHw?Jua0O^|{fB46SzTnr})f zcQDL2?GpAnaj=t1%mUudx4`DJ;iCDZ#w5ee&o+q)ZFa*F-w+ z-n4H%a->rD6RSKkc>l3O*H&u_C4{)|oInp%QQoXR0&3PLLQ(97oMMrOwO>oL30nKE z>JNv=`OMua>7p5`TM1)!HyictAFY|1F9lrro9P+_09%@koZ22VaY_i>eq^&k*D!iZ+~T9ER%eeDW-nR3y+W} zi=Bv!`c#-VXk#(Yc_PShQYpB7vDLn|l%MxVAZxzyuEsUThT9PEON+DE4AjReLciX9 z&+~S!VBY+tc(g}-WvZcR(ZzU%9BL2$iB18&u8O4PIuCAxTRV?b>zY)ZgJjTU&W2Uw zP?_5>d=pALtC|01@?cR|^SB=Ze|^TX{!yaRN=Am$=9o4FU5r!3idd5;F1%z1<0TJM zlNKAt)X#w9aJe!+!e*?!OV>3LMDv8DlHzFkGH zuS{!Div_1bmr`G}X65oVy)Yp`A+$sjEYbFg&}o}7Zx`cKMozvtRQj6cwOx9sj23i& ztTK4C4{R9#qNhz*Qwvv%e@GAzeMJ6bKU6;xAoNe>|EJ_kz{!jMV-o;0rxIWetfz%^{bYjX zmjG}eWv4jk2>U9V0}cs5umxX1QL3MGZUz5$oo*cPs>ilF(Dpf0B@ufU^ov z4mOd1y$hj#8^nLA< z(+^w72Rl0GQ~A^hs#*uo0D8JY#{~g2P^`iymEpQ4l@$+&hbPOw zWU1<(439xjiTbC0^S_6tC stack = new Stack<>(); public Map tsCustomSize = new HashMap<>(); public Map tsCustomLine = new HashMap<>(); @@ -136,6 +137,15 @@ public class ReaderState { } private static void handleStartStructure(ReaderState state, String line, boolean withPrefix) { + boolean withContructor; + if (line.toLowerCase().startsWith(DEFINE_CONTRUCTOR)) { + withContructor = true; + line = line.substring(DEFINE_CONTRUCTOR.length()).trim(); + } else { + withContructor = false; + } + + String name; String comment; if (line.contains(" ")) { @@ -146,7 +156,7 @@ public class ReaderState { name = line; comment = null; } - ConfigStructure structure = new ConfigStructure(name, comment, withPrefix); + ConfigStructure structure = new ConfigStructure(name, comment, withPrefix, withContructor); state.stack.push(structure); SystemOut.println("Starting structure " + structure.getName()); } diff --git a/java_tools/configuration_definition/src/com/rusefi/output/CHeaderConsumer.java b/java_tools/configuration_definition/src/com/rusefi/output/CHeaderConsumer.java index 79a8401b83..bb970127db 100644 --- a/java_tools/configuration_definition/src/com/rusefi/output/CHeaderConsumer.java +++ b/java_tools/configuration_definition/src/com/rusefi/output/CHeaderConsumer.java @@ -21,6 +21,7 @@ public class CHeaderConsumer implements ConfigurationConsumer { SystemOut.println("Writing C header to " + destCHeader); cHeader = new LazyFile(destCHeader); cHeader.write("// this section " + ConfigDefinition.MESSAGE + EOL); + cHeader.write("// by " + getClass() + EOL); cHeader.write("// begin" + EOL); String id = destCHeader.replaceAll("[\\\\\\.\\/]", "_").toUpperCase(); cHeader.write("#ifndef " + id + EOL); @@ -50,7 +51,7 @@ public class CHeaderConsumer implements ConfigurationConsumer { } @Override - public void startFile() throws IOException { + public void startFile() { } @Override @@ -61,6 +62,9 @@ public class CHeaderConsumer implements ConfigurationConsumer { content.append("// start of " + structure.name + EOL); content.append("struct " + structure.name + " {" + EOL); + if (structure.isWithContructor()) { + content.append("\t" + structure.name + "();" + EOL); + } structure.bitState.reset(); for (int i = 0; i < structure.cFields.size(); i++) { 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 231967563d..67733162a0 100644 --- a/java_tools/configuration_definition/src/com/rusefi/output/JavaFieldsConsumer.java +++ b/java_tools/configuration_definition/src/com/rusefi/output/JavaFieldsConsumer.java @@ -104,6 +104,7 @@ public class JavaFieldsConsumer implements ConfigurationConsumer { public void startFile() { javaFields.write("package " + JAVA_PACKAGE + ";" + ConfigDefinition.EOL + ConfigDefinition.EOL); javaFields.write("// this file " + ConfigDefinition.MESSAGE + ConfigDefinition.EOL + EOL); + javaFields.write("// by " + getClass() + EOL); javaFields.write("import com.rusefi.config.*;" + EOL + EOL); javaFields.write("public class " + className + " {" + ConfigDefinition.EOL); }