package me.legrange.panstamp.gui.model.tree; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.swing.tree.TreeNode; import me.legrange.panstamp.PanStamp; import me.legrange.panstamp.PanStampListener; import me.legrange.panstamp.Register; import me.legrange.panstamp.Network; /** * A tree node representing a panStamp device in the network tree. * * @author gideon */ public class PanStampNode extends NetworkTreeNode<PanStamp, Register> implements PanStampListener { @Override void addChild(Register reg) { RegisterNode old = nodes.remove(reg.getId()); if (old != null) { old.stop(); } RegisterNode rn = new RegisterNode(reg); addToTree(rn, this); rn.start(); nodes.put(reg.getId(), rn); } public enum RegisterDisplay { ALL, NONE, INTERESTING; }; public PanStampNode(PanStamp ps) { super(ps); } public PanStamp getPanStamp() { return (PanStamp) getUserObject(); } @Override public String toString() { return String.format("Mote %d: %s", getPanStamp().getAddress(), getPanStamp().getName()); } @Override public int getChildCount() { switch (registerDisplay) { case ALL: return super.getChildCount(); case NONE: int count = 0; for (RegisterNode rn : nodes.values()) { if (rn.getRegister().getId() > 10) { count++; } } return count; case INTERESTING: count = 0; for (RegisterNode rn : nodes.values()) { if ((rn.getRegister().getId() <= 10)) { if (rn.getRegister().hasValue()) { count++; } } else { count++; } } return count; } return 0; } @Override public TreeNode getChildAt(int index) { switch (registerDisplay) { case ALL: return super.getChildAt(index); case NONE: int idx = 0; for (RegisterNode rn : nodes.values()) { if ((rn.getRegister().getId() > 10)) { if (idx == index) { return rn; } else { idx++; } } } return null; case INTERESTING: idx = 0; for (RegisterNode rn : nodes.values()) { if (rn.getRegister().getId() <= 10) { if (rn.getRegister().hasValue()) { if (idx == index) { return rn; } else { idx++; } } } else { if (idx == index) { return rn; } else { idx++; } } } } return null; } @Override protected void start() { getPanStamp().addListener(this); for (Register reg : getPanStamp().getRegisters()) { addRegister(reg); } } @Override protected void stop() { ((Network) getPanStamp().getNetwork()).removeDevice(getPanStamp().getAddress()); super.stop(); } @Override public Type getType() { return Type.PANSTAMP; } @Override public void productCodeChange(PanStamp dev, int manufacturerId, int productId) { for (Register reg : dev.getRegisters()) { RegisterNode rn = nodes.get(reg.getId()); if (rn == null) { addChild(reg); reload(); } else { rn.update(reg); rn.reload(); } } } @Override public void syncStateChange(PanStamp dev, int syncState) { } @Override public void registerDetected(PanStamp dev, Register reg) { if (nodes.get(reg.getId()) == null) { addChild(reg); } } @Override public void syncRequired(PanStamp dev) { } public RegisterDisplay getRegisterDisplay() { return registerDisplay; } public void setRegisterDisplay(RegisterDisplay rd) { if (rd != registerDisplay) { registerDisplay = rd; reload(); } } @Override public int compareTo(NetworkTreeNode<PanStamp, Register> o) { PanStampNode psn = (PanStampNode)o; return getPanStamp().getAddress() - psn.getPanStamp().getAddress(); } private synchronized void addRegister(Register reg) { if (nodes.get(reg.getId()) == null) { addChild(reg); } } private final Map<Integer, RegisterNode> nodes = new ConcurrentHashMap<>(); private RegisterDisplay registerDisplay = RegisterDisplay.INTERESTING; }