fast-feedback virtual target task code on STM Nucleo

Dependencies:   mbed

task.cpp

Committer:
gwappa
Date:
2018-07-01
Revision:
17:0b241aa1f5b6
Parent:
16:33c17c62840e
Child:
18:66246d6c5476

File content as of revision 17:0b241aa1f5b6:

#include "task.h"
#include "utils.h"
#include "states.h"
#include "automaton.h"

Task::Task(const Mode& mode):
    mode(mode),
    delay_min_ms    (CHR_DELAY_MIN,     3000), 
    delay_var_ms    (CHR_DELAY_VAR,     3000),
    prep_dur_ms     (CHR_PREP_DUR,      1500),
    aud_dur_ms      (CHR_AUD_DUR,       4000),
    aud_tick_hz     (CHR_AUD_FREQ,      4),
    resp_dur_ms     (CHR_RESP_DUR,      1500),
    post_dur_ms     (CHR_POST_DUR,      4000),
    reward_on_ms    (CHR_REWARD_ONSET,  350),
    reward_dur_ms   (CHR_REWARD_DUR,    50),
    pre_min_ms      (CHR_PRE_MIN,       500),
    vis_min_ms      (CHR_VIS_MIN,       1),
    vis_avg_ms      (CHR_VIS_AVG,       100),
    vis_fail_perc   (CHR_VIS_FAIL,      30),
    test_reward     (CMD_TEST_REWARD, callback(this, &Task::testReward)),
    run             (CMD_EXECUTE,     callback(this, &Task::runTrial))
{ }

const char ModeSelection::CMD_ID_MODE        = '_';
const char ModeSelection::CMD_MODE_PAIR      = 'P';
const char ModeSelection::CMD_MODE_REPORT    = 'R';
const char ModeSelection::CMD_MODE_ASSOCIATE = 'A';
const char ModeSelection::CMD_MODE_MOTION    = 'M';
const char ModeSelection::CMD_MODE_MOTION_ALT= 'N';

ModeSelection::ModeSelection(const Mode& defaultValue):
    value(defaultValue) {
    config::addCommand(CMD_ID_MODE, this);
}

ModeSelection::~ModeSelection() { 
    config::removeCommand(CMD_ID_MODE);
}

bool ModeSelection::parse(const char& c) {
    switch(c) {
    case CMD_MODE_PAIR:         value = Pair;      return true;
    case CMD_MODE_REPORT:       value = Report;    return true;
    case CMD_MODE_ASSOCIATE:    value = Associate; return true;
    case CMD_MODE_MOTION:       value = Motion;    return true;
    case CMD_MODE_MOTION_ALT:   value = MotionAlt; return true;
    default:
        return false;
    }
}

bool ModeSelection::writeSettings() {
#define WRITE(CHR, VAL) if (value == (VAL)) { IO::write("[%c]",CHR); } else { IO::write("%c",CHR); }
    WRITE(CMD_MODE_PAIR,        Pair)
    WRITE(CMD_MODE_REPORT,      Report)
    WRITE(CMD_MODE_ASSOCIATE,   Associate)
    WRITE(CMD_MODE_MOTION,      Motion)
    WRITE(CMD_MODE_MOTION_ALT,  MotionAlt)
#undef WRITE
    return true;
}

void ModeSelection::echoback() { 
    IO::write(IO::CONFIG_HEADER);
    writeSettings();
    IO::write("\r\n");
}


void Task::testReward() {
    automaton::init<TestReward>();
    automaton::run();
    IO::result("done");
}
 
void Task::runTrial() {
    automaton::init<Delay>();
    automaton::run();
}

void Task::parseFromSerial() {
    config::handleSerial();
}

void Task::writeSettingsToSerial() {
    config::writeSettingsToSerial();
}