Skip to content

Commit e4e546b

Browse files
authored
Merge pull request #551 from open-ephys/issue-546
Refactor Neuropixels V2 to utilize external ProbeInterface files
2 parents b451d02 + 5b4da71 commit e4e546b

16 files changed

+481
-256
lines changed

OpenEphys.Onix1.Design/NeuropixelsV2eChannelConfigurationDialog.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public NeuropixelsV2eChannelConfigurationDialog(NeuropixelsV2ProbeConfiguration
3131

3232
zedGraphChannels.ZoomStepFraction = 0.5;
3333

34-
ProbeConfiguration = Activator.CreateInstance(probeConfiguration.GetType(), probeConfiguration) as NeuropixelsV2ProbeConfiguration;
34+
ProbeConfiguration = probeConfiguration.Clone();
3535
ProbeConfiguration.ProbeGroup = (NeuropixelsV2eProbeGroup)ProbeGroup;
3636

3737
GetChannelNumberFunc = ProbeConfiguration.ChannelMap[0].GetChannelNumberFunc();
@@ -49,7 +49,16 @@ internal override ProbeGroup DefaultChannelLayout()
4949

5050
internal override void LoadDefaultChannelLayout()
5151
{
52-
base.LoadDefaultChannelLayout();
52+
try
53+
{
54+
ProbeConfiguration.ProbeGroup = DefaultChannelLayout() as NeuropixelsV2eProbeGroup;
55+
ProbeGroup = ProbeConfiguration.ProbeGroup;
56+
}
57+
catch (InvalidOperationException ex)
58+
{
59+
MessageBox.Show("Unable to Load Default", ex.Message);
60+
return;
61+
}
5362

5463
OnFileOpenHandler();
5564
}

OpenEphys.Onix1.Design/NeuropixelsV2eDialog.cs

Lines changed: 30 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,33 @@ namespace OpenEphys.Onix1.Design
99
/// </summary>
1010
public partial class NeuropixelsV2eDialog : Form
1111
{
12-
readonly IReadOnlyList<NeuropixelsV2eProbeConfigurationDialog> ProbeConfigurations;
12+
internal readonly Dictionary<NeuropixelsV2Probe, NeuropixelsV2eProbeConfigurationDialog> ProbeConfigurations;
13+
14+
internal NeuropixelsV2ProbeConfiguration ProbeConfigurationA
15+
{
16+
get
17+
{
18+
return ProbeConfigurations.TryGetValue(NeuropixelsV2Probe.ProbeA, out var probeConfigurationDialog)
19+
? probeConfigurationDialog.ProbeConfiguration
20+
: throw new NullReferenceException("Unable to find the probe configuration dialog for Probe A.");
21+
}
22+
}
23+
24+
internal NeuropixelsV2ProbeConfiguration ProbeConfigurationB
25+
{
26+
get
27+
{
28+
return ProbeConfigurations.TryGetValue(NeuropixelsV2Probe.ProbeB, out var probeConfigurationDialog)
29+
? probeConfigurationDialog.ProbeConfiguration
30+
: throw new NullReferenceException("Unable to find the probe configuration dialog for Probe B.");
31+
}
32+
}
1333

1434
/// <summary>
1535
/// Public <see cref="IConfigureNeuropixelsV2"/> interface that is manipulated by
1636
/// <see cref="NeuropixelsV2eDialog"/>.
1737
/// </summary>
38+
[Obsolete]
1839
public IConfigureNeuropixelsV2 ConfigureNode { get; set; }
1940

2041
/// <summary>
@@ -26,75 +47,27 @@ public NeuropixelsV2eDialog(IConfigureNeuropixelsV2 configureNode)
2647
InitializeComponent();
2748
Shown += FormShown;
2849

29-
if (configureNode is ConfigureNeuropixelsV2eBeta configureV2eBeta)
50+
if (configureNode is ConfigureNeuropixelsV2eBeta)
3051
{
31-
ConfigureNode = new ConfigureNeuropixelsV2eBeta(configureV2eBeta);
3252
Text = Text.Replace("NeuropixelsV2e ", "NeuropixelsV2eBeta ");
3353
}
34-
else if (configureNode is ConfigureNeuropixelsV2e configureV2e)
35-
{
36-
ConfigureNode = new ConfigureNeuropixelsV2e(configureV2e);
37-
}
3854

39-
ProbeConfigurations = new List<NeuropixelsV2eProbeConfigurationDialog>
55+
ProbeConfigurations = new()
4056
{
41-
new(ConfigureNode.ProbeConfigurationA, ConfigureNode.GainCalibrationFileA, ConfigureNode.InvertPolarity)
42-
{
43-
TopLevel = false,
44-
FormBorderStyle = FormBorderStyle.None,
45-
Dock = DockStyle.Fill,
46-
Parent = this,
47-
Tag = NeuropixelsV2Probe.ProbeA
48-
},
49-
new(ConfigureNode.ProbeConfigurationB, ConfigureNode.GainCalibrationFileB, ConfigureNode.InvertPolarity)
50-
{
51-
TopLevel = false,
52-
FormBorderStyle = FormBorderStyle.None,
53-
Dock = DockStyle.Fill,
54-
Parent = this,
55-
Tag = NeuropixelsV2Probe.ProbeB
56-
}
57+
{ NeuropixelsV2Probe.ProbeA, new(configureNode.ProbeConfigurationA) },
58+
{ NeuropixelsV2Probe.ProbeB, new(configureNode.ProbeConfigurationB) }
5759
};
5860

5961
foreach (var channelConfiguration in ProbeConfigurations)
6062
{
61-
channelConfiguration.InvertPolarityChanged += InvertPolarityChanged;
62-
63-
string probeName = GetProbeName((NeuropixelsV2Probe)channelConfiguration.Tag);
63+
string probeName = channelConfiguration.Key.ToString();
6464

6565
tabControlProbe.TabPages.Add(probeName, probeName);
66-
tabControlProbe.TabPages[probeName].Controls.Add(channelConfiguration);
67-
this.AddMenuItemsFromDialogToFileOption(channelConfiguration, probeName);
66+
channelConfiguration.Value.SetChildFormProperties(this).AddDialogToTab(tabControlProbe.TabPages[probeName]);
67+
this.AddMenuItemsFromDialogToFileOption(channelConfiguration.Value, probeName);
6868
}
6969
}
7070

71-
private void InvertPolarityChanged(object sender, EventArgs e)
72-
{
73-
NeuropixelsV2eProbeConfigurationDialog sendingDialog = (NeuropixelsV2eProbeConfigurationDialog)sender;
74-
foreach (var channelConfiguration in ProbeConfigurations)
75-
{
76-
if (channelConfiguration.Tag != sendingDialog.Tag)
77-
{
78-
channelConfiguration.SetInvertPolarity(sendingDialog.InvertPolarity);
79-
}
80-
}
81-
}
82-
83-
private string GetProbeName(NeuropixelsV2Probe probe)
84-
{
85-
return probe switch
86-
{
87-
NeuropixelsV2Probe.ProbeA => "Probe A",
88-
NeuropixelsV2Probe.ProbeB => "Probe B",
89-
_ => "Invalid probe was specified."
90-
};
91-
}
92-
93-
private int GetProbeIndex(NeuropixelsV2Probe probe)
94-
{
95-
return probe == NeuropixelsV2Probe.ProbeA ? 0 : 1;
96-
}
97-
9871
private void FormShown(object sender, EventArgs e)
9972
{
10073
if (!TopLevel)
@@ -107,26 +80,13 @@ private void FormShown(object sender, EventArgs e)
10780

10881
foreach (var channelConfiguration in ProbeConfigurations)
10982
{
110-
channelConfiguration.Show();
83+
channelConfiguration.Value.Show();
11184
}
11285
}
11386

11487
internal void Okay_Click(object sender, EventArgs e)
11588
{
116-
SaveVariables();
117-
11889
DialogResult = DialogResult.OK;
11990
}
120-
121-
internal void SaveVariables()
122-
{
123-
ConfigureNode.ProbeConfigurationA = ProbeConfigurations[GetProbeIndex(NeuropixelsV2Probe.ProbeA)].ProbeConfiguration;
124-
ConfigureNode.ProbeConfigurationB = ProbeConfigurations[GetProbeIndex(NeuropixelsV2Probe.ProbeB)].ProbeConfiguration;
125-
126-
ConfigureNode.GainCalibrationFileA = ProbeConfigurations[GetProbeIndex(NeuropixelsV2Probe.ProbeA)].textBoxProbeCalibrationFile.Text;
127-
ConfigureNode.GainCalibrationFileB = ProbeConfigurations[GetProbeIndex(NeuropixelsV2Probe.ProbeB)].textBoxProbeCalibrationFile.Text;
128-
129-
ConfigureNode.InvertPolarity = ProbeConfigurations[GetProbeIndex(NeuropixelsV2Probe.ProbeA)].InvertPolarity;
130-
}
13191
}
13292
}

