Keisuke Sehara / Mbed 2 deprecated STM32_Whisking

Dependencies:   mbed

Committer:
gwappa
Date:
Mon Jun 18 10:43:45 2018 +0000
Revision:
9:e136394bdb39
Parent:
8:973dcd190672
Child:
10:7c216d528c35
add WithCue mode in place of Pair

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 4:fcf597f82632 4 #include "IO.h"
gwappa 4:fcf597f82632 5
gwappa 4:fcf597f82632 6 #define STATE_IS_LOGGED
gwappa 4:fcf597f82632 7
gwappa 4:fcf597f82632 8 #ifdef STATE_IS_LOGGED
gwappa 4:fcf597f82632 9 #define LOGSTATE(S) IO::info(#S);
gwappa 4:fcf597f82632 10 #else
gwappa 4:fcf597f82632 11 #define LOGSTATE(S)
gwappa 4:fcf597f82632 12 #endif
gwappa 4:fcf597f82632 13
gwappa 4:fcf597f82632 14 void (*whiskhandler)() = 0;
gwappa 4:fcf597f82632 15 void (*lickhandler)() = 0;
gwappa 4:fcf597f82632 16 bool logged = false;
gwappa 4:fcf597f82632 17
gwappa 4:fcf597f82632 18 void whiskcallback() {
gwappa 4:fcf597f82632 19 if (logged) {
gwappa 4:fcf597f82632 20 trial.whisking_events.add(timer.read_ms());
gwappa 4:fcf597f82632 21 }
gwappa 4:fcf597f82632 22 if (whiskhandler != 0) {
gwappa 4:fcf597f82632 23 whiskhandler();
gwappa 4:fcf597f82632 24 }
gwappa 4:fcf597f82632 25 }
gwappa 4:fcf597f82632 26
gwappa 4:fcf597f82632 27 void lickcallback() {
gwappa 4:fcf597f82632 28 if (logged) {
gwappa 4:fcf597f82632 29 trial.licking_events.add(timer.read_ms());
gwappa 4:fcf597f82632 30 }
gwappa 4:fcf597f82632 31 if (lickhandler != 0) {
gwappa 4:fcf597f82632 32 lickhandler();
gwappa 4:fcf597f82632 33 }
gwappa 4:fcf597f82632 34 }
gwappa 4:fcf597f82632 35
gwappa 9:e136394bdb39 36 void turnOff_trialStart() {
gwappa 9:e136394bdb39 37 trialStart.write(0);
gwappa 9:e136394bdb39 38 }
gwappa 9:e136394bdb39 39
gwappa 9:e136394bdb39 40 void stopReward() {
gwappa 9:e136394bdb39 41 rewardOut.write(0);
gwappa 9:e136394bdb39 42 }
gwappa 9:e136394bdb39 43
gwappa 4:fcf597f82632 44 void finalize() {
gwappa 7:6744ec9ccc25 45 cueOut.write(0); // if any
gwappa 9:e136394bdb39 46 trialEnd.write(1);
gwappa 9:e136394bdb39 47 wait_us(ms_to_us(TRIGGER_DUR_MS));
gwappa 9:e136394bdb39 48
gwappa 4:fcf597f82632 49 trial.writeToSerial();
gwappa 4:fcf597f82632 50 timer.stop();
gwappa 4:fcf597f82632 51 timer.reset();
gwappa 4:fcf597f82632 52 }
gwappa 4:fcf597f82632 53
gwappa 4:fcf597f82632 54 void Delay::setup() {
gwappa 4:fcf597f82632 55 LOGSTATE(Delay)
gwappa 4:fcf597f82632 56
gwappa 4:fcf597f82632 57 // initialize the trial-related params
gwappa 4:fcf597f82632 58 trial.reset(task);
gwappa 4:fcf597f82632 59
gwappa 4:fcf597f82632 60 // configure the flags
gwappa 4:fcf597f82632 61 cueOut.write(0);
gwappa 9:e136394bdb39 62 if ( (task.mode.value == WithCue) || (task.mode.value == Report) ) {
gwappa 7:6744ec9ccc25 63 enableOut.write(1);
gwappa 7:6744ec9ccc25 64 } else {
gwappa 7:6744ec9ccc25 65 enableOut.write(0);
gwappa 7:6744ec9ccc25 66 }
gwappa 4:fcf597f82632 67 rewardOut.write(0);
gwappa 4:fcf597f82632 68
gwappa 4:fcf597f82632 69 // configure the interrupts
gwappa 4:fcf597f82632 70 whiskIn.rise(&whiskcallback);
gwappa 4:fcf597f82632 71 lickIn.rise(&lickcallback);
gwappa 4:fcf597f82632 72 // no whisk handler, no lick handler
gwappa 4:fcf597f82632 73 // only to be logged
gwappa 4:fcf597f82632 74 logged = true;
gwappa 4:fcf597f82632 75
gwappa 4:fcf597f82632 76 // sets the timeout for the next state
gwappa 9:e136394bdb39 77 switch (task.mode.value) {
gwappa 9:e136394bdb39 78 case Pair:
gwappa 9:e136394bdb39 79 stateTimeout.attach_us(&automaton::jump<Delay,Paired>, ms_to_us(trial.delay_dur_ms + task.prep_dur_ms.value));
gwappa 9:e136394bdb39 80 break;
gwappa 9:e136394bdb39 81 case WithCue:
gwappa 9:e136394bdb39 82 stateTimeout.attach_us(&automaton::jump<Delay,Cued>, ms_to_us(trial.delay_dur_ms + task.prep_dur_ms.value));
gwappa 9:e136394bdb39 83 break;
gwappa 9:e136394bdb39 84 default:
gwappa 7:6744ec9ccc25 85 stateTimeout.attach_us(&automaton::jump<Delay,Prepare>, ms_to_us(trial.delay_dur_ms));
gwappa 7:6744ec9ccc25 86 }
gwappa 4:fcf597f82632 87
gwappa 9:e136394bdb39 88 // trigger trialStart
gwappa 9:e136394bdb39 89 trialStart.write(1);
gwappa 9:e136394bdb39 90 triggerTimeout.attach_us(&turnOff_trialStart, ms_to_us(TRIGGER_DUR_MS));
gwappa 9:e136394bdb39 91
gwappa 4:fcf597f82632 92 // update the timestamp
gwappa 4:fcf597f82632 93 trial.starting = timer.read_ms();
gwappa 4:fcf597f82632 94 timer.start();
gwappa 4:fcf597f82632 95 }
gwappa 4:fcf597f82632 96
gwappa 4:fcf597f82632 97 void Delay::teardown() {
gwappa 4:fcf597f82632 98 // do nothing
gwappa 4:fcf597f82632 99 }
gwappa 4:fcf597f82632 100
gwappa 7:6744ec9ccc25 101 void Prepare::setup() {
gwappa 7:6744ec9ccc25 102 // mostly the same with for Delay
gwappa 7:6744ec9ccc25 103 // except that the animal cannot lick freely
gwappa 7:6744ec9ccc25 104 LOGSTATE(Prepare)
gwappa 7:6744ec9ccc25 105
gwappa 7:6744ec9ccc25 106 // configure the interrupts
gwappa 7:6744ec9ccc25 107 // no whisk handler (i.e. only to be logged)
gwappa 7:6744ec9ccc25 108 lickhandler = &automaton::jump<Prepare,Abort>;
gwappa 7:6744ec9ccc25 109
gwappa 7:6744ec9ccc25 110 // set timeout for the next state
gwappa 7:6744ec9ccc25 111 stateTimeout.attach_us(&automaton::jump<Prepare,Cued>, ms_to_us(task.prep_dur_ms.value));
gwappa 7:6744ec9ccc25 112 }
gwappa 7:6744ec9ccc25 113
gwappa 7:6744ec9ccc25 114 void Prepare::teardown() {
gwappa 7:6744ec9ccc25 115 // de-register lick inhibition
gwappa 7:6744ec9ccc25 116 lickhandler = 0;
gwappa 7:6744ec9ccc25 117 }
gwappa 7:6744ec9ccc25 118
gwappa 9:e136394bdb39 119 void Paired::setup() {
gwappa 9:e136394bdb39 120 LOGSTATE(Paired)
gwappa 9:e136394bdb39 121 trial.response |= TrialFlags::Cues;
gwappa 9:e136394bdb39 122 lickhandler = &automaton::jump<Paired,WithResp>;
gwappa 9:e136394bdb39 123
gwappa 9:e136394bdb39 124 // reward & visual feedback
gwappa 9:e136394bdb39 125 enableOut.write(1);
gwappa 9:e136394bdb39 126
gwappa 9:e136394bdb39 127 rewardOut.write(1);
gwappa 9:e136394bdb39 128 rewardTimeout.attach_us(&stopReward, ms_to_us(task.reward_ms.value));
gwappa 9:e136394bdb39 129
gwappa 9:e136394bdb39 130 stateTimeout.attach_us(&automaton::jump<Paired,NoResp>, ms_to_us(task.cue_dur_ms.value));
gwappa 9:e136394bdb39 131 }
gwappa 9:e136394bdb39 132
gwappa 9:e136394bdb39 133 void Paired::teardown() {
gwappa 9:e136394bdb39 134 enableOut.write(0);
gwappa 9:e136394bdb39 135 }
gwappa 9:e136394bdb39 136
gwappa 4:fcf597f82632 137 void Cued::setup() {
gwappa 4:fcf597f82632 138 LOGSTATE(Cued)
gwappa 4:fcf597f82632 139
gwappa 7:6744ec9ccc25 140 if (task.mode.value == Report) {
gwappa 7:6744ec9ccc25 141 enableOut.write(1); // enable the feedback only during Cued
gwappa 7:6744ec9ccc25 142 }
gwappa 7:6744ec9ccc25 143
gwappa 4:fcf597f82632 144 // configure the interrupts
gwappa 9:e136394bdb39 145 if (task.mode.value == WithCue) {
gwappa 8:973dcd190672 146 whiskhandler = &automaton::jump<Cued,WithResp>;
gwappa 8:973dcd190672 147 trial.response |= TrialFlags::Cues;
gwappa 8:973dcd190672 148 lickhandler = 0;
gwappa 7:6744ec9ccc25 149
gwappa 7:6744ec9ccc25 150 } else {
gwappa 7:6744ec9ccc25 151 whiskhandler = &Cued::gate;
gwappa 7:6744ec9ccc25 152 lickhandler = &automaton::jump<Cued,Abort>;
gwappa 7:6744ec9ccc25 153 }
gwappa 7:6744ec9ccc25 154
gwappa 7:6744ec9ccc25 155 // start cue output
gwappa 7:6744ec9ccc25 156 cueOut.write(1);
gwappa 4:fcf597f82632 157
gwappa 4:fcf597f82632 158 // sets the timeout for the next state
gwappa 7:6744ec9ccc25 159 stateTimeout.attach_us(&automaton::jump<Cued,NoResp>, ms_to_us(task.cue_dur_ms.value));
gwappa 4:fcf597f82632 160
gwappa 4:fcf597f82632 161 // update the timestamp
gwappa 4:fcf597f82632 162 trial.cuestarting = timer.read_ms();
gwappa 4:fcf597f82632 163 trial.waiting = trial.cuestarting - trial.starting;
gwappa 4:fcf597f82632 164 }
gwappa 4:fcf597f82632 165
gwappa 7:6744ec9ccc25 166 void Cued::gate() {
gwappa 7:6744ec9ccc25 167 whiskhandler = 0; // logging only
gwappa 8:973dcd190672 168 trial.response |= TrialFlags::Cues;
gwappa 7:6744ec9ccc25 169 lickhandler = &automaton::jump<Cued,WithResp>;
gwappa 7:6744ec9ccc25 170 }
gwappa 7:6744ec9ccc25 171
gwappa 4:fcf597f82632 172 void Cued::teardown() {
gwappa 4:fcf597f82632 173 whiskhandler = 0;
gwappa 7:6744ec9ccc25 174 lickhandler = 0;
gwappa 7:6744ec9ccc25 175 // end cue output
gwappa 7:6744ec9ccc25 176 cueOut.write(0);
gwappa 7:6744ec9ccc25 177
gwappa 4:fcf597f82632 178 stateTimeout.detach();
gwappa 7:6744ec9ccc25 179
gwappa 7:6744ec9ccc25 180 if (task.mode.value == Report) {
gwappa 7:6744ec9ccc25 181 enableOut.write(0);
gwappa 7:6744ec9ccc25 182 }
gwappa 7:6744ec9ccc25 183 }
gwappa 7:6744ec9ccc25 184
gwappa 7:6744ec9ccc25 185 void Abort::setup() {
gwappa 7:6744ec9ccc25 186 LOGSTATE(Abort)
gwappa 8:973dcd190672 187 trial.waiting = timer.read_ms() - trial.starting;
gwappa 8:973dcd190672 188 trial.response = TrialFlags::Licked;
gwappa 8:973dcd190672 189 stateTimeout.attach_us(&automaton::done<Abort>, ms_to_us(task.post_dur_ms.value));
gwappa 7:6744ec9ccc25 190 }
gwappa 7:6744ec9ccc25 191
gwappa 7:6744ec9ccc25 192 void Abort::teardown() {
gwappa 7:6744ec9ccc25 193 finalize();
gwappa 4:fcf597f82632 194 }
gwappa 4:fcf597f82632 195
gwappa 4:fcf597f82632 196 void WithResp::setup() {
gwappa 4:fcf597f82632 197 LOGSTATE(WithResp)
gwappa 4:fcf597f82632 198
gwappa 4:fcf597f82632 199 trial.response |= TrialFlags::Responded;
gwappa 4:fcf597f82632 200
gwappa 7:6744ec9ccc25 201 whiskhandler = 0;
gwappa 7:6744ec9ccc25 202 lickhandler = 0;
gwappa 7:6744ec9ccc25 203
gwappa 9:e136394bdb39 204 if (task.mode.value != Pair) {
gwappa 9:e136394bdb39 205 // open/close the valve
gwappa 9:e136394bdb39 206 rewardOut.write(1);
gwappa 9:e136394bdb39 207 rewardTimeout.attach_us(&stopReward, ms_to_us(task.reward_ms.value));
gwappa 9:e136394bdb39 208 }
gwappa 4:fcf597f82632 209
gwappa 5:849446d19406 210 stateTimeout.attach_us(&automaton::done<WithResp>, ms_to_us(task.post_dur_ms.value));
gwappa 4:fcf597f82632 211 }
gwappa 4:fcf597f82632 212
gwappa 4:fcf597f82632 213 void WithResp::teardown() {
gwappa 4:fcf597f82632 214 finalize();
gwappa 4:fcf597f82632 215 }
gwappa 4:fcf597f82632 216
gwappa 4:fcf597f82632 217 void NoResp::setup() {
gwappa 4:fcf597f82632 218 LOGSTATE(NoResp)
gwappa 4:fcf597f82632 219
gwappa 7:6744ec9ccc25 220 // no reward here
gwappa 7:6744ec9ccc25 221
gwappa 5:849446d19406 222 stateTimeout.attach_us(&automaton::done<NoResp>, ms_to_us(task.post_dur_ms.value));
gwappa 4:fcf597f82632 223 }
gwappa 4:fcf597f82632 224 void NoResp::teardown() {
gwappa 4:fcf597f82632 225 finalize();
gwappa 8:973dcd190672 226 }
gwappa 8:973dcd190672 227
gwappa 8:973dcd190672 228 void TestReward::setup() {
gwappa 8:973dcd190672 229 LOGSTATE(TestReward)
gwappa 8:973dcd190672 230
gwappa 8:973dcd190672 231 // open/close the valve
gwappa 8:973dcd190672 232 rewardOut.write(1);
gwappa 9:e136394bdb39 233 rewardTimeout.attach_us(&stopReward, ms_to_us(task.reward_ms.value));
gwappa 8:973dcd190672 234 stateTimeout.attach_us(&automaton::done<TestReward>, ms_to_us(task.reward_ms.value+20));
gwappa 8:973dcd190672 235 }
gwappa 8:973dcd190672 236
gwappa 8:973dcd190672 237 void TestReward::teardown() {
gwappa 8:973dcd190672 238 // do nothing
gwappa 4:fcf597f82632 239 }