Skip to content

Commit

Permalink
Merge pull request #269 from open-ephys/issue-268
Browse files Browse the repository at this point in the history
Add NeuropixelsV2eBeta GUIs
  • Loading branch information
jonnew authored Sep 4, 2024
2 parents 77edc08 + 8ffa16c commit 0fcdd85
Show file tree
Hide file tree
Showing 9 changed files with 134 additions and 45 deletions.
14 changes: 11 additions & 3 deletions OpenEphys.Onix1.Design/NeuropixelsV2eDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,26 @@ public partial class NeuropixelsV2eDialog : Form
/// Public <see cref="ConfigureNeuropixelsV2e"/> object that is manipulated by
/// <see cref="NeuropixelsV2eDialog"/>.
/// </summary>
public ConfigureNeuropixelsV2e ConfigureNode { get; set; }
public IConfigureNeuropixelsV2 ConfigureNode { get; set; }

/// <summary>
/// Initializes a new instance of <see cref="NeuropixelsV2eDialog"/>.
/// </summary>
/// <param name="configureNode">A <see cref="ConfigureNeuropixelsV2e"/> object holding the current configuration settings.</param>
public NeuropixelsV2eDialog(ConfigureNeuropixelsV2e configureNode)
public NeuropixelsV2eDialog(IConfigureNeuropixelsV2 configureNode)
{
InitializeComponent();
Shown += FormShown;

ConfigureNode = new(configureNode);
if (configureNode is ConfigureNeuropixelsV2eBeta configureV2eBeta)
{
ConfigureNode = new ConfigureNeuropixelsV2eBeta(configureV2eBeta);
Text = Text.Replace("NeuropixelsV2e ", "NeuropixelsV2eBeta ");
}
else if (configureNode is ConfigureNeuropixelsV2e configureV2e)
{
ConfigureNode = new ConfigureNeuropixelsV2e(configureV2e);
}

ProbeConfigurations = new List<NeuropixelsV2eProbeConfigurationDialog>
{
Expand Down
2 changes: 1 addition & 1 deletion OpenEphys.Onix1.Design/NeuropixelsV2eEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
if (provider != null)
{
var editorState = (IWorkflowEditorState)provider.GetService(typeof(IWorkflowEditorState));
if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2e configureNeuropixelsV2e)
if (editorState != null && !editorState.WorkflowRunning && component is IConfigureNeuropixelsV2 configureNeuropixelsV2e)
{
using var editorDialog = new NeuropixelsV2eDialog(configureNeuropixelsV2e);

Expand Down
15 changes: 13 additions & 2 deletions OpenEphys.Onix1.Design/NeuropixelsV2eHeadstageDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public partial class NeuropixelsV2eHeadstageDialog : Form
/// </summary>
/// <param name="configureNeuropixelsV2e">Configuration settings for a <see cref="ConfigureNeuropixelsV2e"/>.</param>
/// <param name="configureBno055">Configuration settings for a <see cref="ConfigureNeuropixelsV2eBno055"/>.</param>
public NeuropixelsV2eHeadstageDialog(ConfigureNeuropixelsV2e configureNeuropixelsV2e, ConfigureNeuropixelsV2eBno055 configureBno055)
public NeuropixelsV2eHeadstageDialog(IConfigureNeuropixelsV2 configureNeuropixelsV2e, ConfigureNeuropixelsV2eBno055 configureBno055)
{
InitializeComponent();

Expand All @@ -35,7 +35,18 @@ public NeuropixelsV2eHeadstageDialog(ConfigureNeuropixelsV2e configureNeuropixel
};

panelNeuropixelsV2e.Controls.Add(DialogNeuropixelsV2e);
this.AddMenuItemsFromDialogToFileOption(DialogNeuropixelsV2e, "NeuropixelsV2e");

if (configureNeuropixelsV2e is ConfigureNeuropixelsV2e)
{
this.AddMenuItemsFromDialogToFileOption(DialogNeuropixelsV2e, "NeuropixelsV2e");
}
else if (configureNeuropixelsV2e is ConfigureNeuropixelsV2eBeta)
{
this.AddMenuItemsFromDialogToFileOption(DialogNeuropixelsV2e, "NeuropixelsV2eBeta");
Text = Text.Replace("NeuropixelsV2e ", "NeuropixelsV2eBeta ");
tabPageNeuropixelsV2e.Text = "NeuropixelsV2eBeta";
}

DialogNeuropixelsV2e.Show();

DialogBno055 = new(configureBno055)
Expand Down
34 changes: 26 additions & 8 deletions OpenEphys.Onix1.Design/NeuropixelsV2eHeadstageEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,37 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
if (provider != null)
{
var editorState = (IWorkflowEditorState)provider.GetService(typeof(IWorkflowEditorState));
if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2eHeadstage configureHeadstage)

if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2eHeadstage configureV2eHeadstage)
{
using var editorDialog = new NeuropixelsV2eHeadstageDialog(configureV2eHeadstage.NeuropixelsV2e, configureV2eHeadstage.Bno055);

if (editorDialog.ShowDialog() == DialogResult.OK)
{
configureV2eHeadstage.Bno055.Enable = editorDialog.DialogBno055.ConfigureNode.Enable;

configureV2eHeadstage.NeuropixelsV2e.Enable = editorDialog.DialogNeuropixelsV2e.ConfigureNode.Enable;
configureV2eHeadstage.NeuropixelsV2e.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationA;
configureV2eHeadstage.NeuropixelsV2e.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationB;
configureV2eHeadstage.NeuropixelsV2e.GainCalibrationFileA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileA;
configureV2eHeadstage.NeuropixelsV2e.GainCalibrationFileB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileB;

return true;
}
}
else if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2eBetaHeadstage configureV2eBetaHeadstage)
{
using var editorDialog = new NeuropixelsV2eHeadstageDialog(configureHeadstage.NeuropixelsV2e, configureHeadstage.Bno055);
using var editorDialog = new NeuropixelsV2eHeadstageDialog(configureV2eBetaHeadstage.NeuropixelsV2eBeta, configureV2eBetaHeadstage.Bno055);

if (editorDialog.ShowDialog() == DialogResult.OK)
{
configureHeadstage.Bno055.Enable = editorDialog.DialogBno055.ConfigureNode.Enable;
configureV2eBetaHeadstage.Bno055.Enable = editorDialog.DialogBno055.ConfigureNode.Enable;

configureHeadstage.NeuropixelsV2e.Enable = editorDialog.DialogNeuropixelsV2e.ConfigureNode.Enable;
configureHeadstage.NeuropixelsV2e.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationA;
configureHeadstage.NeuropixelsV2e.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationB;
configureHeadstage.NeuropixelsV2e.GainCalibrationFileA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileA;
configureHeadstage.NeuropixelsV2e.GainCalibrationFileB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileB;
configureV2eBetaHeadstage.NeuropixelsV2eBeta.Enable = editorDialog.DialogNeuropixelsV2e.ConfigureNode.Enable;
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationA;
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationB;
configureV2eBetaHeadstage.NeuropixelsV2eBeta.GainCalibrationFileA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileA;
configureV2eBetaHeadstage.NeuropixelsV2eBeta.GainCalibrationFileB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileB;

return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,17 @@ public override object EditValue(ITypeDescriptorContext context, IServiceProvide
if (editorService != null && editorState != null && !editorState.WorkflowRunning &&
value is NeuropixelsV2QuadShankProbeConfiguration configuration)
{
var instance = (ConfigureNeuropixelsV2e)context.Instance;
var instance = (IConfigureNeuropixelsV2)context.Instance;

var calibrationFile = configuration.Probe == NeuropixelsV2Probe.ProbeA ? instance.GainCalibrationFileA : instance.GainCalibrationFileB;

using var editorDialog = new NeuropixelsV2eProbeConfigurationDialog(configuration, calibrationFile);

if (instance is ConfigureNeuropixelsV2eBeta)
{
editorDialog.Text = editorDialog.Text.Replace("NeuropixelsV2e ", "NeuropixelsV2eBeta ");
}

if (editorDialog.ShowDialog() == DialogResult.OK)
{
if (configuration.Probe == NeuropixelsV2Probe.ProbeA)
Expand Down
22 changes: 6 additions & 16 deletions OpenEphys.Onix1/ConfigureNeuropixelsV2e.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace OpenEphys.Onix1
/// </summary>
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eEditor, OpenEphys.Onix1.Design", typeof(ComponentEditor))]
[Description("Configures a NeuropixelsV2e device.")]
public class ConfigureNeuropixelsV2e : SingleDeviceFactory
public class ConfigureNeuropixelsV2e : SingleDeviceFactory, IConfigureNeuropixelsV2
{
/// <summary>
/// Initialize a new instance of a <see cref="ConfigureNeuropixelsV2e"/> class.
Expand All @@ -37,9 +37,7 @@ public ConfigureNeuropixelsV2e(ConfigureNeuropixelsV2e configureNode)
DeviceAddress = configureNode.DeviceAddress;
}

/// <summary>
/// Gets or sets the device enable state.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// If set to true, <see cref="NeuropixelsV2eData"/> will produce data. If set to false,
/// <see cref="NeuropixelsV2eData"/> will not produce data.
Expand All @@ -48,9 +46,7 @@ public ConfigureNeuropixelsV2e(ConfigureNeuropixelsV2e configureNode)
[Description("Specifies whether the NeuropixelsV2 device is enabled.")]
public bool Enable { get; set; } = true;

/// <summary>
/// Gets or sets the electrode configuration for Probe A.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// Configuration is accomplished using a GUI to aid in channel selection and relevant configuration properties.
/// To open a probe configuration GUI, select the ellipses next the <see cref="ProbeConfigurationA"/> variable
Expand All @@ -62,9 +58,7 @@ public ConfigureNeuropixelsV2e(ConfigureNeuropixelsV2e configureNode)
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eProbeConfigurationEditor, OpenEphys.Onix1.Design", typeof(UITypeEditor))]
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationA { get; set; } = new(NeuropixelsV2Probe.ProbeA);

/// <summary>
/// Gets or sets the path to the gain calibration file for Probe A.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// <para>
/// Each probe is linked to a gain calibration file that contains gain adjustments determined by IMEC during
Expand All @@ -83,9 +77,7 @@ public ConfigureNeuropixelsV2e(ConfigureNeuropixelsV2e configureNode)
[Editor("Bonsai.Design.OpenFileNameEditor, Bonsai.Design", DesignTypes.UITypeEditor)]
public string GainCalibrationFileA { get; set; }

/// <summary>
/// Gets or sets the electrode configuration for Probe B.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// Configuration is accomplished using a GUI to aid in channel selection and relevant configuration properties.
/// To open a probe configuration GUI, select the ellipses next the <see cref="ProbeConfigurationB"/> variable
Expand All @@ -97,9 +89,7 @@ public ConfigureNeuropixelsV2e(ConfigureNeuropixelsV2e configureNode)
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eProbeConfigurationEditor, OpenEphys.Onix1.Design", typeof(UITypeEditor))]
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationB { get; set; } = new(NeuropixelsV2Probe.ProbeB);

/// <summary>
/// Gets or sets the path to the gain calibration file for Probe B.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// <para>
/// Each probe is linked to a gain calibration file that contains gain adjustments determined by IMEC during
Expand Down
51 changes: 37 additions & 14 deletions OpenEphys.Onix1/ConfigureNeuropixelsV2eBeta.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Reactive.Disposables;
using Bonsai;

Expand All @@ -9,7 +10,8 @@ namespace OpenEphys.Onix1
/// A class that configures a NeuropixelsV2eBeta device.
/// </summary>
[Description("Configures a NeuropixelsV2eBeta device.")]
public class ConfigureNeuropixelsV2eBeta : SingleDeviceFactory
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eEditor, OpenEphys.Onix1.Design", typeof(ComponentEditor))]
public class ConfigureNeuropixelsV2eBeta : SingleDeviceFactory, IConfigureNeuropixelsV2
{
/// <summary>
/// Initialize a new instance of a <see cref="ConfigureNeuropixelsV2eBeta"/> class.
Expand All @@ -20,8 +22,23 @@ public ConfigureNeuropixelsV2eBeta()
}

/// <summary>
/// Gets or sets the device enable state.
/// Copy constructor for the <see cref="ConfigureNeuropixelsV2e"/> class.
/// </summary>
/// <param name="configureNode">A pre-existing <see cref="ConfigureNeuropixelsV2e"/> object.</param>
public ConfigureNeuropixelsV2eBeta(ConfigureNeuropixelsV2eBeta configureNode)
: base(typeof(NeuropixelsV2eBeta))
{
Enable = configureNode.Enable;
EnableLed = configureNode.EnableLed;
ProbeConfigurationA = configureNode.ProbeConfigurationA;
ProbeConfigurationB = configureNode.ProbeConfigurationB;
GainCalibrationFileA = configureNode.GainCalibrationFileA;
GainCalibrationFileB = configureNode.GainCalibrationFileB;
DeviceName = configureNode.DeviceName;
DeviceAddress = configureNode.DeviceAddress;
}

/// <inheritdoc/>
/// <remarks>
/// If set to true, <see cref="NeuropixelsV2eBetaData"/> will produce data. If set to false,
/// <see cref="NeuropixelsV2eBetaData"/> will not produce data.
Expand All @@ -40,16 +57,19 @@ public ConfigureNeuropixelsV2eBeta()
[Description("If true, the headstage LED will turn on during data acquisition. If false, the LED will not turn on.")]
public bool EnableLed { get; set; } = true;

/// <summary>
/// Gets or sets the electrode configuration for Probe A.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// Configuration is accomplished using a GUI to aid in channel selection and relevant configuration properties.
/// To open a probe configuration GUI, select the ellipses next the <see cref="ProbeConfigurationA"/> variable
/// in the property pane, or double-click <see cref="ConfigureNeuropixelsV2eBetaHeadstage"/> to configure both
/// probes and the <see cref="ConfigureNeuropixelsV2eBno055"/> simultaneously.
/// </remarks>
[Category(ConfigurationCategory)]
[Description("Probe A electrode configuration.")]
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eProbeConfigurationEditor, OpenEphys.Onix1.Design", typeof(UITypeEditor))]
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationA { get; set; } = new(NeuropixelsV2Probe.ProbeA);

/// <summary>
/// Gets or sets the path to the gain calibration file for Probe A.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// <para>
/// Each probe is linked to a gain calibration file that contains gain adjustments determined by IMEC during
Expand All @@ -68,16 +88,19 @@ public ConfigureNeuropixelsV2eBeta()
[Editor("Bonsai.Design.OpenFileNameEditor, Bonsai.Design", DesignTypes.UITypeEditor)]
public string GainCalibrationFileA { get; set; }

/// <summary>
/// Gets or sets the electrode configuration for Probe B.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// Configuration is accomplished using a GUI to aid in channel selection and relevant configuration properties.
/// To open a probe configuration GUI, select the ellipses next the <see cref="ProbeConfigurationB"/> variable
/// in the property pane, or double-click <see cref="ConfigureNeuropixelsV2eBetaHeadstage"/> to configure both
/// probes and the <see cref="ConfigureNeuropixelsV2eBno055"/> simultaneously.
/// </remarks>
[Category(ConfigurationCategory)]
[Description("Probe B electrode configuration.")]
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eProbeConfigurationEditor, OpenEphys.Onix1.Design", typeof(UITypeEditor))]
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationB { get; set; } = new(NeuropixelsV2Probe.ProbeB);

/// <summary>
/// Gets or sets the path to the gain calibration file for Probe B.
/// </summary>
/// <inheritdoc/>
/// <remarks>
/// <para>
/// Each probe is linked to a gain calibration file that contains gain adjustments determined by IMEC during
Expand Down
1 change: 1 addition & 0 deletions OpenEphys.Onix1/ConfigureNeuropixelsV2eBetaHeadstage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ namespace OpenEphys.Onix1
/// A class that configures a NeuropixelsV2eBeta headstage on the specified port.
/// </summary>
[Description("Configures a NeuropixelsV2eBeta headstage.")]
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eHeadstageEditor, OpenEphys.Onix1.Design", typeof(ComponentEditor))]
public class ConfigureNeuropixelsV2eBetaHeadstage : MultiDeviceFactory
{
PortName port;
Expand Down
33 changes: 33 additions & 0 deletions OpenEphys.Onix1/IConfigureNeuropixelsV2.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace OpenEphys.Onix1
{
/// <summary>
/// Public interface that defines common properties in NeuropixelsV2 devices.
/// </summary>
public interface IConfigureNeuropixelsV2
{
/// <summary>
/// Gets or sets the device enable state.
/// </summary>
public bool Enable { get; set; }

/// <summary>
/// Gets or sets the electrode configuration for Probe A.
/// </summary>
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationA { get; set; }

/// <summary>
/// Gets or sets the path to the gain calibration file for Probe A.
/// </summary>
public string GainCalibrationFileA { get; set; }

/// <summary>
/// Gets or sets the electrode configuration for Probe B.
/// </summary>
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationB { get; set; }

/// <summary>
/// Gets or sets the path to the gain calibration file for Probe B.
/// </summary>
public string GainCalibrationFileB { get; set; }
}
}

0 comments on commit 0fcdd85

Please sign in to comment.