OpenEphys.Onix1.Design/NeuropixelsV2eEditor.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,8 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
2222

2323
if (editorDialog.ShowDialog() == DialogResult.OK)
2424
{
25-
configureNeuropixelsV2e.Enable = editorDialog.ConfigureNode.Enable;
26-
configureNeuropixelsV2e.GainCalibrationFileA = editorDialog.ConfigureNode.GainCalibrationFileA;
27-
configureNeuropixelsV2e.GainCalibrationFileB = editorDialog.ConfigureNode.GainCalibrationFileB;
28-
configureNeuropixelsV2e.ProbeConfigurationA = editorDialog.ConfigureNode.ProbeConfigurationA;
29-
configureNeuropixelsV2e.ProbeConfigurationB = editorDialog.ConfigureNode.ProbeConfigurationB;
30-
configureNeuropixelsV2e.InvertPolarity = editorDialog.ConfigureNode.InvertPolarity;
25+
DesignHelper.CopyProperties(editorDialog.ProbeConfigurationA, configureNeuropixelsV2e.ProbeConfigurationA, DesignHelper.PropertiesToIgnore);
26+
DesignHelper.CopyProperties(editorDialog.ProbeConfigurationB, configureNeuropixelsV2e.ProbeConfigurationB, DesignHelper.PropertiesToIgnore);
3127

3228
return true;
3329
}

