Skip to content

Commit fec6133

Browse files
jonnewbparks13
authored andcommitted
Add Enable property to ConfigureHeadstage64*Stimulator
1 parent 3c737a2 commit fec6133

File tree

2 files changed

+31
-35
lines changed

2 files changed

+31
-35
lines changed

OpenEphys.Onix1/ConfigureHeadstage64ElectricalStimulator.cs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ public ConfigureHeadstage64ElectricalStimulator()
4141
{
4242
}
4343

44-
45-
4644
/// <summary>
4745
/// Copy constructor for the <see cref="ConfigureHeadstage64ElectricalStimulator"/> class.
4846
/// </summary>
@@ -51,6 +49,7 @@ public ConfigureHeadstage64ElectricalStimulator(ConfigureHeadstage64ElectricalSt
5149
{
5250
DeviceName = electricalStimulator.DeviceName;
5351
DeviceAddress = electricalStimulator.DeviceAddress;
52+
Enable = electricalStimulator.Enable;
5453
StimEnable = electricalStimulator.StimEnable;
5554
PowerEnable = electricalStimulator.PowerEnable;
5655
TriggerDelay = electricalStimulator.TriggerDelay;
@@ -66,7 +65,6 @@ public ConfigureHeadstage64ElectricalStimulator(ConfigureHeadstage64ElectricalSt
6665
TrainBurstCount = electricalStimulator.TrainBurstCount;
6766
}
6867

69-
7068
/// <summary>
7169
/// Gets or sets the data enable state.
7270
/// </summary>
@@ -88,16 +86,16 @@ public ConfigureHeadstage64ElectricalStimulator(ConfigureHeadstage64ElectricalSt
8886
[Category(AcquisitionCategory)]
8987
public bool StimEnable { get; set; } = true;
9088

91-
/// <summary>
92-
/// Gets or sets the electrical stimulator's power state.
93-
/// </summary>
94-
/// <remarks>
95-
/// If set to true, then the electrical stimulator's ±15V power supplies will be turned on. If set to false,
96-
/// they will be turned off. It may be desirable to power down the electrical stimulator's power supplies outside
97-
/// of stimulation windows to reduce power consumption and electrical noise. This property must be set to true
98-
/// in order for electrical stimuli to be delivered properly. It takes ~10 milliseconds for these supplies to stabilize.
99-
/// </remarks>
100-
[Description("Stimulator power on/off.")]
89+
/// <summary>
90+
/// Gets or sets the electrical stimulator's power state.
91+
/// </summary>
92+
/// <remarks>
93+
/// If set to true, then the electrical stimulator's ±15V power supplies will be turned on. If set to false,
94+
/// they will be turned off. It may be desirable to power down the electrical stimulator's power supplies outside
95+
/// of stimulation windows to reduce power consumption and electrical noise. This property must be set to true
96+
/// in order for electrical stimuli to be delivered properly. It takes ~10 milliseconds for these supplies to stabilize.
97+
/// </remarks>
98+
[Description("Stimulator power on/off.")]
10199
[Category(AcquisitionCategory)]
102100
public bool PowerEnable
103101
{
@@ -117,7 +115,7 @@ public uint TriggerDelay
117115
set => triggerDelay.OnNext(value);
118116
}
119117

120-
static double VerifyCurrentLimits(double value)
118+
static double ClampCurrent(double value)
121119
{
122120
if (value > Headstage64ElectricalStimulator.AbsMaxMicroAmps)
123121
return Headstage64ElectricalStimulator.AbsMaxMicroAmps;
@@ -138,7 +136,7 @@ static double VerifyCurrentLimits(double value)
138136
public double PhaseOneCurrent
139137
{
140138
get => phaseOneCurrent.Value;
141-
set => phaseOneCurrent.OnNext(VerifyCurrentLimits(value));
139+
set => phaseOneCurrent.OnNext(ClampCurrent(value));
142140
}
143141

144142
/// <summary>
@@ -152,7 +150,7 @@ public double PhaseOneCurrent
152150
public double InterPhaseCurrent
153151
{
154152
get => interPhaseCurrent.Value;
155-
set => interPhaseCurrent.OnNext(VerifyCurrentLimits(value));
153+
set => interPhaseCurrent.OnNext(ClampCurrent(value));
156154
}
157155

158156
/// <summary>
@@ -166,7 +164,7 @@ public double InterPhaseCurrent
166164
public double PhaseTwoCurrent
167165
{
168166
get => phaseTwoCurrent.Value;
169-
set => phaseTwoCurrent.OnNext(VerifyCurrentLimits(value));
167+
set => phaseTwoCurrent.OnNext(ClampCurrent(value));
170168
}
171169

172170
/// <summary>
@@ -277,7 +275,7 @@ public override IObservable<ContextTask> Process(IObservable<ContextTask> source
277275

278276
return new CompositeDisposable(
279277
stimEnable.SubscribeSafe(observer, value =>
280-
device.WriteRegister(Headstage64ElectricalStimulator.ENABLE, value ? 1u : 0u)),
278+
device.WriteRegister(Headstage64ElectricalStimulator.STIMENABLE, value ? 1u : 0u)),
281279
phaseOneCurrent.SubscribeSafe(observer, value =>
282280
device.WriteRegister(Headstage64ElectricalStimulator.CURRENT1, Headstage64ElectricalStimulator.MicroampsToCode(value))),
283281
interPhaseCurrent.SubscribeSafe(observer, value =>

OpenEphys.Onix1/ConfigureHeadstage64OpticalStimulator.cs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ public class ConfigureHeadstage64OpticalStimulator : SingleDeviceFactory
3030
readonly BehaviorSubject<uint> burstsPerTrain = new(1);
3131
readonly BehaviorSubject<double> delay = new(0);
3232

33-
3433
/// <summary>
3534
/// Initializes a new instance of the <see cref="ConfigureHeadstage64OpticalStimulator"/> class.
3635
/// </summary>
@@ -48,6 +47,7 @@ public ConfigureHeadstage64OpticalStimulator(ConfigureHeadstage64OpticalStimulat
4847
DeviceName = opticalStimulator.DeviceName;
4948
DeviceAddress = opticalStimulator.DeviceAddress;
5049
Enable = opticalStimulator.Enable;
50+
StimEnable = opticalStimulator.StimEnable;
5151
Delay = opticalStimulator.Delay;
5252
MaxCurrent = opticalStimulator.MaxCurrent;
5353
ChannelOneCurrent = opticalStimulator.ChannelOneCurrent;
@@ -59,12 +59,6 @@ public ConfigureHeadstage64OpticalStimulator(ConfigureHeadstage64OpticalStimulat
5959
BurstsPerTrain = opticalStimulator.BurstsPerTrain;
6060
}
6161

62-
static double VerifyValueLimits(double value, double min, double max) =>
63-
Math.Min(Math.Max(value, min), max);
64-
65-
static uint VerifyValueLimits(uint value, uint min, uint max) =>
66-
Math.Min(Math.Max(value, min), max);
67-
6862
/// <summary>
6963
/// Gets or sets the data enable state.
7064
/// </summary>
@@ -101,7 +95,7 @@ public bool StimEnable
10195
public double Delay
10296
{
10397
get => delay.Value;
104-
set => delay.OnNext(VerifyValueLimits(value, Headstage64OpticalStimulator.MinDelay, Headstage64OpticalStimulator.MaxDelay));
98+
set => delay.OnNext(Clamp(value, Headstage64OpticalStimulator.MinDelay, Headstage64OpticalStimulator.MaxDelay));
10599
}
106100

107101
/// <summary>
@@ -122,12 +116,12 @@ public double Delay
122116
public double MaxCurrent
123117
{
124118
get => maxCurrent.Value;
125-
set => maxCurrent.OnNext(VerifyValueLimits(value, Headstage64OpticalStimulator.MinCurrent, Headstage64OpticalStimulator.MaxCurrent));
119+
set => maxCurrent.OnNext(Clamp(value, Headstage64OpticalStimulator.MinCurrent, Headstage64OpticalStimulator.MaxCurrent));
126120
}
127121

128122
static double VerifyChannelPercentage(double value, double min, double max, double step)
129123
{
130-
value = VerifyValueLimits(value, min, max);
124+
value = Clamp(value, min, max);
131125

132126
return Math.Round(value / step) * step;
133127
}
@@ -177,7 +171,7 @@ public double ChannelTwoCurrent
177171
public double PulseDuration
178172
{
179173
get => pulseDuration.Value;
180-
set => pulseDuration.OnNext(VerifyValueLimits(value, Headstage64OpticalStimulator.MinPulseDuration, Headstage64OpticalStimulator.MaxPulseDuration));
174+
set => pulseDuration.OnNext(Clamp(value, Headstage64OpticalStimulator.MinPulseDuration, Headstage64OpticalStimulator.MaxPulseDuration));
181175
}
182176

183177
/// <summary>
@@ -191,7 +185,7 @@ public double PulseDuration
191185
public double PulsesPerSecond
192186
{
193187
get => pulsesPerSecond.Value;
194-
set => pulsesPerSecond.OnNext(VerifyValueLimits(value, Headstage64OpticalStimulator.MinPulsePeriod, Headstage64OpticalStimulator.MaxPulsePeriod));
188+
set => pulsesPerSecond.OnNext(Clamp(value, Headstage64OpticalStimulator.MinPulsePeriod, Headstage64OpticalStimulator.MaxPulsePeriod));
195189
}
196190

197191
/// <summary>
@@ -205,7 +199,7 @@ public double PulsesPerSecond
205199
public uint PulsesPerBurst
206200
{
207201
get => pulsesPerBurst.Value;
208-
set => pulsesPerBurst.OnNext(VerifyValueLimits(value, 1, int.MaxValue));
202+
set => pulsesPerBurst.OnNext(Clamp(value, 1, int.MaxValue));
209203
}
210204

211205
/// <summary>
@@ -219,7 +213,7 @@ public uint PulsesPerBurst
219213
public double InterBurstInterval
220214
{
221215
get => interBurstInterval.Value;
222-
set => interBurstInterval.OnNext(VerifyValueLimits(value, Headstage64OpticalStimulator.MinInterBurstInterval, Headstage64OpticalStimulator.MaxInterBurstInterval));
216+
set => interBurstInterval.OnNext(Clamp(value, Headstage64OpticalStimulator.MinInterBurstInterval, Headstage64OpticalStimulator.MaxInterBurstInterval));
223217
}
224218

225219
/// <summary>
@@ -233,7 +227,7 @@ public double InterBurstInterval
233227
public uint BurstsPerTrain
234228
{
235229
get => burstsPerTrain.Value;
236-
set => burstsPerTrain.OnNext(VerifyValueLimits(value, 1, int.MaxValue));
230+
set => burstsPerTrain.OnNext(Clamp(value, 1, int.MaxValue));
237231
}
238232

239233
// TODO: Should this be checked before TRIGGER is written to below and an error thrown if
@@ -253,6 +247,12 @@ public double BurstCurrent
253247
}
254248
}
255249

250+
static double Clamp(double value, double min, double max) =>
251+
Math.Min(Math.Max(value, min), max);
252+
253+
static uint Clamp(uint value, uint min, uint max) =>
254+
Math.Min(Math.Max(value, min), max);
255+
256256
/// <summary>
257257
/// Configure a headstage-64 dual-channel optical stimulator.
258258
/// </summary>
@@ -269,13 +269,11 @@ public override IObservable<ContextTask> Process(IObservable<ContextTask> source
269269
var deviceName = DeviceName;
270270
var deviceAddress = DeviceAddress;
271271
var enable = Enable;
272-
273272
return source.ConfigureDevice((context, observer) =>
274273
{
275274
var device = context.GetDeviceContext(deviceAddress, DeviceType);
276275

277276
device.WriteRegister(Headstage64OpticalStimulator.ENABLE, enable ? 1u : 0u);
278-
device.WriteRegister(Headstage64OpticalStimulator.STIMENABLE, 0u);
279277

280278
uint currentSourceMask = 0;
281279
static uint percentToPulseMask(int channel, double percent, uint oldMask)

0 commit comments

Comments
 (0)