test

Dependencies:   mbed

Dependents:   MouseHybridSenseCode

senseFunc.cpp

Committer:
JamieBignell
Date:
2018-04-28
Revision:
7:11dd5581c763
Parent:
6:a652deaae134

File content as of revision 7:11dd5581c763:

#include <mbed.h>
#include <funcdef.h>
//#include <iostream>
#include <math.h>

float fmax(float x, float y)
{
    if(x > y)
    {
        return x;
    }else
    {
        return y;
    }
}  

float interpolation(float errorVar)
{
    float distanceMm=0.0;
    for (int i=1;i<=105;i++) //not looking at first values, because interpolation occurs within range of values
    {        
        if ((errorVar>=linearOffset[i][0]) && (errorVar<linearOffset[i-1][0]))
        {
            //printf("linearOffset %8.4f", linearOffset[i-1][0]);
            //printf("linearOffset %8.4f\r\n", linearOffset[i][0]); 
            distanceMm=linearOffset[i][1]+(errorVar-linearOffset[i][0])*((linearOffset[i-1][1]-linearOffset[i][1])/(linearOffset[i-1][0]-linearOffset[i][0]));
        }
    }
    return distanceMm;
}

void senseFunc()
{
    //READ ALL SENSORS
    float totalError = 0.0;
  
    //for (int i=0;i<=7;i++)
    for (int i=7;i>=0;i--)
    {
        sensorValue[i]=((sensorPin[i]).read_u16()>>4); 
        sensorErrors[i]=((1/(float)(sensorMaxValue[i]-sensorMinValue[i]))*sensorValue[i])+(1-(sensorMaxValue[i]/(float)(sensorMaxValue[i]-sensorMinValue[i])));
    }    
    
    
    if ((sensorErrors[6]<=(float)0.7) && (sensorErrors[7]<=(float)0.7))
    {
        totalError = (fmax(sensorErrors[0], 0.0)*1+fmax(sensorErrors[2],0.0)*2+fmax(sensorErrors[4],0.0)*3+fmax(sensorErrors[6], 0.0)*5) - 
        (fmax(sensorErrors[1], 0.0)*1+fmax(sensorErrors[3],0.0)*2+fmax(sensorErrors[5],0.0)*3+fmax(sensorErrors[7], 0.0)*5);
    }
    else
    {    
        //To compensate for the black lines on the ramp
        totalError = (fmax(sensorErrors[0], 0.0)*1+fmax(sensorErrors[2],0.0)*2) - 
        (fmax(sensorErrors[1], 0.0)*1+fmax(sensorErrors[3],0.0)*2);
        accumulator=0;
        errorDetectthres=100;
        LEDVal=0;
    }
       
    errorVar = -totalError;
    errorVar=interpolation(errorVar)/-3.81;
 
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    for (int i=0;i<=7;i++)
    {
        if ((sensorValue[i])>=(sensorThreshold[i]))
        {
            sensorErrorsdiscrete[i] = 1;
        }
        else
        {
            sensorErrorsdiscrete[i] = 0;
        }
    }
    
    if ((sensorErrorsdiscrete[0]) == 1)
    {
        if ((sensorErrorsdiscrete[1]) == 1)
        {
            errorVardiscrete=0;
        }
        else if ((sensorErrorsdiscrete[2]) == 1)
        {
            errorVardiscrete=-1;
        }  
        else
        {
            errorVardiscrete=-0.5;
        }
    }       
    else if ((sensorErrorsdiscrete[1]) == 1)
    {
        if ((sensorErrorsdiscrete[0]) == 1)
        {
            errorVardiscrete=0;
        }
        else if ((sensorErrorsdiscrete[3]) == 1)
        {
            errorVardiscrete=1;
        }  
        else
        {
            errorVardiscrete=0.5;
        }    
    }   
    else if ((sensorErrorsdiscrete[2]) == 1)
    {
        if ((sensorErrorsdiscrete[0]) == 1)
        {
            errorVardiscrete=-1;
        }
        else if ((sensorErrorsdiscrete[4]) == 1)
        {
            errorVardiscrete=-2;
        }  
        else
        {
            errorVardiscrete=-1.5;
        }    
    }  
    else if ((sensorErrorsdiscrete[3]) == 1)
    {
        if ((sensorErrorsdiscrete[1]) == 1)
        {
            errorVardiscrete=1;
        }
        else if ((sensorErrorsdiscrete[5]) == 1)
        {
            errorVardiscrete=2;
        }  
        else
        {
            errorVardiscrete=1.5;
        }    
    } 
    else if ((sensorErrorsdiscrete[4]) == 1)
    {
        if ((sensorErrorsdiscrete[2]) == 1)
        {
            errorVardiscrete=-2;
        }
        else if ((sensorErrorsdiscrete[6]) == 1)
        {
            errorVardiscrete=-3.5;
        }  
        else
        {
            errorVardiscrete=-2.5;
        }    
    } 
    else if ((sensorErrorsdiscrete[5]) == 1)
    {
        if ((sensorErrorsdiscrete[3]) == 1)
        {
            errorVardiscrete=2;
        }
        else if ((sensorErrorsdiscrete[7]) == 1)
        {
            errorVardiscrete=3.5;
        }  
        else
        {
            errorVardiscrete=2.5;
        }    
    } 
    else if ((sensorErrorsdiscrete[6]) == 1)
    {
        if ((sensorErrorsdiscrete[4]) == 1)
        {
            errorVardiscrete=-3.5;
        }         
        else
        {
            //errorVardiscrete=-4;
            errorVardiscrete=-5;
        }    
    }
    else if ((sensorErrorsdiscrete[7]) == 1)
    {
        if ((sensorErrorsdiscrete[5]) == 1)
        {
            errorVardiscrete=3.5;
        }         
        else
        {
            //errorVardiscrete=4;
            errorVardiscrete=5;
        }    
    }
    else
    {
        errorVardiscrete=previousErrordiscrete;
    }
    
    if (errorVar>largestpositiveerrorvar)
    {
        largestpositiveerrorvar=errorVar;
    }
    if (errorVar<largestnegativeerrorvar)
    {
        largestnegativeerrorvar=errorVar;
    }    
    
    if (((errorVar)<0.2) && ((errorVardiscrete)>2))
    {
        errorVar=largestpositiveerrorvar;
    }   
    if (((errorVar)<0.2) && ((errorVardiscrete)<-2))
    {
        errorVar=largestnegativeerrorvar;
    } 
      
    //printf("errorVardiscrete: %d   ",errorVardiscrete);  
    //printf("errorVar:  %f\r\n",errorVar);   
    //wait_ms(200);
    return;
}