Skip to content

Commit a02b755

Browse files
committed
Added light logging
1 parent 2f507b6 commit a02b755

3 files changed

Lines changed: 133 additions & 40 deletions

File tree

examples/Bandit_Task/Bandit_Task.ino

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@ int probs[5] = {10, 30, 50, 70, 90};
3030
bool press = false;
3131

3232
void setup() {
33-
force.begin(); //setup FORCE
33+
force.log_lite = true;
34+
force.begin(force.log_lite); //setup FORCE
3435
force.trial_window = 60000;
36+
force.ver = prob_left;
37+
force.FRC = prob_right;
38+
force.trials_per_block = trialsToSwitch;
3539
}
3640

3741
void loop() {
@@ -40,19 +44,26 @@ void loop() {
4044
// This is the non-stationary part of the task ///
4145
// meaning that probabilities change every trialsToSwitch trials ///
4246
///////////////////////////////////////////////////////////////////////
43-
force.run(false);
47+
force.run();
4448
if(trial_counter == trialsToSwitch) {
4549
highp_counter = 0;
4650
trial_counter = 0;
4751
prob_left = probs[random(0,5)];
4852
prob_right = 100-prob_left;
53+
force.ver = prob_left;
54+
force.FRC = prob_right;
4955
}
5056

5157
else if (highp_counter == 8) {
5258
highp_counter = 0;
5359
trial_counter = 0;
5460
prob_left = probs[random(0,5)];
5561
prob_right = 100-prob_left;
62+
63+
force.ver = prob_left;
64+
force.FRC = prob_right;
65+
force.dispense_delay = highp_counter;
66+
force.dispense_amount = trial_counter;
5667
}
5768

5869
/////////////////////////////////////////////////////////////////
@@ -63,17 +74,14 @@ void loop() {
6374
force.readPoke();
6475
if (force.poke) {
6576
force.run();
77+
force.event = "CENTER";
78+
force.logdata_lite();
6679
force.trial_start = millis();
6780
force.Tone();
6881
force.trial_available = true;
6982
}
7083

7184
while (((millis()-force.trial_start) < force.trial_window) && force.trial_available) {
72-
force.ratioLeft = prob_left;
73-
force.ratioRight = prob_right;
74-
force.trials_per_block = trial_counter;
75-
force.FRC = highp_counter;
76-
force.library_version = trialsToSwitch;
7785
force.run();
7886

7987
/////////////////////////////////////////////////////////////
@@ -86,9 +94,15 @@ void loop() {
8694
else {
8795
highp_counter = 0;
8896
}
97+
force.dispense_delay = highp_counter;
98+
force.loglite_Left();
99+
89100
if (random(100) < prob_left) {
101+
force.event = "RewardLeft";
90102
force.DispenseLeft();
91103
trial_counter ++;
104+
force.dispense_amount = trial_counter;
105+
force.logdata_lite();
92106
}
93107
else {
94108
force.Tone(300,600);
@@ -107,9 +121,16 @@ void loop() {
107121
else {
108122
highp_counter = 0;
109123
}
124+
force.dispense_delay = highp_counter;
125+
force.loglite_Right();
126+
110127
if (random(100) < prob_right) {
128+
force.event = "RewardRight";
111129
force.DispenseRight();
112130
trial_counter ++;
131+
force.dispense_amount = trial_counter;
132+
force.logdata_lite();
133+
113134
}
114135
else {
115136
force.Tone(300,600);

src/Force.cpp

Lines changed: 89 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -886,7 +886,7 @@ void Force::Calibrate(){
886886
///// and set everything up /////
887887
////////////////////////////////////////////////////
888888

889-
void Force::begin() {
889+
void Force::begin(bool log_lite) {
890890
Serial.begin(9600);
891891

892892
if (!ss.begin()) {
@@ -954,7 +954,7 @@ void Force::begin() {
954954
// Initialize SD
955955
SdFile::dateTimeCallback(dateTime);
956956
CreateDataFile();
957-
writeHeader();
957+
writeHeader(log_lite);
958958

959959
}
960960

@@ -963,15 +963,14 @@ void Force::begin() {
963963
////////////////////////////////////////////////////
964964
//// function to update things on every loop /////
965965
////////////////////////////////////////////////////
966-
void Force::run(bool log_data) {
966+
void Force::run() {
967967
SenseLeft();
968968
SenseRight();
969969
UpdateDisplay();
970970
DateTime now = rtc.now();
971971
unixtime = now.unixtime();
972972
check_buttons();
973973
check_lastDispense();
974-
if (log_data == true) logdata();
975974
}
976975

977976

@@ -1076,7 +1075,7 @@ void Force::graphLegend() {
10761075
if (gramsLeft > 1 or gramsRight >1){
10771076
tft.fillRect(80, 5, 24, 12, ST7735_BLACK); // clear task data on each trial
10781077
}
1079-
tft.print(trialLeft);
1078+
tft.print(rewardLeft);
10801079

10811080
// Print trial right
10821081
tft.setCursor(45,17);
@@ -1085,7 +1084,7 @@ void Force::graphLegend() {
10851084
if (gramsLeft > 1 or gramsRight > 1){
10861085
tft.fillRect(80, 17, 24, 12, ST7735_BLACK);
10871086
}
1088-
tft.print(trialRight);
1087+
tft.print(rewardRight);
10891088

10901089
// Print FR ratio
10911090
tft.setCursor(110, 5);
@@ -1172,14 +1171,20 @@ void Force::CreateDataFile() {
11721171
//////////////////////////////////////////////////
11731172
///// Write header to data file ///////
11741173
//////////////////////////////////////////////////
1175-
void Force::writeHeader() {
1176-
logfile.println("MM:DD:YYYY hh:mm:ss, Seconds, Library_Version, Program, Device_Number, ProgressiveRatio, Grams_req, Hold_time, Ratio, Dispense_amount, Dispense_delay, Timeout, Trials_per_block, Max_force, TrialLeft, TrialRight, Press, Lever1_Grams, Lever2_Grams, LickLeft, LickRight, Dispense, Random_Num, Shock_trial");
1174+
void Force::writeHeader(bool log_lite) {
1175+
if (log_lite == true) {
1176+
logfile.println("MM:DD:YYYY hh:mm:ss, Library_Version, Program, Device_Number, Dispense_amount, Dispense_delay, Timeout, Trials_per_block, Max_force, Trials_left, Trials_right, Left_rewarded, Right_rewarded");
1177+
}
1178+
else if (log_lite == false) {
1179+
logfile.println("MM:DD:YYYY hh:mm:ss, Seconds, Library_Version, Program, Device_Number, ProgressiveRatio, Grams_req, Hold_time, Ratio, Dispense_amount, Dispense_delay, Timeout, Trials_per_block, Max_force, TrialLeft, TrialRight, Press, Lever1_Grams, Lever2_Grams, LickLeft, LickRight, Dispense");
1180+
}
1181+
11771182
}
11781183

11791184
//////////////////////////////////////////////////
11801185
///// Write data to file ///////
11811186
//////////////////////////////////////////////////
1182-
void Force::WriteToSD() {
1187+
void Force::logdata() {
11831188
DateTime now = rtc.now();
11841189
logfile.print(now.month());
11851190
logfile.print("/");
@@ -1238,10 +1243,10 @@ void Force::WriteToSD() {
12381243
logfile.print(max_force);
12391244
logfile.print(",");
12401245

1241-
logfile.print(trialLeft);
1246+
logfile.print(rewardLeft);
12421247
logfile.print(",");
12431248

1244-
logfile.print(trialRight);
1249+
logfile.print(rewardRight);
12451250
logfile.print(",");
12461251

12471252
logfile.print(pressesLeft);
@@ -1262,10 +1267,66 @@ void Force::WriteToSD() {
12621267
logfile.print(dispensing);
12631268
logfile.print(",");
12641269

1265-
logfile.print(random_number);
1270+
logfile.flush();
1271+
1272+
if ( ! logfile ) {
1273+
error(2);
1274+
}
1275+
}
1276+
1277+
void Force::logdata_lite() {
1278+
DateTime now = rtc.now();
1279+
logfile.print(now.month());
1280+
logfile.print("/");
1281+
logfile.print(now.day());
1282+
logfile.print("/");
1283+
logfile.print(now.year());
1284+
logfile.print(" ");
1285+
logfile.print(now.hour());
1286+
logfile.print(":");
1287+
if (now.minute() < 10)
1288+
logfile.print('0'); // Trick to add leading zero for formatting
1289+
logfile.print(now.minute());
1290+
logfile.print(":");
1291+
if (now.second() < 10)
1292+
logfile.print('0'); // Trick to add leading zero for formatting
1293+
logfile.print(now.second());
1294+
logfile.print(",");
1295+
1296+
logfile.print(ver); // Print library version
12661297
logfile.print(",");
12671298

1268-
logfile.println(shock);
1299+
logfile.print(library_version); // Print code or program version
1300+
logfile.print(",");
1301+
1302+
logfile.print(FRC); // Print device name
1303+
logfile.print(",");
1304+
1305+
logfile.print(dispense_amount);
1306+
logfile.print(",");
1307+
1308+
logfile.print(dispense_delay);
1309+
logfile.print(",");
1310+
1311+
logfile.print(timeout_length);
1312+
logfile.print(",");
1313+
1314+
logfile.print(trials_per_block);
1315+
logfile.print(",");
1316+
1317+
logfile.print(event);
1318+
logfile.print(",");
1319+
1320+
logfile.print(trials_left);
1321+
logfile.print(",");
1322+
1323+
logfile.print(trials_right);
1324+
logfile.print(",");
1325+
1326+
logfile.print(rewardLeft);
1327+
logfile.print(",");
1328+
1329+
logfile.println(rewardRight);
12691330

12701331
logfile.flush();
12711332

@@ -1274,6 +1335,18 @@ void Force::WriteToSD() {
12741335
}
12751336
}
12761337

1338+
void Force::loglite_Left() {
1339+
event = "Left";
1340+
trials_left ++;
1341+
logdata_lite();
1342+
}
1343+
1344+
void Force::loglite_Right() {
1345+
event = "Right";
1346+
trials_right ++;
1347+
logdata_lite();
1348+
}
1349+
12771350
/********************************************************
12781351
If any errors are detected with the SD card print on the screen
12791352
********************************************************/
@@ -1314,14 +1387,6 @@ void Force::getFilename(char *filename) {
13141387
return;
13151388
}
13161389

1317-
////////////////////////////////////////
1318-
///// Log data ///////
1319-
////////////////////////////////////////
1320-
1321-
void Force::logdata() {
1322-
WriteToSD();
1323-
}
1324-
13251390

13261391
/////////////////////////////////////////////////////////////////////////
13271392
/////// Task functions ////////
@@ -1346,7 +1411,7 @@ void Force::Timeout(int timeout_length) {
13461411
tft.setTextColor(ST7735_WHITE);
13471412
tft.print("Timeout:");
13481413
tft.print((-(millis() - dispense_time - (timeout_length*1000))/ 1000),1);
1349-
run(false);
1414+
run();
13501415
tft.fillRect(84, 43, 80, 12, ST7735_BLACK);
13511416
if ((gramsLeft > 1.5) or (gramsRight > 1.5)) { //reset timeout if either lever pushed
13521417
Timeout(timeout_length);
@@ -1374,7 +1439,7 @@ void Force::Click() {
13741439

13751440
void Force::DispenseLeft() {
13761441
dispensing = true;
1377-
trialLeft++;
1442+
rewardLeft ++;
13781443
Tone(4000,200);
13791444
float successTime = millis();
13801445
while ((millis() - successTime) < (dispense_delay * 1000)){
@@ -1412,7 +1477,7 @@ void Force::DispenseLeft() {
14121477

14131478
void Force::DispenseRight() {
14141479
dispensing = true;
1415-
trialRight++;
1480+
rewardRight++;
14161481
Tone(4000,200);
14171482
float successTime = millis();
14181483
while ((millis() - successTime) < (dispense_delay * 1000)){

src/Force.h

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ class Force {
5454
String library_version = "undef";
5555

5656
// --- Basic functions --- //
57-
void begin();
58-
void run(bool log_data = true);
57+
void begin(bool log_lite = true);
58+
void run();
5959
void check_buttons();
6060
void readPoke();
6161

@@ -107,12 +107,17 @@ class Force {
107107
char filename[21]; // Array for file name data logged to named in setup
108108
const int chipSelect = 10;
109109
void CreateDataFile();
110-
void writeHeader();
111-
void WriteToSD();
110+
void writeHeader(bool log_lite = true);
112111
void error(uint8_t errno);
113112
void getFilename(char *filename);
114113
void logdata();
114+
void logdata_lite();
115+
void loglite_Left();
116+
void loglite_Right();
115117
unsigned long unixtime = 0;
118+
119+
bool log_lite = true;
120+
bool dispensing = true;
116121

117122

118123
// --- Pump functions --- //
@@ -124,6 +129,7 @@ class Force {
124129
void prime_dispense();
125130
void check_lastDispense();
126131

132+
127133
// --- Lever functions --- //
128134
int dispense_delay = 4;
129135

@@ -155,23 +161,24 @@ class Force {
155161
int reqLeft = 2;
156162
int ratioLeft = 1;
157163
int hold_timeLeft = 350;
158-
int trialLeft = 0;
164+
int rewardLeft = 0;
165+
int trials_left = 0;
159166

160167
int pressesRight = 0;
161168
int reqRight = 2;
162169
int ratioRight = 1;
163170
int hold_timeRight = 350;
164-
int trialRight = 0;
171+
int rewardRight = 0;
172+
int trials_right = 0;
165173

166174
unsigned long pressStart = 0;
167175
int trials_per_block = 10;
168176
int max_force = 20;
169177
unsigned long start_time = 0;
170178
unsigned long lickTime = 0;
171179
unsigned long dispenseTime = 0;
172-
int random_number = 0;
173-
bool shock = false;
174-
bool dispensing = false;
180+
181+
String event = "None";
175182

176183
// --- Serial out--- //
177184
void SerialOutput();

0 commit comments

Comments
 (0)