package org.hwo.pulscounter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; /* DeviceControlChannel * * Binary Serial Protocol based on telegrams * * telegram: * * byte length of next telegram * byte request * byte options * byte reserve * int32 parameter1 * int32 parameter2 * * */ public class DeviceControlChannel { public class Telegram { private byte[] buffer; private byte request; private byte options; private Integer parameter1; private Integer parameter2; public Telegram() { buffer = new byte[12]; request = 0; options = 0; parameter1 = 0; parameter2 = 0; } public Telegram(byte request) { this.request = request; options = 0; parameter1 = 0; parameter2 = 0; } public Telegram(byte request,byte options) { this.request = request; this.options = options; parameter1 = 0; parameter2 = 0; } public Telegram(byte request,byte options,int parameter1,int parameter2) { this.request = request; this.options = options; this.parameter1 = parameter1; this.parameter2 = parameter2; } public byte[] getBuffer() { return this.buffer; } public void decodeBuffer() { ByteBuffer bb = ByteBuffer.wrap(buffer); bb.get(); request = bb.get(); options = bb.get(); bb.get(); parameter1 = bb.getInt(); parameter2 = bb.getInt(); } public Telegram(byte[] buffer) { this.buffer = buffer; decodeBuffer(); } public byte[] toArray() { return ByteBuffer.allocate(12) .put((byte)11) .put(request) .put(options) .put((byte)0) .putInt(parameter1) .putInt(parameter2) .array(); } public byte getRequest() { return request; } public void setRequest(byte request) { this.request = request; } public byte getOptions() { return options; } public void setOptions(byte options) { this.options = options; } public Integer getParameter1() { return parameter1; } public void setParameter1(Integer parameter1) { this.parameter1 = parameter1; } public Integer getParameter2() { return parameter2; } public void setParameter2(Integer parameter2) { this.parameter2 = parameter2; } } public static byte NOOP = 0; public static byte READ = 1; public static byte WRITE = 2; public static byte COMMAND = 3; public static byte REPLY = 8; private InputStream inputStream; private OutputStream outputStream; public DeviceControlChannel(InputStream input,OutputStream output) { this.inputStream = input; this.outputStream = output; } public Telegram sendRequest(Telegram request) { Telegram response = new Telegram(); try { outputStream.write(request.toArray()); inputStream.read(response.getBuffer()); } catch (IOException e) { e.printStackTrace(); } if (request.getRequest() != response.getRequest()) System.err.println("DDC Error!"); return response; } public void noop() { sendRequest(new Telegram()); } public int readInteger() { return 0; } }