package lu.fisch.canze.actors; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import lu.fisch.canze.interfaces.FieldListener; import lu.fisch.canze.interfaces.VirtualFieldAction; /** * Created by robertfisch on 15.11.2015. */ public class VirtualField extends Field implements FieldListener { // the list of fields this field depends on protected HashMap<String,Field> dependantFields = new HashMap<>(); // the method to be executed for the calculation of this field protected VirtualFieldAction virtualFieldAction = null; public VirtualField(String responseId, HashMap<String,Field> dependantFields, String unit, VirtualFieldAction virtualFieldAction) { // virtual frame added in the initialization block // super(Frames.getInstance().createVirtualIfNotExists(id), 0, 0, 1, 1, 0, unit, "", "", 0); // We're creating a new Field, frame 800, bit position 24-31, resolution 1, decimals 0, offset 0, given unit, empty requestId, given responseId, generic car super(Frames.getInstance().getById(0x800), (short)24, (short)31, 1, 0, 0, unit, responseId, (short)0, null, null); // register dependant listeners for (Field field : dependantFields.values()) { if(field!=null) field.addListener(this); } this.dependantFields = dependantFields; this.virtualFieldAction = virtualFieldAction; this.virtual = true; } @Override public void onFieldUpdateEvent(Field field) { if(virtualFieldAction!=null) { setValue(virtualFieldAction.updateValue(dependantFields)); } } @Override public void removeListener(FieldListener fieldListener) { // remove our listener super.removeListener(fieldListener); // remove listeners to dependant listeners for (Field field : dependantFields.values()) { fieldListeners.remove(this); } } public Collection<Field> getFields() { return dependantFields.values(); } }