WIP161209

master
Harald Wolff 2016-12-09 09:19:21 +01:00
parent ae09543e3d
commit 0d07076547
3 changed files with 61 additions and 16 deletions

View File

@ -64,7 +64,7 @@ public class ServiceLink implements NewSerialPortListener {
public ServiceLink(NewSerialPort serialPort)
{
this.requestTimeOut = 75;
this.requestTimeOut = 500;
this.serviceLinkListeners = new LinkedList<ServiceLinkListener>();
this.retries = 3;
@ -181,6 +181,7 @@ public class ServiceLink implements NewSerialPortListener {
try {
request.wait(requestTimeOut);
} catch (InterruptedException e) {
log(e);
}
}
@ -195,6 +196,7 @@ public class ServiceLink implements NewSerialPortListener {
synchronized (pendingRequests) {
if (pendingRequests.containsKey(rx.getAddress())){
for (ServiceLinkTelegram pending: pendingRequests.get(rx.getAddress())){
log(DEBUGDETAIL,"Found Pending: %s", pending);
if ((pending.getOpcode() & (REQ_INT | REQ_FLOAT))==(rx.getOpcode() & (REQ_INT | REQ_FLOAT))){
synchronized (pending) {
pending.setValue(rx.getValue());
@ -271,14 +273,14 @@ public class ServiceLink implements NewSerialPortListener {
public void writeInt(int achse,int knoten,int register,int value) throws IOException, ServiceLinkException, ServiceLinkRequestFailedException
{
ServiceLinkTelegram request = useV2 ?
new ServiceLinkV2Telegram(REQ_INT | REQ_WRITE, achse, knoten, register, null) :
new ServiceLinkV1Telegram(REQ_INT | REQ_WRITE, achse, knoten, register, null);
new ServiceLinkV2Telegram(REQ_INT | REQ_WRITE, achse, knoten, register, value) :
new ServiceLinkV1Telegram(REQ_INT | REQ_WRITE, achse, knoten, register, value);
queueRequest(request);
}
public void writeFloat(int achse,int knoten,int register,float value) throws IOException, ServiceLinkException, ServiceLinkRequestFailedException{
ServiceLinkTelegram request = useV2 ?
new ServiceLinkV2Telegram(REQ_FLOAT | REQ_WRITE, achse, knoten, register, null) :
new ServiceLinkV1Telegram(REQ_FLOAT | REQ_WRITE, achse, knoten, register, null);
new ServiceLinkV2Telegram(REQ_FLOAT | REQ_WRITE, achse, knoten, register, value) :
new ServiceLinkV1Telegram(REQ_FLOAT | REQ_WRITE, achse, knoten, register, value);
queueRequest(request);
}
@ -333,13 +335,20 @@ public class ServiceLink implements NewSerialPortListener {
return;
}
}
rx = useV2 ?
new ServiceLinkV2Telegram(getSerialPort().getInputStream()) :
new ServiceLinkV1Telegram(getSerialPort().getInputStream()) ;
if (rx != null){
received(rx);
}
try {
rx = useV2 ?
new ServiceLinkV2Telegram(getSerialPort().getInputStream()) :
new ServiceLinkV1Telegram(getSerialPort().getInputStream()) ;
if (rx != null){
if (!rx.isNull()){
received(rx);
};
}
} catch (Exception io){
};
}
}
}

View File

@ -2,6 +2,9 @@ package org.hwo.servicelink;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.lang.Thread.State;
import static org.hwo.logging.LogLevel.*;
import static org.hwo.logging.Logging.*;
public abstract class ServiceLinkTelegram {
@ -74,9 +77,13 @@ public abstract class ServiceLinkTelegram {
return value;
}
public void setValue(Object value) {
log(DEBUGDETAIL,"setValue( %s )",value);
this.value = value;
}
public boolean isNull(){
return (getAddress().getAx()==0) && (getAddress().getNode()==0) && (getAddress().getRegister()==0) && (opcode == 0) && value.equals(0);
}
}

View File

@ -10,6 +10,7 @@ import java.util.zip.CRC32;
import org.hwo.ByteArrayHexlifier;
import org.hwo.ChkSum;
import org.hwo.servicelink.exceptions.CRCFailedException;
import org.hwo.servicelink.exceptions.ServiceLinkException;
import static org.hwo.logging.Logging.*;
import static org.hwo.logging.LogLevel.*;
@ -32,13 +33,14 @@ public class ServiceLinkV2Telegram extends ServiceLinkTelegram {
byte[] buffer = new byte[8];
try {
in.read(buffer, 0, 8);
in.read(buffer, 0, 8);
} catch (IOException e) {
log(e);
throw new RuntimeException(e);
}
log(DEBUGDETAIL,"RX BYTES: %s",ByteArrayHexlifier.byteArrayToString(buffer));
setAddress(new ServiceLinkAddress((buffer[1]>>4) & 0x0F, buffer[1] & 0x0F, ((int)buffer[2]) | ((int)buffer[3])<<8 ));
setAddress(new ServiceLinkAddress((buffer[1]>>4) & 0x0F, buffer[1] & 0x0F, (((int)buffer[2])&0xff) | (((int)buffer[3])<<8)&0xFF00 ));
int op = 0;
@ -49,7 +51,16 @@ public class ServiceLinkV2Telegram extends ServiceLinkTelegram {
setOpcode(op);
if ((op & (REQ_READ | REQ_ACK))==(REQ_READ | REQ_ACK)){
// ToDo: set value...
ByteBuffer bb = ByteBuffer.wrap(buffer);
if ((op & REQ_FLOAT)==REQ_FLOAT){
log(DEBUGDETAIL,"############################################################");
setValue( bb.order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer().get(1) );
} else {
log(DEBUGDETAIL,"*************************************************************");
setValue( bb.order(ByteOrder.LITTLE_ENDIAN).asIntBuffer().get(1) );
}
} else {
setValue(null);
}
@ -58,7 +69,25 @@ public class ServiceLinkV2Telegram extends ServiceLinkTelegram {
@Override
public byte[] toByteArray() {
return null;
byte[] buffer = new byte[8];
byte[] bv;
int i;
i = (getOpcode() & REQ_WRITE) == REQ_WRITE ? 0x01 : 0x00;
i |= (getOpcode() & REQ_FLOAT) == REQ_FLOAT ? 0x02 : 0x00;
buffer[0] = (byte)i;
buffer[1] = (byte)( ((getAddress().getAx()&0x0F)<<4) | (getAddress().getNode() & 0x0F) );
buffer[2] = (byte)(getAddress().getRegister() & 0xFF);
buffer[3] = (byte)((getAddress().getRegister()>>8) & 0xFF);
bv = valueAsByteArray();
buffer[4] = bv[0];
buffer[5] = bv[1];
buffer[6] = bv[2];
buffer[7] = bv[3];
return buffer;
}