/* * (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ package com.fr3ts0n.ecu; /** * VAG data conversions (used by Kw1281 ...) * * @author Erwin Scheuch-Heilig */ public class VagConversion extends NumericConversion { /** * */ private static final long serialVersionUID = 9130358043909319282L; /* * Formulas: * * 0 : Tabelle * 10 : (MW+Offset)*NW*Faktor * 11 : (MW.NW+Offset)*Faktor * 12 : (NW.MW+Offset)*Faktor * 13 : (NW*255+MW+Offset)*Faktor * 14 : (MW+Offset)/NW*Faktor * 15 : MW*Faktor+NW*Offset * 16 : (MW+Offset)*Faktor * 17 : 1+(MW+Offset)*NW*Faktor * 18 : (MW*NW*Faktor)+Offset * 20 : Bitdarstellung * 21 : 2 Ascii-Zeichen * 22 : Ascii-Text * 23 : Uhrzeit * 24 : Hexdarstellung */ public static final int CNV_ID_TBL = 0; int cnvId = 10; double factor = 1.0; double offset = 0.0; /** table values as they come from the meta package */ /** Value 2 for calcualtion as it comes from meta package */ private char metaNw = 0; /** table values as they come from the meta package */ private char[] metaTblValues = {0, 255}; public VagConversion() { } public VagConversion(int cnvId, double factor, double offset, String units) { this.cnvId = cnvId; this.factor = factor; this.offset = offset; this.units = units; } /** * @param metaNw the metaNw to set */ public void setMetaNw(char metaNw) { this.metaNw = metaNw; } /** * @param metaTblValues the metaTblValues to set */ public void setMetaTblValues(char[] metaTblValues) { this.metaTblValues = metaTblValues; } /** * calculation of interpolated table value * table values are transferred with the meta package * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double tableValue(int mw, int nw) { // mask value to 1 byte int internalVal = mw & 0xFF; // get position into table double stepwidth = (double) 0xFF / (metaTblValues.length - 1); int pos = (int) (internalVal / stepwidth); int ofs = (int) (internalVal % stepwidth); // get both table values int valBefore = metaTblValues[pos]; int valAfter = pos < metaTblValues.length - 1 ? metaTblValues[pos + 1] : valBefore; // interpolate value between table entries return ((valBefore + (valAfter - valBefore) * ofs / stepwidth) + offset - nw) * factor; } /** * calculation of formula ID 10 * <pre>(MW+Offset)*NW*Faktor</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula10Value(int mw, int nw) { return ((mw + offset) * nw * factor); } /** * calculation of formula ID 11 * <pre>(MW.NW+Offset)*Faktor</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula11Value(int mw, int nw) { return ((Double.parseDouble(String.format("%d.%d", mw, nw)) + offset) * factor); } /** * calculation of formula ID 12 * <pre>(NW.MW+Offset)*Faktor</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula12Value(int mw, int nw) { return ((Double.parseDouble(String.format("%d.%d", nw, mw)) + offset) * factor); } /** * calculation of formula ID 13 * <pre>(NW*255+MW+Offset)*Faktor</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula13Value(int mw, int nw) { return ((nw * 255 + mw + offset) * factor); } /** * calculation of formula ID 14 * <pre>(MW+Offset)/NW*Faktor</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula14Value(int mw, int nw) { return ((mw + offset) / nw * factor); } /** * calculation of formula ID 15 * <pre>MW*Faktor+NW*Offset</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula15Value(int mw, int nw) { return (mw * factor + nw * offset); } /** * calculation of formula ID 16 * <pre>(MW+Offset)*Faktor</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula16Value(int mw, int nw) { return ((mw + offset) * factor); } /** * calculation of formula ID 17 * <pre>1+(MW+Offset)*NW*Faktor</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula17Value(int mw, int nw) { return (1 + (mw + offset) * nw * factor); } /** * calculation of formula ID 18 * <pre>(MW*NW*Faktor)+Offset</pre> * * @param mw value 1 for calculation * @param nw value 2 for calcualtion * @return result of calculation */ double formula18Value(int mw, int nw) { return (mw * nw * factor + offset); } /** * convert memory value to physical value * * @param value memory value * @return physical value */ public Number memToPhys(long value) { double result = 0; int mw = (int) (value % 0x100); // if meta value is set, then it will be used int nw = metaNw != 0 ? metaNw : (int) (value / 0x100); switch (cnvId) { case 0: result = tableValue(mw, nw); break; case 10: result = formula10Value(mw, nw); break; case 11: result = formula11Value(mw, nw); break; case 12: result = formula12Value(mw, nw); break; case 13: result = formula13Value(mw, nw); break; case 14: result = formula14Value(mw, nw); break; case 15: result = formula15Value(mw, nw); break; case 16: result = formula16Value(mw, nw); break; case 17: result = formula17Value(mw, nw); break; case 18: result = formula18Value(mw, nw); break; case 20: result = mw & nw; break; case 21: case 22: case 23: result = nw << 8 | mw; break; default: log.info(String.format("Unsupported Formula: ID=%d [%s]", cnvId, units)); } return (float) result; } public Number physToMem(Number value) { throw new UnsupportedOperationException("Not supported yet."); } @Override public String physToPhysFmtString(Number physValue, String format) { String result = null; switch (cnvId) { case 20: // * 20 : Bitdarstellung result = Integer.toBinaryString(physValue.intValue()); break; case 21: // * 21 : 2 Ascii-Zeichen case 22: // * 22 : Ascii-Text result = String.format("%c%c", physValue.intValue() / 0x100, physValue.intValue() % 0x100); break; case 23: // * 23 : Uhrzeit result = String.format("%02d:%02d", physValue.intValue() / 0x100, physValue.intValue() % 0x100); break; case 24: // * 24 : Hexdarstellung result = String.format("%04X", physValue.intValue()); break; default: result = super.physToPhysFmtString(physValue, format); } return (result); } }