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

101 lines
3.1 KiB
Java

package org.hwo.servicelink.ng;
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 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(cache.calcHash(ax, node, registerno,asFloat)).add(listener);
}
public void removeServiceRegisterListener(int ax,int node,int registerno,boolean asFloat,ServiceRegisterListener listener){
getListeners(cache.calcHash(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 telegramReceived(ServiceLinkTelegram telegram){
if ((telegram.getOpcode() & ServiceLinkTelegram.REQ_READ) != 0){
int hash = cache.calcHash(telegram.getAddress(), ((telegram.getOpcode() & ServiceLinkTelegram.REQ_FLOAT) == ServiceLinkTelegram.REQ_FLOAT));
cache.updateValue(hash, telegram.getValue());
//fireUpdates(hash);
}
}
*/
public void fireUpdates(int hash){
Object v = cache.getCachedValue(hash);
if (Integer.class.isInstance(v)){
Integer i = (Integer)v;
for (ServiceRegisterListener listener: getListeners(hash)){
listener.ServiceRegisterValueUpdated(ServiceRegisterCache.axFromHash(hash),ServiceRegisterCache.nodeFromHash(hash),ServiceRegisterCache.regFromHash(hash),i);
}
}
if (Float.class.isInstance(v)){
Float f = (Float)v;
for (ServiceRegisterListener listener: getListeners(hash)){
listener.ServiceRegisterValueUpdated(ServiceRegisterCache.axFromHash(hash),ServiceRegisterCache.nodeFromHash(hash),ServiceRegisterCache.regFromHash(hash),f);
}
}
}
public void update(){
for (Integer hash: serviceRegisterListeners.keySet()){
if (!getListeners(hash).isEmpty()){
cache.updateValue(hash);
fireUpdates(hash);
/*
int opcode = ServiceLinkTelegram.REQ_READ;
if ((hash & 0x40000000)!=0){
opcode |= ServiceLinkTelegram.REQ_FLOAT;
}
ServiceLinkTelegram telegram = cache.getServiceLink().createTelegram(cache.axFromHash(hash), cache.nodeFromHash(hash), cache.regFromHash(hash), opcode, null);
log(DEBUGDETAIL,"non-pending request: %s", telegram.getAddress() );
cache.getServiceLink().queueRequestNonPending(telegram);
cache.getServiceLink().queueRequest(telegram);
*/
}
}
}
}