86 lines
2.7 KiB
Java
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);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|