package org.hwo.servicelink; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; public class AsynchronServiceLinkProvider { ServiceRegisterCache cache; Hashtable> serviceRegisterListeners; public AsynchronServiceLinkProvider(ServiceRegisterCache cache){ this.cache = cache; this.serviceRegisterListeners = new Hashtable>(); } private Integer calcRegisterHash(int ax,int node,int registerno,boolean asFloat){ Integer hash = (ax << 24) | (node << 16) | registerno; if (asFloat) hash |= 0x40000000; return hash; } private Integer axFromHash(Integer hash){ return (hash >> 24) & 0x0F; } private Integer nodeFromHash(Integer hash){ return (hash >> 16) & 0x0F; } private Integer regFromHash(Integer hash){ return (hash) & 0xFFFF; } private List getListeners(Integer hash){ if (!serviceRegisterListeners.containsKey(hash)) serviceRegisterListeners.put(hash, new LinkedList()); return serviceRegisterListeners.get(hash); } public void addServiceRegisterListener(int ax,int node,int registerno,boolean asFloat,ServiceRegisterListener listener){ getListeners(calcRegisterHash(ax, node, registerno,asFloat)).add(listener); } public void removeServiceRegisterListener(int ax,int node,int registerno,boolean asFloat,ServiceRegisterListener listener){ getListeners(calcRegisterHash(ax, node, registerno,asFloat)).remove(listener); } public Hashtable> getServiceRegisterListeners() { return serviceRegisterListeners; } public void setServiceRegisterListeners( Hashtable> serviceRegisterListeners) { this.serviceRegisterListeners = serviceRegisterListeners; } public void update(){ for (Integer hash: serviceRegisterListeners.keySet()){ if (!getListeners(hash).isEmpty()){ //System.err.println(String.format("AsyncUpdate for Hash: 0x%08x", hash)); if ((hash & 0x40000000) != 0){ Float f = this.cache.getCachedFloat( axFromHash(hash),nodeFromHash(hash),regFromHash(hash)); if (f != null){ for (ServiceRegisterListener listener: getListeners(hash)){ listener.ServiceRegisterValueUpdated(axFromHash(hash),nodeFromHash(hash),regFromHash(hash),f); } } } else { Integer i = this.cache.getCachedInteger( axFromHash(hash),nodeFromHash(hash),regFromHash(hash)); if (i != null){ for (ServiceRegisterListener listener: getListeners(hash)){ listener.ServiceRegisterValueUpdated(axFromHash(hash),nodeFromHash(hash),regFromHash(hash),i); } } } } } } }