package org.yamcs.utils; import org.yamcs.protobuf.Yamcs.Value.Type; import org.yamcs.parameter.BinaryValue; import org.yamcs.parameter.BooleanValue; import org.yamcs.parameter.DoubleValue; import org.yamcs.parameter.FloatValue; import org.yamcs.parameter.SInt32Value; import org.yamcs.parameter.SInt64Value; import org.yamcs.parameter.StringValue; import org.yamcs.parameter.TimestampValue; import org.yamcs.parameter.UInt32Value; import org.yamcs.parameter.UInt64Value; import org.yamcs.parameter.Value; import org.yamcs.yarch.ColumnDefinition; import org.yamcs.yarch.DataType; import com.google.protobuf.ByteString; public class ValueUtility { public static Value getUint32Value(int x) { return new UInt32Value(x); } public static Value getSint32Value(int x) { return new SInt32Value(x); } public static Value getUint64Value(long x) { return new UInt64Value(x); } public static Value getSint64Value(long x) { return new SInt64Value(x); } public static Value getStringValue(String x) { return new StringValue(x); } public static Value getBinaryValue(byte[] x) { return new BinaryValue(x); } public static Value getTimestampValue(long x) { return new TimestampValue(x); } public static Value getBooleanValue(boolean b) { return new BooleanValue(b); } public static Value getFloatValue(float f) { return new FloatValue(f); } public static Value getDoubleValue(double d) { return new DoubleValue(d); } public static org.yamcs.protobuf.Yamcs.Value getDoubleGbpValue(double d) { return org.yamcs.protobuf.Yamcs.Value.newBuilder().setType(Type.DOUBLE).setDoubleValue(d).build(); } public static org.yamcs.protobuf.Yamcs.Value getStringGbpValue(String s) { return org.yamcs.protobuf.Yamcs.Value.newBuilder().setType(Type.STRING).setStringValue(s).build(); } public static org.yamcs.protobuf.Yamcs.Value getUint32GbpValue(int x) { return org.yamcs.protobuf.Yamcs.Value.newBuilder().setType(Type.UINT32).setUint32Value(x).build(); } public static Value getColumnValue(ColumnDefinition cd, Object v) { switch (cd.getType().val) { case INT: return getSint32Value((Integer)v); case SHORT: return getUint32Value((Short)v); case BYTE: return getUint32Value((Byte)v); case STRING: case ENUM: return getStringValue((String)v); case TIMESTAMP: return getTimestampValue((Long)v); case BINARY: return getBinaryValue((byte[])v); case BOOLEAN: return getBooleanValue((Boolean)v); case DOUBLE: return getDoubleValue((Double)v); case LIST: case PROTOBUF: case TUPLE: default: throw new IllegalArgumentException("cannot convert type to value "+cd.getType()); } } public static Object getYarchValue(Value v) { switch(v.getType()) { case BINARY: return v.getBinaryValue(); case SINT32: return v.getSint32Value(); case UINT32: return v.getUint32Value(); case DOUBLE: return v.getDoubleValue(); case FLOAT: return (double)v.getFloatValue(); case STRING: return v.getStringValue(); case TIMESTAMP: return v.getTimestampValue(); case BOOLEAN: return v.getBooleanValue(); case SINT64: return v.getSint64Value(); case UINT64: return v.getUint64Value(); default: throw new IllegalArgumentException("cannot values of type "+v.getType()); } } public static Object getYarchValue(org.yamcs.protobuf.Yamcs.Value v) { switch(v.getType()) { case BINARY: return v.getBinaryValue().toByteArray(); case SINT32: return v.getSint32Value(); case UINT32: return v.getUint32Value(); case DOUBLE: return v.getDoubleValue(); case FLOAT: return (double)v.getFloatValue(); case STRING: return v.getStringValue(); case TIMESTAMP: return v.getTimestampValue(); case BOOLEAN: return v.getBooleanValue(); case SINT64: return v.getSint64Value(); case UINT64: return v.getUint64Value(); default: throw new IllegalArgumentException("cannot values of type "+v.getType()); } } public static DataType getYarchType(Type type) { switch(type) { case BINARY: return DataType.BINARY; case SINT32: return DataType.INT; case UINT32: return DataType.INT; case DOUBLE: return DataType.DOUBLE; case FLOAT: return DataType.DOUBLE; case STRING: return DataType.STRING; case TIMESTAMP: return DataType.TIMESTAMP; } throw new IllegalArgumentException("cannot values of type "+type); } public static boolean equals(Value a, Value b) { if (a == null ^ b == null) return false; if (a == null && b == null) return true; if (a.getType() != b.getType()) return false; switch (a.getType()) { case BINARY: return a.getBinaryValue().equals(b.getBinaryValue()); case BOOLEAN: return a.getBooleanValue() == b.getBooleanValue(); case DOUBLE: return a.getDoubleValue() == b.getDoubleValue(); case FLOAT: return a.getFloatValue() == b.getFloatValue(); case SINT32: return a.getSint32Value() == b.getSint32Value(); case SINT64: return a.getSint64Value() == b.getSint64Value(); case STRING: return a.getStringValue().equals(b.getStringValue()); case TIMESTAMP: return a.getTimestampValue() == b.getTimestampValue(); case UINT32: return a.getUint32Value() == b.getUint32Value(); case UINT64: return a.getUint64Value() == b.getUint64Value(); default: throw new IllegalArgumentException("Unexpected type " + a.getType()); } } // Not perfect. Should also compare compatible types public static int compare(Value a, Value b) { if (a == null ^ b == null) return (a == null) ? -1 : 1; if (a == null && b == null) return 0; if (a.getType() != b.getType()) return a.getType().compareTo(b.getType()); switch (a.getType()) { case BINARY: return String.valueOf(a).compareTo(String.valueOf(b)); // TODO ? case BOOLEAN: return Boolean.compare(a.getBooleanValue(), b.getBooleanValue()); case DOUBLE: return Double.compare(a.getDoubleValue(), b.getDoubleValue()); case FLOAT: return Float.compare(a.getFloatValue(), b.getFloatValue()); case SINT32: return Integer.compare(a.getSint32Value(), b.getSint32Value()); case SINT64: return Long.compare(a.getSint64Value(), b.getSint64Value()); case STRING: return a.getStringValue().compareTo(b.getStringValue()); case TIMESTAMP: return Long.compare(a.getTimestampValue(), b.getTimestampValue()); case UINT32: return Integer.compareUnsigned(a.getUint32Value(), b.getUint32Value()); case UINT64: return Long.compareUnsigned(a.getUint64Value(), b.getUint64Value()); default: throw new IllegalArgumentException("Unexpected type " + a.getType()); } } public static org.yamcs.protobuf.Yamcs.Value toGbp(Value v) { org.yamcs.protobuf.Yamcs.Value.Builder b = org.yamcs.protobuf.Yamcs.Value.newBuilder(); b.setType(v.getType()); switch (v.getType()) { case BINARY: return b.setBinaryValue(ByteString.copyFrom(v.getBinaryValue())).build(); case BOOLEAN: return b.setBooleanValue(v.getBooleanValue()).build(); case DOUBLE: return b.setDoubleValue(v.getDoubleValue()).build(); case FLOAT: return b.setFloatValue(v.getFloatValue()).build(); case SINT32: return b.setSint32Value(v.getSint32Value()).build(); case SINT64: return b.setSint64Value(v.getSint64Value()).build(); case STRING: return b.setStringValue(v.getStringValue()).build(); case TIMESTAMP: return b.setTimestampValue(v.getTimestampValue()).build(); case UINT32: return b.setUint32Value(v.getUint32Value()).build(); case UINT64: return b.setUint64Value(v.getUint64Value()).build(); default: throw new IllegalArgumentException("Unexpected type " + v.getType()); } } public static Value fromGpb(org.yamcs.protobuf.Yamcs.Value v) { switch (v.getType()) { case BINARY: return new BinaryValue(v.getBinaryValue().toByteArray()); case BOOLEAN: return new BooleanValue(v.getBooleanValue()); case DOUBLE: return new DoubleValue(v.getDoubleValue()); case FLOAT: return new FloatValue(v.getFloatValue()); case SINT32: return new SInt32Value(v.getSint32Value()); case SINT64: return new SInt64Value(v.getSint64Value()); case STRING: return new StringValue(v.getStringValue()); case TIMESTAMP: return new TimestampValue(v.getTimestampValue()); case UINT32: return new UInt32Value(v.getUint32Value()); case UINT64: return new UInt64Value(v.getUint64Value()); default: throw new IllegalArgumentException("Unexpected type " + v.getType()); } } }