OpenEphys.Onix1.Design/NeuropixelsV2eHeadstageDialog.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ public NeuropixelsV2eHeadstageDialog(IConfigureNeuropixelsV2 configureNeuropixel
4848

4949
private void Okay_Click(object sender, System.EventArgs e)
5050
{
51-
DialogNeuropixelsV2e.SaveVariables();
52-
5351
DialogResult = DialogResult.OK;
5452
}
5553
}

OpenEphys.Onix1.Design/NeuropixelsV2eHeadstageEditor.cs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,10 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
2323

2424
if (editorDialog.ShowDialog() == DialogResult.OK)
2525
{
26-
configureV2eHeadstage.Bno055.Enable = ((ConfigurePolledBno055)editorDialog.DialogBno055.Device).Enable;
26+
DesignHelper.CopyProperties((ConfigurePolledBno055)editorDialog.DialogBno055.Device, configureV2eHeadstage.Bno055, DesignHelper.PropertiesToIgnore);
2727

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-
configureV2eHeadstage.NeuropixelsV2e.InvertPolarity = editorDialog.DialogNeuropixelsV2e.ConfigureNode.InvertPolarity;
28+
configureV2eHeadstage.NeuropixelsV2e.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ProbeConfigurationA;
29+
configureV2eHeadstage.NeuropixelsV2e.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ProbeConfigurationB;
3430

3531
return true;
3632
}
@@ -41,14 +37,10 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
4137

4238
if (editorDialog.ShowDialog() == DialogResult.OK)
4339
{
44-
configureV2eBetaHeadstage.Bno055.Enable = ((ConfigurePolledBno055)editorDialog.DialogBno055.Device).Enable;
45-
46-
configureV2eBetaHeadstage.NeuropixelsV2eBeta.Enable = editorDialog.DialogNeuropixelsV2e.ConfigureNode.Enable;
47-
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationA;
48-
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.ProbeConfigurationB;
49-
configureV2eBetaHeadstage.NeuropixelsV2eBeta.GainCalibrationFileA = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileA;
50-
configureV2eBetaHeadstage.NeuropixelsV2eBeta.GainCalibrationFileB = editorDialog.DialogNeuropixelsV2e.ConfigureNode.GainCalibrationFileB;
51-
configureV2eBetaHeadstage.NeuropixelsV2eBeta.InvertPolarity = editorDialog.DialogNeuropixelsV2e.ConfigureNode.InvertPolarity;
40+
DesignHelper.CopyProperties((ConfigurePolledBno055)editorDialog.DialogBno055.Device, configureV2eBetaHeadstage.Bno055, DesignHelper.PropertiesToIgnore);
41+
42+
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationA = editorDialog.DialogNeuropixelsV2e.ProbeConfigurationA;
43+
configureV2eBetaHeadstage.NeuropixelsV2eBeta.ProbeConfigurationB = editorDialog.DialogNeuropixelsV2e.ProbeConfigurationB;
5244

5345
return true;
5446
}

OpenEphys.Onix1.Design/NeuropixelsV2eProbeConfigurationDialog.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,26 @@ public NeuropixelsV2ProbeConfiguration ProbeConfiguration
2525
}
2626

