package uk.org.smithfamily.utils.normaliser; import java.io.PrintWriter; import java.util.*; import java.util.Map.Entry; 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.CurveItem; import uk.org.smithfamily.utils.normaliser.curveeditor.CurveTracker; import uk.org.smithfamily.utils.normaliser.menu.*; import uk.org.smithfamily.utils.normaliser.tableeditor.TableItem; import uk.org.smithfamily.utils.normaliser.tableeditor.TableTracker; import uk.org.smithfamily.utils.normaliser.userdefined.*; public class Output { public static final String TAB = " "; private static final int MAX_LINES = 100; private static Set<String> alwaysInt = new HashSet<String>(Arrays.asList(new String[] {})); private static Set<String> alwaysDouble = new HashSet<String>(Arrays.asList(new String[] { "pulseWidth", "throttle", "accDecEnrich", "accDecEnrichPcnt", "accEnrichPcnt", "accEnrichMS", "decEnrichPcnt", "decEnrichMS", "time", "egoVoltage", "egoVoltage2", "egoCorrection", "veCurr", "lambda", "TargetLambda" })); private static List<String> menuDialogs; public static void outputGaugeDoc(final ECUData ecuData, final PrintWriter writer) { writer.println("/*"); for (final String gauge : ecuData.getGaugeDoc()) { writer.println(gauge); } writer.println("*/"); } public static void outputConstructor(final ECUData ecuData, final PrintWriter writer, final String className) { writer.println(TAB + "private MSControllerInterface parent;"); writer.println(TAB + "private MSUtilsInterface utils;"); writer.println(TAB + "public " + className + "(MSControllerInterface parent,MSUtilsInterface utils)"); writer.println(TAB + "{"); writer.println(TAB + TAB + "this.parent = parent;"); writer.println(TAB + TAB + "this.utils = utils;"); writer.println(TAB + TAB + "initOutputChannels();"); writer.println(TAB + "}"); writer.println(TAB + "private double table(double x,String t)"); writer.println(TAB + "{"); writer.println(TAB + TAB + "return parent.table(x,t);"); writer.println(TAB + "}"); writer.println(TAB + "private double round(double x)"); writer.println(TAB + "{"); writer.println(TAB + TAB + "return parent.round(x);"); writer.println(TAB + "}"); writer.println(TAB + "private double tempCvt(double x)"); writer.println(TAB + "{"); writer.println(TAB + TAB + "return parent.tempCvt(x);"); writer.println(TAB + "}"); writer.println(TAB + "private double timeNow()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "return parent.timeNow();"); writer.println(TAB + "}"); } /** * This is nasty. We need to have a set of methods to init the constants as there is a hard limit of 64K on the size of a method, and MS3 will * break that. We also need to ensure that if there is any preprocessor type logic that we don't stop and start the next method in the middle of * it. * * @param ecuData * @param writer */ public static void outputFlagsAndConstants(final ECUData ecuData, final PrintWriter writer) { int constantMethodCount = 0; int lineCount = 0; int bracketNesting = 0; boolean needDeclaration = true; int lookahead = 3; for (final Constant c : ecuData.getConstants()) { if (needDeclaration) { constantMethodCount++; writer.println(TAB + "private void initConstants" + constantMethodCount + "()\n" + TAB + "{\n"); needDeclaration = false; } if ((bracketNesting == 0) && (lookahead > 0)) { lookahead--; } lineCount++; if (c.getName().contains("{")) { bracketNesting++; } if (c.getName().contains("}")) { bracketNesting--; } if ("PREPROC".equals(c.getType())) { writer.println(TAB + TAB + c.getName()); lookahead = 3; } else { writer.println(TAB + TAB + "constants.put(\"" + c.getName() + "\", new " + c.toString() + ");"); } if ((lineCount > MAX_LINES) && (bracketNesting == 0) && (lookahead == 0)) { writer.println(TAB + "}\n"); needDeclaration = true; lineCount = 0; } } if (!needDeclaration) { writer.println(TAB + "}\n"); } writer.println(TAB + "@Override"); writer.println(TAB + "public void setFlags()"); writer.println(TAB + "{"); final Map<String, String> vars = ecuData.getConstantVars(); for (final String flag : ecuData.getFlags()) { // INI_VERSION_2 should always be true if (flag.equals("INI_VERSION_2")) { writer.println(TAB + TAB + "INI_VERSION_2 = true;"); } // MEMPAGES, LOGPAGES and MSLVV_COMPATIBLE should always be false else if (flag.equals("MEMPAGES") || flag.equals("LOGPAGES") || flag.equals("MSLVV_COMPATIBLE")) { writer.println(TAB + TAB + flag + " = false;"); } else if (flag.equals("SPEED_DENSITY")) { String varName = "algorithm1"; // MS1 B&G if (vars.containsKey("algorithm")) { varName = "algorithm"; } writer.println(TAB + TAB + "SPEED_DENSITY = (" + varName + " == 1);"); } else if (flag.equals("ALPHA_N")) { String varName = "algorithm1"; // MS1 B&G if (vars.containsKey("algorithm")) { varName = "algorithm"; } writer.println(TAB + TAB + "ALPHA_N = (" + varName + " == 2);"); } else if (flag.equals("AIR_FLOW_METER")) { if (vars.containsKey("AFMUse")) { writer.println(TAB + TAB + "AIR_FLOW_METER = (AFMUse == 2);"); } // MS1 B&G doesn't support MAF else { writer.println(TAB + TAB + "AIR_FLOW_METER = false;"); } } else { writer.println(TAB + TAB + flag + " = parent.isSet(\"" + flag + "\");"); } } writer.println(TAB + "}"); writer.println(TAB + "@Override"); writer.println(TAB + "public void refreshFlags()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "setFlags();"); writer.println(TAB + TAB + "initOutputChannels();"); for (int i = 1; i <= constantMethodCount; i++) { writer.println(TAB + TAB + "initConstants" + i + "();"); } writer.println(TAB + TAB + "createTableEditors();"); writer.println(TAB + TAB + "createCurveEditors();"); writer.println(TAB + TAB + "createMenus();"); writer.println(TAB + TAB + "createDialogs();"); writer.println(TAB + "}"); } public static void outputOutputChannels(final ECUData ecuData, final PrintWriter writer) { writer.println(TAB + "public void initOutputChannels()"); writer.println(TAB + "{"); for (final OutputChannel op : ecuData.getOutputChannels()) { if (op.getType().equals("PREPROC")) { writer.println(TAB + TAB + op.getName()); } else { writer.println(TAB + TAB + "parent.registerOutputChannel(new " + op.toString() + ");"); } } writer.println(TAB + "}"); } public static void outputPackageAndIncludes(final ECUData ecuData, final PrintWriter writer) { writer.println("package uk.org.smithfamily.mslogger.ecuDef.gen;"); writer.println(""); writer.println("import java.io.IOException;"); writer.println("import java.util.*;"); writer.println(""); writer.println(""); writer.println("import uk.org.smithfamily.mslogger.ecuDef.*;"); } private static String getType(final String name, final Map<String, String> vars) { String type = vars.get(name); if (alwaysInt.contains(name)) { type = "int"; } else if (alwaysDouble.contains(name)) { type = "double"; } return type; } public static void outputGlobalVars(final ECUData ecuData, final PrintWriter writer) { writer.println("//Flags"); final List<String> flags = new ArrayList<String>(); for (final String flag : ecuData.getFlags()) { if (!flag.equals("INI_VERSION_2") && !flag.equals("MEMPAGES") && !flag.equals("LOGPAGES") && !flag.equals("SPEED_DENSITY") && !flag.equals("ALPHA_N") && !flag.equals("MSLVV_COMPATIBLE") && !flag.equals("AIR_FLOW_METER")) { flags.add("\"" + flag + "\""); } } writer.println(TAB + "public String[] flags = {" + StringUtils.join(flags, ",") + "};"); for (final String name : ecuData.getFlags()) { writer.println(TAB + "public boolean " + name + ";"); } writer.println("//Defaults"); for (final String d : ecuData.getDefaults()) { writer.println(TAB + "public " + d); } final Map<String, String> vars = new TreeMap<String, String>(); vars.putAll(ecuData.getRuntimeVars()); vars.putAll(ecuData.getEvalVars()); for (final String v : vars.keySet()) { ecuData.getConstantVars().remove(v); } writer.println("//Variables"); for (final String name : vars.keySet()) { String type = getType(name, vars); // Force secl to be double if (name.equals("secl")) { type = "double"; } writer.println(TAB + "public " + type + " " + name + ";"); } writer.println("\n//Constants"); for (final String name : ecuData.getConstantVars().keySet()) { final String type = getType(name, ecuData.getConstantVars()); writer.println(TAB + "public " + type + " " + name + ";"); } writer.println("\n"); writer.println(TAB + "Map<String,GaugeDetails> gauges = new HashMap<String,GaugeDetails>();\n"); writer.println(TAB + "private String[] defaultGauges = {"); boolean first = true; for (final String dg : ecuData.getDefaultGauges()) { if (!first) { writer.println(","); } first = false; writer.print(TAB + TAB + "\"" + dg + "\""); } writer.println("\n" + TAB + "};"); writer.println("\n" + TAB + "@Override"); writer.println(TAB + "public String[] getControlFlags()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "return flags;"); writer.println(TAB + "}"); } public static void outputRequiresPowerCycle(final ECUData ecuData, final PrintWriter writer) { writer.println("\n //Fields that requires power cycle"); writer.println(" public List<String> getRequiresPowerCycle()"); writer.println(" {"); writer.println(TAB + TAB + "List<String> requiresPowerCycle = new ArrayList<String>();"); for (final String field : ecuData.getRequiresPowerCycle()) { writer.println(TAB + TAB + "requiresPowerCycle.add(\"" + field + "\");"); } writer.println(TAB + TAB + "return requiresPowerCycle;"); writer.println(TAB + "}\n"); } public static void outputRTCalcs(final ECUData ecuData, final PrintWriter writer) { writer.println(" @Override"); writer.println(" public void calculate(byte[] ochBuffer)"); writer.println(" {"); for (final String defn : ecuData.getRuntime()) { writer.println(TAB + TAB + defn); // System.out.println(defn); } writer.println(TAB + "}"); } public static void outputLogInfo(final ECUData ecuData, final PrintWriter writer) { writer.println(TAB + "@Override"); writer.println(TAB + "public String getLogHeader()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "StringBuffer b = new StringBuffer();"); for (final String header : ecuData.getLogHeader()) { writer.println(TAB + TAB + header); } writer.println(TAB + TAB + "b.append(utils.getLocationLogHeader());"); writer.println(TAB + TAB + "return b.toString();\n" + TAB + "}\n"); writer.println(TAB + "@Override"); writer.println(TAB + "public String getLogRow()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "StringBuffer b = new StringBuffer();"); for (final String record : ecuData.getLogRecord()) { writer.println(TAB + TAB + record); } writer.println(TAB + TAB + "b.append(utils.getLocationLogRow());"); writer.println(TAB + TAB + "return b.toString();\n" + TAB + "}\n"); } static void outputGauges(final ECUData ecuData, final PrintWriter writer) { writer.println(TAB + "@Override"); writer.println(TAB + "public void initGauges()"); writer.println(TAB + "{"); for (final String gauge : ecuData.getGaugeDef()) { boolean okToWrite = true; if (gauge.contains("gauges.")) { final String[] parts = gauge.split(","); final String channel = parts[5]; okToWrite = ecuData.getRuntimeVars().containsKey(channel) || ecuData.getEvalVars().containsKey(channel); } if (okToWrite) { writer.println(TAB + TAB + gauge); } } writer.println(TAB + "}\n"); } public static void outputMenus(final ECUData ecuData, final PrintWriter writer) { menuDialogs = new ArrayList<String>(); writer.println(TAB + "@Override"); writer.println(TAB + "public void createMenus()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "Menu m;"); writer.println(TAB + TAB + "List<Menu> listMenus;"); boolean isFirstMenu = true; String key = ""; for (final MenuTracker m : ecuData.getMenuDefs()) { for (final Entry<String, List<MenuItem>> menuDialog : m.getItems()) { key = menuDialog.getKey(); final List<MenuItem> value = menuDialog.getValue(); for (int i = 0; i < value.size(); i++) { if (MenuDefinition.class.isInstance(value.get(i))) { if (!isFirstMenu) { if (menuDialogs.contains(key)) { writer.println(TAB + TAB + "menus.get(\"" + key + "\").add(m);"); } else { writer.println(TAB + TAB + "listMenus = new ArrayList<Menu>();"); writer.println(TAB + TAB + "listMenus.add(m);"); writer.println(TAB + TAB + "menus.put(\"" + key + "\", listMenus);"); menuDialogs.add(key); } } else { isFirstMenu = false; } } writer.println(TAB + TAB + value.get(i).toString()); } } } if (menuDialogs.contains(key)) { writer.println(TAB + TAB + "menus.get(\"" + key + "\").add(m);"); } else { writer.println(TAB + TAB + "listMenus = new ArrayList<Menu>();"); writer.println(TAB + TAB + "listMenus.add(m);"); writer.println(TAB + TAB + "menus.put(\"" + key + "\", listMenus);"); menuDialogs.add(key); } writer.println(TAB + "}\n"); } public static void outputUserDefined(final ECUData ecuData, final PrintWriter writer) { // Keep track of indent of preprocessor int preprocessorIndent = 0; // Keep all the dummy dialogs methods and dump them at the end. Some dialog might get merged with other because // they are in the same preproc String dummyDialogsMethods = ""; // Keep track if it's the first dialog of the method or if we already added one boolean isFirstDialog = false; for (int i = 0; i < ecuData.getDialogDefs().size(); i++) { final UserDefinedTracker d = ecuData.getDialogDefs().get(i); // We are not in a preproc so write the method signature if (preprocessorIndent == 0) { isFirstDialog = true; writer.println(TAB + "private void createDialog_" + d.getName() + "()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "MSDialog d = null;"); } else { isFirstDialog = false; } boolean ignorePreproc = false; // If it's the last dialog and we are not in preproc, // ignore the preproc, it most likely belong to the other section after [UserDefined] (usually [PortEditor]) if ((i == (ecuData.getDialogDefs().size() - 1)) && (preprocessorIndent == 0)) { ignorePreproc = true; } for (final UserDefinedItem j : d.getItems()) { // If it's a preproc, we need to keep track of indent if (UserDefinedPreProcessor.class.isInstance(j) && !ignorePreproc) { if (j.toString().contains("{")) { preprocessorIndent++; } if (j.toString().contains("}")) { preprocessorIndent--; } } // Make sure it's not a preproc, or that it's one but we don't ignore them if (!UserDefinedPreProcessor.class.isInstance(j) || (UserDefinedPreProcessor.class.isInstance(j) && !ignorePreproc)) { writer.println(TAB + TAB + StringUtils.repeat(TAB, preprocessorIndent) + j); } } // We are out of the preproc so we won't add the dialog to the same function // We can close the current function if (preprocessorIndent == 0) { writer.println(TAB + "}"); } // It wasn't the first dialog of this method, so we will create a dummy method if (!isFirstDialog) { dummyDialogsMethods += TAB + "private void createDialog_" + d.getName() + "(){}\n"; } } writer.println(dummyDialogsMethods); writer.println(TAB + "@Override"); writer.println(TAB + "public void createDialogs()"); writer.println(TAB + "{"); for (final UserDefinedTracker d : ecuData.getDialogDefs()) { writer.println(TAB + TAB + "createDialog_" + d.getName() + "();"); } writer.println(TAB + "}"); } public static void outputUserDefinedVisibilityFlags(final ECUData ecuData, final PrintWriter writer) { writer.println(TAB + "@Override"); writer.println(TAB + "public void setUserDefinedVisibilityFlags()"); writer.println(TAB + "{"); for (final String key : ecuData.getFieldControlExpressions().keySet()) { final String expr = ecuData.getFieldControlExpressions().get(key); writer.println(String.format(TAB + TAB + "userDefinedVisibilityFlags.put(\"%s\",%s);", key, expr)); } writer.println(TAB + "}"); } public static void outputMenuVisibilityFlags(final ECUData ecuData, final PrintWriter writer) { writer.println(TAB + "@Override"); writer.println(TAB + "public void setMenuVisibilityFlags()"); writer.println(TAB + "{"); for (final String key : ecuData.getMenuControlExpressions().keySet()) { final String expr = ecuData.getMenuControlExpressions().get(key); writer.println(String.format(TAB + TAB + "menuVisibilityFlags.put(\"%s\",%s);", key, expr)); } writer.println(TAB + "}"); } public static void outputTableEditors(final ECUData ecuData, final PrintWriter writer) { for (final TableTracker t : ecuData.getTableDefs()) { writer.println(TAB + "private void createTableEditor_" + t.getName() + "()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "TableEditor t = null;"); for (final TableItem i : t.getItems()) { writer.println(TAB + TAB + i); } writer.println(TAB + "}"); } writer.println(TAB + "@Override"); writer.println(TAB + "public void createTableEditors()"); writer.println(TAB + "{"); for (final TableTracker t : ecuData.getTableDefs()) { writer.println(TAB + TAB + "createTableEditor_" + t.getName() + "();"); } writer.println(TAB + "}"); } public static void outputCurves(final ECUData ecuData, final PrintWriter writer) { for (final CurveTracker c : ecuData.getCurveDefs()) { if ((c.getName() != null) && !c.getName().trim().equals("")) { writer.println(TAB + "private void createCurveEditor_" + c.getName() + "()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "CurveEditor c = null;"); for (final CurveItem i : c.getItems()) { writer.println(TAB + TAB + i); } writer.println(TAB + "}"); } } writer.println(TAB + "@Override"); writer.println(TAB + "public void createCurveEditors()"); writer.println(TAB + "{"); for (final CurveTracker c : ecuData.getCurveDefs()) { if ((c.getName() != null) && !c.getName().trim().equals("")) { writer.println(TAB + TAB + "createCurveEditor_" + c.getName() + "();"); } } writer.println(TAB + "}"); } public static void outputLoadConstants(final ECUData ecuData, final PrintWriter writer) { int pageNo = 0; final List<Integer> pageNumbers = new ArrayList<Integer>(); for (final Constant c : ecuData.getConstants()) { if (c.getPage() != pageNo) { if (pageNo > 0) { writer.println(TAB + "}"); } pageNo = c.getPage(); pageNumbers.add(pageNo); writer.println(TAB + "public void loadConstantsPage" + pageNo + "(boolean simulated)"); writer.println(TAB + "{"); writer.println(TAB + TAB + "byte[] pageBuffer = null;"); final int pageSize = Integer.parseInt(ecuData.getPageSizes().get(pageNo - 1).trim()); String activateCommand = null; if ((pageNo - 1) < ecuData.getPageActivateCommands().size()) { activateCommand = ecuData.getPageActivateCommands().get(pageNo - 1); } String readCommand = null; if ((pageNo - 1) < ecuData.getPageReadCommands().size()) { readCommand = ecuData.getPageReadCommands().get(pageNo - 1); } outputLoadPage(ecuData, pageNo, 0, pageSize, activateCommand, readCommand, writer); } // getScalar(String bufferName,String name, String dataType, String // offset, String scale, String numOffset) final String name = c.getName(); if (!"PREPROC".equals(c.getType())) { String def; if ("bits".equals(c.getClassType())) { final String bitspec = StringUtils.remove(StringUtils.remove(c.getShape(), '['), ']'); final String[] bits = bitspec.split(":"); final int offset = c.getOffset(); final String start = bits[0]; String end = bits[1]; String ofs = "0"; if (end.contains("+")) { final String[] parts = end.split("\\+"); end = parts[0]; ofs = parts[1]; } def = (name + " = utils.getBits(pageBuffer," + offset + "," + start + "," + end + "," + ofs + ");"); } else if ("array".equals(c.getClassType())) { def = generateLoadArray(ecuData, c); } else { def = getScalar("pageBuffer", ecuData.getConstantVars().get(name), name, c.getType(), "" + c.getOffset(), "1", "0"); // scale of 1 // and // translate // of 0 } writer.println(TAB + TAB + def); } else { if (pageNo > 0) { writer.println(TAB + TAB + name); } } } writer.println(TAB + "}"); writer.println(TAB + "@Override"); writer.println(TAB + "public void loadConstants(boolean simulated)"); writer.println(TAB + "{"); for (final int i : pageNumbers) { writer.println(TAB + TAB + "loadConstantsPage" + i + "(simulated);"); } writer.println(TAB + TAB + "refreshFlags();"); writer.println(TAB + "}"); } private static String generateLoadArray(final ECUData ecuData, final Constant c) { String loadArray = ""; final int[] size = MSUtilsShared.getArraySize(c.getShape()); final int width = size[0]; final int height = size[1]; String functionName = "parent.loadByte"; String signed = "false"; if (c.getType().contains("16")) { functionName = "parent.loadWord"; } if (c.getType().contains("S")) { signed = "true"; } if (height == -1) { functionName += "Vector"; loadArray = String.format("%s = %s(pageBuffer, %d, %d, %s);", c.getName(), functionName, c.getOffset(), width, signed); } else { functionName += "Array"; loadArray = String.format("%s = %s(pageBuffer, %d, %d, %d, %s);", c.getName(), functionName, c.getOffset(), width, height, signed); } return loadArray; } public static void outputLoadPage(final ECUData ecuData, final int pageNo, final int pageOffset, final int pageSize, String activate, String read, final PrintWriter writer) { if (activate != null) { activate = processStringToBytes(ecuData, activate, pageOffset, pageSize, pageNo); } if (read != null) { read = processStringToBytes(ecuData, read, pageOffset, pageSize, pageNo); } writer.println(TAB + TAB + String.format("pageBuffer = parent.loadPage(%d,%d,%d,%s,%s);", pageNo, pageOffset, pageSize, activate, read)); } public static void outputOverrides(final ECUData ecuData, final PrintWriter writer) { String pageIdentifierOutput = ""; for (final String pageIdentifier : ecuData.getPageIdentifiers()) { pageIdentifierOutput += TAB + TAB + "pageIdentifiers.add(\"" + pageIdentifier.replace("\\", "\\\\") + "\");\n"; } String pageActivateOutput = ""; final int[] value = { 0 }; for (final String pageActivate : ecuData.getPageActivateCommands()) { pageActivateOutput += TAB + TAB + "pageActivates.add(new byte[] {" + MSUtilsShared.HexStringToBytes(new ArrayList<String>(), pageActivate, 0, 0, value, 0) + "});\n"; } String pageValueWriteOutput = ""; for (final String pageValueWrite : ecuData.getPageValueWrites()) { pageValueWriteOutput += TAB + TAB + "pageValueWrites.add(" + pageValueWrite + ");\n"; } String pageChunkWriteOutput = ""; for (final String pageChunkWrite : ecuData.getPageChunkWrites()) { pageChunkWriteOutput += TAB + TAB + "pageChunkWrites.add(" + pageChunkWrite + ");\n"; } String overrides = TAB + "@Override\n" + TAB + "public String getSignature()\n" + TAB + "{\n" + TAB + TAB + "return signature;\n" + "}\n" + TAB + "@Override\n" + TAB + "public byte[] getOchCommand()\n" + TAB + "{\n" + TAB + TAB + "return this.ochGetCommand;\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public byte[] getSigCommand()\n" + TAB + "{\n" + TAB + TAB + "return this.queryCommand;\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public int getBlockSize()\n" + TAB + "{\n" + TAB + TAB + "return this.ochBlockSize;\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public int getSigSize()\n" + TAB + "{\n" + TAB + TAB + "return signature.length();\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public int getPageActivationDelay()\n" + TAB + "{\n" + TAB + TAB + "return " + ecuData.getPageActivationDelayVal() + ";\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public List<String> getPageValueWrites()\n" + TAB + "{\n" + TAB + TAB + "List<String> pageValueWrites = new ArrayList<String>();\n\n" + pageValueWriteOutput + "\n" + TAB + TAB + "return pageValueWrites;\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public List<String> getPageChunkWrites()\n" + TAB + "{\n" + TAB + TAB + "List<String> pageChunkWrites = new ArrayList<String>();\n\n" + pageChunkWriteOutput + "\n" + TAB + TAB + "return pageChunkWrites;\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public List<String> getPageIdentifiers()\n" + TAB + "{\n" + TAB + TAB + "List<String> pageIdentifiers = new ArrayList<String>();\n\n" + pageIdentifierOutput + "\n" + TAB + TAB + "return pageIdentifiers;\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public List<byte[]> getPageActivates()\n" + TAB + "{\n" + TAB + TAB + "List<byte[]> pageActivates = new ArrayList<byte[]>();\n\n" + pageActivateOutput + "\n" + TAB + TAB + "return pageActivates;\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public int getInterWriteDelay()\n" + TAB + "{\n" + TAB + TAB + "return " + ecuData.getInterWriteDelay() + ";\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public boolean isCRC32Protocol()\n" + TAB + "{\n" + TAB + TAB + "return " + ecuData.isCRC32Protocol() + ";\n" + TAB + "}\n" + TAB + "@Override\n" + TAB + "public int getCurrentTPS()\n" + TAB + "{\n"; if (ecuData.getRuntimeVars().containsKey("tpsADC")) { overrides += TAB + TAB + "return (int)tpsADC;\n"; } else { overrides += TAB + TAB + "return 0;\n"; } overrides += TAB + "}\n"; overrides += TAB + "@Override\n" + TAB + "public String[] defaultGauges()\n" + TAB + "{\n" + TAB + TAB + "return defaultGauges;\n" + TAB + "}\n"; writer.println(overrides); } private static String processStringToBytes(final ECUData ecuData, final String s, final int offset, final int count, final int pageNo) { String ret = "new byte[]{"; final int[] value = { 0 }; ret += MSUtilsShared.HexStringToBytes(ecuData.getPageIdentifiers(), s, offset, count, value, pageNo); ret += "}"; return ret; } static String getScalar(final String bufferName, String javaType, final String name, final String dataType, final String offset, final String scale, final String numOffset) { if (javaType == null) { javaType = "int"; } String definition = name + " = (" + javaType + ")((utils.get"; if (dataType.startsWith("S")) { definition += "Signed"; } final int size = Integer.parseInt(dataType.substring(1).trim()); switch (size) { case 8: definition += "Byte"; break; case 16: definition += "Word"; break; case 32: definition += "Long"; break; default: definition += dataType; break; } definition += "(" + bufferName + "," + offset + ") + " + numOffset + ") * " + scale + ");"; return definition; } public static void outputSettingGroups(final ECUData ecuData, final PrintWriter writer) { writer.println(TAB + "@Override"); writer.println(TAB + "public void createSettingGroups()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "settingGroups.clear();"); writer.println(TAB + TAB + "SettingGroup g;"); for (final SettingGroup group : ecuData.getSettingGroups()) { final String desc = group.getDescription(); if (desc.trim().length() > 1) { writer.println(TAB + TAB + String.format("g = new SettingGroup(\"%s\",\"%s\");", group.getName(), group.getDescription())); for (final SettingGroup.SettingOption settingOption : group.getOptions()) { writer.println(TAB + TAB + String.format("g.addOption(\"%s\",\"%s\");", settingOption.getFlag(), settingOption.getDescription())); } writer.println(TAB + TAB + "settingGroups.add(g);"); } } writer.println(TAB + "}"); writer.println(TAB + "@Override"); writer.println(TAB + "public List<SettingGroup> getSettingGroups()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "return settingGroups;"); writer.println(TAB + "}"); } public static void outputControllerCommands(final ECUData ecuData, final PrintWriter writer) { writer.println(TAB + "@Override"); writer.println(TAB + "public void createControllerCommands()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "controllerCommands.clear();"); for (final ControllerCommand command : ecuData.getControllerCommands()) { final String name = command.getName(); final String controllerCommand = command.getCommand(); writer.println(TAB + TAB + String.format("controllerCommands.put(\"%s\", \"%s\");", name, controllerCommand)); } writer.println(TAB + "}"); writer.println(TAB + "@Override"); writer.println(TAB + "public Map<String,String> getControllerCommands()"); writer.println(TAB + "{"); writer.println(TAB + TAB + "return controllerCommands;"); writer.println(TAB + "}"); } }