142142/// @brief Fill the #ACD_DAQSettings structure from a specially crafted string
143143Function ACD_InitDAQSettingsFromString ( STRUCT ACD_DAQSettings &s, string str)
144144
145- variable md, ra, idx, lidx, bkg_daq, res, headstage, clampMode, ttl
145+ variable md, ra, idx, lidx, bkg_daq, res, headstage, clampMode, ttl, async
146146 string elem, output
147147
148148 sscanf str, "MD%d_RA%d_I%d_L%d_BKG%d" , md, ra, idx, lidx, bkg_daq
@@ -176,6 +176,8 @@ Function ACD_InitDAQSettingsFromString(STRUCT ACD_DAQSettings &s, string str)
176176
177177 s. tbp = ACD_ParseNumber ( str, "_TBP" , defValue = NaN )
178178
179+ s. tad = ACD_ParseNumber ( str, "_TAD" , defValue = 0 )
180+
179181 // default to DAQ if nothing is choosen
180182 if ( IsNaN ( s. daq) && IsNaN ( s. tp))
181183 s. daq = 1
@@ -216,6 +218,13 @@ Function ACD_InitDAQSettingsFromString(STRUCT ACD_DAQSettings &s, string str)
216218 Make / FREE/ N= ( NUM_HEADSTAGES) s. da = NaN
217219 Make / FREE/ N= ( NUM_HEADSTAGES) s. cm = NaN
218220 Make / FREE/ N= ( NUM_HEADSTAGES) s. aso = NaN
221+ Make / FREE/ N= ( NUM_HEADSTAGES) s. ab = NaN
222+ Make / FREE/ N= ( NUM_HEADSTAGES) / D s. abv = NaN
223+ Make / FREE/ N= ( NUM_HEADSTAGES) / D s. abvv = NaN
224+ Make / FREE/ N= ( NUM_HEADSTAGES) s. asyncAD = NaN
225+ Make / FREE/ N= ( NUM_HEADSTAGES) s. asyncAlarm = NaN
226+ Make / FREE/ N= ( NUM_HEADSTAGES) / D s. da_scale = NaN
227+
219228 Make / FREE/ T/ N= ( NUM_HEADSTAGES) s. st, s. ist, s. af, s. st_ttl, s. iaf
220229
221230 for ( elem : hsConfig)
@@ -227,6 +236,12 @@ Function ACD_InitDAQSettingsFromString(STRUCT ACD_DAQSettings &s, string str)
227236
228237 s. st_ttl[ ttl] = ACD_ParseString ( elem, "_ST" , defValue = "" )
229238 continue
239+ elseif ( GrepString ( elem, "^ASYNC" ))
240+ async = ACD_ParseNumber ( elem, "ASYNC" )
241+ s. asyncAD[ async] = 1
242+
243+ s. asyncAlarm[ async] = ACD_ParseNumber ( elem, "_ALARM" )
244+ continue
230245 endif
231246
232247 headstage = ACD_ParseNumber ( elem, "HS" )
@@ -262,6 +277,12 @@ Function ACD_InitDAQSettingsFromString(STRUCT ACD_DAQSettings &s, string str)
262277 s. iaf[ headstage] = ACD_ParseString ( elem, "_IAF" , defValue = "" )
263278
264279 s. aso[ headstage] = ACD_ParseNumber ( elem, "_ASO" , defValue = 1 )
280+
281+ s. ab[ headstage] = ACD_ParseNumber ( str, "_AB" , defValue = NaN )
282+ s. abv[ headstage] = ACD_ParseNumber ( str, "_ABV" , defValue = NaN )
283+ s. abvv[ headstage] = ACD_ParseNumber ( str, "_ABVV" , defValue = NaN )
284+
285+ s. da_scale[ headstage] = ACD_ParseNumber ( elem, "_DS" , defValue = NaN )
265286 endfor
266287 endif
267288End
324345/// - TP Baseline Percentage: (TBP: [25, 49])
325346/// - Fixed frequency acquisition: (FFR: see @ref DAP_GetSamplingFrequencies() for available values)
326347/// - TP Duration: (TPD: [5, inf[)
348+ /// - TP Amplitute IC: (TAI) @todo check if this is really HS independent
349+ /// - TP After DAQ: (TAD: 1/0)
327350///
328351/// HeadstageConfig:
329352/// - Full specification: __HSXX_ADXX_DAXX_CM:XX:_ST:XX:_IST:XX:_AF:XX:_IAF:XX:_ASOXX
333356/// - DA
334357/// - CM (VC/IC/IZ): clamp mode
335358/// Optional:
359+ /// - TAI: Testpulse Amplitude IC
336360/// - ST: stimulus set
337361/// - IST: indexing stimulus set
338362/// - AF: analysis function for stimulus set
347371/// Optional:
348372/// - ST: TTL stimulus set
349373///
374+ /// AsyncConfig:
375+ /// - Full specification: __ASYNCXX_ADXX_AlARMXX_TTE:XX:_UN:XX:
376+ /// TODO
377+ ///
350378/// For tweaking data acquisition with full flexibility we also support
351379/// customization functions before initialization, preInit aka before the DAEphys
352380/// panel is created, and before acquisition, preAcq aka before the Start DAQ/TP
@@ -407,7 +435,7 @@ Function ACD_AcquireData(STRUCT ACD_DAQSettings &s, string device)
407435 PGC_SetAndActivateControl ( device, "Popup_Settings_IC_AD" , str = num2str ( s. ad[ i ]))
408436#endif // !TESTS_WITH_SUTTER_HARDWARE
409437
410- if ( s. aso[ i ] != 1 )
438+ if ( WaveExists ( s . aso ) && s. aso[ i ] != 1 )
411439#ifdef TESTS_WITH_SUTTER_HARDWARE
412440 INFO ( "Unassociated channel %d is setup on an existing HS" , n0 = i )
413441 CHECK_GT_VAR ( i + 1, deviceInfo[ % DA])
@@ -467,6 +495,17 @@ Function ACD_AcquireData(STRUCT ACD_DAQSettings &s, string device)
467495 PGC_SetAndActivateControl ( device, ctrl, val = 1 )
468496 DoUpdate / W=$ device
469497
498+ if ( s. cm[ i ] == I_CLAMP_MODE)
499+ PGC_SetAndActivateControl ( device, "check_DataAcq_AutoBias" , val = s. ab[ i ])
500+ PGC_SetAndActivateControl ( device, "setvar_DataAcq_AutoBiasV" , val = s. abv[ i ])
501+ PGC_SetAndActivateControl ( device, "setvar_DataAcq_AutoBiasVrange" , val = s. abvv[ i ])
502+ endif
503+
504+ if ( IsFinite ( s. da_scale[ i ]))
505+ ctrl = GetPanelControl ( s. da[ i ] , CHANNEL_TYPE_DAC, CHANNEL_CONTROL_SCALE)
506+ PGC_SetAndActivateControl ( device, ctrl, val = s. da_scale[ i ])
507+ endif
508+
470509 activeHS += 1
471510 endfor
472511
@@ -492,6 +531,31 @@ Function ACD_AcquireData(STRUCT ACD_DAQSettings &s, string device)
492531 endif
493532 endfor
494533
534+ for ( i = 0; i < NUM_ASYNC_CHANNELS; i += 1 )
535+
536+ if ( s. asyncAD[ i ] != 1 )
537+ continue
538+ endif
539+
540+ ctrl = GetPanelControl ( i , CHANNEL_TYPE_ASYNC, CHANNEL_CONTROL_CHECK)
541+ PGC_SetAndActivateControl ( device, ctrl, val = s. asyncAD[ i ])
542+
543+ ctrl = GetPanelControl ( i , CHANNEL_TYPE_ALARM, CHANNEL_CONTROL_CHECK)
544+ PGC_SetAndActivateControl ( device, ctrl, val = s. asyncAlarm[ i ])
545+
546+ ctrl = GetPanelControl ( i , CHANNEL_TYPE_ASYNC, CHANNEL_CONTROL_ALARM_MIN)
547+ PGC_SetAndActivateControl ( device, ctrl, val = s. asyncAlarmMin[ i ])
548+
549+ ctrl = GetPanelControl ( i , CHANNEL_TYPE_ASYNC, CHANNEL_CONTROL_ALARM_MAX)
550+ PGC_SetAndActivateControl ( device, ctrl, val = s. asyncAlarmMax[ i ])
551+
552+ ctrl = GetPanelControl ( i , CHANNEL_TYPE_ASYNC, CHANNEL_CONTROL_TITLE)
553+ PGC_SetAndActivateControl ( device, ctrl, str = s. asyncTitle[ i ])
554+
555+ ctrl = GetPanelControl ( i , CHANNEL_TYPE_ASYNC, CHANNEL_CONTROL_UNIT)
556+ PGC_SetAndActivateControl ( device, ctrl, str = s. asyncUnit[ i ])
557+ endfor
558+
495559 PGC_SetAndActivateControl ( device, "check_Settings_RequireAmpConn" , val = ( s. amp ? CHECKBOX_SELECTED : CHECKBOX_UNSELECTED))
496560 PGC_SetAndActivateControl ( device, "check_Settings_MD" , val = s. MD)
497561 PGC_SetAndActivateControl ( device, "Check_DataAcq1_RepeatAcq" , val = s. RA)
@@ -505,6 +569,8 @@ Function ACD_AcquireData(STRUCT ACD_DAQSettings &s, string device)
505569 PGC_SetAndActivateControl ( device, "setvar_DataAcq_TerminationDelay" , val = s. td)
506570 PGC_SetAndActivateControl ( device, "Setvar_DataAcq_dDAQDelay" , val = s. ddl)
507571
572+ PGC_SetAndActivateControl ( device, "check_Settings_TPAfterDAQ" , val = s. tad)
573+
508574 PGC_SetAndActivateControl ( device, "Check_DataAcq_Get_Set_ITI" , val = s. gsi)
509575
510576 PGC_SetAndActivateControl ( device, "Popup_Settings_SampIntMult" , str = num2str ( s. sim))
@@ -535,6 +601,10 @@ Function ACD_AcquireData(STRUCT ACD_DAQSettings &s, string device)
535601 PGC_SetAndActivateControl ( device, "SetVar_DataAcq_SetRepeats" , val = s. RES)
536602 PGC_SetAndActivateControl ( device, "check_Settings_TP_SaveTP" , val = s. STP)
537603
604+ if ( IsFinite ( s. TAI))
605+ PGC_SetAndActivateControl ( device, "SetVar_DataAcq_TPAmplitudeIC" , val = s. TAI)
606+ endif
607+
538608 if ( IsFinite ( s. TBP))
539609 PGC_SetAndActivateControl ( device, "SetVar_DataAcq_TPBaselinePerc" , val = s. TBP)
540610 endif
0 commit comments