AsyncServiceRegisters
parent
3cbf13f260
commit
fc654ed832
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue