package com.isti.traceview.data;
public class SegmentData {
long startTime = 0;
double sampleRate = Double.POSITIVE_INFINITY;
int previous = Integer.MAX_VALUE;
int next = Integer.MAX_VALUE;
public int[] data = null;
int sourceSerialNumber = 0;
int channelSerialNumber = 0;
/**
* Sequential number of continue data area in trace, to which this point belongs.
* Similar to segmentNumber, but takes into account only gaps, not overlaps
*/
int continueAreaNumber = 0;
public SegmentData(long startTime, double sampleRate, int sourceSerialNumber, int channelSerialNumber, int continueAreaNumber, int previous, int next, int[] data) {
this.startTime = startTime;
this.sampleRate = sampleRate;
this.previous = previous;
this.next = next;
this.data = data;
this.sourceSerialNumber = sourceSerialNumber;
this.channelSerialNumber = channelSerialNumber;
this.continueAreaNumber = continueAreaNumber;
}
public SegmentData(long startTime, double sampleRate, int sourceSerialNumber, int channelSerialNumber, int continueAreaNumber, int[] data) {
this(startTime, sampleRate, sourceSerialNumber, channelSerialNumber, continueAreaNumber, Integer.MAX_VALUE, Integer.MAX_VALUE, data);
}
public long endTime() {
return new Double(startTime + sampleRate * data.length).longValue();
}
/**
* returns subarray of data in requested time range, from array of loaded segment data.
*
* @param start
* start time of requested range in milliseconds
* @param end
* end time of requested range in milliseconds
*/
public SegmentData getData(double start, double end) {
// lg.debug("PlotDataProvider.getData(): start " + start + ", end " + end);
int[] ret = new int[0];
int _previous = Integer.MAX_VALUE;
int _next = Integer.MAX_VALUE;
double startt = Math.max(startTime, start);
double endt = Math.min(endTime(), end);
double startvalue = new Double((startt - startTime) / sampleRate);
int startIndex = 0;
if (startvalue > 0.000000001) {
startIndex = new Double(startvalue).intValue() + 1;
}
int endIndex = Math.min(new Double((endt - startTime) / sampleRate).intValue(), data.length - 1);
if (startIndex <= endIndex) {
ret = new int[endIndex - startIndex + 1];
// lg.debug("PlotDataProvider.getData()-getting segment data: startindex " + startIndex
// + ", endindex " + endIndex);
for (int i = startIndex; i <= endIndex; i++) {
ret[i - startIndex] = data[i];
}
}
if (startIndex > 0)
_previous = data[startIndex - 1];
if (endIndex < data.length-1)
_next = data[endIndex];
return new SegmentData(startTime, sampleRate, sourceSerialNumber, channelSerialNumber, continueAreaNumber, _previous, _next, ret);
}
/**
* Computes linear interpolated value for any time on data array.
*
* @param time
* time argument to get interpolated value
* @return the linear interpolated value
*/
public double interpolateValue(double time) {
// lg.debug("interpolateValue: dataLength " + data.length + ", startTime " + dataTI.getStartTime() + ", time " + time);
int nextIndex = new Double((time - startTime ) / sampleRate + 1).intValue();
if (nextIndex >= data.length) {
nextIndex = data.length - 1;
}
int prevIndex = 0;
if (nextIndex < 1) {
nextIndex = 0;
} else {
prevIndex = nextIndex - 1;
}
// lg.debug("prevIndex = " + prevIndex + "; nextIndex = " + nextIndex);
return data[prevIndex] + (data[nextIndex] - data[prevIndex]) * (time - startTime - sampleRate * prevIndex)
/ (sampleRate * (nextIndex - prevIndex));
}
}