Skip to content
Open
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
232 changes: 96 additions & 136 deletions OpenEphys.Onix1.Design/GenericStimulusSequenceDialog.Designer.cs

Large diffs are not rendered by default.

48 changes: 18 additions & 30 deletions OpenEphys.Onix1.Design/GenericStimulusSequenceDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,13 @@ namespace OpenEphys.Onix1.Design
/// </summary>
public partial class GenericStimulusSequenceDialog : Form
{
internal object Device
{
get => propertyGrid.SelectedObject;
set => propertyGrid.SelectedObject = value;
}

readonly int NumberOfChannels;
readonly bool UseProbeGroup;
readonly bool UseTable;

internal const double ZeroPeakToPeak = 1e-12;
internal readonly double ChannelScale = 1.1;
Expand All @@ -25,37 +29,22 @@ public partial class GenericStimulusSequenceDialog : Form
InitializeComponent();

NumberOfChannels = 0;
UseProbeGroup = true;
}

/// <summary>
/// Opens a dialog allowing for easy changing of stimulus sequence parameters, with visual feedback on what the resulting stimulus sequence looks like.
/// Opens a dialog allowing for easy changing of stimulus sequence parameters,
/// with visual feedback on what the resulting stimulus sequence looks like.
/// </summary>
public GenericStimulusSequenceDialog(int numberOfChannels, bool useProbeGroup, bool useTable = false)
public GenericStimulusSequenceDialog(object device, int numberOfChannels)
{
InitializeComponent();
Shown += FormShown;

NumberOfChannels = numberOfChannels;
UseProbeGroup = useProbeGroup;
UseTable = useTable;
Device = device;

if (!UseProbeGroup)
{
tableLayoutPanel1.Controls.Remove(panelProbe);
GroupBox gb = tableLayoutPanel1.Controls[nameof(groupBoxDefineStimuli)] as GroupBox;
tableLayoutPanel1.SetRow(gb, 0);
tableLayoutPanel1.SetRowSpan(gb, 2);
}

if (!UseTable)
{
panelWaveform.Controls.Remove(tabControlVisualization);
panelWaveform.Controls.Add(zedGraphWaveform);
}
NumberOfChannels = numberOfChannels;

InitializeZedGraphWaveform();
SetTableDataSource();

zedGraphWaveform.ZoomEvent += OnZoom_Waveform;
zedGraphWaveform.MouseMoveEvent += MouseMoveEvent;
Expand Down Expand Up @@ -210,8 +199,6 @@ internal void DrawStimulusWaveform(bool setZoomState = true)
return Math.Abs(val).ToString("0");
};

dataGridViewStimulusTable.Refresh();

if (setZoomState && XMin != 0 && XMax != 0)
{
zedGraphWaveform.GraphPane.XAxis.Scale.Min = XMin;
Expand Down Expand Up @@ -505,12 +492,6 @@ internal void HideMenuStrip()
menuStrip.Enabled = false;
}

internal virtual void SetTableDataSource()
{
if (UseTable)
throw new NotImplementedException();
}

void ResetZoom_Click(object sender, EventArgs e)
{
ResetZoom();
Expand All @@ -524,5 +505,12 @@ void ResetZoom()
zedGraphWaveform.Refresh();
}

void PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
var propertyGrid = (PropertyGrid)s;
UpdateControls(propertyGrid.SelectedObject);
}

internal virtual void UpdateControls(object obj) { throw new NotImplementedException(); }
}
}
4 changes: 2 additions & 2 deletions OpenEphys.Onix1.Design/Headstage64Dialog.Designer.cs

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

Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ public Headstage64ElectricalStimulatorOptions()
/// <param name="electricalStimulator"></param>
public Headstage64ElectricalStimulatorOptions(ConfigureHeadstage64ElectricalStimulator electricalStimulator)
: this()
{
UpdateControls(electricalStimulator);
}

