I am building a real time chart to display ECG data. I would like to, on the fly, be able to change the amount of time displayed on the x axis. In other words, the user can select the number of seconds of ECG data being displayed. The display sweeps across the time range then throws out old data after the sweep reaches the end of the time range then restarts at the beginning of the chart.
To do this, I am using a Fifo series and I am setting up the FifoCapacity to be just large enough to hold the desired number of seconds of data (sample rate x desired number of seconds). I also set the XVisibleRange to be equal to the desired time range. This works fine – the waveform sweeps to the end then restarts the trace. Now, when the user wants to change the time range (say from 6 seconds to 10 seconds of data for example) I think I need to do the following:
- create a new xyDataSeries with the FifoCapacity set at the new value of sample rate x desired number of seconds
- copy the data from the old series into the new series so it’s not lost from the chart
- bind the new series into the FastLineRenderableSeries DataSeries
- update the XVisibleRange to the new time range
Is this correct? If yes, how do I copy the data from the old series into the new series. I looked over the api documentation but it’s not clear to me. I see a clone() method but this is not what I want since I want a different FifoCapacity. Instead of creating a new series and copying old data into it, can I simply change the FifoCapacity property on the existing series?
Thanks for your help.
- Gary Arnold asked 9 years ago
- You must login to post comments
Hi Gary,
You’re absolutely correct. If you change the FifoCapacity the data gets erased (unavoidable, we have internally a circular buffer), so you need to create a new series and perform a copy.
You can do this by accessing the XValues, YValues properties on the original dataseries, e.g.
public XyDataSeries<TX, TY> ResizeFifoSeries<TX, TY>(XyDataSeries<TX, TY> original, int? fifoCapacity)
where TX : IComparable
where TY : IComparable
{
lock (original.SyncRoot)
{
var newDataSeries = new XyDataSeries<TX, TY>() {FifoCapacity = fifoCapacity};
newDataSeries.Append(original.XValues, original.YValues);
return newDataSeries;
}
}
Let me know if this helps,
Best regards,
Andrew
- Andrew Burnett-Thompson answered 9 years ago
-
Thanks for this method. Will it also work when shrinking the fifo size? In other words, when going from 10 seconds of data to 6 seconds of data? In this case, I would want to preserve the most recent data up to the new fifo size.
-
If you shrink the FIFO size it will attempt to append all but wrap around. E.g. if you Append 0 1 2 3 4 5 into a FIFO buffer of size 3, you will lose 0 1, but preserve 3 4 5. Does that make sense?
-
Yes, that makes sense. And that's exactly the behavior I want. Thanks!
- You must login to post comments
Please login first to submit.