java-org.hwo.servicelink/src/org/hwo/servicelink/AsynchronServiceLinkProvide...

86 lines
2.7 KiB
Java

package org.hwo.servicelink;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
public class AsynchronServiceLinkProvider {
ServiceRegisterCache cache;
Hashtable<Integer, List<ServiceRegisterListener>> serviceRegisterListeners;
public AsynchronServiceLinkProvider(ServiceRegisterCache cache){
this.cache = cache;
this.serviceRegisterListeners = new Hashtable<Integer, List<ServiceRegisterListener>>();
}
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<ServiceRegisterListener> getListeners(Integer hash){
if (!serviceRegisterListeners.containsKey(hash))
serviceRegisterListeners.put(hash, new LinkedList<ServiceRegisterListener>());
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<Integer, List<ServiceRegisterListener>> getServiceRegisterListeners() {
return serviceRegisterListeners;
}
public void setServiceRegisterListeners(
Hashtable<Integer, List<ServiceRegisterListener>> 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);
}
}
}
}
}
}
}