fast-feedback virtual target task code on STM Nucleo

Dependencies:   mbed

Committer:
gwappa
Date:
Wed Jul 04 13:26:58 2018 +0000
Revision:
25:56c4b22ec034
Parent:
24:e236faf66935
Child:
26:b4421d1ee57a
add whisk debouncing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gwappa 4:fcf597f82632 1 #include "states.h"
gwappa 4:fcf597f82632 2 #include "rig.h"
gwappa 4:fcf597f82632 3 #include "automaton.h"
gwappa 12:06ea96546af1 4 #include "events.h"
gwappa 4:fcf597f82632 5 #include "IO.h"
gwappa 4:fcf597f82632 6
gwappa 4:fcf597f82632 7 #define STATE_IS_LOGGED
gwappa 4:fcf597f82632 8
gwappa 4:fcf597f82632 9 #ifdef STATE_IS_LOGGED
gwappa 4:fcf597f82632 10 #define LOGSTATE(S) IO::info(#S);
gwappa 4:fcf597f82632 11 #else
gwappa 4:fcf597f82632 12 #define LOGSTATE(S)
gwappa 4:fcf597f82632 13 #endif
gwappa 4:fcf597f82632 14
gwappa 4:fcf597f82632 15 void finalize() {
gwappa 11:897ecd5413e0 16 trial.markTrialEnd();
gwappa 4:fcf597f82632 17 }
gwappa 4:fcf597f82632 18
gwappa 4:fcf597f82632 19 void Delay::setup() {
gwappa 4:fcf597f82632 20 LOGSTATE(Delay)
gwappa 4:fcf597f82632 21
gwappa 4:fcf597f82632 22 // initialize the trial-related params
gwappa 4:fcf597f82632 23 trial.reset(task);
gwappa 25:56c4b22ec034 24 events::setup(true, task.whisk_debounce_ms.value, task.lick_debounce_ms.value);
gwappa 4:fcf597f82632 25
gwappa 11:897ecd5413e0 26 // set up the timeout for the next state
gwappa 9:e136394bdb39 27 switch (task.mode.value) {
gwappa 9:e136394bdb39 28 case Pair:
gwappa 16:33c17c62840e 29 case MotionAlt:
gwappa 16:33c17c62840e 30 stateTimeout.attach_us(&automaton::jump<Delay,Cued>, ms_to_us(trial.delay_dur_ms + task.prep_dur_ms.value));
gwappa 16:33c17c62840e 31 break;
gwappa 9:e136394bdb39 32 default:
gwappa 7:6744ec9ccc25 33 stateTimeout.attach_us(&automaton::jump<Delay,Prepare>, ms_to_us(trial.delay_dur_ms));
gwappa 7:6744ec9ccc25 34 }
gwappa 4:fcf597f82632 35
gwappa 11:897ecd5413e0 36 trial.markTrialStart();
gwappa 4:fcf597f82632 37 }
gwappa 4:fcf597f82632 38
gwappa 4:fcf597f82632 39 void Delay::teardown() {
gwappa 4:fcf597f82632 40 // do nothing
gwappa 4:fcf597f82632 41 }
gwappa 4:fcf597f82632 42
gwappa 7:6744ec9ccc25 43 void Prepare::setup() {
gwappa 7:6744ec9ccc25 44 // mostly the same with for Delay
gwappa 7:6744ec9ccc25 45 // except that the animal cannot lick freely
gwappa 7:6744ec9ccc25 46 LOGSTATE(Prepare)
gwappa 7:6744ec9ccc25 47
gwappa 7:6744ec9ccc25 48 // configure the interrupts
gwappa 12:06ea96546af1 49 // no whisk handler
gwappa 12:06ea96546af1 50 events::lickhandler = &automaton::jump<Prepare,Abort>;
gwappa 7:6744ec9ccc25 51
gwappa 7:6744ec9ccc25 52 // set timeout for the next state
gwappa 7:6744ec9ccc25 53 stateTimeout.attach_us(&automaton::jump<Prepare,Cued>, ms_to_us(task.prep_dur_ms.value));
gwappa 7:6744ec9ccc25 54 }
gwappa 7:6744ec9ccc25 55
gwappa 7:6744ec9ccc25 56 void Prepare::teardown() {
gwappa 7:6744ec9ccc25 57 // de-register lick inhibition
gwappa 12:06ea96546af1 58 events::lickhandler = 0;
gwappa 9:e136394bdb39 59 }
gwappa 9:e136394bdb39 60
gwappa 4:fcf597f82632 61 void Cued::setup() {
gwappa 4:fcf597f82632 62 LOGSTATE(Cued)
gwappa 4:fcf597f82632 63
gwappa 11:897ecd5413e0 64 trial.markEndOfWait();
gwappa 7:6744ec9ccc25 65
gwappa 21:e51733fc1c36 66 switch (task.mode.value) {
gwappa 21:e51733fc1c36 67 case Pair:
gwappa 21:e51733fc1c36 68 case Report:
gwappa 21:e51733fc1c36 69 case Associate:
gwappa 21:e51733fc1c36 70 // wait for the visual cue to flag "cued"
gwappa 21:e51733fc1c36 71 break;
gwappa 21:e51733fc1c36 72 case Motion:
gwappa 21:e51733fc1c36 73 case MotionAlt:
gwappa 19:50663f8815b8 74 trial.flag.cued = true;
gwappa 21:e51733fc1c36 75 break;
gwappa 19:50663f8815b8 76 }
gwappa 15:20f7f737c256 77
gwappa 17:0b241aa1f5b6 78 // configure lick handler
gwappa 16:33c17c62840e 79 if (task.mode.value != MotionAlt) {
gwappa 17:0b241aa1f5b6 80 // licking without a visual "go-cue" will be considered a "catch" response
gwappa 17:0b241aa1f5b6 81 events::lickhandler = &automaton::jump<Cued,WithResp>;
gwappa 17:0b241aa1f5b6 82 } else {
gwappa 17:0b241aa1f5b6 83 // for MotionAlt
gwappa 16:33c17c62840e 84 }
gwappa 11:897ecd5413e0 85
gwappa 17:0b241aa1f5b6 86 // configure whisk handler
gwappa 17:0b241aa1f5b6 87 // matters only for Motion & MotionAlt conditions
gwappa 16:33c17c62840e 88 switch (task.mode.value) {
gwappa 16:33c17c62840e 89 case Motion:
gwappa 21:e51733fc1c36 90 events::whiskhandler = &events::gate;
gwappa 16:33c17c62840e 91 break;
gwappa 16:33c17c62840e 92 case MotionAlt:
gwappa 16:33c17c62840e 93 events::whiskhandler = &automaton::jump<Cued,WithResp>;
gwappa 16:33c17c62840e 94 break;
gwappa 16:33c17c62840e 95 default:
gwappa 17:0b241aa1f5b6 96 // do nothing
gwappa 17:0b241aa1f5b6 97 break;
gwappa 17:0b241aa1f5b6 98 }
gwappa 17:0b241aa1f5b6 99
gwappa 17:0b241aa1f5b6 100 // configure gate handler
gwappa 17:0b241aa1f5b6 101 // "gating" comes from the visual cue for Report & Associate
gwappa 17:0b241aa1f5b6 102 // from the whisking for Motion
gwappa 17:0b241aa1f5b6 103 if (task.mode.value != MotionAlt) {
gwappa 17:0b241aa1f5b6 104 events::gatehandler = &Cued::gate;
gwappa 17:0b241aa1f5b6 105 }
gwappa 17:0b241aa1f5b6 106
gwappa 21:e51733fc1c36 107 // configure visual stimulus callback
gwappa 21:e51733fc1c36 108 // only for Pair/Report/Associate
gwappa 17:0b241aa1f5b6 109 switch (task.mode.value) {
gwappa 21:e51733fc1c36 110 case Pair:
gwappa 17:0b241aa1f5b6 111 case Report:
gwappa 17:0b241aa1f5b6 112 case Associate:
gwappa 17:0b241aa1f5b6 113 visualOut.attachTurnOnCallback(&events::gate);
gwappa 17:0b241aa1f5b6 114 break;
gwappa 17:0b241aa1f5b6 115 case Motion:
gwappa 17:0b241aa1f5b6 116 case MotionAlt:
gwappa 21:e51733fc1c36 117 // do nothing
gwappa 17:0b241aa1f5b6 118 break;
gwappa 7:6744ec9ccc25 119 }
gwappa 7:6744ec9ccc25 120
gwappa 7:6744ec9ccc25 121 // start cue output
gwappa 21:e51733fc1c36 122 visualOut.run();
gwappa 21:e51733fc1c36 123 audioOut.run();
gwappa 4:fcf597f82632 124
gwappa 4:fcf597f82632 125 // sets the timeout for the next state
gwappa 24:e236faf66935 126 stateTimeout.attach_us(&automaton::jump<Cued,NoResp>, trial.cued_dur_us);
gwappa 4:fcf597f82632 127 }
gwappa 4:fcf597f82632 128
gwappa 7:6744ec9ccc25 129 void Cued::gate() {
gwappa 12:06ea96546af1 130 events::gatehandler = 0;
gwappa 12:06ea96546af1 131 events::whiskhandler = 0;
gwappa 19:50663f8815b8 132 trial.flag.cued = true;
gwappa 12:06ea96546af1 133 events::lickhandler = &automaton::jump<Cued,WithResp>;
gwappa 7:6744ec9ccc25 134 }
gwappa 7:6744ec9ccc25 135
gwappa 4:fcf597f82632 136 void Cued::teardown() {
gwappa 12:06ea96546af1 137 events::whiskhandler = 0;
gwappa 12:06ea96546af1 138 events::lickhandler = 0;
gwappa 12:06ea96546af1 139 events::gatehandler = 0;
gwappa 20:4c06d3041337 140
gwappa 7:6744ec9ccc25 141 // end cue output
gwappa 20:4c06d3041337 142 switch (task.mode.value) {
gwappa 20:4c06d3041337 143 case Report:
gwappa 20:4c06d3041337 144 case Associate:
gwappa 12:06ea96546af1 145 visualOut.stop();
gwappa 7:6744ec9ccc25 146 }
gwappa 20:4c06d3041337 147
gwappa 20:4c06d3041337 148 switch (task.mode.value) {
gwappa 20:4c06d3041337 149 case Associate:
gwappa 20:4c06d3041337 150 case Motion:
gwappa 20:4c06d3041337 151 case MotionAlt:
gwappa 20:4c06d3041337 152 audioOut.stop();
gwappa 20:4c06d3041337 153 }
gwappa 7:6744ec9ccc25 154 }
gwappa 7:6744ec9ccc25 155
gwappa 7:6744ec9ccc25 156 void Abort::setup() {
gwappa 7:6744ec9ccc25 157 LOGSTATE(Abort)
gwappa 14:af3adf5d5ddf 158 events::whiskhandler = 0;
gwappa 14:af3adf5d5ddf 159 events::lickhandler = 0;
gwappa 14:af3adf5d5ddf 160 events::gatehandler = 0;
gwappa 11:897ecd5413e0 161 trial.markEndOfWait();
gwappa 19:50663f8815b8 162 trial.flag.reset = true;
gwappa 8:973dcd190672 163 stateTimeout.attach_us(&automaton::done<Abort>, ms_to_us(task.post_dur_ms.value));
gwappa 7:6744ec9ccc25 164 }
gwappa 7:6744ec9ccc25 165
gwappa 7:6744ec9ccc25 166 void Abort::teardown() {
gwappa 7:6744ec9ccc25 167 finalize();
gwappa 4:fcf597f82632 168 }
gwappa 4:fcf597f82632 169
gwappa 4:fcf597f82632 170 void WithResp::setup() {
gwappa 4:fcf597f82632 171 LOGSTATE(WithResp)
gwappa 4:fcf597f82632 172
gwappa 19:50663f8815b8 173 trial.flag.responded = true;
gwappa 14:af3adf5d5ddf 174 events::whiskhandler = 0;
gwappa 14:af3adf5d5ddf 175 events::lickhandler = 0;
gwappa 14:af3adf5d5ddf 176 events::gatehandler = 0;
gwappa 4:fcf597f82632 177
gwappa 22:41163fb3fdc6 178 // open/close the valve, only when the cue was there
gwappa 22:41163fb3fdc6 179 // (for Pair, reward will be there no matter the response)
gwappa 20:4c06d3041337 180 if ((task.mode.value == Pair) || trial.flag.cued ) {
gwappa 11:897ecd5413e0 181 rewardOut.start();
gwappa 9:e136394bdb39 182 }
gwappa 4:fcf597f82632 183
gwappa 5:849446d19406 184 stateTimeout.attach_us(&automaton::done<WithResp>, ms_to_us(task.post_dur_ms.value));
gwappa 4:fcf597f82632 185 }
gwappa 4:fcf597f82632 186
gwappa 4:fcf597f82632 187 void WithResp::teardown() {
gwappa 4:fcf597f82632 188 finalize();
gwappa 4:fcf597f82632 189 }
gwappa 4:fcf597f82632 190
gwappa 4:fcf597f82632 191 void NoResp::setup() {
gwappa 4:fcf597f82632 192 LOGSTATE(NoResp)
gwappa 14:af3adf5d5ddf 193 events::whiskhandler = 0;
gwappa 14:af3adf5d5ddf 194 events::lickhandler = 0;
gwappa 14:af3adf5d5ddf 195 events::gatehandler = 0;
gwappa 4:fcf597f82632 196
gwappa 22:41163fb3fdc6 197 // no reward here, except for Pair
gwappa 22:41163fb3fdc6 198 if (task.mode.value == Pair) {
gwappa 22:41163fb3fdc6 199 rewardOut.start();
gwappa 22:41163fb3fdc6 200 }
gwappa 7:6744ec9ccc25 201
gwappa 5:849446d19406 202 stateTimeout.attach_us(&automaton::done<NoResp>, ms_to_us(task.post_dur_ms.value));
gwappa 4:fcf597f82632 203 }
gwappa 4:fcf597f82632 204 void NoResp::teardown() {
gwappa 4:fcf597f82632 205 finalize();
gwappa 8:973dcd190672 206 }
gwappa 8:973dcd190672 207
gwappa 8:973dcd190672 208 void TestReward::setup() {
gwappa 8:973dcd190672 209 LOGSTATE(TestReward)
gwappa 8:973dcd190672 210
gwappa 8:973dcd190672 211 // open/close the valve
gwappa 16:33c17c62840e 212 rewardOut.setOnset(0);
gwappa 16:33c17c62840e 213 rewardOut.setDuration(ms_to_us(task.reward_dur_ms.value));
gwappa 11:897ecd5413e0 214 rewardOut.start();
gwappa 16:33c17c62840e 215 stateTimeout.attach_us(&automaton::done<TestReward>, ms_to_us(task.reward_dur_ms.value+100));
gwappa 8:973dcd190672 216 }
gwappa 8:973dcd190672 217
gwappa 8:973dcd190672 218 void TestReward::teardown() {
gwappa 8:973dcd190672 219 // do nothing
gwappa 4:fcf597f82632 220 }