auto-sync

This commit is contained in:
rusEfi 2014-09-01 17:04:44 -05:00
parent b57e11871d
commit ee48146c4b
14 changed files with 121 additions and 128 deletions

View File

@ -89,9 +89,9 @@ public class IoUtil {
long time = System.currentTimeMillis(); long time = System.currentTimeMillis();
final CountDownLatch rpmLatch = new CountDownLatch(1); final CountDownLatch rpmLatch = new CountDownLatch(1);
SensorCentral.AdcListener listener = new SensorCentral.AdcListener() { SensorCentral.SensorListener listener = new SensorCentral.SensorListener() {
@Override @Override
public void onAdcUpdate(SensorCentral model, double value) { public void onSensorUpdate(double value) {
double actualRpm = SensorCentral.getInstance().getValue(Sensor.RPM); double actualRpm = SensorCentral.getInstance().getValue(Sensor.RPM);
if (isCloseEnough(rpm, actualRpm)) if (isCloseEnough(rpm, actualRpm))
rpmLatch.countDown(); rpmLatch.countDown();
@ -115,9 +115,9 @@ public class IoUtil {
static void waitForFirstResponse() throws InterruptedException { static void waitForFirstResponse() throws InterruptedException {
FileLog.MAIN.logLine("Let's give it some time to start..."); FileLog.MAIN.logLine("Let's give it some time to start...");
final CountDownLatch startup = new CountDownLatch(1); final CountDownLatch startup = new CountDownLatch(1);
SensorCentral.AdcListener listener = new SensorCentral.AdcListener() { SensorCentral.SensorListener listener = new SensorCentral.SensorListener() {
@Override @Override
public void onAdcUpdate(SensorCentral model, double value) { public void onSensorUpdate(double value) {
startup.countDown(); startup.countDown();
} }
}; };

View File

@ -22,7 +22,7 @@ public class FileUtils {
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
String packed = EngineState.packString(line); String packed = EngineState.packString(line);
engineState.append(packed + "\r\n"); engineState.processNewData(packed + "\r\n");
} }
} catch (IOException e) { } catch (IOException e) {
throw new IllegalStateException(e); throw new IllegalStateException(e);

View File

@ -39,7 +39,7 @@ class PortHolder {
open(port, new DataListener() { open(port, new DataListener() {
public void onStringArrived(String string) { public void onStringArrived(String string) {
// jTextAreaIn.append(string); // jTextAreaIn.append(string);
es.append(string); es.processNewData(string);
} }
}); });
} }

View File

@ -83,7 +83,7 @@ public class TcpConnector implements LinkConnector {
while (true) { while (true) {
try { try {
String line = reader.readLine(); String line = reader.readLine();
LinkManager.engineState.append(line + "\r\n"); LinkManager.engineState.processNewData(line + "\r\n");
} catch (IOException e) { } catch (IOException e) {
System.err.println("End of connection"); System.err.println("End of connection");
return; return;

View File

@ -14,7 +14,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
* @see #registerStringValueAction * @see #registerStringValueAction
*/ */
public class EngineState { public class EngineState {
public static final String RPM_KEY = "rpm";
public static final String SEPARATOR = ","; public static final String SEPARATOR = ",";
public static final int SNIFFED_ADC_COUNT = 16; public static final int SNIFFED_ADC_COUNT = 16;
public static final ValueCallback<String> NOTHING = new ValueCallback<String>() { public static final ValueCallback<String> NOTHING = new ValueCallback<String>() {
@ -29,7 +28,7 @@ public class EngineState {
private static final CharSequence TS_PROTOCOL_TAG = "ts_p_al"; private static final CharSequence TS_PROTOCOL_TAG = "ts_p_al";
private final Object lock = new Object(); private final Object lock = new Object();
static class StringActionPair extends Pair<String, ValueCallback<String>> { private static class StringActionPair extends Pair<String, ValueCallback<String>> {
public final String prefix; public final String prefix;
StringActionPair(String key, ValueCallback<String> second) { StringActionPair(String key, ValueCallback<String> second) {
@ -43,7 +42,7 @@ public class EngineState {
} }
} }
public List<EngineTimeListener> timeListeners = new CopyOnWriteArrayList<EngineTimeListener>(); public final List<EngineTimeListener> timeListeners = new CopyOnWriteArrayList<EngineTimeListener>();
private final ResponseBuffer buffer; private final ResponseBuffer buffer;
private final List<StringActionPair> actions = new ArrayList<StringActionPair>(); private final List<StringActionPair> actions = new ArrayList<StringActionPair>();
@ -68,62 +67,17 @@ public class EngineState {
} }
); );
SensorCentral.getInstance().initialize(this);
// SensorStats.start(Sensor.CLT, Sensor.COOLANT_WIDTH); // SensorStats.start(Sensor.CLT, Sensor.COOLANT_WIDTH);
// SensorStats.start(Sensor.IAT, Sensor.INTAKE_AIR_WIDTH); // SensorStats.start(Sensor.IAT, Sensor.INTAKE_AIR_WIDTH);
SensorStats.start(Sensor.VREF, Sensor.VREF_WIDTH); SensorStats.start(Sensor.VREF, Sensor.VREF_WIDTH);
addDoubleSensor(RPM_KEY, Sensor.RPM);
addDoubleSensor("mat", Sensor.IAT);
addDoubleSensor("map", Sensor.MAP);
addDoubleSensor("map_r", Sensor.MAP_RAW);
addDoubleSensor("baro", Sensor.BARO);
addDoubleSensor("clt", Sensor.CLT);
addDoubleSensor("tp", Sensor.TPS);
addDoubleSensor(Sensor.DWELL0);
addDoubleSensor(Sensor.DWELL1);
addDoubleSensor(Sensor.TOTAL_DWELL0);
addDoubleSensor(Sensor.TOTAL_DWELL1);
addDoubleSensor("tch", Sensor.T_CHARGE);
addDoubleSensor("afr", Sensor.AFR);
addDoubleSensor("d_fuel", Sensor.DEFAULT_FUEL);
addDoubleSensor("fuel", Sensor.FUEL);
addDoubleSensor("fuel_base", Sensor.FUEL_BASE);
addDoubleSensor("fuel_lag", Sensor.FUEL_LAG);
addDoubleSensor("fuel_clt", Sensor.FUEL_CLT);
addDoubleSensor("fuel_iat", Sensor.FUEL_IAT);
addDoubleSensor("table_spark", Sensor.TABLE_SPARK);
addDoubleSensor("advance0", Sensor.ADVANCE0);
addDoubleSensor("advance1", Sensor.ADVANCE1);
addDoubleSensor("vref", Sensor.VREF);
addDoubleSensor("vbatt", Sensor.VBATT);
addDoubleSensor("maf", Sensor.MAF);
addDoubleSensor("period0", Sensor.PERIOD0);
addDoubleSensor("period1", Sensor.PERIOD0);
addDoubleSensor("duty0", Sensor.DUTY0);
addDoubleSensor("duty1", Sensor.DUTY1);
addDoubleSensor("timing", Sensor.TIMING);
addDoubleSensor(Sensor.TRG_0_DUTY);
addDoubleSensor(Sensor.TRG_1_DUTY);
addDoubleSensor("idl", Sensor.IDLE_SWITCH);
addDoubleSensor("chart", Sensor.CHART_STATUS, true);
addDoubleSensor("chartsize", Sensor.CHARTSIZE, true);
addDoubleSensor("adcDebug", Sensor.ADC_STATUS, true);
addDoubleSensor("adcfast", Sensor.ADC_FAST);
addDoubleSensor("adcfastavg", Sensor.ADC_FAST_AVG);
registerStringValueAction("adcfast_co", NOTHING); registerStringValueAction("adcfast_co", NOTHING);
registerStringValueAction("adcfast_max", NOTHING); registerStringValueAction("adcfast_max", NOTHING);
registerStringValueAction("adcfast_min", NOTHING); registerStringValueAction("adcfast_min", NOTHING);
registerStringValueAction("key", NOTHING); registerStringValueAction("key", NOTHING);
registerStringValueAction("value", NOTHING); registerStringValueAction("value", NOTHING);
// addDoubleSensor("adcfast_co", Sensor.ADC_FAST_AVG);
addDoubleSensor("injector0", Sensor.INJECTOR_0_STATUS, true);
addDoubleSensor("injector1", Sensor.INJECTOR_1_STATUS, true);
addDoubleSensor("injector2", Sensor.INJECTOR_2_STATUS, true);
addDoubleSensor("injector3", Sensor.INJECTOR_3_STATUS, true);
registerStringValueAction("msg", new ValueCallback<String>() { registerStringValueAction("msg", new ValueCallback<String>() {
@Override @Override
@ -157,7 +111,6 @@ public class EngineState {
registerStringValueAction("i_p", NOTHING); registerStringValueAction("i_p", NOTHING);
registerStringValueAction("a_time", NOTHING); registerStringValueAction("a_time", NOTHING);
registerStringValueAction("time", new ValueCallback<String>() { registerStringValueAction("time", new ValueCallback<String>() {
public void onUpdate(String value) { public void onUpdate(String value) {
double time; double time;
@ -173,35 +126,6 @@ public class EngineState {
}); });
} }
/**
* Sensor enum name matches the protocol key
*/
private void addDoubleSensor(Sensor sensor) {
addDoubleSensor(sensor.name(), sensor);
}
private void addDoubleSensor(String key, final Sensor sensor) {
addDoubleSensor(key, sensor, false);
}
private void addDoubleSensor(final String key, final Sensor sensor, final boolean verbose) {
registerStringValueAction(key, new ValueCallback<String>() {
@Override
public void onUpdate(String stringValue) {
double value;
try {
value = Double.parseDouble(stringValue);
} catch (NumberFormatException e) {
// serial protocol is not safe
return;
}
SensorCentral.getInstance().setValue(value, sensor);
if (verbose)
MessagesCentral.getInstance().postMessage(EngineState.class, key + "=" + value);
}
});
}
/** /**
* @see #unpackString(String) * @see #unpackString(String)
*/ */
@ -210,8 +134,11 @@ public class EngineState {
} }
/** /**
* This method extract the content of a 'line with known length' packet
* <p/>
* serial protocol is not error-prone, so our simple approach is to validate the length of incoming strings * serial protocol is not error-prone, so our simple approach is to validate the length of incoming strings
* *
* @return null in case of error, line message if valid packed ine
* @see #packString(String) * @see #packString(String)
*/ */
public static String unpackString(String message) { public static String unpackString(String message) {
@ -340,7 +267,7 @@ public class EngineState {
} }
} }
public void append(String append) { public void processNewData(String append) {
buffer.append(append); buffer.append(append);
} }

View File

@ -6,18 +6,19 @@ import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
/** /**
* This class keeps track of {@link Sensor} current values and {@link SensorCentral.SensorListener}
* <p/>
* <p/>
* Date: 1/6/13 * Date: 1/6/13
* (c) Andrey Belomutskiy * (c) Andrey Belomutskiy
*/ */
public class SensorCentral { public class SensorCentral {
public static final String RPM_KEY = "rpm";
private static final SensorCentral INSTANCE = new SensorCentral(); private static final SensorCentral INSTANCE = new SensorCentral();
private final Map<Sensor, Double> values = new EnumMap<Sensor, Double>(Sensor.class); private final Map<Sensor, Double> values = new EnumMap<Sensor, Double>(Sensor.class);
private final Map<Sensor, List<AdcListener>> allListeners = new EnumMap<Sensor, List<AdcListener>>(Sensor.class); private final Map<Sensor, List<SensorListener>> allListeners = new EnumMap<Sensor, List<SensorListener>>(Sensor.class);
// private final List<AdcListener> listeners = new CopyOnWriteArrayList<AdcListener>();
public static SensorCentral getInstance() { public static SensorCentral getInstance() {
return INSTANCE; return INSTANCE;
@ -26,18 +27,6 @@ public class SensorCentral {
private SensorCentral() { private SensorCentral() {
} }
// public static String getTitle(int i) {
// Sensor sensor = Sensor.findByMazdaIndex(i);
// return "adc " + i + sensor.getName();
// }
// public String getSniffedAdcRepresentation(Sensor channel) {
// double value = getValue(channel);
//
// double volts = 5 * value / 255;
// return "" + value + " (" + volts + ")";
// }
public double getValue(Sensor sensor) { public double getValue(Sensor sensor) {
Double value = values.get(sensor); Double value = values.get(sensor);
if (value == null) if (value == null)
@ -47,14 +36,14 @@ public class SensorCentral {
public void setValue(double value, Sensor sensor) { public void setValue(double value, Sensor sensor) {
values.put(sensor, value); values.put(sensor, value);
List<AdcListener> listeners; List<SensorListener> listeners;
synchronized (allListeners) { synchronized (allListeners) {
listeners = allListeners.get(sensor); listeners = allListeners.get(sensor);
} }
if (listeners == null) if (listeners == null)
return; return;
for (AdcListener listener : listeners) for (SensorListener listener : listeners)
listener.onAdcUpdate(this, value); listener.onSensorUpdate(value);
} }
public static String getInternalAdcRepresentation(double value) { public static String getInternalAdcRepresentation(double value) {
@ -62,19 +51,19 @@ public class SensorCentral {
return String.format("%.2f (%.2fv)", value, volts); return String.format("%.2f (%.2fv)", value, volts);
} }
public void addListener(Sensor sensor, AdcListener listener) { public void addListener(Sensor sensor, SensorListener listener) {
List<AdcListener> listeners; List<SensorListener> listeners;
synchronized (allListeners) { synchronized (allListeners) {
listeners = allListeners.get(sensor); listeners = allListeners.get(sensor);
if (listeners == null) if (listeners == null)
listeners = new CopyOnWriteArrayList<AdcListener>(); listeners = new CopyOnWriteArrayList<SensorListener>();
allListeners.put(sensor, listeners); allListeners.put(sensor, listeners);
} }
listeners.add(listener); listeners.add(listener);
} }
public void removeListener(Sensor sensor, AdcListener listener) { public void removeListener(Sensor sensor, SensorListener listener) {
List<AdcListener> listeners; List<SensorListener> listeners;
synchronized (allListeners) { synchronized (allListeners) {
listeners = allListeners.get(sensor); listeners = allListeners.get(sensor);
} }
@ -82,7 +71,84 @@ public class SensorCentral {
listeners.remove(listener); listeners.remove(listener);
} }
public interface AdcListener { public void initialize(EngineState es) {
void onAdcUpdate(SensorCentral model, double value); addDoubleSensor("injector0", Sensor.INJECTOR_0_STATUS, true, es);
addDoubleSensor("injector1", Sensor.INJECTOR_1_STATUS, true, es);
addDoubleSensor("injector2", Sensor.INJECTOR_2_STATUS, true, es);
addDoubleSensor("injector3", Sensor.INJECTOR_3_STATUS, true, es);
addDoubleSensor(RPM_KEY, Sensor.RPM, es);
addDoubleSensor("mat", Sensor.IAT, es);
addDoubleSensor("map", Sensor.MAP, es);
addDoubleSensor("map_r", Sensor.MAP_RAW, es);
addDoubleSensor("baro", Sensor.BARO, es);
addDoubleSensor("clt", Sensor.CLT, es);
addDoubleSensor("tp", Sensor.TPS, es);
addDoubleSensor(Sensor.DWELL0, es);
addDoubleSensor(Sensor.DWELL1, es);
addDoubleSensor(Sensor.TOTAL_DWELL0, es);
addDoubleSensor(Sensor.TOTAL_DWELL1, es);
addDoubleSensor("tch", Sensor.T_CHARGE, es);
addDoubleSensor(Sensor.AFR, es);
addDoubleSensor("d_fuel", Sensor.DEFAULT_FUEL, es);
addDoubleSensor(Sensor.FUEL, es);
addDoubleSensor(Sensor.FUEL_BASE, es);
addDoubleSensor(Sensor.FUEL_LAG, es);
addDoubleSensor(Sensor.FUEL_CLT, es);
addDoubleSensor(Sensor.FUEL_IAT, es);
addDoubleSensor(Sensor.TABLE_SPARK, es);
addDoubleSensor(Sensor.ADVANCE0, es);
addDoubleSensor(Sensor.ADVANCE1, es);
addDoubleSensor(Sensor.VREF, es);
addDoubleSensor(Sensor.VBATT, es);
addDoubleSensor(Sensor.MAF, es);
addDoubleSensor("period0", Sensor.PERIOD0, es);
addDoubleSensor("period1", Sensor.PERIOD0, es);
addDoubleSensor("duty0", Sensor.DUTY0, es);
addDoubleSensor("duty1", Sensor.DUTY1, es);
addDoubleSensor("timing", Sensor.TIMING, es);
addDoubleSensor(Sensor.TRG_0_DUTY, es);
addDoubleSensor(Sensor.TRG_1_DUTY, es);
addDoubleSensor("idl", Sensor.IDLE_SWITCH, es);
addDoubleSensor("chart", Sensor.CHART_STATUS, true, es);
addDoubleSensor("chartsize", Sensor.CHARTSIZE, true, es);
addDoubleSensor("adcDebug", Sensor.ADC_STATUS, true, es);
addDoubleSensor("adcfast", Sensor.ADC_FAST, es);
addDoubleSensor("adcfastavg", Sensor.ADC_FAST_AVG, es);
}
/**
* Sensor enum name matches the protocol key
*/
private void addDoubleSensor(Sensor sensor, EngineState es) {
addDoubleSensor(sensor.name(), sensor, es);
}
private void addDoubleSensor(String key, final Sensor sensor, EngineState es) {
addDoubleSensor(key, sensor, false, es);
}
private void addDoubleSensor(final String key, final Sensor sensor, final boolean verbose, EngineState es) {
es.registerStringValueAction(key, new EngineState.ValueCallback<String>() {
@Override
public void onUpdate(String stringValue) {
double value;
try {
value = Double.parseDouble(stringValue);
} catch (NumberFormatException e) {
// serial protocol is not safe
return;
}
setValue(value, sensor);
if (verbose)
MessagesCentral.getInstance().postMessage(EngineState.class, key + "=" + value);
}
});
}
public interface SensorListener {
void onSensorUpdate(double value);
} }
} }

View File

@ -7,14 +7,14 @@ package com.irnems.core;
public class SensorStats { public class SensorStats {
public static void start(final Sensor source, final Sensor destination) { public static void start(final Sensor source, final Sensor destination) {
SensorCentral.getInstance().addListener(source, new SensorCentral.AdcListener() { SensorCentral.getInstance().addListener(source, new SensorCentral.SensorListener() {
int counter; int counter;
double min = Double.MAX_VALUE; double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE; double max = Double.MIN_VALUE;
@Override @Override
public void onAdcUpdate(SensorCentral model, double value) { public void onSensorUpdate(double value) {
counter++; counter++;
min = Math.min(value, min); min = Math.min(value, min);

View File

@ -38,10 +38,10 @@ public class EngineStateTest {
rpmResult.set(Integer.parseInt(value)); rpmResult.set(Integer.parseInt(value));
} }
}); });
es.append("line:7:"); es.processNewData("line:7:");
es.append(EngineState.RPM_KEY + SEPARATOR); es.processNewData(SensorCentral.RPM_KEY + SEPARATOR);
assertEquals(0, rpmResult.get()); assertEquals(0, rpmResult.get());
es.append("600\r"); es.processNewData("600\r");
assertEquals(600, rpmResult.get()); assertEquals(600, rpmResult.get());
} }

View File

@ -19,7 +19,7 @@ import javax.swing.*;
* @see WavePanel * @see WavePanel
*/ */
public class Launcher extends FrameHelper { public class Launcher extends FrameHelper {
public static final int CONSOLE_VERSION = 20140829; public static final int CONSOLE_VERSION = 20140831;
public static final boolean SHOW_STIMULATOR = true; public static final boolean SHOW_STIMULATOR = true;
public Launcher(String port) { public Launcher(String port) {

View File

@ -65,7 +65,7 @@ public class AdcPanel {
// private Pair<JPanel, JLabel> createAdcLabel(final int channel) { // private Pair<JPanel, JLabel> createAdcLabel(final int channel) {
// final Pair<JPanel, JLabel> result = createLabelWithCaption(SensorCentral.getTitle(channel)); // final Pair<JPanel, JLabel> result = createLabelWithCaption(SensorCentral.getTitle(channel));
// model.addListener(new SensorCentral.AdcListener() { // model.addListener(new SensorCentral.SensorListener() {
// public void onAdcUpdate(SensorCentral model, Sensor sensor, double value) { // public void onAdcUpdate(SensorCentral model, Sensor sensor, double value) {
// if (sensor.getMazdaIndex() != channel) // if (sensor.getMazdaIndex() != channel)
// return; // return;

View File

@ -26,9 +26,9 @@ public class RpmModel {
} }
private RpmModel() { private RpmModel() {
SensorCentral.getInstance().addListener(Sensor.RPM, new SensorCentral.AdcListener() { SensorCentral.getInstance().addListener(Sensor.RPM, new SensorCentral.SensorListener() {
@Override @Override
public void onAdcUpdate(SensorCentral model, double value) { public void onSensorUpdate(double value) {
setValue((int) value); setValue((int) value);
} }
}); });

View File

@ -40,9 +40,9 @@ public class BooleanFlagControlPanel {
} }
protected void installStatusReader(final Sensor statusSensor) { protected void installStatusReader(final Sensor statusSensor) {
SensorCentral.getInstance().addListener(statusSensor, new SensorCentral.AdcListener() { SensorCentral.getInstance().addListener(statusSensor, new SensorCentral.SensorListener() {
@Override @Override
public void onAdcUpdate(SensorCentral model, double value) { public void onSensorUpdate(double value) {
checkBox.setSelected(value > 0); checkBox.setSelected(value > 0);
} }
}); });

View File

@ -11,9 +11,9 @@ import javax.swing.*;
*/ */
public class IdleLabel extends JLabel { public class IdleLabel extends JLabel {
public IdleLabel() { public IdleLabel() {
SensorCentral.getInstance().addListener(Sensor.IDLE_SWITCH, new SensorCentral.AdcListener() { SensorCentral.getInstance().addListener(Sensor.IDLE_SWITCH, new SensorCentral.SensorListener() {
@Override @Override
public void onAdcUpdate(SensorCentral model, double value) { public void onSensorUpdate(double value) {
IdleLabel.this.setText("Idle: " + (value == 0)); IdleLabel.this.setText("Idle: " + (value == 0));
} }
}); });

View File

@ -47,8 +47,8 @@ public class SensorGauge {
gauge.setBackgroundColor(sensor.getColor()); gauge.setBackgroundColor(sensor.getColor());
SensorCentral.getInstance().addListener(sensor, new SensorCentral.AdcListener() { SensorCentral.getInstance().addListener(sensor, new SensorCentral.SensorListener() {
public void onAdcUpdate(SensorCentral model, double value) { public void onSensorUpdate(double value) {
gauge.setValue(value); gauge.setValue(value);
} }
}); });