2727
/// <inheritdoc cref="ConfigureNeuropixelsV2e.InvertPolarity"/>
28-
public bool InvertPolarity { get; set; }
28+
[Obsolete]
29+
public bool InvertPolarity
30+
{
31+
get => ProbeConfiguration.InvertPolarity;
32+
set => ProbeConfiguration.InvertPolarity = value;
33+
}
2934

3035
INeuropixelsV2ProbeInfo ProbeData { get; set; }
3136

3237
/// <summary>
3338
/// Initializes a new instance of <see cref="NeuropixelsV2ProbeConfiguration"/>.
3439
/// </summary>
3540
/// <param name="configuration">A <see cref="NeuropixelsV2ProbeConfiguration"/> object holding the current configuration settings.</param>
36-
/// <param name="calibrationFile">String containing the path to the calibration file for this probe.</param>
37-
/// <param name="invertPolarity">Boolean denoting whether or not to invert the polarity of neural data.</param>
38-
public NeuropixelsV2eProbeConfigurationDialog(NeuropixelsV2ProbeConfiguration configuration, string calibrationFile, bool invertPolarity)
41+
public NeuropixelsV2eProbeConfigurationDialog(NeuropixelsV2ProbeConfiguration configuration)
3942
{
4043
InitializeComponent();
4144
Shown += FormShown;
4245

43-
textBoxProbeCalibrationFile.Text = calibrationFile;
44-
45-
InvertPolarity = invertPolarity;
46+
textBoxProbeCalibrationFile.Text = configuration.GainCalibrationFileName;
47+
textBoxProbeCalibrationFile.TextChanged += (sender, e) => ProbeConfiguration.GainCalibrationFileName = ((TextBox)sender).Text;
4648

4749
ChannelConfiguration = new(configuration);
4850
ChannelConfiguration.SetChildFormProperties(this).AddDialogToPanel(panelProbe);
@@ -61,7 +63,7 @@ public NeuropixelsV2eProbeConfigurationDialog(NeuropixelsV2ProbeConfiguration co
6163
comboBoxChannelPresets.DataSource = ProbeData.GetComboBoxChannelPresets();
6264
comboBoxChannelPresets.SelectedIndexChanged += SelectedChannelPresetChanged;
6365

64-
checkBoxInvertPolarity.Checked = InvertPolarity;
66+
checkBoxInvertPolarity.Checked = ProbeConfiguration.InvertPolarity;
6567
checkBoxInvertPolarity.CheckedChanged += InvertPolarityIndexChanged;
6668

6769
CheckForExistingChannelPreset();
@@ -83,7 +85,7 @@ static INeuropixelsV2ProbeInfo ProbeDataFactory(NeuropixelsV2ProbeConfiguration
8385

8486
private void InvertPolarityIndexChanged(object sender, EventArgs e)
8587
{
86-
InvertPolarity = ((CheckBox)sender).Checked;
88+
ProbeConfiguration.InvertPolarity = ((CheckBox)sender).Checked;
8789
OnInvertPolarityChangedHandler();
8890
}
8991

OpenEphys.Onix1.Design/NeuropixelsV2eProbeConfigurationEditor.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,9 @@ public override object EditValue(ITypeDescriptorContext context, IServiceProvide
3131
{
3232
var instance = (IConfigureNeuropixelsV2)context.Instance;
3333

34-
var calibrationFile = configuration.Probe == NeuropixelsV2Probe.ProbeA ? instance.GainCalibrationFileA : instance.GainCalibrationFileB;
35-
3634
bool isBeta = instance is ConfigureNeuropixelsV2eBeta;
3735

38-
using var editorDialog = new NeuropixelsV2eProbeConfigurationDialog(configuration, calibrationFile, instance.InvertPolarity);
36+
using var editorDialog = new NeuropixelsV2eProbeConfigurationDialog(configuration);
3937

4038
if (isBeta)
4139
{
@@ -44,17 +42,6 @@ public override object EditValue(ITypeDescriptorContext context, IServiceProvide
4442

4543
if (editorDialog.ShowDialog() == DialogResult.OK)
4644
{
47-
if (configuration.Probe == NeuropixelsV2Probe.ProbeA)
48-
{
49-
instance.GainCalibrationFileA = editorDialog.textBoxProbeCalibrationFile.Text;
50-
}
51-
else
52-
{
53-
instance.GainCalibrationFileB = editorDialog.textBoxProbeCalibrationFile.Text;
54-
}
55-
56-
instance.InvertPolarity = editorDialog.InvertPolarity;
57-
5845
return editorDialog.ProbeConfiguration;
5946
}
6047
}

0 commit comments

Comments
 (0)