fast-feedback virtual target task code on STM Nucleo

Dependencies:   mbed

Revision:
24:e236faf66935
Parent:
23:61af0317e404
Child:
26:b4421d1ee57a
--- a/trial.cpp	Tue Jul 03 13:46:21 2018 +0000
+++ b/trial.cpp	Tue Jul 03 13:58:05 2018 +0000
@@ -34,32 +34,42 @@
     delay_dur_ms  = task.delay_min_ms.value
                     + random::exponential(task.delay_var_ms.value, task.delay_var_ms.value*3);
                     
-    // generate stimuli
+    // reset cues
     audioOut.setEnabled(false);
     visualOut.setEnabled(false);
     vis_dur_us      = 0;
     vis_onset_us    = 0;
     
+    // configure reward
+    rewardOut.setOnset(0);
+    rewardOut.setDuration(ms_to_us(task.reward_dur_ms.value));
+    
+    // configure cued state duration + visual stimulus position (if any)
     switch (task.mode.value) {
     case Pair:
-        visualOut.setBlinkDuration( calc_blink_duration(task.vis_blink_hz.value) );
-        assignRandomStim(task);
-        rewardOut.setDuration(ms_to_us(task.reward_dur_ms.value));
-        break;
     case Report:
     case Associate:
-        assignRandomStim(task);
-        // fallthrough
+        visualOut.setBlinkDuration( calc_blink_duration(task.vis_blink_hz.value) );
+        assignCues(task, true);
+        break;
     case Motion:
     case MotionAlt:
-        rewardOut.setOnset(0);
-        rewardOut.setDuration(ms_to_us(task.reward_dur_ms.value));
-        if (task.mode.value != Report) {
-            audioOut.setEnabled(true);
-            audioOut.setOnset(0);
-            audioOut.setDuration(ms_to_us(task.aud_dur_ms.value));
-            audioOut.setBlinkDuration( calc_blink_duration(task.aud_tick_hz.value) );
-        }
+        assignCues(task, false);
+        break;
+    }
+    
+    // assign Auditory cues (if any)
+    switch (task.mode.value) {
+    case Pair:
+    case Report:
+        break;
+    case Associate:
+    case Motion:
+    case MotionAlt:
+        audioOut.setEnabled(true);
+        audioOut.setOnset(0);
+        audioOut.setDuration(cued_dur_us);
+        audioOut.setBlinkDuration( calc_blink_duration(task.aud_tick_hz.value) );
         break;
     }
     
@@ -68,8 +78,17 @@
     whisking_events.clear();
 }
 
-void Trial::assignRandomStim(const Task& task)
+void Trial::assignCues(const Task& task, const bool& assignVisual)
 {
+    if (!assignVisual) {
+        visualOut.setEnabled(false);
+        vis_dur_us      = 0;
+        vis_onset_us    = 0;
+        
+        cued_dur_us     = ms_to_us(task.aud_dur_ms.value);
+        return;
+    }
+    
     const uint32_t  phasedur_us = ms_to_us(task.aud_dur_ms.value);
     const uint32_t  minonset_us = ms_to_us(task.pre_min_ms.value);
     const uint32_t  respdur_us  = ms_to_us(task.resp_dur_ms.value);
@@ -95,11 +114,16 @@
         
         vis_dur_us      = dur_us;
         vis_onset_us    = onset_us;
+        
+        cued_dur_us     = onset_us + dur_us + respdur_us;
+        
     } else {
         // no pulse
         visualOut.setEnabled(false);
         vis_dur_us      = 0;
         vis_onset_us    = 0;
+        
+        cued_dur_us     = phasedur_us;
     }
 }