Skip to content

Commit 0fcdd85

Browse files
authored
Merge pull request #269 from open-ephys/issue-268
Add NeuropixelsV2eBeta GUIs
2 parents 77edc08 + 8ffa16c commit 0fcdd85

9 files changed

+134
-45
lines changed

OpenEphys.Onix1.Design/NeuropixelsV2eDialog.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,26 @@ public partial class NeuropixelsV2eDialog : Form
1515
/// Public <see cref="ConfigureNeuropixelsV2e"/> object that is manipulated by
1616
/// <see cref="NeuropixelsV2eDialog"/>.
1717
/// </summary>
18-
public ConfigureNeuropixelsV2e ConfigureNode { get; set; }
18+
public IConfigureNeuropixelsV2 ConfigureNode { get; set; }
1919

2020
/// <summary>
2121
/// Initializes a new instance of <see cref="NeuropixelsV2eDialog"/>.
2222
/// </summary>
2323
/// <param name="configureNode">A <see cref="ConfigureNeuropixelsV2e"/> object holding the current configuration settings.</param>
24-
public NeuropixelsV2eDialog(ConfigureNeuropixelsV2e configureNode)
24+
public NeuropixelsV2eDialog(IConfigureNeuropixelsV2 configureNode)
2525
{
2626
InitializeComponent();
2727
Shown += FormShown;
2828

29-
ConfigureNode = new(configureNode);
29+
if (configureNode is ConfigureNeuropixelsV2eBeta configureV2eBeta)
30+
{
31+
ConfigureNode = new ConfigureNeuropixelsV2eBeta(configureV2eBeta);
32+
Text = Text.Replace("NeuropixelsV2e ", "NeuropixelsV2eBeta ");
33+
}
34+
else if (configureNode is ConfigureNeuropixelsV2e configureV2e)
35+
{
36+
ConfigureNode = new ConfigureNeuropixelsV2e(configureV2e);
37+
}
3038

3139
ProbeConfigurations = new List<NeuropixelsV2eProbeConfigurationDialog>
3240
{

OpenEphys.Onix1.Design/NeuropixelsV2eEditor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
1616
if (provider != null)
1717
{
1818
var editorState = (IWorkflowEditorState)provider.GetService(typeof(IWorkflowEditorState));
19-
if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2e configureNeuropixelsV2e)
19+
if (editorState != null && !editorState.WorkflowRunning && component is IConfigureNeuropixelsV2 configureNeuropixelsV2e)
2020
{
2121
using var editorDialog = new NeuropixelsV2eDialog(configureNeuropixelsV2e);
2222

OpenEphys.Onix1.Design/NeuropixelsV2eHeadstageDialog.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public partial class NeuropixelsV2eHeadstageDialog : Form
2222
/// </summary>
2323
/// <param name="configureNeuropixelsV2e">Configuration settings for a <see cref="ConfigureNeuropixelsV2e"/>.</param>
2424
/// <param name="configureBno055">Configuration settings for a <see cref="ConfigureNeuropixelsV2eBno055"/>.</param>
25-
public NeuropixelsV2eHeadstageDialog(ConfigureNeuropixelsV2e configureNeuropixelsV2e, ConfigureNeuropixelsV2eBno055 configureBno055)
25+
public NeuropixelsV2eHeadstageDialog(IConfigureNeuropixelsV2 configureNeuropixelsV2e, ConfigureNeuropixelsV2eBno055 configureBno055)
2626
{
2727
InitializeComponent();
2828

@@ -35,7 +35,18 @@ public NeuropixelsV2eHeadstageDialog(ConfigureNeuropixelsV2e configureNeuropixel
3535
};
3636

3737
panelNeuropixelsV2e.Controls.Add(DialogNeuropixelsV2e);
38-
this.AddMenuItemsFromDialogToFileOption(DialogNeuropixelsV2e, "NeuropixelsV2e");
38+
39+
if (configureNeuropixelsV2e is ConfigureNeuropixelsV2e)
40+
{
41+
this.AddMenuItemsFromDialogToFileOption(DialogNeuropixelsV2e, "NeuropixelsV2e");
42+
}
43+
else if (configureNeuropixelsV2e is ConfigureNeuropixelsV2eBeta)
44+
{
45+
this.AddMenuItemsFromDialogToFileOption(DialogNeuropixelsV2e, "NeuropixelsV2eBeta");
46+
Text = Text.Replace("NeuropixelsV2e ", "NeuropixelsV2eBeta ");
47+
tabPageNeuropixelsV2e.Text = "NeuropixelsV2eBeta";
48+
}
49+
3950
DialogNeuropixelsV2e.Show();
4051

4152
DialogBno055 = new(configureBno055)

OpenEphys.Onix1.Design/NeuropixelsV2eHeadstageEditor.cs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,37 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
1616
if (provider != null)
1717
{
1818
var editorState = (IWorkflowEditorState)provider.GetService(typeof(IWorkflowEditorState));
19-
if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2eHeadstage configureHeadstage)
19+
20+
if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2eHeadstage configureV2eHeadstage)
21+
{
22+
using var editorDialog = new NeuropixelsV2eHeadstageDialog(configureV2eHeadstage.NeuropixelsV2e, configureV2eHeadstage.Bno055);
23+
24+
if (editorDialog.ShowDialog() == DialogResult.OK)
25+
{
26+
configureV2eHeadstage.Bno055.Enable = editorDialog.DialogBno055.ConfigureNode.Enable;
27+
28+
configureV2eHeadstage.NeuropixelsV2e.Enable = editorDialog.DialogNeuropixelsV2e.ConfigureNode.Enable;
29+
configureV2eHeadstage.NeuropixelsV2e.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationA;
30+
configureV2eHeadstage.NeuropixelsV2e.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationB;
31+
configureV2eHeadstage.NeuropixelsV2e.GainCalibrationFileA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileA;
32+
configureV2eHeadstage.NeuropixelsV2e.GainCalibrationFileB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileB;
33+
34+
return true;
35+
}
36+
}
37+
else if (editorState != null && !editorState.WorkflowRunning && component is ConfigureNeuropixelsV2eBetaHeadstage configureV2eBetaHeadstage)
2038
{
21-
using var editorDialog = new NeuropixelsV2eHeadstageDialog(configureHeadstage.NeuropixelsV2e, configureHeadstage.Bno055);
39+
using var editorDialog = new NeuropixelsV2eHeadstageDialog(configureV2eBetaHeadstage.NeuropixelsV2eBeta, configureV2eBetaHeadstage.Bno055);
2240

2341
if (editorDialog.ShowDialog() == DialogResult.OK)
2442
{
25-
configureHeadstage.Bno055.Enable = editorDialog.DialogBno055.ConfigureNode.Enable;
43+
configureV2eBetaHeadstage.Bno055.Enable = editorDialog.DialogBno055.ConfigureNode.Enable;
2644

27-
configureHeadstage.NeuropixelsV2e.Enable = editorDialog.DialogNeuropixelsV2e.ConfigureNode.Enable;
28-
configureHeadstage.NeuropixelsV2e.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationA;
29-
configureHeadstage.NeuropixelsV2e.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationB;
30-
configureHeadstage.NeuropixelsV2e.GainCalibrationFileA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileA;
31-
configureHeadstage.NeuropixelsV2e.GainCalibrationFileB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileB;
45+
configureV2eBetaHeadstage.NeuropixelsV2eBeta.Enable = editorDialog.DialogNeuropixelsV2e.ConfigureNode.Enable;
46+
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationA;
47+
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationB;
48+
configureV2eBetaHeadstage.NeuropixelsV2eBeta.GainCalibrationFileA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileA;
49+
configureV2eBetaHeadstage.NeuropixelsV2eBeta.GainCalibrationFileB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileB;
3250

3351
return true;
3452
}

OpenEphys.Onix1.Design/NeuropixelsV2eProbeConfigurationEditor.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,17 @@ public override object EditValue(ITypeDescriptorContext context, IServiceProvide
2929
if (editorService != null && editorState != null && !editorState.WorkflowRunning &&
3030
value is NeuropixelsV2QuadShankProbeConfiguration configuration)
3131
{
32-
var instance = (ConfigureNeuropixelsV2e)context.Instance;
32+
var instance = (IConfigureNeuropixelsV2)context.Instance;
3333

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

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

38+
if (instance is ConfigureNeuropixelsV2eBeta)
39+
{
40+
editorDialog.Text = editorDialog.Text.Replace("NeuropixelsV2e ", "NeuropixelsV2eBeta ");
41+
}
42+
3843
if (editorDialog.ShowDialog() == DialogResult.OK)
3944
{
4045
if (configuration.Probe == NeuropixelsV2Probe.ProbeA)

OpenEphys.Onix1/ConfigureNeuropixelsV2e.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace OpenEphys.Onix1
1111
/// </summary>
1212
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eEditor, OpenEphys.Onix1.Design", typeof(ComponentEditor))]
1313
[Description("Configures a NeuropixelsV2e device.")]
14-
public class ConfigureNeuropixelsV2e : SingleDeviceFactory
14+
public class ConfigureNeuropixelsV2e : SingleDeviceFactory, IConfigureNeuropixelsV2
1515
{
1616
/// <summary>
1717
/// Initialize a new instance of a <see cref="ConfigureNeuropixelsV2e"/> class.
@@ -37,9 +37,7 @@ public ConfigureNeuropixelsV2e(ConfigureNeuropixelsV2e configureNode)
3737
DeviceAddress = configureNode.DeviceAddress;
3838
}
3939

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

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

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

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

100-
/// <summary>
101-
/// Gets or sets the path to the gain calibration file for Probe B.
102-
/// </summary>
92+
/// <inheritdoc/>
10393
/// <remarks>
10494
/// <para>
10595
/// Each probe is linked to a gain calibration file that contains gain adjustments determined by IMEC during

OpenEphys.Onix1/ConfigureNeuropixelsV2eBeta.cs

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.ComponentModel;
3+
using System.Drawing.Design;
34
using System.Reactive.Disposables;
45
using Bonsai;
56

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

2224
/// <summary>
23-
/// Gets or sets the device enable state.
25+
/// Copy constructor for the <see cref="ConfigureNeuropixelsV2e"/> class.
2426
/// </summary>
27+
/// <param name="configureNode">A pre-existing <see cref="ConfigureNeuropixelsV2e"/> object.</param>
28+
public ConfigureNeuropixelsV2eBeta(ConfigureNeuropixelsV2eBeta configureNode)
29+
: base(typeof(NeuropixelsV2eBeta))
30+
{
31+
Enable = configureNode.Enable;
32+
EnableLed = configureNode.EnableLed;
33+
ProbeConfigurationA = configureNode.ProbeConfigurationA;
34+
ProbeConfigurationB = configureNode.ProbeConfigurationB;
35+
GainCalibrationFileA = configureNode.GainCalibrationFileA;
36+
GainCalibrationFileB = configureNode.GainCalibrationFileB;
37+
DeviceName = configureNode.DeviceName;
38+
DeviceAddress = configureNode.DeviceAddress;
39+
}
40+
41+
/// <inheritdoc/>
2542
/// <remarks>
2643
/// If set to true, <see cref="NeuropixelsV2eBetaData"/> will produce data. If set to false,
2744
/// <see cref="NeuropixelsV2eBetaData"/> will not produce data.
@@ -40,16 +57,19 @@ public ConfigureNeuropixelsV2eBeta()
4057
[Description("If true, the headstage LED will turn on during data acquisition. If false, the LED will not turn on.")]
4158
public bool EnableLed { get; set; } = true;
4259

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

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

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

78-
/// <summary>
79-
/// Gets or sets the path to the gain calibration file for Probe B.
80-
/// </summary>
103+
/// <inheritdoc/>
81104
/// <remarks>
82105
/// <para>
83106
/// Each probe is linked to a gain calibration file that contains gain adjustments determined by IMEC during

OpenEphys.Onix1/ConfigureNeuropixelsV2eBetaHeadstage.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace OpenEphys.Onix1
77
/// A class that configures a NeuropixelsV2eBeta headstage on the specified port.
88
/// </summary>
99
[Description("Configures a NeuropixelsV2eBeta headstage.")]
10+
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eHeadstageEditor, OpenEphys.Onix1.Design", typeof(ComponentEditor))]
1011
public class ConfigureNeuropixelsV2eBetaHeadstage : MultiDeviceFactory
1112
{
1213
PortName port;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
namespace OpenEphys.Onix1
2+
{
3+
/// <summary>
4+
/// Public interface that defines common properties in NeuropixelsV2 devices.
5+
/// </summary>
6+
public interface IConfigureNeuropixelsV2
7+
{
8+
/// <summary>
9+
/// Gets or sets the device enable state.
10+
/// </summary>
11+
public bool Enable { get; set; }
12+
13+
/// <summary>
14+
/// Gets or sets the electrode configuration for Probe A.
15+
/// </summary>
16+
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationA { get; set; }
17+
18+
/// <summary>
19+
/// Gets or sets the path to the gain calibration file for Probe A.
20+
/// </summary>
21+
public string GainCalibrationFileA { get; set; }
22+
23+
/// <summary>
24+
/// Gets or sets the electrode configuration for Probe B.
25+
/// </summary>
26+
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationB { get; set; }
27+
28+
/// <summary>
29+
/// Gets or sets the path to the gain calibration file for Probe B.
30+
/// </summary>
31+
public string GainCalibrationFileB { get; set; }
32+
}
33+
}

0 commit comments

Comments
 (0)