Keisuke Sehara
/
STM32_Whisking
fast-feedback virtual target task code on STM Nucleo
Diff: trial.cpp
- 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); }