Skip to content

Commit

Permalink
don't accept deprecated messages
Browse files Browse the repository at this point in the history
  • Loading branch information
pfichtner committed Feb 1, 2025
1 parent dd6f87c commit 9af3748
Showing 1 changed file with 65 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,23 @@

public class VirtualAvrConnection extends WebSocketClient implements AutoCloseable {

private static final class PinStateJsonDeserializer implements JsonDeserializer<PinState> {
@Override
public PinState deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject object = json.getAsJsonObject();
String pin = object.get("pin").getAsString();
JsonPrimitive state = object.get("state").getAsJsonPrimitive();
return createPinState(pin, state).withCpuTime(object.get("cpuTime").getAsDouble());
}

private PinState createPinState(String pin, JsonPrimitive state) {
return state.isBoolean() //
? new PinState(pin, state.getAsBoolean())
: new PinState(pin, state.getAsInt());
}
}

public enum PinReportMode {
ANALOG("analog"), DIGITAL("digital"), NONE("none");

Expand All @@ -45,24 +62,8 @@ public interface Listener<T> {
void accept(T t);
}

private final Gson gson = new GsonBuilder().registerTypeAdapter(PinState.class, pinStateDeserializer()).create();

private static JsonDeserializer<PinState> pinStateDeserializer() {
return new JsonDeserializer<PinState>() {
@Override
public PinState deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject object = json.getAsJsonObject();
String pin = object.get("pin").getAsString();
JsonPrimitive state = object.get("state").getAsJsonPrimitive();
PinState pinState = state.isBoolean() //
? new PinState(pin, state.getAsBoolean())
: new PinState(pin, state.getAsInt());
pinState.setCpuTime(object.get("cpuTime").getAsDouble());
return pinState;
}
};
}
private final Gson gson = new GsonBuilder().registerTypeAdapter(PinState.class, new PinStateJsonDeserializer())
.create();

private final List<Listener<PinState>> pinStateListeners = new CopyOnWriteArrayList<>();
private final List<Listener<SerialDebug>> serialDebugListeners = new CopyOnWriteArrayList<>();
Expand All @@ -72,13 +73,22 @@ public PinState deserialize(JsonElement json, Type typeOfT, JsonDeserializationC

public static class PinState {

private String pin;
private Object state;
private double cpuTime;
private final String pin;
private final Object state;
private final double cpuTime;

public PinState(String pin, Object state) {
this(pin, state, 0);
}

public PinState(String pin, Object state, double cpuTime) {
this.pin = pin;
this.state = state;
this.cpuTime = cpuTime;
}

public PinState withCpuTime(double cpuTime) {
return new PinState(pin, state, cpuTime);
}

public String getPin() {
Expand All @@ -93,20 +103,16 @@ public double getCpuTime() {
return cpuTime;
}

public void setCpuTime(double cpuTime) {
this.cpuTime = cpuTime;
}

public static PinState stateIsOn(int pin) {
return stateIsOn("D" + pin);
return stateIsOn(pin);
}

public static PinState stateIsOn(String pin) {
return stateOfPinIs(pin, TRUE);
}

public static PinState stateIsOff(int pin) {
return stateIsOff("D" + pin);
return stateIsOff(pin);
}

public static PinState stateIsOff(String pin) {
Expand Down Expand Up @@ -153,8 +159,13 @@ public static enum Direction {
RX, TX;
}

private Direction direction;
private byte[] bytes;
private final Direction direction;
private final byte[] bytes;

public SerialDebug(Direction direction, byte[] bytes) {
this.direction = direction;
this.bytes = bytes;
}

public Direction direction() {
return direction;
Expand All @@ -167,7 +178,12 @@ public byte[] bytes() {
}

public static class CommandReply {
UUID replyId;

private final UUID replyId;

public CommandReply(UUID replyId) {
this.replyId = replyId;
}

public UUID replyId() {
return replyId;
Expand Down Expand Up @@ -250,7 +266,7 @@ public Map<String, Object> lastStates() {
return pinStates().stream().collect(toMap(PinState::getPin, PinState::getState, lastWins()));
}

private static BinaryOperator<Object> lastWins() {
private static <T> BinaryOperator<T> lastWins() {
return (first, last) -> last;
}

Expand All @@ -266,6 +282,9 @@ public void onOpen(ServerHandshake handshakedata) {
@Override
public void onMessage(String message) {
Map<?, ?> json = gson.fromJson(message, Map.class);
if (isDeprecated(json)) {
return;
}
if (isResponse(json)) {
callAccept(commandReplyListeners, message, CommandReply.class);
} else {
Expand All @@ -278,7 +297,11 @@ public void onMessage(String message) {
}
}

private boolean isResponse(Map<?, ?> json) {
private static boolean isDeprecated(Map<?, ?> json) {
return json.get("deprecated") != null;
}

private static boolean isResponse(Map<?, ?> json) {
return json.get("replyId") != null && json.get("executed") != null;
}

Expand All @@ -294,7 +317,7 @@ private static <T> void callAccept(List<Listener<T>> listeners, T message) {

private static class WithReplyId {

private UUID replyId = UUID.randomUUID();
private final UUID replyId = UUID.randomUUID();

public UUID replyId() {
return replyId;
Expand All @@ -319,14 +342,15 @@ private Control(String action) {
@SuppressWarnings("unused")
private static class SetPinState extends WithReplyId {

private final String type = "pinState";
private final String pin;
private final Object state;

private SetPinState(String pin, Object state) {
this.pin = pin;
this.state = state;
}

private final String type = "pinState";
private final String pin;
private final Object state;
}

public VirtualAvrConnection pinState(String pin, boolean state) {
Expand All @@ -340,9 +364,9 @@ public VirtualAvrConnection pinState(String pin, int state) {
@SuppressWarnings("unused")
private static class SetPinReportMode extends WithReplyId {

private String type = "pinMode";
private String pin;
private String mode;
private final String type = "pinMode";
private final String pin;
private final String mode;

private SetPinReportMode(String pin, PinReportMode mode) {
this.pin = pin;
Expand All @@ -354,8 +378,8 @@ private SetPinReportMode(String pin, PinReportMode mode) {
@SuppressWarnings("unused")
private static class SetSerialDebug extends WithReplyId {

private String type = "serialDebug";
private boolean state;
private final String type = "serialDebug";
private final boolean state;

private SetSerialDebug(boolean state) {
this.state = state;
Expand Down

0 comments on commit 9af3748

Please sign in to comment.