internal void UpdateControls(ConfigureHeadstage64ElectricalStimulator electricalStimulator)
{
textBoxPhaseOneCurrent.Text = electricalStimulator.PhaseOneCurrent.ToString();
textBoxPhaseOneDuration.Text = electricalStimulator.PhaseOneDuration.ToString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ namespace OpenEphys.Onix1.Design
/// </summary>
public partial class Headstage64ElectricalStimulatorSequenceDialog : GenericStimulusSequenceDialog
{
internal readonly ConfigureHeadstage64ElectricalStimulator ElectricalStimulator;
internal ConfigureHeadstage64ElectricalStimulator ElectricalStimulator
{
get => (ConfigureHeadstage64ElectricalStimulator)Device;
}
readonly Headstage64ElectricalStimulatorOptions StimulusSequenceOptions;

readonly static int NumberOfChannels = 1;
Expand All @@ -27,34 +30,37 @@ public partial class Headstage64ElectricalStimulatorSequenceDialog : GenericStim
/// </summary>
/// <param name="electricalStimulator">Existing stimulus sequence.</param>
public Headstage64ElectricalStimulatorSequenceDialog(ConfigureHeadstage64ElectricalStimulator electricalStimulator)
: base(NumberOfChannels, false)
: base(new ConfigureHeadstage64ElectricalStimulator(electricalStimulator), NumberOfChannels)
{
InitializeComponent();
HideMenuStrip();

ElectricalStimulator = new(electricalStimulator);

StimulusSequenceOptions = new(ElectricalStimulator);
StimulusSequenceOptions.SetChildFormProperties(this);
groupBoxDefineStimuli.Controls.Add(StimulusSequenceOptions);
tabPageDefineStimuli.Controls.Add(StimulusSequenceOptions);

void refreshPropertyGrid() => propertyGrid.Refresh();

currentBindings = new()
{
{ StimulusSequenceOptions.textBoxPhaseOneCurrent,
new TextBoxBinding<double>(
StimulusSequenceOptions.textBoxPhaseOneCurrent,
value => { ElectricalStimulator.PhaseOneCurrent = value; return ElectricalStimulator.PhaseOneCurrent; },
double.Parse) },
double.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxInterPhaseCurrent,
new TextBoxBinding<double>(
StimulusSequenceOptions.textBoxInterPhaseCurrent,
value => { ElectricalStimulator.InterPhaseCurrent = value; return ElectricalStimulator.InterPhaseCurrent; },
double.Parse) },
double.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxPhaseTwoCurrent,
new TextBoxBinding<double>(
StimulusSequenceOptions.textBoxPhaseTwoCurrent,
value => { ElectricalStimulator.PhaseTwoCurrent = value; return ElectricalStimulator.PhaseTwoCurrent; },
double.Parse) }
double.Parse,
onChanged: refreshPropertyGrid) }
};

timeBindings = new Dictionary<TextBox, TextBoxBinding<uint>>
Expand All @@ -63,32 +69,38 @@ public Headstage64ElectricalStimulatorSequenceDialog(ConfigureHeadstage64Electri
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxPhaseOneDuration,
value => { ElectricalStimulator.PhaseOneDuration = value; return ElectricalStimulator.PhaseOneDuration; },
uint.Parse) },
uint.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxPhaseTwoDuration,
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxPhaseTwoDuration,
value => { ElectricalStimulator.PhaseTwoDuration = value; return ElectricalStimulator.PhaseTwoDuration; },
uint.Parse) },
uint.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxInterPhaseDuration,
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxInterPhaseDuration,
value => { ElectricalStimulator.InterPhaseInterval = value; return ElectricalStimulator.InterPhaseInterval; },
uint.Parse) },
uint.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxInterBurstInterval,
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxInterBurstInterval,
value => { ElectricalStimulator.InterBurstInterval = value; return ElectricalStimulator.InterBurstInterval; },
uint.Parse) },
uint.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxPulsePeriod,
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxPulsePeriod,
value => { ElectricalStimulator.InterPulseInterval = value; return ElectricalStimulator.InterPulseInterval; },
uint.Parse) },
uint.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxTrainDelay,
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxTrainDelay,
value => { ElectricalStimulator.TriggerDelay = value; return ElectricalStimulator.TriggerDelay; },
uint.Parse) }
uint.Parse,
onChanged: refreshPropertyGrid) }
};

countBindings = new Dictionary<TextBox, TextBoxBinding<uint>>
Expand All @@ -97,12 +109,14 @@ public Headstage64ElectricalStimulatorSequenceDialog(ConfigureHeadstage64Electri
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxBurstPulseCount,
value => { ElectricalStimulator.BurstPulseCount = value; return ElectricalStimulator.BurstPulseCount; },
uint.Parse) },
uint.Parse,
onChanged: refreshPropertyGrid) },
{ StimulusSequenceOptions.textBoxTrainBurstCount,
new TextBoxBinding<uint>(
StimulusSequenceOptions.textBoxTrainBurstCount,
value => { ElectricalStimulator.TrainBurstCount = value; return ElectricalStimulator.TrainBurstCount; },
uint.Parse) }
uint.Parse,
onChanged: refreshPropertyGrid) }
};

foreach (var binding in currentBindings)
Expand Down Expand Up @@ -157,7 +171,6 @@ void TextBoxChanged(object sender, EventArgs e)
throw new Exception($"No valid text box found when updating parameters in {nameof(Headstage64ElectricalStimulatorSequenceDialog)}");
}

SetStatusValidity();
DrawStimulusWaveform();
}
}
Expand Down Expand Up @@ -325,5 +338,12 @@ internal override void SetStatusValidity()
toolStripStatusIsValid.Text = "Warning: " + reason;
}
}

internal override void UpdateControls(object obj)
{
StimulusSequenceOptions.UpdateControls((ConfigureHeadstage64ElectricalStimulator)obj);

DrawStimulusWaveform();
}
}
}
Loading