@@ -0,0 +1,118 @@
#include " Arduino.h"
// Include API-Headers
extern " C" {
#include " ets_sys.h"
#include " os_type.h"
#include " osapi.h"
#include " mem.h"
#include " user_interface.h"
#include " cont.h"
}
#define DEVICE_QTY (2 )
#define tandaInterval (500000 )
#define MAXINT (2147483647 )
unsigned long interruptionMoments[DEVICE_QTY];
unsigned long toPrint[DEVICE_QTY];
bool hasToPrint = false ;
int cagada = 0 ;
int interruptionQty = 0 ;
unsigned long tandaTime;
unsigned long currentInterruptTime = 0 ;
void interruptionCommon (int deviceId){
currentInterruptTime = micros ();
if (interruptionQty == 0 ) {
tandaTime = currentInterruptTime + tandaInterval;
}
if (currentInterruptTime > tandaTime) {
cagada = interruptionQty;
for (int i=0 ; i<DEVICE_QTY; i++)
toPrint[i] = interruptionMoments[i];
hasToPrint = true ;
tandaTime = currentInterruptTime + tandaInterval;
interruptionQty = 0 ;
}
interruptionMoments[deviceId] = currentInterruptTime;
interruptionQty++;
}
#define MAPPER_LENGTH (sizeof (mapper)/sizeof (mapper[0 ]))
/* D1, D2, D3, D4, D5, D6, D7, D8 */
// int mapper[] = {5, 4, 0, 2, 14, 12, 13, 15};
int mapper[] = {5 , 0 , 2 , 14 , 12 , 13 , 15 , 4 };
#define INTERRUPT_NAME (n ) d ## n ## _interrupt
#define INTERRUPT_D (n )\
void d ## n ## _interrupt(){\
interruptionCommon (n-1 );\
};
INTERRUPT_D (1 );
INTERRUPT_D (2 );
INTERRUPT_D (3 );
INTERRUPT_D (4 );
INTERRUPT_D (5 );
INTERRUPT_D (6 );
INTERRUPT_D (7 );
INTERRUPT_D (8 );
int getMaximumDistanceBetweenTimes (){
long max = 0 ;
for (int i = 0 ; i < DEVICE_QTY; i++)
for (int j = i+1 ; j < DEVICE_QTY; j++){
long distance = toPrint[i] - toPrint[j];
if (abs (distance) > abs (max))
max = distance;
}
return max;
}
#define MODE CHANGE
void setup (){
Serial.begin (9600 );
while (!Serial){};
Serial.printf (" Hello World! %i devices\n " , DEVICE_QTY);
if (DEVICE_QTY > MAPPER_LENGTH){
Serial.printf (" ERROR: update mapper!\n " );
}else {
/* initialize pins */
for (int i = 0 ; i < DEVICE_QTY; i++) {
pinMode (mapper[i], INPUT);
}
/* create interruption handler for each device */
attachInterrupt (digitalPinToInterrupt (mapper[0 ]), INTERRUPT_NAME (1 ), MODE);
attachInterrupt (digitalPinToInterrupt (mapper[1 ]), INTERRUPT_NAME (2 ), MODE);
attachInterrupt (digitalPinToInterrupt (mapper[2 ]), INTERRUPT_NAME (3 ), MODE);
attachInterrupt (digitalPinToInterrupt (mapper[3 ]), INTERRUPT_NAME (4 ), MODE);
attachInterrupt (digitalPinToInterrupt (mapper[4 ]), INTERRUPT_NAME (5 ), MODE);
attachInterrupt (digitalPinToInterrupt (mapper[5 ]), INTERRUPT_NAME (6 ), MODE);
attachInterrupt (digitalPinToInterrupt (mapper[6 ]), INTERRUPT_NAME (7 ), MODE);
attachInterrupt (digitalPinToInterrupt (mapper[7 ]), INTERRUPT_NAME (8 ), MODE);
}
}
void loop () {
if (hasToPrint) {
// if (!cagada){
for (int i = 0 ; i < DEVICE_QTY; i++){
Serial.printf (" %i\t " , toPrint[i]);
}
Serial.printf (" %i\t %i\n " , getMaximumDistanceBetweenTimes (), cagada);
// }
hasToPrint = false ;
}
}