Skip to content

Commit 80651e2

Browse files
committed
Add interface for NeuropixelsV2
- V2e and V2eBeta inherit from this interface - Modified V2e dialogs to accept the interface - V2eBeta operators call the V2e dialogs, due to the common interface, and modify strings as needed to specify 'Beta'
1 parent 3bdadf5 commit 80651e2

9 files changed

+104
-17
lines changed

OpenEphys.Onix1.Design/NeuropixelsV2eDialog.cs

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

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

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

3341
ProbeConfigurations = new List<NeuropixelsV2eProbeConfigurationDialog>
3442
{

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: 1 addition & 1 deletion
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.

OpenEphys.Onix1/ConfigureNeuropixelsV2eBeta.cs

Lines changed: 34 additions & 1 deletion
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.
@@ -19,6 +21,23 @@ public ConfigureNeuropixelsV2eBeta()
1921
{
2022
}
2123

24+
/// <summary>
25+
/// Copy constructor for the <see cref="ConfigureNeuropixelsV2e"/> class.
26+
/// </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+
2241
/// <summary>
2342
/// Gets or sets the device enable state.
2443
/// </summary>
@@ -43,8 +62,15 @@ public ConfigureNeuropixelsV2eBeta()
4362
/// <summary>
4463
/// Gets or sets the electrode configuration for Probe A.
4564
/// </summary>
65+
/// <remarks>
66+
/// Configuration is accomplished using a GUI to aid in channel selection and relevant configuration properties.
67+
/// To open a probe configuration GUI, select the ellipses next the <see cref="ProbeConfigurationA"/> variable
68+
/// in the property pane, or double-click <see cref="ConfigureNeuropixelsV2eBetaHeadstage"/> to configure both
69+
/// probes and the <see cref="ConfigureNeuropixelsV2eBno055"/> simultaneously.
70+
/// </remarks>
4671
[Category(ConfigurationCategory)]
4772
[Description("Probe A electrode configuration.")]
73+
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eProbeConfigurationEditor, OpenEphys.Onix1.Design", typeof(UITypeEditor))]
4874
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationA { get; set; } = new(NeuropixelsV2Probe.ProbeA);
4975

5076
/// <summary>
@@ -71,8 +97,15 @@ public ConfigureNeuropixelsV2eBeta()
7197
/// <summary>
7298
/// Gets or sets the electrode configuration for Probe B.
7399
/// </summary>
100+
/// <remarks>
101+
/// Configuration is accomplished using a GUI to aid in channel selection and relevant configuration properties.
102+
/// To open a probe configuration GUI, select the ellipses next the <see cref="ProbeConfigurationB"/> variable
103+
/// in the property pane, or double-click <see cref="ConfigureNeuropixelsV2eBetaHeadstage"/> to configure both
104+
/// probes and the <see cref="ConfigureNeuropixelsV2eBno055"/> simultaneously.
105+
/// </remarks>
74106
[Category(ConfigurationCategory)]
75107
[Description("Probe B electrode configuration.")]
108+
[Editor("OpenEphys.Onix1.Design.NeuropixelsV2eProbeConfigurationEditor, OpenEphys.Onix1.Design", typeof(UITypeEditor))]
76109
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationB { get; set; } = new(NeuropixelsV2Probe.ProbeB);
77110

78111
/// <summary>

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: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace OpenEphys.Onix1
2+
{
3+
public interface IConfigureNeuropixelsV2
4+
{
5+
public bool Enable { get; set; }
6+
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationA { get; set; }
7+
public string GainCalibrationFileA { get; set; }
8+
public NeuropixelsV2QuadShankProbeConfiguration ProbeConfigurationB { get; set; }
9+
public string GainCalibrationFileB { get; set; }
10+
}
11+
}

0 commit comments

Comments
 (0)