fast-feedback virtual target task code on STM Nucleo

Dependencies:   mbed

task.cpp

Committer:
gwappa
Date:
2018-05-24
Revision:
5:849446d19406
Parent:
4:fcf597f82632
Child:
6:13d180af7501

File content as of revision 5:849446d19406:

#include "task.h"
#include "IO.h"
#include "utils.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,  3000),
    cue_dur_ms  (CHR_CUE_DUR,   3000),
    post_dur_ms (CHR_POST_DUR,  4000),
    reward_ms   (CHR_REWARD_DUR,10),
    test_reward (CMD_TEST_REWARD, callback(this, &Task::testReward)),
    run         (CMD_EXECUTE,     callback(this, &Task::runTrial))
{ }

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_APPEAR:   value = Appear;    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_APPEAR, Appear)
#undef WRITE
    return true;
}

void ModeSelection::echoback() { 
    IO::write(IO::CONFIG_HEADER);
    writeSettings();
}


void Task::testReward() {
    // Cued::turnOnReward();
    // while(Cued::phase != Cued::Done);
    // LOG_REWARDED
}
 
void Task::runTrial() {
    // TRIAL_STARTING
    automaton::run();
}

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

void Task::writeSettingsToSerial() {
    config::writeSettingsToSerial();
}
       
/*
void Task::parseFromSerial() {
    char in = IO::getc();
    
    if (isWhitespace(in)) {
        return;
    }
    
    switch(in) {
    case CMD_TEST_REWARD:
        // Cued::turnOnReward();
        // while(Cued::phase != Cued::Done);
        // LOG_REWARDED
        IO::result("done");
        break;
    
    case CMD_EXECUTE:
        // TRIAL_STARTING
        automaton::run();
        IO::result("done");
        break;
    
    case '?': writeSettingsToSerial(); break;
    case CMD_MODE_PAIR:   mode = Pair;   writeModeToSerial(); break;
    case CMD_MODE_REPORT: mode = Report; writeModeToSerial(); break;
    case CMD_MODE_APPEAR: mode = Appear; writeModeToSerial(); break;
#define PARSE(CHR, PARAM) case (CHR): PARAM = parseUnsignedFromSerial<uint16_t>(PARAM);\
        IO::config("%c%u",(CHR),(PARAM)); break;
    
    PARSE(CHR_DELAY_MIN,    delay_min_ms)
    PARSE(CHR_DELAY_VAR,    delay_var_ms)
    PARSE(CHR_PREP_DUR,     prep_dur_ms)
    PARSE(CHR_CUE_DUR,      cue_dur_ms)
    PARSE(CHR_POST_DUR,     post_dur_ms)
    PARSE(CHR_REWARD_DUR,   reward_ms)
#undef PARSE
    default:
        IO::error("%c",in);
        break;
    }
}

    
void Task::writeSettingsToSerial()
{
    writeModeToSerial(false);
    IO::write(STR_DELIMITER);
#define WRITE(CHR, PARAM, END) IO::write("%c%u",CHR,PARAM); if (END) { IO::write(STR_NEWLINE); } else { IO::write(STR_DELIMITER); }
    WRITE(CHR_DELAY_MIN,  delay_min_ms,   false)
    WRITE(CHR_DELAY_VAR,  delay_var_ms,   false)
    WRITE(CHR_PREP_DUR,   prep_dur_ms,    false)
    WRITE(CHR_CUE_DUR,    cue_dur_ms,     false)
    WRITE(CHR_POST_DUR,   post_dur_ms,    false)
    WRITE(CHR_REWARD_DUR, reward_ms,      true)
#undef WRITE
}

void Task::writeModeToSerial(bool newline){
    IO::write(IO::CONFIG_HEADER);
#define WRITE(CHR, VAL) if (mode == (VAL)) { IO::write("[%c]",CHR); } else { IO::write("%c",CHR); }
    WRITE(CMD_MODE_PAIR, Pair)
    WRITE(CMD_MODE_APPEAR, Appear)
#undef WRITE
    if (newline) {
        IO::write(STR_NEWLINE);
    }
}
*/