Arduino
int detectDirection(int16_t* buffI, int16_t* buffQ)
{
int16_t directionRet = 0;
int indicator = 0;
bool edgechanged = true;
bool nextismax = true;
int16_t mean = 0;
mean = getMeanValue(buffI, SAMPLES);
for (int i = 0; i < (SAMPLES - 1); i++)
{
if ((buffI[i] < (mean - SENSIVITY)) || (buffI[i] > (mean + SENSIVITY)))
{
if(edgechanged) // Determine next turning point type
{
if(buffI[i] > buffI[i+1]) // I(t): New edge is falling
nextismax = false; // Look for minimum
else // I(t): New edge is rising
nextismax = true; // Look for maximum
edgechanged = false;
}
if (nextismax)
{
if (buffI[i] > buffI[i + 1]) // Waiting for maximum
{
if (buffQ[i] > buffQ[i + 1]) // ... meets falling edge Q(t)
indicator++;
else if (buffQ[i] < buffQ[i + 1]) // ... meets rising edge Q(t)
indicator--;
edgechanged = true; // Prepare for determine next edge I(t)
}
}
else
{
if (buffI[i] < buffI[i + 1]) // Waiting for minimum
{
if (buffQ[i] > buffQ[i + 1]) // ... meets falling edge Q(t)
indicator--;
else if (buffQ[i] < buffQ[i + 1]) // ... meets rising edge Q(t)
indicator++;
edgechanged = true; // Prepare for next edge I(t)
}
}
}
}
if (indicator > 0)
directionRet = 1;
else if (indicator < 0)
directionRet = -1;
return directionRet;
}