fast-feedback virtual target task code on STM Nucleo

Dependencies:   mbed

trial.cpp

Committer:
gwappa
Date:
2018-06-25
Revision:
12:06ea96546af1
Parent:
11:897ecd5413e0
Child:
13:8ea85a33e37a

File content as of revision 12:06ea96546af1:

#include "trial.h"
#include "rig.h"
#include "IO.h"
#include "random.h"

const uint64_t MicrosecondsInSecond = 1000000;

void Trial::reset(const Task& task){
    // reset score
    response      = TrialFlags::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);
                    
    // TODO: generate visual stimulus (sequence) here
    
    // reset interrupt events
    licking_events.clear();
    whisking_events.clear();
}

void Trial::markTrialStart() {
    starting = timer.read_ms();
    trialStart.run();
    timer.start();
}

void Trial::markEndOfWait() {
    cuestarting = timer.read_ms();
    waiting     = cuestarting - starting;
}

void Trial::markTrialEnd() {
    trialEnd.run();
    trialEnd.wait();
    writeToSerial();
    timer.stop();
    timer.reset();
}

void Trial::writeToSerial() {
    switch(response){
#define WRITE_SCORE(SC,REPR) case SC: IO::write("%c%s;",IO::RESULT_HEADER,REPR); break;
        WRITE_SCORE(Responses::Hit,     "hit")
        WRITE_SCORE(Responses::Miss,    "miss")
        WRITE_SCORE(Responses::Catch,   "catch")
        WRITE_SCORE(Responses::Reject,  "reject")
        WRITE_SCORE(Responses::Reset,   "reset")
#undef WRITE_SCORE
        case Responses::NA:
        default:
            IO::write("%c%s(%x);",IO::RESULT_HEADER,"na",response);
    }
    
    IO::write("wait%u",waiting);
    trialtime_t zero = (response == Responses::Reset)? starting : cuestarting;
    IO::write(";whisk");
    whisking_events.writeToSerial(zero);
    IO::write(";lick");
    licking_events.writeToSerial(zero);
    IO::write(";\r\n");
}