diff --git a/src/org/hwo/io/servicelink/AsynchronServiceLinkProvider.java b/src/org/hwo/io/servicelink/AsynchronServiceLinkProvider.java index 8522e57..cb3707b 100644 --- a/src/org/hwo/io/servicelink/AsynchronServiceLinkProvider.java +++ b/src/org/hwo/io/servicelink/AsynchronServiceLinkProvider.java @@ -11,13 +11,26 @@ public class AsynchronServiceLinkProvider { public AsynchronServiceLinkProvider(ServiceRegisterCache cache){ this.cache = cache; + this.serviceRegisterListeners = new Hashtable>(); } - private Integer calcRegisterHash(int ax,int node,int registerno){ + 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()); @@ -25,15 +38,49 @@ public class AsynchronServiceLinkProvider { return serviceRegisterListeners.get(hash); } - public void addServiceRegisterListener(int ax,int node,int registerno,ServiceRegisterListener listener){ - getListeners(calcRegisterHash(ax, node, registerno)).add(listener); + 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,ServiceRegisterListener listener){ - getListeners(calcRegisterHash(ax, node, registerno)).remove(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(){ - /* TODO: Implementieren des Update Zyklus */ + + 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); + } + } + + } + } + } + + } diff --git a/src/org/hwo/io/servicelink/ServiceLink.java b/src/org/hwo/io/servicelink/ServiceLink.java index d84a639..dea9f4b 100644 --- a/src/org/hwo/io/servicelink/ServiceLink.java +++ b/src/org/hwo/io/servicelink/ServiceLink.java @@ -1,6 +1,7 @@ package org.hwo.io.servicelink; import java.io.IOException; +import java.io.ObjectInputStream.GetField; import java.lang.ref.ReferenceQueue; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -182,12 +183,16 @@ public class ServiceLink { Smoother requestTime; + private AsynchronServiceLinkProvider + asynchronServiceLinkProvider; + public ServiceLink(SerialPort serialPort) { this.retries = 3; this.serialPort = serialPort; this.serialPort.setTimeout(500); this.serviceRegisterCache = new ServiceRegisterCache(this); + this.asynchronServiceLinkProvider = new AsynchronServiceLinkProvider(serviceRegisterCache); this.requestTime = new Smoother(); this.requestTime.setTn(16); } @@ -202,6 +207,10 @@ public class ServiceLink { return this.serviceRegisterCache; } + public AsynchronServiceLinkProvider getAsynchronServiceLinkProvider() { + return asynchronServiceLinkProvider; + } + public void open() throws ServiceLinkException { if (serialPort != null)