Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions OpenEphys.Onix1.Design/HeadstageRhs2116Dialog.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 3 additions & 9 deletions OpenEphys.Onix1.Design/HeadstageRhs2116Dialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,16 @@ public partial class HeadstageRhs2116Dialog : Form
internal readonly Rhs2116StimulusSequenceDialog StimulusSequenceDialog;
internal readonly GenericDeviceDialog Rhs2116Dialog;

internal Rhs2116ProbeGroup ProbeGroup;

/// <summary>
/// Initializes a new instance of a <see cref="HeadstageRhs2116Dialog"/>.
/// </summary>
/// <param name="probeGroup">Current channel configuration settings for a <see cref="Rhs2116ProbeGroup"/>.</param>
/// <param name="sequence">Current stimulus sequence for a <see cref="Rhs2116StimulusSequencePair"/>.</param>
/// <param name="rhs2116Trigger">Current configuration settings for <see cref="ConfigureRhs2116Trigger"/>.</param>
/// <param name="rhs2116">Current configuration settings for a single <see cref="ConfigureRhs2116"/>.</param>
public HeadstageRhs2116Dialog(Rhs2116ProbeGroup probeGroup, Rhs2116StimulusSequencePair sequence,
ConfigureRhs2116Pair rhs2116)
public HeadstageRhs2116Dialog(ConfigureRhs2116Trigger rhs2116Trigger, ConfigureRhs2116Pair rhs2116)
{
InitializeComponent();

ProbeGroup = new Rhs2116ProbeGroup(probeGroup);

StimulusSequenceDialog = new Rhs2116StimulusSequenceDialog(sequence, ProbeGroup);
StimulusSequenceDialog = new Rhs2116StimulusSequenceDialog(rhs2116Trigger);

StimulusSequenceDialog.SetChildFormProperties(this).AddDialogToTab(tabPageStimulusSequence);
this.AddMenuItemsFromDialogToFileOption(StimulusSequenceDialog);
Expand Down
6 changes: 2 additions & 4 deletions OpenEphys.Onix1.Design/HeadstageRhs2116Editor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,11 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
var editorState = (IWorkflowEditorState)provider.GetService(typeof(IWorkflowEditorState));
if (editorState != null && !editorState.WorkflowRunning && component is ConfigureHeadstageRhs2116 configureNode)
{
using var editorDialog = new HeadstageRhs2116Dialog(configureNode.StimulusTrigger.ProbeGroup,
configureNode.StimulusTrigger.StimulusSequence, configureNode.Rhs2116Pair);
using var editorDialog = new HeadstageRhs2116Dialog(configureNode.StimulusTrigger, configureNode.Rhs2116Pair);

if (editorDialog.ShowDialog() == DialogResult.OK)
{
configureNode.StimulusTrigger.StimulusSequence = editorDialog.StimulusSequenceDialog.Sequence;
configureNode.StimulusTrigger.ProbeGroup = (Rhs2116ProbeGroup)editorDialog.StimulusSequenceDialog.ChannelDialog.ProbeGroup;
configureNode.StimulusTrigger = editorDialog.StimulusSequenceDialog.Trigger;
DesignHelper.CopyProperties((ConfigureRhs2116Pair)editorDialog.Rhs2116Dialog.Device, configureNode.Rhs2116Pair, DesignHelper.PropertiesToIgnore);

return true;
Expand Down
45 changes: 19 additions & 26 deletions OpenEphys.Onix1.Design/Rhs2116StimulusSequenceDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ public partial class Rhs2116StimulusSequenceDialog : GenericStimulusSequenceDial
const double SamplePeriodMilliSeconds = 1e3 / Rhs2116.SampleFrequencyHz;
const int NumberOfChannels = 32;

internal Rhs2116StimulusSequencePair Sequence { get; set; }
internal Rhs2116StimulusSequencePair Sequence { get => Trigger.StimulusSequence; }

internal ConfigureRhs2116Trigger Trigger { get; set; }

readonly Rhs2116StimulusSequencePair SequenceCopy = new();

Expand All @@ -35,19 +37,18 @@ public partial class Rhs2116StimulusSequenceDialog : GenericStimulusSequenceDial
/// Opens a dialog allowing for easy changing of stimulus sequence parameters, with
/// visual feedback on what the resulting stimulus sequence looks like.
/// </summary>
/// <param name="sequence">Stimulus sequence containing 32 channels of stimuli.</param>
/// <param name="probeGroup">Probe group containing ProbeInterface specifications for 32 contacts.</param>
public Rhs2116StimulusSequenceDialog(Rhs2116StimulusSequencePair sequence, Rhs2116ProbeGroup probeGroup)
/// <param name="rhs2116Trigger">Existing <see cref="ConfigureRhs2116Trigger"/> object.</param>
public Rhs2116StimulusSequenceDialog(ConfigureRhs2116Trigger rhs2116Trigger)
: base(NumberOfChannels, true, true)
{
if (probeGroup.NumberOfContacts != NumberOfChannels)
if (rhs2116Trigger.ProbeGroup.NumberOfContacts != NumberOfChannels)
{
throw new ArgumentException($"Probe group is not valid: {NumberOfChannels} channels were expected, there are {probeGroup.NumberOfContacts} instead.");
throw new ArgumentException($"Probe group is not valid: {NumberOfChannels} channels were expected, there are {rhs2116Trigger.ProbeGroup.NumberOfContacts} instead.");
}

InitializeComponent();

Sequence = new Rhs2116StimulusSequencePair(sequence);
Trigger = new(rhs2116Trigger);

dataGridViewStimulusTable.DataBindingComplete += DataBindingComplete;
SetTableDataSource();
Expand All @@ -63,7 +64,7 @@ public Rhs2116StimulusSequenceDialog(Rhs2116StimulusSequencePair sequence, Rhs21

StepSize = Sequence.CurrentStepSize;

ChannelDialog = new(probeGroup);
ChannelDialog = new(rhs2116Trigger.ProbeGroup);

ChannelDialog.SetChildFormProperties(this).AddDialogToPanel(panelProbe);
this.AddMenuItemsFromDialogToFileOption(ChannelDialog, "Channel Configuration");
Expand Down Expand Up @@ -278,11 +279,6 @@ internal override PointPairList[] CreateStimulusWaveforms()

internal override void SetStatusValidity()
{
if (Sequence == null)
{
return;
}

if (Sequence.Valid && Sequence.FitsInHardware)
{
toolStripStatusIsValid.Image = Properties.Resources.StatusReadyImage;
Expand Down Expand Up @@ -919,16 +915,16 @@ internal override void SerializeStimulusSequence(string fileName)

internal override bool IsSequenceValid()
{
return Sequence.Valid;
return Sequence.Valid && Sequence.FitsInHardware;
}

internal override void DeserializeStimulusSequence(string fileName)
{
var sequence = DesignHelper.DeserializeString<Rhs2116StimulusSequencePair>(File.ReadAllText(fileName));
var newSequence = DesignHelper.DeserializeString<Rhs2116StimulusSequencePair>(File.ReadAllText(fileName));

if (sequence != null && sequence.Stimuli.Length == 32)
if (newSequence != null && newSequence.Stimuli.Length == 32)
{
if (sequence == new Rhs2116StimulusSequencePair())
if (newSequence == new Rhs2116StimulusSequencePair())
{
var result = MessageBox.Show("The stimulus sequence loaded does not have any configuration settings applied. " +
"This could be because the file did not have the correct format. If this sequence is loaded, it will clear out " +
Expand All @@ -940,15 +936,15 @@ internal override void DeserializeStimulusSequence(string fileName)
}
}

Sequence = sequence;
Trigger.StimulusSequence = newSequence;

for (int i = 0; i < Sequence.Stimuli.Length; i++)
for (int i = 0; i < newSequence.Stimuli.Length; i++)
{
RequestedAnodicAmplitudeuA[i] = Sequence.Stimuli[i].AnodicAmplitudeSteps * Sequence.CurrentStepSizeuA;
RequestedCathodicAmplitudeuA[i] = Sequence.Stimuli[i].CathodicAmplitudeSteps * Sequence.CurrentStepSizeuA;
RequestedAnodicAmplitudeuA[i] = newSequence.Stimuli[i].AnodicAmplitudeSteps * newSequence.CurrentStepSizeuA;
RequestedCathodicAmplitudeuA[i] = newSequence.Stimuli[i].CathodicAmplitudeSteps * newSequence.CurrentStepSizeuA;
}

if (!Sequence.Valid)
if (!newSequence.Valid)
{
MessageBox.Show("Warning: Invalid stimuli found in the recently opened file. Check all values to ensure they are what is expected.",
"Invalid Stimuli", MessageBoxButtons.OK, MessageBoxIcon.Error);
Expand All @@ -962,10 +958,7 @@ internal override void DeserializeStimulusSequence(string fileName)

internal override void SetTableDataSource()
{
if (Sequence == null)
return;

dataGridViewStimulusTable.DataSource = Sequence.Stimuli;
dataGridViewStimulusTable.DataSource = Trigger?.StimulusSequence.Stimuli;
}

private void DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
Expand Down
5 changes: 2 additions & 3 deletions OpenEphys.Onix1.Design/Rhs2116StimulusSequenceEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@ public override bool EditComponent(ITypeDescriptorContext context, object compon
var editorState = (IWorkflowEditorState)provider.GetService(typeof(IWorkflowEditorState));
if (editorState != null && !editorState.WorkflowRunning && component is ConfigureRhs2116Trigger configureNode)
{
using var editorDialog = new Rhs2116StimulusSequenceDialog(configureNode.StimulusSequence, configureNode.ProbeGroup);
using var editorDialog = new Rhs2116StimulusSequenceDialog(configureNode);

if (editorDialog.ShowDialog() == DialogResult.OK)
{
configureNode.StimulusSequence = editorDialog.Sequence;
configureNode.ProbeGroup = (Rhs2116ProbeGroup)editorDialog.ChannelDialog.ProbeGroup;
DesignHelper.CopyProperties(editorDialog.Trigger, configureNode);

return true;
}
Expand Down
16 changes: 16 additions & 0 deletions OpenEphys.Onix1/ConfigureRhs2116Trigger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,22 @@ public ConfigureRhs2116Trigger()
{
}

/// <summary>
/// Copy constructor for the <see cref="ConfigureRhs2116Trigger"/> class.
/// </summary>
/// <param name="rhs2116Trigger">Existing <see cref="ConfigureRhs2116Trigger"/> object.</param>
public ConfigureRhs2116Trigger(ConfigureRhs2116Trigger rhs2116Trigger)
: this()
{
Enable = rhs2116Trigger.Enable;
DeviceAddress = rhs2116Trigger.DeviceAddress;
DeviceName = rhs2116Trigger.DeviceName;
TriggerSource = rhs2116Trigger.TriggerSource;
ProbeGroup = rhs2116Trigger.ProbeGroup;
Armed = rhs2116Trigger.Armed;
StimulusSequence = new(rhs2116Trigger.StimulusSequence);
}

/// <summary>
/// Gets or sets the device enable state.
/// </summary>
Expand Down