AsyncServiceRegisters

thobaben_serialize
Harald Wolff 2015-07-10 13:14:19 +02:00
parent 3cbf13f260
commit fc654ed832
2 changed files with 62 additions and 6 deletions

View File

@ -11,13 +11,26 @@ public class AsynchronServiceLinkProvider {
public AsynchronServiceLinkProvider(ServiceRegisterCache cache){
this.cache = cache;
this.serviceRegisterListeners = new Hashtable<Integer, List<ServiceRegisterListener>>();
}
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<ServiceRegisterListener> getListeners(Integer hash){
if (!serviceRegisterListeners.containsKey(hash))
serviceRegisterListeners.put(hash, new LinkedList<ServiceRegisterListener>());
@ -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<Integer, List<ServiceRegisterListener>> getServiceRegisterListeners() {
return serviceRegisterListeners;
}
public void setServiceRegisterListeners(
Hashtable<Integer, List<ServiceRegisterListener>> 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);
}
}
}
}
}
}

View File

@ -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)