java-org.hwo.servicelink/src/org/hwo/servicelink/ServiceLinkV2Telegram.java

110 lines
2.7 KiB
Java

package org.hwo.servicelink;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
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.*;
public class ServiceLinkV2Telegram extends ServiceLinkTelegram {
static int REQ_READ = 0x01;
static int REQ_WRITE = 0x02;
static int REQ_EVENT = 0x04;
static int REQ_FAIL = 0x08;
static int REQ_INT = 0x10;
static int REQ_FLOAT = 0x20;
static int REQ_ACK = 0x40;
byte[] buffer = new byte[8];
int bufferUsed = 0;
public ServiceLinkV2Telegram(int operation,int achse,int knoten,int register,Object value){
super(operation,achse,knoten,register,value);
}
public ServiceLinkV2Telegram(){
}
public boolean read(InputStream in){
try {
int n = in.read(buffer, bufferUsed, 8 - bufferUsed);
if (n > 0){
bufferUsed += n;
}
} catch (IOException e) {
log(e);
throw new RuntimeException(e);
}
if (bufferUsed != 8){
//log(DEBUG,"ServiceLinkV2Telegram: bufferUsed == %d !!",bufferUsed);
return false;
}
log(DEBUGDETAIL,"RX BYTES: %s",ByteArrayHexlifier.byteArrayToString(buffer));
setAddress(new ServiceLinkAddress((buffer[1]>>4) & 0x0F, buffer[1] & 0x0F, (((int)buffer[2])&0xff) | (((int)buffer[3])<<8)&0xFF00 ));
int op = 0;
op |= ( buffer[0] & 0x01 ) == 0 ? REQ_WRITE : REQ_READ;
op |= ( buffer[0] & 0x02 ) == 0 ? REQ_INT : REQ_FLOAT;
op |= ( buffer[0] & 0x04 ) == 0 ? REQ_ACK : REQ_FAIL;
setOpcode(op);
if ((op & (REQ_READ | REQ_ACK))==(REQ_READ | REQ_ACK)){
ByteBuffer bb = ByteBuffer.wrap(buffer);
if ((op & REQ_FLOAT)==REQ_FLOAT){
setValue( bb.order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer().get(1) );
} else {
setValue( bb.order(ByteOrder.LITTLE_ENDIAN).asIntBuffer().get(1) );
}
} else {
setValue(null);
}
return true;
}
@Override
public byte[] toByteArray() {
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;
}
}