From e6b0e0625ad9c7c560d2da5eefb8b699eb5c4994 Mon Sep 17 00:00:00 2001 From: rusefi Date: Mon, 17 Jun 2019 20:21:32 -0400 Subject: [PATCH] Utility class which writes same line both to stdout and file --- firmware/.gitignore | 3 ++ .../controllers/algo/auto_generated_enums.cpp | 14 +++--- .../controllers/algo/auto_generated_enums.h | 6 +-- firmware/gen_config.bat | 5 +- firmware/gen_config_board.bat | 6 ++- firmware/gen_enum_to_string.bat | 5 +- .../com/rusefi/config/generated/Fields.java | 2 +- java_tools/ConfigDefinition.jar | Bin 99267 -> 106514 bytes .../src/com/rusefi/ConfigDefinition.java | 23 ++++----- .../src/com/rusefi/ConfigField.java | 9 ++-- .../src/com/rusefi/ReaderState.java | 5 +- .../src/com/rusefi/TypesHelper.java | 4 +- .../src/com/rusefi/VariableRegistry.java | 11 ++-- .../rusefi/board_generator/BoardReader.java | 7 +-- .../com/rusefi/ldmp/LiveDocsMetaParser.java | 20 ++++---- .../com/rusefi/output/CHeaderConsumer.java | 3 +- .../com/rusefi/output/TSProjectConsumer.java | 5 +- java_tools/enum2string.jar | Bin 11813 -> 19953 bytes .../src/com/rusefi/EnumToString.java | 15 +++--- .../src/com/rusefi/EnumsReader.java | 9 ++-- .../src/com/rusefi/util/IoUtils.java | 8 +++ .../src/com/rusefi/util/LazyFile.java | 23 ++++----- .../src/com/rusefi/util/SystemOut.java | 47 ++++++++++++++++++ 23 files changed, 151 insertions(+), 79 deletions(-) create mode 100644 java_tools/enum_to_string/src/com/rusefi/util/IoUtils.java rename java_tools/{configuration_definition => enum_to_string}/src/com/rusefi/util/LazyFile.java (70%) create mode 100644 java_tools/enum_to_string/src/com/rusefi/util/SystemOut.java diff --git a/firmware/.gitignore b/firmware/.gitignore index 4dde7496f3..02c65c8d52 100644 --- a/firmware/.gitignore +++ b/firmware/.gitignore @@ -1,2 +1,5 @@ openocd benchmark.txt +gen_config.log +gen_config_board.log +gen_enum_to_string.log diff --git a/firmware/controllers/algo/auto_generated_enums.cpp b/firmware/controllers/algo/auto_generated_enums.cpp index 77f6413a8e..6c3c8f6b7f 100644 --- a/firmware/controllers/algo/auto_generated_enums.cpp +++ b/firmware/controllers/algo/auto_generated_enums.cpp @@ -1,10 +1,10 @@ #include "global.h" #include "rusefi_enums.h" #include "rusefi_hw_enums.h" -// auto-generated from rusefi_hw_enums.h -// auto-generated from rusefi_enums.h +// was generated automatically by rusEfi tool from rusefi_hw_enums.h +// was generated automatically by rusEfi tool from rusefi_enums.h // by enum2string.jar tool -// on Tue Jun 04 12:17:32 EDT 2019 +// on Mon Jun 17 19:49:25 EDT 2019 // see also gen_config_and_enums.bat @@ -533,8 +533,6 @@ case Force_4_bytes_size_cranking_ignition_mode: } const char *getDebug_mode_e(debug_mode_e value){ switch(value) { -case DBG_ETB_LOGIC: - return "DBG_ETB_LOGIC"; case DBG_36: return "DBG_36"; case DBG_37: @@ -567,6 +565,8 @@ case DBG_ELECTRONIC_THROTTLE_PID: return "DBG_ELECTRONIC_THROTTLE_PID"; case DBG_EL_ACCEL: return "DBG_EL_ACCEL"; +case DBG_ETB_LOGIC: + return "DBG_ETB_LOGIC"; case DBG_EXECUTOR: return "DBG_EXECUTOR"; case DBG_FSIO_ADC: @@ -751,6 +751,8 @@ case MIATA_NA6_MAP: return "MIATA_NA6_MAP"; case MIATA_NA6_VAF: return "MIATA_NA6_VAF"; +case MICRO_RUS_EFI: + return "MICRO_RUS_EFI"; case MINIMAL_PINS: return "MINIMAL_PINS"; case MINI_COOPER_R50: @@ -785,8 +787,6 @@ case TEST_ISSUE_366_BOTH: return "TEST_ISSUE_366_BOTH"; case TEST_ISSUE_366_RISE: return "TEST_ISSUE_366_RISE"; -case MICRO_RUS_EFI: - return "MICRO_RUS_EFI"; case TLE8888_BENCH_ENGINE: return "TLE8888_BENCH_ENGINE"; case TOYOTA_2JZ_GTE_VVTi: diff --git a/firmware/controllers/algo/auto_generated_enums.h b/firmware/controllers/algo/auto_generated_enums.h index 1b86ea3c4d..b261f14ec9 100644 --- a/firmware/controllers/algo/auto_generated_enums.h +++ b/firmware/controllers/algo/auto_generated_enums.h @@ -1,7 +1,7 @@ -// auto-generated from rusefi_hw_enums.h -// auto-generated from rusefi_enums.h +// was generated automatically by rusEfi tool from rusefi_hw_enums.h +// was generated automatically by rusEfi tool from rusefi_enums.h // by enum2string.jar tool -// on Tue Jun 04 12:17:32 EDT 2019 +// on Mon Jun 17 19:49:25 EDT 2019 // see also gen_config_and_enums.bat diff --git a/firmware/gen_config.bat b/firmware/gen_config.bat index ef540e6617..17355aa087 100644 --- a/firmware/gen_config.bat +++ b/firmware/gen_config.bat @@ -2,13 +2,16 @@ rem This batch files reads rusefi_config.txt and produses firmware persistent configuration headers rem the storage section of rusefi.ini is updated as well +rm gen_config.log +rm gen_config_board.log rem lazy is broken - TS input is not considered a change rm build/config.gen mkdir build -java -Drusefi.generator.lazyfile.enabled=true ^ +java -DSystemOut.name=gen_config ^ + -Drusefi.generator.lazyfile.enabled=true ^ -jar ../java_tools/ConfigDefinition.jar ^ -definition integration\rusefi_config.txt ^ -romraider integration ^ diff --git a/firmware/gen_config_board.bat b/firmware/gen_config_board.bat index 42a5f49551..d2389f9f59 100644 --- a/firmware/gen_config_board.bat +++ b/firmware/gen_config_board.bat @@ -16,7 +16,8 @@ echo BOARDNAME=%BOARDNAME% rem lazy is broken - TS input is not considered a change rm build/config.gen -java -cp ../java_tools/ConfigDefinition.jar;../java_tools/configuration_definition/lib/snakeyaml.jar ^ +java -DSystemOut.name=gen_config_board ^ + -cp ../java_tools/ConfigDefinition.jar;../java_tools/configuration_definition/lib/snakeyaml.jar ^ com.rusefi.board_generator.BoardReader ^ -board %BOARDNAME% ^ -firmware_path . ^ @@ -25,7 +26,8 @@ java -cp ../java_tools/ConfigDefinition.jar;../java_tools/configuration_definiti -enumInputFile controllers/algo/rusefi_hw_enums.h -java -jar ../java_tools/ConfigDefinition.jar ^ +java -DSystemOut.name=gen_config_board ^ + -jar ../java_tools/ConfigDefinition.jar ^ -definition integration\rusefi_config.txt ^ -ts_destination tunerstudio ^ -ts_output_name rusefi_%BOARDNAME%.ini ^ diff --git a/firmware/gen_enum_to_string.bat b/firmware/gen_enum_to_string.bat index d23d53b833..f01ba2c86a 100644 --- a/firmware/gen_enum_to_string.bat +++ b/firmware/gen_enum_to_string.bat @@ -1,6 +1,9 @@ rem This batch files reads rusefi_enums.h and produses auto_generated_enums.* files -java -jar ../java_tools/enum2string.jar ^ +rm gen_enum_to_string.log + +java -DSystemOut.name=gen_enum_to_string ^ + -jar ../java_tools/enum2string.jar ^ -inputPath . ^ -outputPath controllers/algo ^ -enumInputFile controllers/algo/rusefi_enums.h ^ 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 7b8c788ba8..3c1dca38e4 100644 --- a/java_console/models/src/com/rusefi/config/generated/Fields.java +++ b/java_console/models/src/com/rusefi/config/generated/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config.generated; -// this file was generated automatically by ConfigDefinition.jar based on integration\rusefi_config.txt Sun Jun 16 22:17:51 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration\rusefi_config.txt Mon Jun 17 19:57:03 EDT 2019 import com.rusefi.config.*; diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index fa9277d76fb191aff79573ea4ef380fb7b91cbc3..aac6694d40e508c034f86c1e5f1cc7af2c9972e4 100644 GIT binary patch delta 68624 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≥#yU5GbwalgUb4PJ0D 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 u7GS|QS_F+2L8C% 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 F{txJN`c?n{ diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java index b14957ec7b..67ccabbb41 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java @@ -4,12 +4,12 @@ import com.rusefi.output.CHeaderConsumer; import com.rusefi.output.ConfigurationConsumer; import com.rusefi.output.JavaFieldsConsumer; import com.rusefi.output.TSProjectConsumer; +import com.rusefi.util.IoUtils; import com.rusefi.util.LazyFile; +import com.rusefi.util.SystemOut; import java.io.*; import java.math.BigInteger; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -23,8 +23,7 @@ import java.util.List; @SuppressWarnings("StringConcatenationInsideStringBufferAppend") public class ConfigDefinition { public static final String EOL = "\n"; - public static final Charset CHARSET = StandardCharsets.ISO_8859_1; - public static final String GENERATED_AUTOMATICALLY_TAG = "was generated automatically by ConfigDefinition.jar based on "; + public static final String GENERATED_AUTOMATICALLY_TAG = LazyFile.LAZY_FILE_TAG + "ConfigDefinition.jar based on "; public static String MESSAGE; private static final String ROM_RAIDER_XML_TEMPLATE = "rusefi_template.xml"; @@ -45,7 +44,7 @@ public class ConfigDefinition { try { doJob(args); } catch (Throwable e) { - System.out.println(e); + SystemOut.println(e); e.printStackTrace(); System.exit(-1); } @@ -53,7 +52,7 @@ public class ConfigDefinition { private static void doJob(String[] args) throws IOException { if (args.length < 2) { - System.out.println("Please specify\r\n" + SystemOut.println("Please specify\r\n" + KEY_DEFINITION + " x\r\n" + KEY_TS_DESTINATION + " x\r\n" + KEY_C_DESTINATION + " x\r\n" @@ -100,14 +99,14 @@ public class ConfigDefinition { MESSAGE = GENERATED_AUTOMATICALLY_TAG + definitionInputFile + " " + new Date(); - System.out.println("Reading from " + definitionInputFile); + SystemOut.println("Reading from " + definitionInputFile); String currentMD5 = getDefinitionMD5(definitionInputFile); if (skipRebuildFile != null) { boolean nothingToDoHere = needToSkipRebuild(skipRebuildFile, currentMD5); if (nothingToDoHere) { - System.out.println("Nothing to do here according to " + skipRebuildFile + " hash " + currentMD5); + SystemOut.println("Nothing to do here according to " + skipRebuildFile + " hash " + currentMD5); return; } } @@ -115,7 +114,7 @@ public class ConfigDefinition { for (String prependFile : prependFiles) readPrependValues(prependFile); - BufferedReader definitionReader = new BufferedReader(new InputStreamReader(new FileInputStream(definitionInputFile), CHARSET.name())); + BufferedReader definitionReader = new BufferedReader(new InputStreamReader(new FileInputStream(definitionInputFile), IoUtils.CHARSET.name())); ReaderState state = new ReaderState(); List destinations = new ArrayList<>(); @@ -145,7 +144,7 @@ public class ConfigDefinition { processTextTemplate(inputFileName, romRaiderDestination); } if (skipRebuildFile != null) { - System.out.println("Writing " + currentMD5 + " to " + skipRebuildFile); + SystemOut.println("Writing " + currentMD5 + " to " + skipRebuildFile); PrintWriter writer = new PrintWriter(new FileWriter(skipRebuildFile)); writer.write(currentMD5); writer.close(); @@ -186,8 +185,8 @@ public class ConfigDefinition { } private static void processTextTemplate(String inputFileName, String outputFileName) throws IOException { - System.out.println("Reading from " + inputFileName); - System.out.println("Writing to " + outputFileName); + SystemOut.println("Reading from " + inputFileName); + SystemOut.println("Writing to " + outputFileName); VariableRegistry.INSTANCE.put("generator_message", ConfigDefinition.GENERATED_AUTOMATICALLY_TAG + new Date()); diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java index 7c19487760..9060f5d670 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java @@ -1,9 +1,8 @@ package com.rusefi; +import com.rusefi.util.SystemOut; import com.rusefi.test.ConfigFieldParserTest; -import java.io.IOException; -import java.io.Writer; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -101,9 +100,9 @@ public class ConfigField { boolean isIterate = "iterate".equalsIgnoreCase(matcher.group(5)); ConfigField field = new ConfigField(state, name, comment, arraySizeAsText, type, arraySize, tsInfo, isIterate); - System.out.println("type " + type); - System.out.println("name " + name); - System.out.println("comment " + comment); + SystemOut.println("type " + type); + SystemOut.println("name " + name); + SystemOut.println("comment " + comment); return field; } diff --git a/java_tools/configuration_definition/src/com/rusefi/ReaderState.java b/java_tools/configuration_definition/src/com/rusefi/ReaderState.java index 929db38d4e..f45860c454 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ReaderState.java +++ b/java_tools/configuration_definition/src/com/rusefi/ReaderState.java @@ -1,6 +1,7 @@ package com.rusefi; import com.rusefi.output.ConfigurationConsumer; +import com.rusefi.util.SystemOut; import java.io.BufferedReader; import java.io.IOException; @@ -147,14 +148,14 @@ public class ReaderState { } ConfigStructure structure = new ConfigStructure(name, comment, withPrefix); state.stack.push(structure); - System.out.println("Starting structure " + structure.getName()); + SystemOut.println("Starting structure " + structure.getName()); } private static void handleEndStruct(ReaderState state, List consumers) throws IOException { if (state.stack.isEmpty()) throw new IllegalStateException("Unexpected end_struct"); ConfigStructure structure = state.stack.pop(); - System.out.println("Ending structure " + structure.getName()); + SystemOut.println("Ending structure " + structure.getName()); structure.addAlignmentFill(state); state.structures.put(structure.getName(), structure); diff --git a/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java b/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java index 8653be6cac..3fca979637 100644 --- a/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java +++ b/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java @@ -1,5 +1,7 @@ package com.rusefi; +import com.rusefi.util.SystemOut; + import java.util.Objects; /** @@ -64,7 +66,7 @@ public class TypesHelper { return "S08"; if (UINT8_T.equals(type)) return "U08"; - System.out.println("No TS type convesion for " + type); + SystemOut.println("No TS type conversion for " + type); return type; } diff --git a/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java b/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java index 92dbc80c6c..4fec5fbe29 100644 --- a/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java +++ b/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java @@ -1,6 +1,7 @@ package com.rusefi; import com.rusefi.util.LazyFile; +import com.rusefi.util.SystemOut; import java.io.IOException; import java.util.*; @@ -51,10 +52,10 @@ public class VariableRegistry extends TreeMap { public void register(String var, String value) { if (containsKey(var)) { - System.out.println("Not redefining " + var); + SystemOut.println("Not redefining " + var); return; } - System.out.println("Registering " + var + " as " + value); + SystemOut.println("Registering " + var + " as " + value); put(var, value); cAllDefinitions.put(var, "#define " + var + " " + value + EOL); @@ -65,11 +66,11 @@ public class VariableRegistry extends TreeMap { private void tryToRegisterAsInteger(String var, String value) { try { int intValue = Integer.parseInt(value); - System.out.println("key [" + var + "] value: " + intValue); + SystemOut.println("key [" + var + "] value: " + intValue); intValues.put(var, intValue); javaDefinitions.put(var, "\tpublic static final int " + var + " = " + intValue + ";" + EOL); } catch (NumberFormatException e) { - System.out.println("Not an integer: " + value); + SystemOut.println("Not an integer: " + value); if (isQuoted(value) && !var.trim().endsWith(ConfigField.ENUM_SUFFIX)) { // quoted and not with enum suffix means plain string define statement @@ -96,7 +97,7 @@ public class VariableRegistry extends TreeMap { } public void writeNumericsToFile(String fileName) throws IOException { - System.out.println("Writing to " + fileName); + SystemOut.println("Writing to " + fileName); LazyFile cHeader = new LazyFile(fileName); cHeader.write("//\n// " + ConfigDefinition.GENERATED_AUTOMATICALLY_TAG + ConfigDefinition.definitionInputFile + "\n//\n\n"); diff --git a/java_tools/configuration_definition/src/com/rusefi/board_generator/BoardReader.java b/java_tools/configuration_definition/src/com/rusefi/board_generator/BoardReader.java index 54ad0dca8a..4dc1fa00fc 100644 --- a/java_tools/configuration_definition/src/com/rusefi/board_generator/BoardReader.java +++ b/java_tools/configuration_definition/src/com/rusefi/board_generator/BoardReader.java @@ -2,6 +2,7 @@ package com.rusefi.board_generator; import com.rusefi.EnumsReader; import com.rusefi.enum_reader.Value; +import com.rusefi.util.SystemOut; import org.yaml.snakeyaml.Yaml; import java.io.*; @@ -18,7 +19,7 @@ public class BoardReader { public static void main(String[] args) throws IOException { if (args.length < 2) { - System.out.println("Please specify\r\n" + SystemOut.println("Please specify\r\n" + KEY_BOARD_NAME + " x\r\n" + KEY_FIRMWARE_PATH + " x\r\n" ); @@ -44,7 +45,7 @@ public class BoardReader { Yaml yaml = new Yaml(); Map data = yaml.load(new FileReader(firmwarePath + "/config/boards/" + boardName + "/mapping.yaml")); - System.out.println(data); + SystemOut.println(data); BufferedWriter bw = new BufferedWriter(new FileWriter(outputPath + File.separator + boardName + "_prefix.txt")); @@ -65,7 +66,7 @@ public class BoardReader { Map enumMap = EnumsReader.enums.get(headerEnumName); Objects.requireNonNull(enumMap, "enum for " + headerEnumName); - System.out.println(enumMap.size()); + SystemOut.println(enumMap.size()); StringBuffer sb = new StringBuffer(); diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java index 99f0a04dc0..4ff12551ea 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java @@ -1,5 +1,7 @@ package com.rusefi.ldmp; +import com.rusefi.util.SystemOut; + import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -33,12 +35,12 @@ public class LiveDocsMetaParser { public static void main(String[] args) throws IOException { String fileName = args[0]; String destinationPath = args[1]; - System.out.println(fileName); + SystemOut.println(fileName); if (!new File(fileName).exists()) throw new IllegalStateException("Not found " + fileName); String content = readLineByLine(fileName); List r = parse(content); - System.out.println(r); + SystemOut.println(r); String className = "ThermistorMeta"; @@ -53,27 +55,27 @@ public class LiveDocsMetaParser { List result = new ArrayList<>(); string = string.replaceAll("[()>]", " "); - System.out.println(string); + SystemOut.println(string); Scanner s = new Scanner(string); while (s.hasNext()) { String token = s.next(); - //System.out.println(token); + //SystemOut.println(token); if (DISPLAY_CONFIG.equals(token)) { if (s.hasNext()) { String config = s.next(); - System.out.println("REQ CONF " + config); + SystemOut.println("REQ CONF " + config); result.add(new ConfigRequest(config)); } } else if (DISPLAY_TEXT.equals(token)) { if (s.hasNext()) { String config = s.next(); - System.out.println("REQ TEXT " + config); + SystemOut.println("REQ TEXT " + config); result.add(new TextRequest(config)); } } else if (DISPLAY_FIELD.equals(token)) { if (s.hasNext()) { String config = s.next(); - System.out.println("REQ FIELD " + config); + SystemOut.println("REQ FIELD " + config); result.add(new FieldRequest(config)); } } else if (DISPLAY_IF.equals(token)) { @@ -84,7 +86,7 @@ public class LiveDocsMetaParser { String config = s.next(); - System.out.println("REQ TEXT " + config); + SystemOut.println("REQ TEXT " + config); IfRequest ifRequest = new IfRequest(variable); result.add(ifRequest); @@ -110,7 +112,7 @@ public class LiveDocsMetaParser { } else if (DISPLAY_SENSOR.equals(token)) { if (s.hasNext()) { String config = s.next(); - System.out.println("REQ SENSOR " + config); + SystemOut.println("REQ SENSOR " + config); result.add(new SensorRequest(config)); } } 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 682aa4dec8..d98701ac7a 100644 --- a/java_tools/configuration_definition/src/com/rusefi/output/CHeaderConsumer.java +++ b/java_tools/configuration_definition/src/com/rusefi/output/CHeaderConsumer.java @@ -5,6 +5,7 @@ import com.rusefi.ConfigField; import com.rusefi.ConfigStructure; import com.rusefi.TypesHelper; import com.rusefi.util.LazyFile; +import com.rusefi.util.SystemOut; import java.io.IOException; @@ -18,7 +19,7 @@ public class CHeaderConsumer implements ConfigurationConsumer { private final LazyFile cHeader; public CHeaderConsumer(String destCHeader) { - System.out.println("Writing C header to " + destCHeader); + SystemOut.println("Writing C header to " + destCHeader); cHeader = new LazyFile(destCHeader); cHeader.write("// this section " + ConfigDefinition.MESSAGE + EOL); cHeader.write("// begin" + EOL); diff --git a/java_tools/configuration_definition/src/com/rusefi/output/TSProjectConsumer.java b/java_tools/configuration_definition/src/com/rusefi/output/TSProjectConsumer.java index 07d37814dc..53cc1101b0 100644 --- a/java_tools/configuration_definition/src/com/rusefi/output/TSProjectConsumer.java +++ b/java_tools/configuration_definition/src/com/rusefi/output/TSProjectConsumer.java @@ -2,10 +2,11 @@ package com.rusefi.output; import com.rusefi.*; import com.rusefi.util.LazyFile; +import com.rusefi.util.SystemOut; import java.io.*; -import static com.rusefi.ConfigDefinition.CHARSET; +import static com.rusefi.util.IoUtils.CHARSET; import static com.rusefi.ConfigDefinition.EOL; public class TSProjectConsumer implements ConfigurationConsumer { @@ -100,7 +101,7 @@ public class TSProjectConsumer implements ConfigurationConsumer { private void writeTunerStudioFile(String tsPath, String fieldsSection) throws IOException { TsFileContent tsContent = readTsFile(tsPath); - System.out.println("Got " + tsContent.getPrefix().length() + "/" + tsContent.getPostfix().length() + " of " + TS_FILE_INPUT_NAME); + SystemOut.println("Got " + tsContent.getPrefix().length() + "/" + tsContent.getPostfix().length() + " of " + TS_FILE_INPUT_NAME); // File.getPath() would eliminate potential separator at the end of the path String fileName = new File(tsPath).getPath() + File.separator + TS_FILE_OUTPUT_NAME; diff --git a/java_tools/enum2string.jar b/java_tools/enum2string.jar index f5279a1afa6977c4cfa3d28c81d6190880275ae4..f7fda2b10eebfe607105e615c437f7aa2ff43fa1 100644 GIT binary patch literal 19953 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 MY@g38M1OqxKU1lM&j0`b literal 11813 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 Ys*o-a7w`MLkY2o!FKS8tJl}u)2ivbPz5oCK diff --git a/java_tools/enum_to_string/src/com/rusefi/EnumToString.java b/java_tools/enum_to_string/src/com/rusefi/EnumToString.java index 9ef241a160..9a1c44af97 100644 --- a/java_tools/enum_to_string/src/com/rusefi/EnumToString.java +++ b/java_tools/enum_to_string/src/com/rusefi/EnumToString.java @@ -1,6 +1,8 @@ package com.rusefi; import com.rusefi.enum_reader.Value; +import com.rusefi.util.LazyFile; +import com.rusefi.util.SystemOut; import java.io.*; import java.util.*; @@ -30,7 +32,7 @@ public class EnumToString { public static void main(String[] args) throws IOException { if (args.length < 4) { - System.out.println("Please specify at least\n\n" + + SystemOut.println("Please specify at least\n\n" + KEY_INPUT_PATH + "XXX\r\n" + // KEY_INPUT_FILE + "XXX" + KEY_OUTPUT + "XXX\r\n" @@ -63,7 +65,7 @@ public class EnumToString { cppFileContent.insert(0, includesSection); headerFileContent.insert(0, includesSection); - System.out.println("includesSection:\r\n" + includesSection + "end of includesSection\r\n"); + SystemOut.println("includesSection:\r\n" + includesSection + "end of includesSection\r\n"); cppFileContent.insert(0, "#include \"global.h\"\r\n"); headerFileContent.insert(0, bothFilesHeader.toString()); @@ -75,21 +77,22 @@ public class EnumToString { } private static void writeCppAndHeaderFiles(String outFileName) throws IOException { - BufferedWriter bw = new BufferedWriter(new FileWriter(outFileName + ".cpp")); + LazyFile bw = new LazyFile(outFileName + ".cpp"); bw.write(cppFileContent.toString()); bw.close(); - bw = new BufferedWriter(new FileWriter(outFileName + ".h")); + bw = new LazyFile(outFileName + ".h"); bw.write(headerFileContent.toString()); bw.close(); } private static void consumeFile(String inputPath, String inFileName) throws IOException { File f = new File(inputPath + File.separator + inFileName); - System.out.println("Reading from " + inFileName); + SystemOut.println("Reading from " + inFileName); String simpleFileName = f.getName(); - bothFilesHeader.insert(0, "// auto-generated from " + simpleFileName + "\r\n"); + bothFilesHeader.insert(0, "// " + + LazyFile.LAZY_FILE_TAG + " from " + simpleFileName + "\r\n"); includesSection.append("#include \"" + simpleFileName + "\"\r\n"); EnumsReader.process(new FileReader(inFileName)); diff --git a/java_tools/enum_to_string/src/com/rusefi/EnumsReader.java b/java_tools/enum_to_string/src/com/rusefi/EnumsReader.java index 60ecfc38d1..6b13895e6f 100644 --- a/java_tools/enum_to_string/src/com/rusefi/EnumsReader.java +++ b/java_tools/enum_to_string/src/com/rusefi/EnumsReader.java @@ -1,14 +1,13 @@ package com.rusefi; import com.rusefi.enum_reader.Value; +import com.rusefi.util.SystemOut; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.util.Map; -import java.util.Set; import java.util.TreeMap; -import java.util.TreeSet; public class EnumsReader { private final static Map currentValues = new TreeMap<>(); @@ -23,13 +22,13 @@ public class EnumsReader { line = removeSpaces(line); if (line.startsWith("typedefenum{") || line.startsWith("typedefenum__attribute__")) { - System.out.println("Entering enum"); + SystemOut.println("Entering enum"); currentValues.clear(); isInsideEnum = true; } else if (line.startsWith("}") && line.endsWith(";")) { isInsideEnum = false; line = line.substring(1, line.length() - 1); - System.out.println("Ending enum " + line); + SystemOut.println("Ending enum " + line); enums.put(line, new TreeMap<>(currentValues)); } else { line = line.replaceAll("//.+", ""); @@ -42,7 +41,7 @@ public class EnumsReader { value = line.substring(index + 1); line = line.substring(0, index); } - System.out.println("Line " + line); + SystemOut.println("Line " + line); currentValues.put(line, new Value(line, value)); } } diff --git a/java_tools/enum_to_string/src/com/rusefi/util/IoUtils.java b/java_tools/enum_to_string/src/com/rusefi/util/IoUtils.java new file mode 100644 index 0000000000..291a6de1d7 --- /dev/null +++ b/java_tools/enum_to_string/src/com/rusefi/util/IoUtils.java @@ -0,0 +1,8 @@ +package com.rusefi.util; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class IoUtils { + public static final Charset CHARSET = StandardCharsets.ISO_8859_1; +} diff --git a/java_tools/configuration_definition/src/com/rusefi/util/LazyFile.java b/java_tools/enum_to_string/src/com/rusefi/util/LazyFile.java similarity index 70% rename from java_tools/configuration_definition/src/com/rusefi/util/LazyFile.java rename to java_tools/enum_to_string/src/com/rusefi/util/LazyFile.java index 90822376bd..0a520d8f0a 100644 --- a/java_tools/configuration_definition/src/com/rusefi/util/LazyFile.java +++ b/java_tools/enum_to_string/src/com/rusefi/util/LazyFile.java @@ -1,10 +1,6 @@ package com.rusefi.util; -import com.rusefi.ConfigDefinition; - import java.io.*; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.Scanner; import java.util.regex.Pattern; @@ -13,11 +9,12 @@ import java.util.regex.Pattern; * This file would override file content only of content has changed, disregarding the magic tag line. */ public class LazyFile { + public static final String LAZY_FILE_TAG = "was generated automatically by rusEfi tool "; private static final String PROPERTY_NAME = "rusefi.generator.lazyfile.enabled"; private static boolean ENABLED = Boolean.getBoolean(PROPERTY_NAME); static { - System.out.println(PROPERTY_NAME + "=" + ENABLED); + SystemOut.println(PROPERTY_NAME + "=" + ENABLED); } private String filename; @@ -31,7 +28,7 @@ public class LazyFile { public void write(String line) { content.append(line); - if (!line.contains(ConfigDefinition.GENERATED_AUTOMATICALLY_TAG)) + if (!line.contains(LAZY_FILE_TAG)) contentWithoutTag.append(line); } @@ -39,20 +36,20 @@ public class LazyFile { String fileContent = unifySpaces(readCurrentContent(filename)); String newContent = unifySpaces(contentWithoutTag.toString().trim()); if (fileContent.equals(newContent)) { - System.out.println(getClass().getSimpleName() + ": Not updating " + filename + " since looks to be the same content"); + SystemOut.println(getClass().getSimpleName() + ": Not updating " + filename + " since looks to be the same content"); return; } 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); + SystemOut.println(getClass().getSimpleName() + " " + filename + ": Not same at " + i); 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)); + SystemOut.println("file " + fileContent.substring(i - 15, i + 5)); + SystemOut.println("newContent " + newContent.substring(i - 15, i + 5)); } break; } } - Writer fw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(filename), ConfigDefinition.CHARSET)); + Writer fw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(filename), IoUtils.CHARSET)); fw.write(content.toString()); fw.close(); } @@ -64,12 +61,12 @@ public class LazyFile { private String readCurrentContent(String filename) throws IOException { if (!new File(filename).exists()) return ""; - Scanner in = new Scanner(Paths.get(filename), ConfigDefinition.CHARSET.name()); + Scanner in = new Scanner(Paths.get(filename), IoUtils.CHARSET.name()); Pattern pat = Pattern.compile(".*\\R|.+\\z"); String line; StringBuffer sb = new StringBuffer(); while ((line = in.findWithinHorizon(pat, 0)) != null) { - if (!line.contains(ConfigDefinition.GENERATED_AUTOMATICALLY_TAG)) + if (!line.contains(LAZY_FILE_TAG)) sb.append(line); } return sb.toString(); diff --git a/java_tools/enum_to_string/src/com/rusefi/util/SystemOut.java b/java_tools/enum_to_string/src/com/rusefi/util/SystemOut.java new file mode 100644 index 0000000000..1c7a19eefe --- /dev/null +++ b/java_tools/enum_to_string/src/com/rusefi/util/SystemOut.java @@ -0,0 +1,47 @@ +package com.rusefi.util; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * Utility class which writes same line both to stdout and file + */ +//@ThreadSafe +public class SystemOut { + private static final String LOG = ".log"; + private static PrintWriter logFile; + + public static void println(String line) { + System.out.println(line); + try { + openFileIfNeeded(); + logFile.write(line + "\r\n"); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private static synchronized void openFileIfNeeded() throws IOException { + if (logFile != null) + return; + String fileName = System.getProperty("SystemOut.name", "rusefi_tool") + LOG; + System.out.println("Opening " + fileName); + logFile = new PrintWriter(new FileWriter(fileName, true)); + } + + @SuppressWarnings("ThrowablePrintedToSystemOut") + public static void println(Throwable param) { + System.out.println(param); + try { + openFileIfNeeded(); + param.printStackTrace(logFile); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + public static void println(Object object) { + println(object == null ? "(null)" : object.toString()); + } +}