// PTA (12 13) = [3 4] // ready signal and XS2
// PTB (0 1 2 3) = [16 17 19 18] // For address bits
// PTC (0 1 2 3 4 5 6 7 8 9 10 11) = [15 22 23 9 10 13 11 12 35 36 37 38] // For digital inputs from NI cards
// PTD (0 1 2 3 4 5 6 7 13 14 15 ) = [2 14 7 8 6 20 21 5 51 52 54] // For digital output to marker
// PTE (25) = [34] // for digital output to reward
byte inputPins[] = {3, 4, 16, 17, 19, 18, 15, 22, 23, 9, 10, 13, 11, 12, 35, 36, 37, 38};
byte outputPIns[] = {2, 14, 7, 8, 6, 20, 21, 5, 34, 51 ,52 ,54};
int isMarkerOn = 0;// set to 1 when marker activated , and to 0 when deactivated
//unsigned long T1;
unsigned long rewardON = 0;
elapsedMillis rewardTime;
elapsedMicros markerTime;
IntervalTimer myTimerOne;
IntervalTimer myTimerTwo;
void reward(void) {
if (!digitalReadFast(3)) {
switch (GPIOB_PDIR & 0xF) {
case 4: // reward command received
rewardON = GPIOC_PDIR;
//Serial.println(GPIOC_PDIR);
//Serial.println(rewardON);
GPIOE_PDOR= 0x2000000;
//digitalWriteFast(34, HIGH);//reward
rewardTime = 0;//start counting until stop
break;
case 1:
//Serial.println("markerIFtest - GPIOC_PDIR-");
//Serial.println(GPIOC_PDIR,BIN);
GPIOD_PDOR= ((GPIOC_PDIR >>1) & 0xFF) | ((GPIOC_PDIR<<4) & 0xE000);
//Serial.println(GPIOD_PDOR,BIN);
isMarkerOn=1;
//Serial.println("GPIOD_PDOR-");
//Serial.println(GPIOD_PDOR,BIN);
markerTime = 0;//start counting until stop
}
}
}
void ManualReward(void) {
if (Serial.available()) {
rewardON = Serial.parseInt();
//int rewardON = Serial.parseInt();
Serial.println(rewardON);
GPIOE_PDOR= 0x2000000;
rewardTime = 0;//start counting until stop
}
}
//void reward(void) {
//if (!digitalReadFast(3) && ((GPIOB_PDIR & 0xF) == 4)){// reward command received
// rewardON = GPIOC_PDIR;
//Serial.println("rewardIFtest - GPIOC_PDIR-");
//Serial.println(GPIOC_PDIR);
//Serial.println(rewardON);
//digitalWriteFast(34,HIGH);
//GPIOE_PDOR |= (1<<25 ); // set bit 25 in PORTB to 1 ,reward
// Serial.println(GPIOE_PDOR,BIN);
//rewardTime = 0;//start counting until stop
// }
//}
//void marker(void) {
//if (!digitalReadFast(3) && ((GPIOB_PDIR & 0xF) == 1)){//marker command received
//Serial.println("markerIFtest - GPIOC_PDIR-");
//Serial.println(GPIOC_PDIR,BIN);
//GPIOD_PDOR |= (GPIOC_PDIR >>1) & 0x7FF;
// Serial.println(GPIOD_PDOR,BIN);
// isMarkerOn=1;
//Serial.println("GPIOD_PDOR-");
//Serial.println(GPIOD_PDOR,BIN);
// markerTime = 0;//start counting until stop
// }
//}
void setup() {
Serial.begin(9600);
//Serial.println("enter reward time [ms]");
//Serial.setTimeout(10);
pinMode(34,OUTPUT);
for (int pinnum = 0; pinnum < 18; pinnum++) {
//pinMode(inputPins[pinnum], INPUT_PULLDOWN);
pinMode(inputPins[pinnum], INPUT);
}
for (int pinnum = 0; pinnum < 12; pinnum++) {
pinMode(outputPIns[pinnum], OUTPUT);
}
myTimerOne.priority(0);
myTimerOne.begin(reward,1);
myTimerTwo.priority(1);
myTimerTwo.begin(ManualReward,100000);
}
void loop() {
//T1=micros();
if ( GPIOE_PDOR>>25 && rewardTime > rewardON) {//if the reward output is being sent for the input time
//digitalWriteFast(34,LOW);
GPIOE_PDOR = 0x0;//stop reward
}
if (isMarkerOn == 1 && markerTime > 25){//if the marker message is being sent for 25us (maybe the interval is too long\short for some devices)
GPIOD_PDOR = 0x00;//stop marker
isMarkerOn=0;
//Serial.println(micros()-T1);
}
}