fast-feedback virtual target task code on STM Nucleo

Dependencies:   mbed

Revision:
20:4c06d3041337
Parent:
19:50663f8815b8
Child:
22:41163fb3fdc6
--- a/trial.cpp	Mon Jul 02 08:26:44 2018 +0000
+++ b/trial.cpp	Mon Jul 02 09:04:45 2018 +0000
@@ -6,13 +6,17 @@
 
 const uint64_t MicrosecondsInSecond = 1000000;
 
-void TrialFlag::reset() {
+inline uint64_t calc_blink_duration(const uint16_t& freq) {
+    return (freq == 0)? 0 : (MicrosecondsInSecond/(freq * 2));
+}
+
+void TrialFlag::clear() {
     cued        = false;
     responded   = false;
     reset       = false;
 }
 
-void writeToSerial() {
+void TrialFlag::writeToSerial() {
     if (reset) {
         IO::write("reset");
     } else if (cued) {
@@ -24,27 +28,22 @@
 
 void Trial::reset(const Task& task){
     // reset score
-    flag.reset();
+    flag.clear();
     
     // set delay duration
     delay_dur_ms  = task.delay_min_ms.value
                     + random::exponential(task.delay_var_ms.value, task.delay_var_ms.value*3);
-    
-    aud_ticker_cycle = MicrosecondsInSecond/(task.aud_tick_hz.value * 2);
                     
-    // generate visual stimulus
+    // generate stimuli
+    audioOut.setEnabled(false);
     visualOut.setEnabled(false);
     vis_dur_us      = 0;
     vis_onset_us    = 0;
     
     switch (task.mode.value) {
     case Pair:
-        vis_onset_us    = ms_to_us(task.pre_min_ms.value);
-        vis_dur_us      = ms_to_us(task.vis_avg_ms.value);
-        visualOut.setEnabled(true);
-        visualOut.setOnset(vis_onset_us);
-        visualOut.setDuration(vis_dur_us);
-        rewardOut.setOnset(ms_to_us(task.reward_on_ms.value));
+        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:
@@ -55,6 +54,12 @@
     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) );
+        }
         break;
     }
     
@@ -72,17 +77,17 @@
     const uint32_t  mindur_us   = ms_to_us(task.vis_min_ms.value);
     const double    failure_perc = (task.vis_fail_perc.value > 0)? ((double)(task.vis_fail_perc.value)):1e-6;
     
-    const double    onsetvar    = (double)(phasedur_us - minonset_us - respdur_us - mindur_us);
-    const double    taudenom    = ::log(100.0) - ::log(failure_perc);
-    const double    ftau        = onsetvar/taudenom;
+    const double    onset_vrng  = (double)(phasedur_us - minonset_us - respdur_us - mindur_us);
+    const double    logdecay    = ::log(100.0) - ::log(failure_perc);
+    const double    ftau        = onset_vrng/logdecay;
     const uint32_t  tau         = (uint32_t)(ftau + 0.5);
-    const uint32_t  onset_us    = random::exponential(tau, onsetvar+10) + minonset_us;
-    const uint32_t  maxonset_us = onsetvar + minonset_us;
+    const uint32_t  onset_us    = random::exponential(tau, onset_vrng+10) + minonset_us;
+    const uint32_t  maxonset_us = onset_vrng + minonset_us;
     
-    if (onset_us < maxonset_us) {
+    if ((onset_us > 0) && (onset_us < maxonset_us)) {
         // generate duration
-        const uint32_t durvar   = maxonset_us - onset_us;
-        const uint32_t dur_us   = random::exponential(avgdur_us - mindur_us, durvar) + mindur_us;
+        const uint32_t dur_vrng = maxonset_us - onset_us;
+        const uint32_t dur_us   = random::exponential(avgdur_us - mindur_us, dur_vrng) + mindur_us;
         
         visualOut.setEnabled(true);
         visualOut.setDuration(dur_us);
@@ -90,11 +95,13 @@
         
         vis_dur_us      = dur_us;
         vis_onset_us    = onset_us;
+        IO::debug("visual(onset=%u,dur=%u)",vis_onset_us,vis_dur_us);
     } else {
         // no pulse
         visualOut.setEnabled(false);
         vis_dur_us      = 0;
         vis_onset_us    = 0;
+        IO::debug("visual(disabled)");
     }
 }
 
@@ -123,7 +130,7 @@
     
     IO::write(";wait%u", waiting);
     
-    if (visualOut.isEnabled() && (response != Responses::Reset)) {
+    if (visualOut.isEnabled() && (!flag.reset)) {
         IO::write(";visual(onset%u,duration%u)",vis_onset_us,vis_dur_us);
     }