Whatever we call it, no matter how we do it - we need live data / remote view into rusEFI actual state #3353
progress
This commit is contained in:
parent
37db1559df
commit
a5f5ec4029
|
@ -4,7 +4,7 @@ echo "This batch files reads rusefi_enums.h and produces auto_generated_enums.*
|
||||||
|
|
||||||
rm gen_enum_to_string.log
|
rm gen_enum_to_string.log
|
||||||
|
|
||||||
java -DSystemOut.name=gen_java_enum -cp ../java_tools/enum2string.jar com.rusefi.ToJavaEnum -enumInputFile controllers/algo/live_data_ids.h -outputPath ../java_console/ui/src/main/java/com/rusefi/enums
|
java -DSystemOut.name=gen_java_enum -cp ../java_tools/enum2string.jar com.rusefi.ToJavaEnum -enumInputFile controllers/algo/live_data_ids.h -outputPath ../java_console/io/src/main/java/com/rusefi/enums
|
||||||
|
|
||||||
java -DSystemOut.name=gen_enum_to_string \
|
java -DSystemOut.name=gen_enum_to_string \
|
||||||
-jar ../java_tools/enum2string.jar \
|
-jar ../java_tools/enum2string.jar \
|
||||||
|
|
|
@ -1,72 +1,45 @@
|
||||||
package com.rusefi.ldmp;
|
package com.rusefi.ldmp;
|
||||||
|
|
||||||
import com.rusefi.config.Field;
|
import com.rusefi.config.Field;
|
||||||
import com.rusefi.config.generated.*;
|
import com.rusefi.config.generated.EngineState;
|
||||||
import com.rusefi.ui.livedocs.LiveDataContext;
|
import com.rusefi.config.generated.PidState;
|
||||||
|
import com.rusefi.config.generated.TriggerCentral;
|
||||||
|
import com.rusefi.config.generated.TriggerState;
|
||||||
|
import com.rusefi.enums.live_data_e;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
public enum StateDictionary {
|
public enum StateDictionary {
|
||||||
INSTANCE;
|
INSTANCE;
|
||||||
|
|
||||||
public static final int NONE = -1;
|
public static final int NONE = -1;
|
||||||
private Map<Integer, Field[]> map = new HashMap<>();
|
private Map<live_data_e, Field[]> map = new HashMap<>();
|
||||||
|
|
||||||
StateDictionary() {
|
StateDictionary() {
|
||||||
register(Fields.LDS_SPEED_DENSITY_STATE_INDEX, EngineState.VALUES); // 2
|
register(live_data_e.LDS_SPEED_DENSITY, EngineState.VALUES); // 2
|
||||||
register(Fields.LDS_ENGINE_STATE_INDEX, EngineState.VALUES); // 3
|
register(live_data_e.LDS_ENGINE, EngineState.VALUES); // 3
|
||||||
register(Fields.LDS_FUEL_TRIM_STATE_INDEX, EngineState.VALUES);
|
register(live_data_e.LDS_FUEL_TRIM, EngineState.VALUES);
|
||||||
register(Fields.LDS_TPS_TPS_ENRICHMENT_STATE_INDEX, EngineState.VALUES); // 5
|
register(live_data_e.LDS_TPS_TPS_ENRICHMENT, EngineState.VALUES); // 5
|
||||||
register(Fields.LDS_TRIGGER_CENTRAL_STATE_INDEX, TriggerCentral.VALUES);
|
register(live_data_e.LDS_TRIGGER_CENTRAL, TriggerCentral.VALUES);
|
||||||
register(Fields.LDS_ETB_PID_STATE_INDEX, PidState.VALUES); // 7
|
register(live_data_e.LDS_ETB_PID, PidState.VALUES); // 7
|
||||||
register(Fields.LDS_IDLE_PID_STATE_INDEX, PidState.VALUES);
|
register(live_data_e.LDS_IDLE_PID, PidState.VALUES);
|
||||||
// LDS_ALTERNATOR_PID_STATE_INDEX
|
// LDS_ALTERNATOR_PID
|
||||||
// LDS_CJ125_PID_STATE_INDEX
|
// LDS_CJ125_PID
|
||||||
register(Fields.LDS_TRIGGER_STATE_STATE_INDEX, TriggerState.VALUES); // 11
|
register(live_data_e.LDS_TRIGGER_STATE, TriggerState.VALUES); // 11
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(int ldsIndex, Field[] values) {
|
private void register(live_data_e ldsIndex, Field[] values) {
|
||||||
map.put(ldsIndex, values);
|
map.put(ldsIndex, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Field[] getValue(String state) {
|
|
||||||
String indexFieldName = getContextIndexFieldName(state);
|
|
||||||
LiveDataContext indexValue = getStateContext(indexFieldName);
|
|
||||||
return getFields(indexFieldName, indexValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Field[] getFields(String indexFieldName, LiveDataContext indexValue) {
|
public Field[] getFields(live_data_e indexFieldName) {
|
||||||
Field[] result = map.get(indexValue.getId());
|
Field[] result = map.get(indexFieldName);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
throw new IllegalStateException("Nothing for " + indexFieldName + "/" + indexValue);
|
throw new IllegalStateException("Nothing for " + indexFieldName);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static String getContextIndexFieldName(String state) {
|
|
||||||
return "LDS_" + state.toUpperCase() + "_STATE_INDEX";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static LiveDataContext getStateContext(String contextIndexFieldName) {
|
|
||||||
java.lang.reflect.Field field;
|
|
||||||
try {
|
|
||||||
field = Fields.class.getField(contextIndexFieldName);
|
|
||||||
} catch (NoSuchFieldException e) {
|
|
||||||
throw new IllegalStateException(e);
|
|
||||||
}
|
|
||||||
Objects.requireNonNull(field, "Field " + contextIndexFieldName);
|
|
||||||
int indexValue;
|
|
||||||
try {
|
|
||||||
indexValue = (int) field.get(null);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new IllegalStateException(e);
|
|
||||||
}
|
|
||||||
return new LiveDataContext(indexValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
package com.rusefi.ui.livedocs;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Type-safe unique structure identifier
|
|
||||||
* <p>
|
|
||||||
* Andrey Belomutskiy, (c) 2013-2020
|
|
||||||
*/
|
|
||||||
public class LiveDataContext {
|
|
||||||
private final int id;
|
|
||||||
|
|
||||||
public LiveDataContext(int id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "LiveDataContext{" +
|
|
||||||
"id=" + id +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
|
||||||
LiveDataContext stateId = (LiveDataContext) o;
|
|
||||||
return id == stateId.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(id);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +1,16 @@
|
||||||
package com.rusefi.ui.livedocs;
|
package com.rusefi.ui.livedocs;
|
||||||
|
|
||||||
import com.rusefi.binaryprotocol.BinaryProtocol;
|
import com.rusefi.binaryprotocol.BinaryProtocol;
|
||||||
|
import com.rusefi.enums.live_data_e;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Andrey Belomutskiy, (c) 2013-2020
|
* Andrey Belomutskiy, (c) 2013-2020
|
||||||
*/
|
*/
|
||||||
public abstract class LiveDocHolder {
|
public abstract class LiveDocHolder {
|
||||||
private final LiveDataContext id;
|
private final live_data_e id;
|
||||||
private final RefreshActionsMap actions;
|
private final RefreshActionsMap actions;
|
||||||
|
|
||||||
public LiveDocHolder(LiveDataContext id, RefreshActionsMap actions) {
|
public LiveDocHolder(live_data_e id, RefreshActionsMap actions) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.actions = actions;
|
this.actions = actions;
|
||||||
}
|
}
|
||||||
|
@ -18,14 +19,14 @@ public abstract class LiveDocHolder {
|
||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update(BinaryProtocol binaryProtocol, LiveDataContext context, byte[] response) {
|
public void update(BinaryProtocol binaryProtocol, live_data_e context, byte[] response) {
|
||||||
for (RefreshActions action : actions.getActions().get(context))
|
for (RefreshActions action : actions.getActions().get(context))
|
||||||
action.refresh(binaryProtocol, response);
|
action.refresh(binaryProtocol, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract boolean isVisible();
|
public abstract boolean isVisible();
|
||||||
|
|
||||||
public LiveDataContext getId() {
|
public live_data_e getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.rusefi.ui.livedocs;
|
||||||
import com.rusefi.binaryprotocol.BinaryProtocol;
|
import com.rusefi.binaryprotocol.BinaryProtocol;
|
||||||
import com.rusefi.config.Field;
|
import com.rusefi.config.Field;
|
||||||
import com.rusefi.config.generated.Fields;
|
import com.rusefi.config.generated.Fields;
|
||||||
|
import com.rusefi.enums.live_data_e;
|
||||||
import com.rusefi.ldmp.StateDictionary;
|
import com.rusefi.ldmp.StateDictionary;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -28,21 +29,20 @@ public enum LiveDocsRegistry {
|
||||||
for (LiveDocHolder holder : liveDocs) {
|
for (LiveDocHolder holder : liveDocs) {
|
||||||
boolean visible = holder.isVisible();
|
boolean visible = holder.isVisible();
|
||||||
if (visible) {
|
if (visible) {
|
||||||
for (LiveDataContext context : holder.getActions().getActions().keySet()) {
|
for (live_data_e context : holder.getActions().getActions().keySet()) {
|
||||||
refresh(binaryProtocol, holder, context);
|
refresh(binaryProtocol, holder, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void refresh(BinaryProtocol binaryProtocol, LiveDocHolder holder, LiveDataContext context) {
|
private void refresh(BinaryProtocol binaryProtocol, LiveDocHolder holder, live_data_e context) {
|
||||||
int liveDocRequestId = context.getId();
|
Field[] values = StateDictionary.INSTANCE.getFields(context);
|
||||||
Field[] values = StateDictionary.INSTANCE.getFields("refresh", context);
|
|
||||||
int size = Field.getStructureSize(values);
|
int size = Field.getStructureSize(values);
|
||||||
|
|
||||||
byte[] packet = new byte[5];
|
byte[] packet = new byte[5];
|
||||||
packet[0] = Fields.TS_GET_STRUCT;
|
packet[0] = Fields.TS_GET_STRUCT;
|
||||||
putShort(packet, 1, swap16(liveDocRequestId)); // offset
|
putShort(packet, 1, swap16(context.ordinal())); // offset
|
||||||
putShort(packet, 3, swap16(size));
|
putShort(packet, 3, swap16(size));
|
||||||
|
|
||||||
byte[] responseWithCode = binaryProtocol.executeCommand(packet, "get LiveDoc");
|
byte[] responseWithCode = binaryProtocol.executeCommand(packet, "get LiveDoc");
|
||||||
|
|
|
@ -1,26 +1,28 @@
|
||||||
package com.rusefi.ui.livedocs;
|
package com.rusefi.ui.livedocs;
|
||||||
|
|
||||||
|
import com.rusefi.enums.live_data_e;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class RefreshActionsMap {
|
public class RefreshActionsMap {
|
||||||
private final Map<LiveDataContext, List<RefreshActions>> actions = new HashMap<>();
|
private final Map<live_data_e, List<RefreshActions>> actions = new HashMap<>();
|
||||||
|
|
||||||
public void put(LiveDataContext context, RefreshActions refreshAction) {
|
public void put(live_data_e context, RefreshActions refreshAction) {
|
||||||
actions.putIfAbsent(context, new ArrayList<>());
|
actions.putIfAbsent(context, new ArrayList<>());
|
||||||
actions.get(context).add(refreshAction);
|
actions.get(context).add(refreshAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addAll(RefreshActionsMap actions) {
|
public void addAll(RefreshActionsMap actions) {
|
||||||
for (Map.Entry<LiveDataContext, List<RefreshActions>> e : actions.actions.entrySet()) {
|
for (Map.Entry<live_data_e, List<RefreshActions>> e : actions.actions.entrySet()) {
|
||||||
for (RefreshActions action : e.getValue())
|
for (RefreshActions action : e.getValue())
|
||||||
put(e.getKey(), action);
|
put(e.getKey(), action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<LiveDataContext, List<RefreshActions>> getActions() {
|
public Map<live_data_e, List<RefreshActions>> getActions() {
|
||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue