From 6377c10a1c0e3d684ca76d2565f3f4db3966cee0 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Tue, 9 Sep 2014 19:04:10 -0500 Subject: [PATCH] auto-sync --- .../src/com/irnems/core/EngineState.java | 2 + .../models/src/com/irnems/core/Sensor.java | 11 ++-- .../src/com/irnems/core/SensorCentral.java | 7 +-- .../src/com/irnems/core/SensorStats.java | 22 ++++++++ .../models/src/com/rusefi/CyclicBuffer.java | 55 +++++++++++++++++++ .../src/com/rusefi/test/CyclicBufferTest.java | 24 ++++++++ .../ui/src/com/rusefi/ui/RpmPanel.java | 8 +-- 7 files changed, 113 insertions(+), 16 deletions(-) create mode 100644 java_console/models/src/com/rusefi/CyclicBuffer.java create mode 100644 java_console/models/src/com/rusefi/test/CyclicBufferTest.java diff --git a/java_console/models/src/com/irnems/core/EngineState.java b/java_console/models/src/com/irnems/core/EngineState.java index 4db49b82e3..61eafc79c4 100644 --- a/java_console/models/src/com/irnems/core/EngineState.java +++ b/java_console/models/src/com/irnems/core/EngineState.java @@ -73,6 +73,8 @@ public class EngineState { // SensorStats.start(Sensor.IAT, Sensor.INTAKE_AIR_WIDTH); SensorStats.start(Sensor.VREF, Sensor.VREF_WIDTH); + SensorStats.startStandardDeviation(Sensor.DWELL0, Sensor.DWELL0_SD); + registerStringValueAction("adcfast_co", NOTHING); registerStringValueAction("adcfast_max", NOTHING); registerStringValueAction("adcfast_min", NOTHING); diff --git a/java_console/models/src/com/irnems/core/Sensor.java b/java_console/models/src/com/irnems/core/Sensor.java index bfe215ef93..ee4233db70 100644 --- a/java_console/models/src/com/irnems/core/Sensor.java +++ b/java_console/models/src/com/irnems/core/Sensor.java @@ -36,6 +36,9 @@ public enum Sensor { DWELL1("Input dwl #2", "ms", 0, 30, BackgroundColor.BEIGE), DWELL2("Input dwl #3", "ms", 0, 30, BackgroundColor.BEIGE), DWELL3("Input dwl #4", "ms", 0, 30, BackgroundColor.BEIGE), + DWELL0_SD("Input d #1", "std dev", 100), + + TOTAL_DWELL0("Input tdwl #1", "ms", 0, 30, BackgroundColor.BEIGE), TOTAL_DWELL1("Input tdwl #2", "ms", 0, 30, BackgroundColor.BEIGE), TOTAL_DWELL2("Input tdwl #3", "ms", 0, 30, BackgroundColor.BEIGE), @@ -62,13 +65,9 @@ public enum Sensor { CHART_STATUS("CHART_STATUS"), ADC_STATUS("ADC_STATUS"), - INJECTOR_0_STATUS("INJECTOR_0_STATUS"), - INJECTOR_1_STATUS("INJECTOR_1_STATUS"), - INJECTOR_2_STATUS("INJECTOR_2_STATUS"), - INJECTOR_3_STATUS("INJECTOR_3_STATUS"), - ADC_FAST("ADC_FAST", "b", 4000), - ADC_FAST_AVG("ADC_FAST_AVG", "b", 4000); + ADC_FAST_AVG("ADC_FAST_AVG", "b", 4000), + ; private final String name; private final String units; diff --git a/java_console/models/src/com/irnems/core/SensorCentral.java b/java_console/models/src/com/irnems/core/SensorCentral.java index ec6f3f82d7..ef7c6638cf 100644 --- a/java_console/models/src/com/irnems/core/SensorCentral.java +++ b/java_console/models/src/com/irnems/core/SensorCentral.java @@ -72,11 +72,6 @@ public class SensorCentral { } public void initialize(EngineState es) { - 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); @@ -114,7 +109,7 @@ public class SensorCentral { addDoubleSensor("period1", Sensor.PERIOD0, es); addDoubleSensor("duty0", Sensor.DUTY0, es); addDoubleSensor("duty1", Sensor.DUTY1, es); - addDoubleSensor("timing", Sensor.TIMING, es); + addDoubleSensor(Sensor.TIMING, es); addDoubleSensor(Sensor.TRG_0_DUTY, es); addDoubleSensor(Sensor.TRG_1_DUTY, es); diff --git a/java_console/models/src/com/irnems/core/SensorStats.java b/java_console/models/src/com/irnems/core/SensorStats.java index 7a24559d10..de0be0651b 100644 --- a/java_console/models/src/com/irnems/core/SensorStats.java +++ b/java_console/models/src/com/irnems/core/SensorStats.java @@ -1,5 +1,7 @@ package com.irnems.core; +import com.rusefi.CyclicBuffer; + /** * 7/26/13 * (c) Andrey Belomutskiy @@ -35,4 +37,24 @@ public class SensorStats { } + /** + * http://en.wikipedia.org/wiki/Standard_deviation + */ + public static void startStandardDeviation(Sensor source, final Sensor destination) { + final CyclicBuffer sb = new CyclicBuffer(30); + + SensorCentral.getInstance().addListener(source, new SensorCentral.SensorListener() { + @Override + public void onSensorUpdate(double value) { + sb.add(value); + + if (sb.getSize() == sb.getMaxSize()) { + double stdDev = sb.getStandardDeviation(); + SensorCentral.getInstance().setValue(stdDev, destination); + } + } + } + ); + } + } diff --git a/java_console/models/src/com/rusefi/CyclicBuffer.java b/java_console/models/src/com/rusefi/CyclicBuffer.java new file mode 100644 index 0000000000..b3e215ce82 --- /dev/null +++ b/java_console/models/src/com/rusefi/CyclicBuffer.java @@ -0,0 +1,55 @@ +package com.rusefi; + +public class CyclicBuffer { + private final double values[]; + + private int size = 0; + private int pointer = 0; + + public CyclicBuffer(int maxSize) { + values = new double[maxSize]; + } + + public double getStandardDeviation() { + double accumulator = 0; + double avg = average(); + + for (int i = 0; i < getSize(); i++) { + double v = get(i) - avg; + accumulator += v * v; + } + return Math.sqrt(accumulator); + } + + public void add(double value) { + if (size < values.length) + size++; + values[pointer] = value; + pointer++; + if (pointer == values.length) + pointer = 0; + } + + public double average() { + return sum() / size; + } + + public double sum() { + double result = 0; + for (int i = 0; i < size; i++) + result += values[i]; + return result; + } + + public int getSize() { + return size; + } + + public int getMaxSize() { + return values.length; + } + + public double get(int i) { + return values[i]; + } +} \ No newline at end of file diff --git a/java_console/models/src/com/rusefi/test/CyclicBufferTest.java b/java_console/models/src/com/rusefi/test/CyclicBufferTest.java new file mode 100644 index 0000000000..bb2234a66c --- /dev/null +++ b/java_console/models/src/com/rusefi/test/CyclicBufferTest.java @@ -0,0 +1,24 @@ +package com.rusefi.test; + +import com.rusefi.CyclicBuffer; +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +public class CyclicBufferTest { + @Test + public void test() { + CyclicBuffer cb = new CyclicBuffer(3); + + cb.add(1); + cb.add(3); + + assertEquals(2.0, cb.average()); + + cb.add(111); + cb.add(211); + assertEquals(108.33333333333333, cb.average()); + + assertEquals(147.1144679039647, cb.getStandardDeviation()); + } +} \ No newline at end of file diff --git a/java_console/ui/src/com/rusefi/ui/RpmPanel.java b/java_console/ui/src/com/rusefi/ui/RpmPanel.java index f47c3107a2..f08e820aa5 100644 --- a/java_console/ui/src/com/rusefi/ui/RpmPanel.java +++ b/java_console/ui/src/com/rusefi/ui/RpmPanel.java @@ -103,10 +103,10 @@ public class RpmPanel { controls.add(new AdcDebugControl().getControl(), "grow, wrap"); - controls.add(new InjectorControl(0, Sensor.INJECTOR_0_STATUS).getControl(), "grow, wrap"); - controls.add(new InjectorControl(1, Sensor.INJECTOR_1_STATUS).getControl(), "grow, wrap"); - controls.add(new InjectorControl(2, Sensor.INJECTOR_2_STATUS).getControl(), "grow, wrap"); - controls.add(new InjectorControl(3, Sensor.INJECTOR_3_STATUS).getControl(), "grow, wrap"); +// controls.add(new InjectorControl(0, Sensor.INJECTOR_0_STATUS).getControl(), "grow, wrap"); +// controls.add(new InjectorControl(1, Sensor.INJECTOR_1_STATUS).getControl(), "grow, wrap"); +// controls.add(new InjectorControl(2, Sensor.INJECTOR_2_STATUS).getControl(), "grow, wrap"); +// controls.add(new InjectorControl(3, Sensor.INJECTOR_3_STATUS).getControl(), "grow, wrap"); controls.add(new LogModeWidget().getPanel(), "grow, wrap");