package pl.llp.aircasting.sensor.bioharness; import pl.llp.aircasting.util.Pair; public enum PacketType { GeneralPacket(0x20) { @Override public byte[] getRequest(Packet.Request request) { byte[] bytes = {2, 20, 1, 0, 0, 3}; if (request.isEnabled()) { bytes[3] = (byte) 1; bytes[4] = 94; } else { bytes[3] = (byte) 0; bytes[4] = 0; } return bytes; } }, BreathingPacket(0x21) { @Override public byte[] getRequest(Packet.Request request) { byte[] bytes = { 2, 21, 1, 0, 0, 3 }; if (request.isEnabled()) { bytes[3] = 1; bytes[4] = 94; } return bytes; } }, ECGPacket(0x22) { @Override public byte[] getRequest(Packet.Request request) { byte[] bytes = { 2, 22, 1, 0, 0, 3 }; if (request.isEnabled()) { bytes[3] = 1; bytes[4] = 94; } return bytes; } }, Lifesign(0x23) { @Override public byte[] getRequest(Packet.Request request) { throw new RuntimeException("Not implemented yet"); } }, RtoRPacket(0x24) { @Override public byte[] getRequest(Packet.Request request) { byte[] bytes = { 2, 25, 1, 0, 0, 3 }; if (request.isEnabled()) { bytes[3] = 1; bytes[4] = 94; } return bytes; } }, SummaryPacket(0x2B) { @Override public byte[] getRequest(Packet.Request request) { byte[] bytes = {2, -67, 2, 0, 0, 0, 3}; if (request.isEnabled()) { bytes[3] = (byte) 1; bytes[5] = -60; } return bytes; } }, Invalid(0x00, false) { @Override public byte[] getRequest(Packet.Request request) { throw new RuntimeException("Should not be called"); } }, ; static final byte STX = 0x02; static final byte ETX = 0x03; private boolean valid = true; public final int messageId; public abstract byte[] getRequest(Packet.Request request); PacketType(int id) { this.messageId = id; } PacketType(int id, boolean valid) { this(id); this.valid = valid; } public static Pair<PacketType, Integer> decide(byte[] input, int index) { if (input[index] == STX) { int messageId = input[index + 1]; PacketType packetType = decode(messageId); if (packetType == PacketType.Invalid) { return packetAndLenght(PacketType.Invalid, 0); } if (packetType == Lifesign) { return packetAndLenght(Lifesign, 5); } int length = input[index + 2]; if ((index + length) > input.length) { return packetAndLenght(PacketType.Invalid, 0); } if (input[index + 2 + length + 2] == ETX) { return packetAndLenght(packetType, length); } } return packetAndLenght(PacketType.Invalid, 0); } public static Pair<PacketType, Integer> packetAndLenght(PacketType packetType, int length) { return new Pair<PacketType, Integer>(packetType, length); } public static PacketType decode(int messageId) { switch (messageId) { case 0x20: return PacketType.GeneralPacket; case 0x21: return PacketType.BreathingPacket; case 0x22: return PacketType.ECGPacket; case 0x23: return PacketType.Lifesign; case 0x24: return RtoRPacket; case 0x2B: return SummaryPacket; } return PacketType.Invalid; } public boolean isValid() { return valid; } }