package org.yamcs.parameterarchive; import java.nio.ByteBuffer; import java.util.List; import org.yamcs.parameter.Value; import org.yamcs.utils.DecodingException; import org.yamcs.utils.DoubleArray; import org.yamcs.utils.ValueUtility; import org.yamcs.utils.VarIntUtil; public class DoubleValueSegment extends BaseSegment implements ValueSegment { final static byte SUBFORMAT_ID_RAW = 0; DoubleArray values; DoubleValueSegment() { super(FORMAT_ID_DoubleValueSegment); values = new DoubleArray(); } @Override public void writeTo(ByteBuffer bb) { bb.put(SUBFORMAT_ID_RAW); int n = values.size(); VarIntUtil.writeVarInt32(bb, n); for(int i=0;i<n;i++) { bb.putDouble(values.get(i)); } } private void parse(ByteBuffer bb) throws DecodingException { byte fid = bb.get(); if(fid!=SUBFORMAT_ID_RAW) { throw new DecodingException("Uknown sub format id: "+fid); } int n = VarIntUtil.readVarInt32(bb); values = new DoubleArray(n); for(int i=0;i<n;i++) { values.add(bb.getDouble()); } } public static DoubleValueSegment parseFrom(ByteBuffer bb) throws DecodingException { DoubleValueSegment r = new DoubleValueSegment(); r.parse(bb); return r; } @Override public Value getValue(int index) { return ValueUtility.getDoubleValue(values.get(index)); } @Override public int getMaxSerializedSize() { return 4+8*values.size(); } static DoubleValueSegment consolidate(List<Value> v) { DoubleValueSegment fvs = new DoubleValueSegment(); int n = v.size(); fvs.values = new DoubleArray(n); for(int i=0; i<n; i++) { fvs.values.add(v.get(i).getDoubleValue()); } return fvs; } @Override public double[] getRange(int posStart, int posStop, boolean ascending) { double[] r = new double[posStop-posStart]; if(ascending) { for(int i = posStart; i<posStop; i++) { r[i-posStart] = values.get(i); } } else { for(int i = posStop; i>posStart; i--) { r[posStop-i] = values.get(i); } } return r; } @Override public int size() { return values.size(); } @Override public void add(int pos, Value engValue) { values.add(pos, engValue.getDoubleValue()); } @Override public DoubleValueSegment consolidate() { return this; } }