package uk.org.smithfamily.utils.normaliser; import java.util.*; import java.util.regex.Matcher; import org.apache.commons.lang3.StringUtils; import uk.org.smithfamily.mslogger.ecuDef.*; import uk.org.smithfamily.utils.normaliser.controllercommand.ControllerCommand; import uk.org.smithfamily.utils.normaliser.curveeditor.*; import uk.org.smithfamily.utils.normaliser.menu.*; import uk.org.smithfamily.utils.normaliser.tableeditor.*; import uk.org.smithfamily.utils.normaliser.userdefined.*; public class Process { private static String currentMenuDialog = ""; private static String deBinary(final String group) { final Matcher binNumber = Patterns.binary.matcher(group); if (!binNumber.matches()) { return group; } else { final String binNum = binNumber.group(2); final int num = Integer.parseInt(binNum, 2); final String expr = binNumber.group(1) + num + binNumber.group(3); return deBinary(expr); } } private static String removeComments(String line) { line += "; junk"; line = StringUtils.trim(line).split(";")[0]; line = line.trim(); return line; } private static String convertC2JavaBoolean(String expression) { final Matcher matcher = Patterns.booleanConvert.matcher(expression); final StringBuffer result = new StringBuffer(expression.length()); while (matcher.find()) { matcher.appendReplacement(result, ""); result.append(matcher.group(1) + " ? 1 : 0)"); } matcher.appendTail(result); expression = result.toString(); return expression; } private static boolean isFloatingExpression(final ECUData ecuData, final String expression) { boolean result = expression.contains("."); if (result) { return result; } for (final String var : ecuData.getRuntimeVars().keySet()) { if (expression.contains(var) && ecuData.getRuntimeVars().get(var).equals("double")) { result = true; } } for (final String var : ecuData.getEvalVars().keySet()) { if (expression.contains(var) && ecuData.getEvalVars().get(var).equals("double")) { result = true; } } return result; } public static void processExpr(final ECUData ecuData, String line) { String definition = null; line = removeComments(line); line = StringUtils.replace(line, "timeNow", "timeNow()"); final Matcher bitsM = Patterns.bits.matcher(line); final Matcher scalarM = Patterns.scalar.matcher(line); final Matcher exprM = Patterns.expr.matcher(line); final Matcher ochGetCommandM = Patterns.ochGetCommand.matcher(line); final Matcher ochBlockSizeM = Patterns.ochBlockSize.matcher(line); if (bitsM.matches()) { final String name = bitsM.group(1); final String offset = bitsM.group(3); final String start = bitsM.group(4); String end = bitsM.group(5); String ofs = "0"; if (end.contains("+")) { final String[] parts = end.split("\\+"); end = parts[0]; ofs = parts[1]; } definition = (name + " = utils.getBits(ochBuffer," + offset + "," + start + "," + end + "," + ofs + ");"); ecuData.getRuntime().add(definition); ecuData.getRuntimeVars().put(name, "int"); } else if (scalarM.matches()) { String name = scalarM.group(1); if (constantDefined(ecuData, name)) { name += "RT"; } final String dataType = scalarM.group(2); final String offset = scalarM.group(3); final String units = scalarM.group(4); String scale = scalarM.group(5); final String numOffset = scalarM.group(6); try { if (Double.parseDouble(scale) != 1) { ecuData.getRuntimeVars().put(name, "double"); } else { ecuData.getRuntimeVars().put(name, "int"); } } // If we have a NumberFormatException at this point, most likely scale is an expression so assume it's a double catch (final NumberFormatException e) { // Replace curly brackets by round brackets scale = "(" + removeCurlyBrackets(scale) + ")"; ecuData.getRuntimeVars().put(name, "double"); } definition = Output.getScalar("ochBuffer", ecuData.getRuntimeVars().get(name), name, dataType, offset, scale, numOffset); ecuData.setFingerprintSource(ecuData.getFingerprintSource() + definition); ecuData.getRuntime().add(definition); final int offsetOC = Integer.parseInt(offset); final String scaleOC = StringUtils.isEmpty(scale) ? "0" : scale; final double translateOC = !StringUtils.isEmpty(numOffset) ? Double.parseDouble(numOffset) : 0; final OutputChannel outputChannel = new OutputChannel(name, dataType, offsetOC, units, scaleOC, translateOC, null); ecuData.getOutputChannels().add(outputChannel); } else if (exprM.matches()) { final String name = exprM.group(1); if ("pwma_load".equals(name)) { // Hook to hang a break point on @SuppressWarnings("unused") final int x = 1; } String expression = deBinary(exprM.group(2).trim()); final Matcher ternaryM = Patterns.ternary.matcher(expression); if (ternaryM.matches()) { // System.out.println("BEFORE : " + expression); final String test = ternaryM.group(1); final String values = ternaryM.group(2); if (StringUtils.containsAny(test, "<>!=")) { expression = "(" + test + ") ? " + values; } else { expression = "((" + test + ") != 0 ) ? " + values; } // System.out.println("AFTER : " + expression + "\n"); } String dataType = addRuntimeExpression(ecuData, name, expression); final OutputChannel outputChannel = new OutputChannel(name, dataType, -1, "", "1", 0, null); ecuData.getOutputChannels().add(outputChannel); } else if (ochGetCommandM.matches()) { String och = ochGetCommandM.group(1); if (och.length() > 1) { final int[] value = { 0 }; och = MSUtilsShared.HexStringToBytes(ecuData.getPageIdentifiers(), och, 0, 0, value, 0); } else { och = "'" + och + "'"; } ecuData.setOchGetCommandStr("byte [] ochGetCommand = new byte[]{" + och + "};"); } else if (ochBlockSizeM.matches()) { ecuData.setOchBlockSizeStr("int ochBlockSize = " + ochBlockSizeM.group(1) + ";"); } else if (line.startsWith("#")) { final String preproc = processPreprocessor(ecuData, line); ecuData.getRuntime().add(preproc); final OutputChannel oc = new OutputChannel(preproc, "PREPROC", 0, "", "0", 0, null); ecuData.getOutputChannels().add(oc); } else if (!StringUtils.isEmpty(line)) { System.out.println("WARNING! Not sure what to do with this line: " + line); } } /** * @param ecuData * @param name The name of the expression to create * @param expression The expression itself * * @return The data type of the created runtime expression */ private static String addRuntimeExpression(final ECUData ecuData, String name, String expression) { if (expression.contains("*") && expression.contains("==")) { expression = convertC2JavaBoolean(expression); } String definition = name + " = (" + expression + ");"; // If the expression contains a division, wrap it in a try/catch to // avoid division by zero if (expression.contains("/")) { definition = "try\n" + Output.TAB + Output.TAB + "{\n" + Output.TAB + Output.TAB + Output.TAB + definition + "\n" + Output.TAB + Output.TAB + "}\n" + Output.TAB + Output.TAB + "catch (ArithmeticException e) {\n" + Output.TAB + Output.TAB + Output.TAB + name + " = 0;\n" + Output.TAB + Output.TAB + "}"; } ecuData.getRuntime().add(definition); String dataType; if (isFloatingExpression(ecuData, expression)) { dataType = "double"; } else { dataType = "int"; } ecuData.getEvalVars().put(name, dataType); return dataType; } /** * Occasionally we get a collision between the name of a constant and an expression. Test for that here. * * @param ecuData * @param name * @return */ private static boolean constantDefined(final ECUData ecuData, final String name) { for (final Constant c : ecuData.getConstants()) { if (c.getName().equals(name)) { return true; } } return false; } static void processLogEntry(final ECUData ecuData, String line) { line = removeComments(line); final Matcher logM = Patterns.log.matcher(line); if (logM.matches()) { final String header = logM.group(2); String variable = logM.group(1); if ("double".equals(ecuData.getRuntimeVars().get(variable))) { variable = "round(" + variable + ")"; } ecuData.getLogHeader().add("b.append(\"" + header + "\").append(\"\\t\");"); ecuData.getLogRecord().add("b.append(" + variable + ").append(\"\\t\");"); } else if (line.startsWith("#")) { final String directive = processPreprocessor(ecuData, line); ecuData.getLogHeader().add(directive); ecuData.getLogRecord().add(directive); } } static String processPreprocessor(final ECUData ecuData, String line) { String filtered; boolean stripped = false; filtered = line.replace(" ", " "); stripped = filtered.equals(line); while (!stripped) { line = filtered; filtered = line.replace(" ", " "); stripped = filtered.equals(line); } final String[] components = line.split(" "); final String flagName = components.length > 1 ? sanitize(components[1]) : ""; if (components[0].equals("#if") || components[0].equals("#ifdef")) { ecuData.getFlags().add(flagName); return ("if (" + flagName + ")\n {"); } if (components[0].equals("#elif")) { ecuData.getFlags().add(flagName); return ("}\n else if (" + flagName + ")\n {"); } if (components[0].equals("#else")) { return ("}\n else\n {"); } if (components[0].equals("#endif")) { return ("}"); } return ""; } private static String sanitize(final String flagName) { return StringUtils.replace(flagName, "!", "n"); } public static void processFrontPage(final ECUData ecuData, String line) { line = removeComments(line); final Matcher dgM = Patterns.defaultGauge.matcher(line); if (dgM.matches()) { ecuData.getDefaultGauges().add(dgM.group(1)); } } public static void processHeader(final ECUData ecuData, final String line) { final Matcher queryM = Patterns.queryCommand.matcher(line); if (queryM.matches()) { ecuData.setQueryCommandStr("byte[] queryCommand = new byte[]{'" + queryM.group(1) + "'};"); return; } final Matcher sigM = Patterns.signature.matcher(line); final Matcher sigByteM = Patterns.byteSignature.matcher(line); if (sigM.matches()) { String tmpsig = sigM.group(1); if (line.contains("null")) { tmpsig += "\\0"; } ecuData.setClassSignature("\"" + tmpsig + "\""); ecuData.setSignatureDeclaration("String signature = \"" + tmpsig + "\";"); } else if (sigByteM.matches()) { final String b = sigByteM.group(1).trim(); ecuData.setClassSignature("new String(new byte[]{" + b + "})"); ecuData.setSignatureDeclaration("String signature = \"\"+(byte)" + b + ";"); } } /** * Process the [Constants] section of the ini file * * @param line */ public static void processConstants(final ECUData ecuData, String line) { line = removeComments(line); if (StringUtils.isEmpty(line)) { return; } if (line.contains("DI_rpm")) { // Break point hook @SuppressWarnings("unused") final int x = 1; } if (line.contains("messageEnvelopeFormat")) { ecuData.setCRC32Protocol(line.contains("msEnvelope_1.0")); } final Matcher pageM = Patterns.page.matcher(line); if (pageM.matches()) { ecuData.setCurrentPage(Integer.parseInt(pageM.group(1).trim())); return; } final Matcher pageSizesM = Patterns.pageSize.matcher(line); if (pageSizesM.matches()) { final String values = StringUtils.remove(pageSizesM.group(1), ' '); final String[] list = values.split(","); ecuData.setPageSizes(new ArrayList<String>(Arrays.asList(list))); } final Matcher pageIdentifersM = Patterns.pageIdentifier.matcher(line); if (pageIdentifersM.matches()) { String values = StringUtils.remove(pageIdentifersM.group(1), ' '); values = StringUtils.remove(values, '"'); final String[] list = values.split(","); ecuData.setPageIdentifiers(new ArrayList<String>(Arrays.asList(list))); } final Matcher pageActivateM = Patterns.pageActivate.matcher(line); if (pageActivateM.matches()) { String values = StringUtils.remove(pageActivateM.group(1), ' '); values = StringUtils.remove(values, '"'); final String[] list = values.split(","); ecuData.setPageActivateCommands(new ArrayList<String>(Arrays.asList(list))); } final Matcher pageReadCommandM = Patterns.pageReadCommand.matcher(line); if (pageReadCommandM.matches()) { String values = StringUtils.remove(pageReadCommandM.group(1), ' '); values = StringUtils.remove(values, '"'); final String[] list = values.split(","); ecuData.setPageReadCommands(new ArrayList<String>(Arrays.asList(list))); } final Matcher pageValueWriteM = Patterns.pageValueWrite.matcher(line); if (pageValueWriteM.matches()) { final String values = StringUtils.remove(pageValueWriteM.group(1), ' '); final String[] list = values.replace("\\", "\\\\").split(","); ecuData.setPageValueWrites(new ArrayList<String>(Arrays.asList(list))); } final Matcher pageChunkWriteM = Patterns.pageChunkWrite.matcher(line); if (pageChunkWriteM.matches()) { final String values = StringUtils.remove(pageChunkWriteM.group(1), ' '); final String[] list = values.replace("\\", "\\\\").split(","); ecuData.setPageChunkWrites(new ArrayList<String>(Arrays.asList(list))); } final Matcher interWriteDelayM = Patterns.interWriteDelay.matcher(line); if (interWriteDelayM.matches()) { ecuData.setInterWriteDelay(Integer.parseInt(interWriteDelayM.group(1).trim())); return; } final Matcher pageActivationDelayM = Patterns.pageActivationDelay.matcher(line); if (pageActivationDelayM.matches()) { ecuData.setPageActivationDelayVal(Integer.parseInt(pageActivationDelayM.group(1).trim())); return; } final Matcher bitsM = Patterns.bits.matcher(line); final Matcher constantM = Patterns.constantScalar.matcher(line); final Matcher constantSimpleM = Patterns.constantSimple.matcher(line); final Matcher constantArrayM = Patterns.constantArray.matcher(line); if (constantM.matches()) { final String name = constantM.group(1); final String classtype = constantM.group(2); final String type = constantM.group(3); final int offset = Integer.parseInt(constantM.group(4).trim()); final String units = constantM.group(5); final String scaleText = constantM.group(6); final String translateText = constantM.group(7); final String lowText = constantM.group(8); final String highText = constantM.group(9); final String digitsText = constantM.group(10); final String scale = StringUtils.isEmpty(scaleText) ? "0" : scaleText; String translate = StringUtils.isEmpty(translateText) ? "0" : translateText; final int digits = !StringUtils.isEmpty(digitsText) ? (int) Double.parseDouble(digitsText) : 0; if (!ecuData.getConstants().contains(name)) { if (ExpressionWrangler.isExpression(translate)) { final String runtimeVarExpressionName = "msl_exp_" + name; String definition = (runtimeVarExpressionName + " = " + removeCurlyBrackets(translateText).trim() + ";"); definition = "try\n" + Output.TAB + Output.TAB + "{\n" + Output.TAB + Output.TAB + Output.TAB + definition + "\n" + Output.TAB + Output.TAB + "}\n" + Output.TAB + Output.TAB + "catch (ArithmeticException e) {\n" + Output.TAB + Output.TAB + Output.TAB + runtimeVarExpressionName + " = 0;\n" + Output.TAB + Output.TAB + "}"; ecuData.getRuntime().add(definition); ecuData.getRuntimeVars().put(runtimeVarExpressionName, "double"); translate = runtimeVarExpressionName; } final Constant c = new Constant(ecuData.getCurrentPage(), name, classtype, type, offset, "", units, scale, translate, lowText, highText, digits, new String[]{}); ecuData.getConstantVars().put(name, "int"); ecuData.getConstants().add(c); } } else if (constantArrayM.matches()) { final String name = constantArrayM.group(1); final String classtype = constantArrayM.group(2); final String type = constantArrayM.group(3); final int offset = Integer.parseInt(constantArrayM.group(4).trim()); final String shape = constantArrayM.group(5); final String units = constantArrayM.group(6); String scaleText = StringUtils.isEmpty(constantArrayM.group(7)) ? "0" : constantArrayM.group(7); String translateText = StringUtils.isEmpty(constantArrayM.group(8)) ? "0" : constantArrayM.group(8); String lowText = constantArrayM.group(9); String highText = constantArrayM.group(10); final String digitsText = constantArrayM.group(11); highText = removeCurlyBrackets(highText); final int digits = !StringUtils.isEmpty(digitsText) ? (int) Double.parseDouble(digitsText) : 0; if (ExpressionWrangler.isExpression(scaleText)) { // scale is an expression, add it to runtime expression scaleText = removeCurlyBrackets(scaleText); addRuntimeExpression(ecuData, "MSLoggerExp" + name, scaleText); scaleText = "MSLoggerExp" + name; } if (ExpressionWrangler.isExpression(translateText)) { // scale is an expression, add it to runtime expression translateText = removeCurlyBrackets(translateText); addRuntimeExpression(ecuData, "MSLoggerExp" + name, translateText); translateText = "MSLoggerExp" + name; } if (ExpressionWrangler.isExpression(lowText)) { // low is an expression, add it to runtime expression lowText = ExpressionWrangler.convertExpr(removeCurlyBrackets(lowText)); addRuntimeExpression(ecuData, "MSLoggerExp" + name, lowText); lowText = "MSLoggerExp" + name; } if (ExpressionWrangler.isExpression(highText)) { highText = ExpressionWrangler.convertExpr(removeCurlyBrackets(highText)); addRuntimeExpression(ecuData, "MSLoggerExp" + name, highText); highText = "MSLoggerExp" + name; } if (!ecuData.getConstants().contains(name)) { final Constant c = new Constant(ecuData.getCurrentPage(), name, classtype, type, offset, shape, units, scaleText, translateText, lowText, highText, digits, new String[]{}); if (shape.contains("x")) { ecuData.getConstantVars().put(name, "int[][]"); } else { ecuData.getConstantVars().put(name, "int[]"); } ecuData.getConstants().add(c); } } else if (constantSimpleM.matches()) { final String name = constantSimpleM.group(1); final String classtype = constantSimpleM.group(2); final String type = constantSimpleM.group(3); final int offset = Integer.parseInt(constantSimpleM.group(4).trim()); final String units = constantSimpleM.group(5); final String scale = constantSimpleM.group(6); final String translate = constantSimpleM.group(7); final Constant c = new Constant(ecuData.getCurrentPage(), name, classtype, type, offset, "", units, scale, translate, "0", "0", 0, new String[]{}); ecuData.getConstantVars().put(name, "int"); ecuData.getConstants().add(c); } else if (bitsM.matches()) { final String name = bitsM.group(1); final String offset = bitsM.group(3); final String start = bitsM.group(4); final String end = bitsM.group(5); final String strBitsValues = bitsM.group(7); String[] bitsValues = new String[] {}; if (strBitsValues != null) { bitsValues = Patterns.bitsValues.split(strBitsValues); } final Constant c = new Constant(ecuData.getCurrentPage(), name, "bits", "", Integer.parseInt(offset.trim()), "[" + start + ":" + end + "]", "", "1", "0", "0", "0", 0, bitsValues); ecuData.getConstantVars().put(name, "int"); ecuData.getConstants().add(c); } else if (line.startsWith("#")) { final String preproc = (processPreprocessor(ecuData, line)); final Constant c = new Constant(ecuData.getCurrentPage(), preproc, "", "PREPROC", 0, "", "", "0", "0", "0", "0", 0, new String[]{}); ecuData.getConstants().add(c); } } private static String removeCurlyBrackets(final String line) { return line.replaceAll("\\{", "").replaceAll("\\}", ""); } /** * Process the [Menu] section of the ini file * * @param line */ public static void processMenu(final ECUData ecuData, String line) { line = removeComments(line); if (StringUtils.isEmpty(line)) { return; } final Matcher menuDialog = Patterns.menuDialog.matcher(line); final Matcher menu = Patterns.menu.matcher(line); final Matcher subMenu = Patterns.subMenu.matcher(line); final List<MenuTracker> menuDefs = ecuData.getMenuDefs(); MenuTracker m = null; if (menuDefs.size() > 0) { m = menuDefs.get(menuDefs.size() - 1); } if (m == null) { m = new MenuTracker(); menuDefs.add(m); } if (menuDialog.matches()) { currentMenuDialog = menuDialog.group(1); } else if (menu.matches()) { final MenuDefinition x = new MenuDefinition(currentMenuDialog, menu.group(1)); m.addItem(currentMenuDialog, x); } else if (subMenu.matches()) { final String name = subMenu.group(1); final String label = subMenu.group(3); final String randomNumber = subMenu.group(5); String expression = subMenu.group(7); final SubMenuDefinition x = new SubMenuDefinition(name, label, randomNumber); m.addItem(currentMenuDialog, x); // Add the expression too if (expression != null && !StringUtils.isEmpty(expression)) { expression = expression.trim(); expression = removeCurlyBrackets(expression); expression = ExpressionWrangler.convertExpr(expression); ecuData.getMenuControlExpressions().put(name, expression); } } else { final MenuPreProcessor p = new MenuPreProcessor(processPreprocessor(ecuData, line)); m.addItem(currentMenuDialog, p); } } /** * Process the [TablEditor] section of the ini file * * @param line */ public static void processTableEditor(final ECUData ecuData, String line) { line = removeComments(line); if (StringUtils.isEmpty(line)) { return; } final Matcher table = Patterns.tablEditorTable.matcher(line); final Matcher xBins = Patterns.tablEditorXBins.matcher(line); final Matcher yBins = Patterns.tablEditorYBins.matcher(line); final Matcher zBins = Patterns.tablEditorZBins.matcher(line); final Matcher upDownLabel = Patterns.tablEditorUpDownLabel.matcher(line); final Matcher gridHeight = Patterns.tablEditorGridHeight.matcher(line); final Matcher gridOrient = Patterns.tablEditorGridOrient.matcher(line); final List<TableTracker> tableDefs = ecuData.getTableDefs(); TableTracker t = null; if (tableDefs.size() > 0) { t = tableDefs.get(tableDefs.size() - 1); } if (t == null) { t = new TableTracker(); tableDefs.add(t); } if (table.matches()) { if (t.isDefinitionCompleted()) { t = new TableTracker(); tableDefs.add(t); } final TableDefinition td = new TableDefinition(t, table.group(1), table.group(2), table.group(3), table.group(4)); t.addItem(td); } else if (xBins.matches()) { final XBins x = new XBins(xBins.group(1), xBins.group(2), xBins.group(4)); t.addItem(x); } else if (yBins.matches()) { final YBins y = new YBins(yBins.group(1), yBins.group(2), yBins.group(4)); t.addItem(y); } else if (zBins.matches()) { final ZBins z = new ZBins(zBins.group(1)); t.addItem(z); } else if (upDownLabel.matches()) { final UpDownLabel l = new UpDownLabel(upDownLabel.group(1), upDownLabel.group(2)); t.addItem(l); } else if (gridHeight.matches()) { final GridHeight g = new GridHeight(gridHeight.group(1)); t.addItem(g); } else if (gridOrient.matches()) { final GridOrient g = new GridOrient(gridOrient.group(1), gridOrient.group(2), gridOrient.group(3)); t.addItem(g); } else { final PreProcessor p = new PreProcessor(processPreprocessor(ecuData, line)); if ((t != null) && !t.isDefinitionCompleted()) { t.addItem(p); } else { t = new TableTracker(); tableDefs.add(t); t.addItem(p); } } } /** * Process the [CurveEditor] section of the ini file * * @param line */ public static void processCurveEditor(final ECUData ecuData, String line) { line = removeComments(line); if (StringUtils.isEmpty(line)) { return; } line = removeCurlyBrackets(line); final Matcher curve = Patterns.curve.matcher(line); final Matcher columnLabel = Patterns.curveColumnLabel.matcher(line); final Matcher xAxis = Patterns.curveXAxis.matcher(line); final Matcher yAxis = Patterns.curveYAxis.matcher(line); final Matcher xBins = Patterns.curveXBins.matcher(line); final Matcher yBins = Patterns.curveYBins.matcher(line); final Matcher gauge = Patterns.curveGauge.matcher(line); final Matcher lineLabel = Patterns.curveLineLabel.matcher(line); final List<CurveTracker> curveDefs = ecuData.getCurveDefs(); CurveTracker c = null; if (line.contains("cltlowlim")) { // Break point hook @SuppressWarnings("unused") final int x = 1; } if (curveDefs.size() > 0) { c = curveDefs.get(curveDefs.size() - 1); } if (c == null) { c = new CurveTracker(); curveDefs.add(c); } if (curve.matches()) { if (c.isDefinitionCompleted()) { c = new CurveTracker(); curveDefs.add(c); } final CurveDefinition cd = new CurveDefinition(c, curve.group(1), curve.group(2)); c.addItem(cd); } else if (columnLabel.matches()) { final CurveColumnLabel x = new CurveColumnLabel(columnLabel.group(1), columnLabel.group(2)); c.addItem(x); } else if (xAxis.matches()) { final CurveXAxis x = new CurveXAxis(xAxis.group(1), xAxis.group(2), xAxis.group(3)); c.addItem(x); } else if (yAxis.matches()) { final CurveYAxis x = new CurveYAxis(yAxis.group(1), yAxis.group(2), yAxis.group(3)); c.addItem(x); } else if (xBins.matches()) { String xBins2 = "0"; if (xBins.group(3) != null) { xBins2 = xBins.group(3); } final CurveXBins x = new CurveXBins(xBins.group(1), xBins2, xBins.group(5)); c.addItem(x); } else if (yBins.matches()) { final CurveYBins x = new CurveYBins(yBins.group(1)); c.addItem(x); } else if (gauge.matches()) { final CurveGauge x = new CurveGauge(gauge.group(1)); c.addItem(x); } else if (lineLabel.matches()) { final CurveLineLabel x = new CurveLineLabel(lineLabel.group(1)); c.addItem(x); } else { final CurvePreProcessor p = new CurvePreProcessor(processPreprocessor(ecuData, line)); if ((c != null) && !c.isDefinitionCompleted()) { c.addItem(p); } else { c = new CurveTracker(); curveDefs.add(c); c.addItem(p); } } } /** * Process the [ControllerCommands] section of the ini file * * @param line */ public static void processControllerCommands(final ECUData ecuData, String line) { line = removeComments(line); if (StringUtils.isEmpty(line)) { return; } final Matcher controllerCommands = Patterns.controllerCommands.matcher(line); if (controllerCommands.matches()) { final String name = controllerCommands.group(1); final String command = controllerCommands.group(2).replace("\\", "\\\\"); final ControllerCommand controllerCommand = new ControllerCommand(name, command); ecuData.getControllerCommands().add(controllerCommand); } } /** * Process the [UserDefined] section of the ini file * * @param line */ public static void processUserDefined(final ECUData ecuData, String line) { line = removeComments(line); if (StringUtils.isEmpty(line)) { return; } final Matcher dialog = Patterns.dialog.matcher(line); final Matcher dialogField = Patterns.dialogField.matcher(line); final Matcher dialogDisplayOnlyField = Patterns.dialogDisplayOnlyField.matcher(line); final Matcher dialogPanel = Patterns.dialogPanel.matcher(line); final Matcher commandButton = Patterns.commandButton.matcher(line); final List<UserDefinedTracker> dialogDefs = ecuData.getDialogDefs(); UserDefinedTracker d = null; if (dialogDefs.size() > 0) { d = dialogDefs.get(dialogDefs.size() - 1); } if (dialog.matches()) { final String name = dialog.group(1); final String label = dialog.group(3); final String axis = dialog.group(5); d = new UserDefinedTracker(); dialogDefs.add(d); final UserDefinedDefinition x = new UserDefinedDefinition(d, name, label, axis); d.addItem(x); d.setName(name); } else if (dialogField.matches()) { createDialogField(ecuData, dialogField, d, false, false); } else if (dialogDisplayOnlyField.matches()) { createDialogField(ecuData, dialogDisplayOnlyField, d, true, false); } else if (commandButton.matches()) { createDialogField(ecuData, commandButton, d, false, true); } else if (dialogPanel.matches()) { final String name = dialogPanel.group(1); final String orientation = dialogPanel.group(3); String expression = dialogPanel.group(5); final String visibilityFlag = d.getName() + "_" + name; if (expression != null && !StringUtils.isEmpty(expression)) { expression = expression.trim(); expression = removeCurlyBrackets(expression); expression = ExpressionWrangler.convertExpr(expression); ecuData.getFieldControlExpressions().put(visibilityFlag, expression); } final UserDefinedPanel x = new UserDefinedPanel(name, orientation); d.addItem(x); } else { final String preproc = processPreprocessor(ecuData, line); if (!preproc.equals("")) { final UserDefinedPreProcessor p = new UserDefinedPreProcessor(preproc); if (d != null) { d.addItem(p); } else { d = new UserDefinedTracker(); dialogDefs.add(d); d.addItem(p); } } } } private static void createDialogField(final ECUData ecuData, final Matcher dialogField, final UserDefinedTracker d, final boolean readOnly, final boolean isCommandButton) { final String label = dialogField.group(1).trim(); String name = dialogField.group(3); if (name != null) { name = name.trim(); } String expression = dialogField.group(5); final String visibilityFlag = d.getName() + "_" + name; if (visibilityFlag.equals("null_staged_extended_opts_simult")) { // Break point hook @SuppressWarnings("unused") final int x = 1; } if (expression != null && !StringUtils.isEmpty(expression)) { expression = expression.trim(); expression = removeCurlyBrackets(expression); expression = ExpressionWrangler.convertExpr(expression); ecuData.getFieldControlExpressions().put(visibilityFlag, expression); } String commandOnClose = ""; if (isCommandButton && (dialogField.group(7) != null)) { commandOnClose = dialogField.group(7); } final UserDefinedField x = new UserDefinedField(label, name, readOnly, isCommandButton, commandOnClose); d.addItem(x); } public static void processConstantsExtensions(final ECUData ecuData, String line) { line = removeComments(line); if (line.contains("defaultValue")) { String statement = ""; final String[] definition = line.split("=")[1].split(","); if (definition[1].contains("\"")) { statement = "String "; } else { statement = "int "; } statement += definition[0] + " = " + definition[1] + ";"; ecuData.getDefaults().add(statement); } else if (line.contains("requiresPowerCycle")) { final String field = line.split("=")[1]; ecuData.getRequiresPowerCycle().add(field.trim()); } } public static void processPcVariables(final ECUData ecuData, final String line) { } public static void processSettingGroups(final ECUData ecuData, String line) { line = removeComments(line); final ArrayList<SettingGroup> groups = ecuData.getSettingGroups(); if (line.contains("settingGroup")) { final String data = line.split("=")[1]; final int commaIndex = data.indexOf(','); final String groupName = data.substring(0, commaIndex).trim(); final String description = data.substring(commaIndex + 1).replaceAll("\"", "").trim(); final SettingGroup group = new SettingGroup(groupName, description); groups.add(group); } else if (line.contains("settingOption")) { final SettingGroup currentGroup = groups.get(groups.size() - 1); final String data = line.split("=")[1]; final int commaIndex = data.indexOf(','); final String flagName = data.substring(0, commaIndex).trim(); final String description = data.substring(commaIndex + 1).replaceAll("\"", "").trim(); currentGroup.addOption(flagName, description); } } static void processGaugeEntry(final ECUData ecuData, String line) { line = removeComments(line); final Matcher m = Patterns.gauge.matcher(line); if (m.matches()) { final String name = m.group(1); final String channel = m.group(2); final String title = m.group(3); final String units = m.group(4); final String lo = m.group(5); final String hi = m.group(6); final String loD = m.group(7); final String loW = m.group(8); final String hiW = m.group(9); final String hiD = m.group(10); final String vd = m.group(11); final String ld = m.group(12); String g = String.format("gauges.put(\"%s\",new GaugeDetails(\"Gauge\",\"\",\"%s\",\"%s\",%s,\"%s\",\"%s\",%s,%s,%s,%s,%s,%s,%s,%s,45));", name, name, channel, channel, title, units, lo, hi, loD, loW, hiW, hiD, vd, ld); g = g.replace("{", "").replace("}", ""); final String gd = String.format("<tr><td>Gauge</td><td></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>", name, channel, title, units, lo, hi, loD, loW, hiW, hiD, vd, ld); ecuData.getGaugeDoc().add(gd); ecuData.getGaugeDef().add(g); } else if (line.startsWith("#")) { ecuData.getGaugeDef().add(processPreprocessor(ecuData, line)); ecuData.getGaugeDoc().add(String.format("<tr><td colspan=\"12\" id=\"preprocessor\">%s</td></tr>", line)); } } }