For an example of how to create a generic x-axis plugin, create a Visual Studio project using the ‘Generic X-Axis Project Template’.
To use the generic x-axis in a display, there are two distinct tasks which need fulfilling. Firstly, the main view model for the display has to manage the generic x-axis instance and any changes to it. You then need to read the generic x-axis data correctly in order to use it.
The generic x-axis system consists of the following parts:
- IXAxisMappingSelector – used for cycling though available generic x-axis mappings. A display will need to register and unregister with this class.
- IXAxisMappingInstanceSupported – every display main view model will need to implement this interface.
- IXAxisMappingsController – provides access to all system registered generic x-axis mappings. Also provides quick access to the system wide default generic x-axis mapping (which happens to be Time).
- IXAxisMappingInstance – a system wide instance of a generic x-axis mapping, specific to am ICompositeSessionContainerController. This instance provides methods for converting timestamps to mapped data values and vice versa.
- IXAxisMappingAdapter – a system wide representation of a generic x-axis mapping, individual instances are created from this when required.
The following code is to be considered the minimum required implementation for a display’s main view model for managing the generic x-axis:
internal class MyDisplayViewModel :
DisplayViewModelBase,
IXAxisMappingInstanceSupported
{
private IXAxisMappingsController xAxisMappingsController;
private IXAxisMappingSelector xAxisMappingSelector;
public MyDisplayViewModel(
IXAxisMappingsController xAxisMappingsController,
IXAxisMappingSelector xAxisMappingSelector,
IDefaultXAxisMappingProvider defaultXAxisMappingProvider)
{
this.xAxisMappingsController = xAxisMappingsController;
this.xAxisMappingSelector = xAxisMappingSelector;
this.XAxisMappingAdapter = this.xAxisMappingsController.DefaultXAxisMapping;
this.ParameterSetProvider.SetXAxisMappingInstance(
defaultXAxisMappingProvider.DefaultXAxisMappingInstance);
}
public IXAxisMappingAdapter XAxisMappingAdapter { get; private set; }
public IXAxisMappingInstance XAxisMappingInstance { get; private set; }
public void SetXAxisMapping(IXAxisMappingAdapter xAxisMappingAdapter)
{
this.XAxisMappingAdapter = xAxisMappingAdapter;
this.RefreshXAxisMappingInstance();
this.RefreshData();
}
protected override void OnInitialised()
{
base.OnInitialised();
this.xAxisMappingSelector.RegisterDisplay(this.ScopeIdentity, this);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.xAxisMappingSelector.UnregisterDisplay(this.ScopeIdentity);
}
base.Dispose(disposing);
}
protected override void OnCompositeSessionContainerChanged()
{
base.OnCompositeSessionContainerChanged();
this.RefreshXAxisMappingInstance();
}
protected override void OnContainerCompositeSessionAdded()
{
base.OnContainerCompositeSessionAdded();
this.RefreshXAxisMappingInstance();
}
protected override void OnParameterAdded(
IParameterController parameterController,
IParameterSetController parameterSetController)
{
parameterController.AxisMappingInstance = this.XAxisMappingInstance;
}
protected override void OnPrimarySessionChanged()
{
base.OnPrimarySessionChanged();
this.RefreshXAxisMappingInstance();
}
private void CycleXAxisMappings()
{
this.SetXAxisMapping(
this.xAxisMappingsController.GetNextXAxisMapping(
this.XAxisMappingAdapter));
}
private void OnXAxisMappingInstanceMappingFailed(object sender, EventArgs e)
{
this.SetXAxisMapping(this.xAxisMappingsController.DefaultXAxisMapping);
}
private void RefreshXAxisMappingInstance()
{
if (this.XAxisMappingInstance != null)
{
this.XAxisMappingInstance.MappingFailed -=
this.OnXAxisMappingInstanceMappingFailed;
}
this.XAxisMappingInstance =
this.xAxisMappingsController.GetXAxisMappingInstanceFor(
this.XAxisMappingAdapter,
this.CompositeSessionContainerController);
this.XAxisMappingInstance.MappingFailed +=
this.OnXAxisMappingInstanceMappingFailed;
this.ParameterSetProvider
.SetXAxisMappingInstance(this.XAxisMappingInstance);
this.ClearCachedData = true;
}
}
Data is returned for a parameter in an IDataResult, which in turn contains an IMappedTimestamps object, which is where the timestamps and generic x-axis values are returned. You should be aware that the values mapped to the timestamps will only be the delta generic x-axis value from the last value. To convert timestamps to actual values you can use the IXAxisMappingInstance.GetMappedTimestampsAndValuesInRange() method.
If your particular display needs to work with an axis, whether in time or generic x-axis mode, you can get an axis object from IXAxisMappingInstance.GetAxis().
Comments
0 comments
Please sign in to leave a comment.