Programme course fonctionnel Jour J Croisement non pris en charge (tourne en rond)

Dependencies:   MMA8451Q mbed

Fork of Programme_course_30Tr by Freescale_Cachan

Mlib.cpp

Committer:
leandre
Date:
2017-03-22
Revision:
4:8b0215ec788f
Parent:
3:c0aae5aa230b
Child:
5:7714a216c91d

File content as of revision 4:8b0215ec788f:

#include "Mlib.h"

/***********AUTRES_FCT***************/

char middle_3(char *tab)
{
    tri_a_bulle(tab, 3);
    return tab[1];
}

int middle_3U(int *tab)
{
    tri_a_bulleU(tab, 3);
    return tab[1];
}

float middle_3F(float *tab)
{
    
    return tri_a_bulleF(tab, 3);
}


void tri_a_bulle(char* t, int const size) 
{
    int en_desordre = 1;
    int i,j;

    for (i = 0; (i < size) && en_desordre; ++i)
    {
        en_desordre = 0;
        for (j = 1; j < (size - i); ++j)
        {
            if (t[j-1] > t[j])
            {
                int temp = t[j-1];
                t[j-1] = t[j];
                t[j] = temp;
                en_desordre = 1;
            }
        }
    }
}
void tri_a_bulleU(int* t, int const size) 
{
    int en_desordre = 1;
    int i,j;

    for (i = 0; (i < size) && en_desordre; ++i)
    {
        en_desordre = 0;
        for (j = 1; j < (size - i); ++j)
        {
            if (t[j-1] > t[j])
            {
                int temp = t[j-1];
                t[j-1] = t[j];
                t[j] = temp;
                en_desordre = 1;
            }
        }
    }
}
float tri_a_bulleF(float* t2, int const size) 
{
    float t[3];
    t[0] = t2[0];
    t[1] = t2[1];
    t[2] = t2[2];
    
        
    int en_desordre = 1;
    int i,j;

    for (i = 0; (i < size) && en_desordre; ++i)
    {
        en_desordre = 0;
        for (j = 1; j < (size - i); ++j)
        {
            if (t[j-1] > t[j])
            {
                float temp = t[j-1];
                t[j-1] = t[j];
                t[j] = temp;
                en_desordre = 1;
            }
        }
    }
    return t[1];
}

unsigned char Moyenne(unsigned char *tab)
{
    int i = 0;
    int somme = 0;
    for(i = 0; i < 128;i++)
    {
        somme+=tab[i];
    }
    return somme/128.0;
}
char Moyenne2(char *tab, int nb)
{
    int i = 0;
    int somme = 0;
    for(i = 0; i < nb;i++)
    {
        somme+=tab[i];
    }
    return float(somme/nb);
}

void menu()
{
    static int p = 0;
    p++;
        wait(0.1);
        if(BP2)
        {
            seuil_der++;
            if(seuil_der == 2) seuil_der = -1;
            led1 = 0;
            wait(0.5);
        }
        if(seuil_der == 0)
        {
            led1 = p%2;
        }
        else if(seuil_der == 1)
        {
            led1 = 1;
        }
        else
        {
            led1 = 0;
        }
        if(S1 == 1)
        {
            led2 = 1;
        }
        else led2 = 0;
        if(S2 == 1)
        {
            led3 = 1;
        }
        else led3= 0;
}

void fin_course()
{
    static int arr = 0;
    static char moy_inter, moy_mem_a,moy_mem_b;
    static char tab_mem_b[TAILLE_TAB_INT]={0,0,0};
    static char tab_mem_a[TAILLE_TAB_INT]={0,0,0};
          
    if (t_debut.read_ms()>2000){
        moy_inter=Moyenne2(Interval, TAILLE_TAB_INT);
        moy_mem_a=Moyenne2(tab_mem_a, TAILLE_TAB_INT);
        moy_mem_b=Moyenne2(tab_mem_b, TAILLE_TAB_INT);
        
        //pc.printf("%d\n",moy_inter);
        if(S1&&(arr!=0))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           {//delai apres l'arret
            if (t_debut.read_ms()-arr>200)VIT=0;
            }
        else if((moy_mem_a>20)&&(moy_mem_b>20)){  // si la voiture n'est pas trop sur l'exterieur de la piste
            if(S1 && (moy_inter<75) && (moy_inter>50)){  //si l'espace entre les deux lignes est plus petit que la normale (arret)
             
                //for(int i=0;i<5;i++)  pc.printf("%d ",Interval[i]);
                //pc.printf("\n");
                //VIT=0;
                //pc.printf("\narret ");
                //pc.printf("\n%d ",moy_inter);
                led1=1;
                led2=1;
                arr=t_debut.read_ms();
        
                }   
        }
        else {
            led1=0;
            led2=0;
            
        }
            
    }
        
    for(int j = TAILLE_TAB_INT-1; j > 0; j--)
    {
        Interval[j] = Interval[j-1];
        tab_mem_b[j]=tab_mem_b[j-1];
        tab_mem_a[j]=tab_mem_a[j-1];
    } 
    tab_mem_b[0]=mem_b;
    tab_mem_a[0]=mem_a; 
}


void Gestion_bosse()
{
    if(BOSSE_ACTIVE)//Si on active la détection de la bosse
    {
    
        //pc.printf("bosse: %d , X: %1.2f , ajustement : %hi\n ",bosse,middle_3F(last_three),ajust_vit_bosse);
        
        
        last_three[2] = last_three[1]; // les 3 dernieres valeurs de X sont stockées dans un tableau
        last_three[1] = last_three[0];
        last_three[0] = acc.getAccX();
        
        if(bosse == 1)
        {
            ajust_vit_bosse = 60; 
            led3=1;
            led4=0;
            
        }
        else if(bosse == 3){
            ajust_vit_bosse = -80;
            led3=0;
            led4=1;
        
        }
        else 
        {
            ajust_vit_bosse = 0;
            led3=0;
            led4=0;
            
        }
        
        if((abs(middle_3F(last_three)) > 0.13 ) && (bosse == 0)) // si montée détectée
        {
            bosse = 1;
            //tep = (int)t_debut.read_ms();
        }
        else if(bosse == 1 && (middle_3F(last_three) > -0.1)) 
        {
            bosse = 2;
        }
        else if(bosse == 2 && (middle_3F(last_three) > 0.19)) 
        {
            bosse = 3;
            
        }
        else if(bosse==3 && (middle_3F(last_three) > 0.19))
        {
                 ajust_vit_bosse = -50;
                 
                 pc.printf("bosse: %d , X: %1.2f , ajustement : %hi\n",bosse,middle_3F(last_three),ajust_vit_bosse);
         }
                 
        else if (bosse==3 && (middle_3F(last_three) < 0.19)) 
        {
            bosse=0;
            ajust_vit_bosse=0;
        }
    }
}


//void F_BalanceBlancs()
//{
//    unsigned char moy = 0;
//    moy = Moyenne(cam_data);
//    if(moy > LUMI_MOYENNE && tempsInte >= MIN_INTE) tempsInte-=INCREM_BALANCE;
//    else if(tempsInte <= MAX_INTE) tempsInte+=INCREM_BALANCE;
//}