skusku

Dependencies:   mbed bloc_io mbed-rtos html EthernetInterface

main.cpp

Committer:
algrs
Date:
2021-01-14
Revision:
1:fbf189951c5e
Parent:
0:e30c9ba95bd4

File content as of revision 1:fbf189951c5e:



//#include "EthernetInterface.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mbed.h"
#include "rtos.h" // need for main thread sleep
#include "html.h" // need for html patch working with web server
#include "bloc_io.h"
#define RADIUS  0.2F // wheel size
#define NBPOLES 8 // magnetic pole number
#define DELTA_T 0.1F // speed measurement counting period
#define TickVitessePeriode 0.1
#define CirconferenceRoue 1.25664F

Bloc_IO MyPLD(p25,p26,p5,p6,p7,p8,p9,p10,p23,p24);// instantiate object needed to communicate with PLD
// analog input connected to mbed
// valid pmw mbed pin
Serial pc(USBTX, USBRX); // tx, rx
// Top_Hall Pin

/************ persistent file parameters section *****************/
LocalFileSystem local("local");               // Create the local filesystem under the name "local"


/********************* web server section **********************************/

var_field_t tab_balise[10];  //une balise est présente dans le squelette
int giCounter=0;// acces counting


/*********************** can bus section  ************/
// determine message ID used to send Gaz ref over can bus
#define _CAN_DEBUG // used to debug can bus activity
//#define USE_CAN_REF // uncomment to receive gaz ref over can_bus
CAN can_port (p30, p29); // initialisation du Bus CAN sur les broches 30 (rd) et 29(td) for lpc1768 + mbed shield
bool bCan_Active=false;


DigitalOut led1(LED1); //initialisation des Leds présentes sur le micro-controleur Mbed*/
DigitalOut led2(LED2);
DigitalOut led3(LED3); // blink when can message is sent
DigitalOut led4(LED4); // blink when can message is received

InterruptIn TopHallSku(p22);


float fVitesse = 0,fLimiteBridage=15;
int iCompteurHallVitesse = 0,iCompteurHallTotal=0,iCompteurHallPartiel=0;

AnalogIn AINPOIGNEE (p17);

Ticker Ticky;
Ticker TickVitesse;
Ticker Bridge;
Ticker TickPLD;

        FILE* fichier = NULL;
    
    int iMode=1;
    int iSortiePWM=0;
    int iConsignePWM=0;
    int iAllow=1;
    float fPoigneeMax=1,fPoigneeMin=0.5;
    
    
    int iBit6=0,iBit5=0,iBit4=0,iBit3=0,iBit2=0,iBit1=0,iBit0=0;

void ModeAutoPWM(void)
{
                if(iMode=1)
                {
                    iConsignePWM=(((AINPOIGNEE.read()-fPoigneeMin)/(fPoigneeMax-fPoigneeMin))*255);
                    if(iConsignePWM>254)
                    {   iConsignePWM=255;   }
                    else if (iConsignePWM<10)
                    {   iConsignePWM=0; } // FIN DE L'ACTUALISATION DE LA SORTIE PWM IDEALE
                    
                    if(iBit5==0) //frein , faire lecture ici
                    {   iSortiePWM=0;   }
                    else if(iConsignePWM>iSortiePWM && ((fVitesse/1000)<fLimiteBridage))
                    {   iSortiePWM++;   }
                    else if(iConsignePWM<iSortiePWM )
                    {   iSortiePWM--;   } // FIN DE L'ACTUALISATION DE LA SORTIE PWM PROGRESSIVE 
                }
                else if(iMode=0)
                {
                    iConsignePWM=0;
                    iSortiePWM=0;
                }
                
        MyPLD.write(iSortiePWM); // Ecriture sortie
}

void VitesseTopHall()
{
    fVitesse=((2*3.1415*0.2*iCompteurHallVitesse)/(TickVitessePeriode*8*6))*3600;
    iCompteurHallVitesse=0;
}

void Incrementation()
{
    iCompteurHallVitesse++;
    iCompteurHallTotal++;
    iCompteurHallPartiel++;
}
//************ local function prototypes *******************



void LecturePLD(void)
{
                int iLecture=MyPLD.read();
                if(iLecture>=64){iBit6=1;iLecture=iLecture-64;    }else{iBit6=0;}
                if(iLecture>=32){iBit5=1;iLecture=iLecture-32;    }else{iBit5=0;}
                if(iLecture>=16){iBit4=1;iLecture=iLecture-16;    }else{iBit4=0;}
                if(iLecture>=8) {iBit3=1;iLecture=iLecture-8;     }else{iBit3=0;}
                if(iLecture>=4) {iBit2=1;iLecture=iLecture-4;     }else{iBit2=0;}
                if(iLecture>=2) {iBit1=1;iLecture=iLecture-2;     }else{iBit1=0;}
                if(iLecture>=1) {iBit0=1;iLecture=iLecture-1;     }else{iBit0=0;}
}

void LireFichier()
{
    fichier = NULL;
    fichier = fopen("/local/GR2B.txt", "r");
    
    pc.printf("\n\r Ouverture du fichier pour lecture... ");
    if(fichier==NULL)
    {
        pc.printf("ERREUR !\n\r");
    }
    else
    {
        fscanf(fichier, "%g %g %g %d %d",&fPoigneeMin,&fPoigneeMax,&fLimiteBridage,&iCompteurHallTotal,&iCompteurHallPartiel);
        pc.printf(" SUCCES !\n\r");
        pc.printf("_____________________________________________________________________________\n\r");
        pc.printf("PoigneeMin\tPoigneeMax\tLimiteBridage\tCompteursTot\tCompteurPart\n\r");
        pc.printf("%g\t\t%g\t\t%g\t\t%d\t\t%d\n\r",fPoigneeMin,fPoigneeMax,fLimiteBridage,iCompteurHallTotal,iCompteurHallPartiel);
        pc.printf("_____________________________________________________________________________\n\r");
        fclose(fichier);
    }
}

void SauvegarderFichier()
{
        fclose(fichier);
        fichier = NULL;
        fichier = fopen("/local/GR2B.txt", "w");
        
        pc.printf("\n\r Ouverture du fichier pour ecriture... ");
        
        if(fichier==NULL)
        {
            printf("ERREUR !\n\r(valeurs seulement en mémoire vive)\n\r");
        }
        else
        {
            fprintf(fichier, "%g %g %g %d %d",fPoigneeMin,fPoigneeMax,fLimiteBridage,iCompteurHallTotal,iCompteurHallPartiel);
            pc.printf(" SUCCES !\n\r");
            pc.printf("_____________________________________________________________________________\n\r");
            pc.printf("PoigneeMin\tPoigneeMax\tLimiteBridage\tCompteursTot\tCompteurPart\n\r");
            pc.printf("%g\t\t%g\t\t%g\t\t%d\t\t%d\n\r",fPoigneeMin,fPoigneeMax,fLimiteBridage,iCompteurHallTotal,iCompteurHallPartiel);
            pc.printf("_____________________________________________________________________________\n\r");
            fclose(fichier);
        }
        
        fclose(fichier);
}



/**************** Read persistent data from text file located on local file system ****************/



/**************** write persitant  data to text file located on local file system ****************/


//************** calibation gaz function needed to record min_gaz and max_gaz value to persistent text file  ******************


// ************top hall counting interrupt needed for speed measurement


//********************** timer interrupt for speed measurement each 100ms  *************************






//********************* Timer Interrupt for gaz ref management each 10ms   ********************



/********* main cgi function used to patch data to the web server thread **********************************/
void CGI_Function(void) // cgi function that patch web data to empty web page
{
    char ma_chaine4[20]= {}; // needed to form html response

}


/*********************** CAN BUS SECTION  **********************/



void CAN_REC_THREAD(void const *args)
{
    int iCount,iError;

    while (bCan_Active) {
        Thread::wait(100);// wait 100ms
        // code todo

    }

}
//*************************** main function *****************************************
int main()
{
    TopHallSku.mode(PullUp);
    char cChoix=0;
    
    TickVitesse.attach(&VitesseTopHall,TickVitessePeriode);
    
    
    TickPLD.attach(&LecturePLD,0.1);
    
    TopHallSku.rise(&Incrementation);
    MyPLD.write(iConsignePWM);
    pc.printf("\n\r************************************");
    pc.printf("\n\r**                                **");
    pc.printf("\n\r**     PROGRAMME SCOOTER MBED     **");
    pc.printf("\n\r**                                **");
    pc.printf("\n\r************************************\n\r");
    
    LireFichier();
    


//***************************************** web section ********************************************/
//Init_Web_Server(&CGI_Function); // create and initialize tcp server socket and pass function pointer to local CGI function
//Thread WebThread(Web_Server_Thread);// create and launch web server thread
    /********* main cgi function used to patch data to the web server thread **********************************/

//******************************************* end web section  ************************************* /

    

//********************* can bus section initialisation *******************************************
//bCan_Active=true;// needed to lauchn CAN thread
//Thread CanThread(CAN_REC_THREAD);// create and launch can receiver  thread
//********************* end can bus section *****************************************************


    while(cChoix!='q' and cChoix!='Q')
    {
        if(iMode==1)
        {
            pc.printf(" \n\r\n\r\t*** MODE AUTOMATIQUE ***\n\r");
                iAllow=1;
                Ticky.attach(&ModeAutoPWM,0.05);
        }
        else
        {
            pc.printf(" \n\r\n\r\t*** MODE MANUEL ***\n\r");
                    iAllow=0;
                    Ticky.detach();
                    MyPLD.write(iConsignePWM);
        }
        pc.printf(" \t Veuillez selectionner une action : \n\r");
        pc.printf(" a: Changer de mode \n\r");
        pc.printf(" b: Calibrer \n\r");
        pc.printf(" c: Afficher dernieres valeurs de calibration\n\r");
        if(iMode==0)    {   pc.printf(" d: Saisir une consigne pwm \n\r");  }
        pc.printf(" e: Afficher Vitesse\n\r");
        pc.printf(" f: Lire PLD\n\r");
        pc.printf(" g: Changer limite bridage\n\r");
        pc.printf(" h: Remettre a 0 le kilometrage partiel\n\r");
        pc.printf(" q: Quitter \n\r");

        /************* multithreading : main thread need to sleep in order to allow web response */
        while (pc.readable()==0) { // determine if char availabler
            Thread::wait(10);   // wait 10 until char available on serial input
        }
        /************* end of main thread sleep  ****************/


        pc.scanf("%c",&cChoix);
        printf("\n\r");
        switch (cChoix)
        {
            case 'a':
                iMode=!iMode;
                Ticky.detach();
                iConsignePWM=0;
                MyPLD.write(iConsignePWM); 
                break;
            case 'b':
                iConsignePWM=0;
                MyPLD.write(iConsignePWM); 
                Ticky.detach();
                
                pc.printf("\n\r MODE DE CALIBRATION ! \n\r");
                pc.printf("MAINTENEZ LA POIGNEE AU MAX PENDANT 3 SECONDES : \n\r");
                pc.printf(" 1.. "); wait(1);pc.printf(" 2.. ");wait(1);pc.printf(" 3.. ");wait(1);
                fPoigneeMax=AINPOIGNEE.read()*100;fPoigneeMax=(int)fPoigneeMax;fPoigneeMax=fPoigneeMax/100;pc.printf("\t %g \n\r",fPoigneeMax);
                pc.printf("MAINTENEZ LA POIGNEE AU MIN PENDANT 3 SECONDES : \n\r");
                pc.printf(" 1.. "); wait(1);pc.printf(" 2.. ");wait(1);pc.printf(" 3.. ");wait(1);
                fPoigneeMin=AINPOIGNEE.read()*100;fPoigneeMin=(int)fPoigneeMin;fPoigneeMin=fPoigneeMin/100;pc.printf("\t %g \n\r",fPoigneeMin);
                pc.printf("ECRITURE EN MEMOIRE ... \n\r");
                //ecriture du fichier
                SauvegarderFichier();
                Ticky.attach(&ModeAutoPWM,0.01);
                //fin de l'ecriture du fichier
                pc.printf("FIN DU MODE DE CALIBRATION ! \n\r");
                break;
            case 'c':
                pc.printf("\n\r\t Valeurs de calibration : \t MIN=%.2f \tMAX=%.2f \n\r",fPoigneeMin,fPoigneeMax);
                break;
            case 'd':
                if(iMode==0)
                {
                    iAllow=0;
                    Ticky.detach();
                    iConsignePWM=0;
                    pc.printf("\n\r\t MODE DE SAISIE DE CONSIGNE PWM\n\r");
                    pc.printf("ENTREE DE LA CONSIGNE ...\n\r(valeur entiere entre 0 et 255)\n\r");
                    pc.scanf("%d",&iConsignePWM);
                    MyPLD.write(iConsignePWM);
                    pc.printf("CONSIGNE ENREGISTREE ! : %d\n\r",iConsignePWM);
                    pc.printf("FIN DU MODE SAISIE !\n\r\n\r");
                    Ticky.detach();
                }
                
                break;
            case 'e':
            
                pc.printf("\n\r\n\r Vitesse = %.2F km/h",fVitesse/1000);
                pc.printf("\n\r Vitesse = %.2F m/s\n\r",fVitesse/3600);
                pc.printf("\n\r Bridage : %g km/h\n\r",fLimiteBridage);
                pc.printf("\n\r Kilometres parcourus (total): %.3f km\n\r",(((iCompteurHallTotal/48)*CirconferenceRoue)/1000));
                pc.printf("\n\r Kilometres parcourus (partiel): %.3f km\n\r",(((iCompteurHallPartiel/48)*CirconferenceRoue)/1000));
                
                break;
            case 'f':
                LecturePLD();
                //pc.printf("\n\r\t Valeur de PLD en int : %d \n\r",MyPLD.read());
                
                if(iBit3==1){pc.printf("\n\r PAS DE SURCHARGE COURRANT ");}     else{pc.printf("\n\r SURCHARGE COURRANT ");}
                if(iBit5==1){pc.printf("\n\r Frein INACTIF ");}                 else{pc.printf("\n\r Frein ACTIF ");}
                if(iBit4==1){pc.printf("\n\r PAS D'ERREUR CONVERTISSEUR ");}    else{pc.printf("\n\r ERREUR CONVERTISSEUR ");}
                if(iBit3==1){pc.printf("\n\r Direction AVANT ");}               else{pc.printf("\n\r Direction ARRIERE ");}
                /*
                pc.printf("\n\r BIT 2 : %d HALL C               ",iBit2);
                pc.printf("\n\r BIT 1 : %d HALL B               ",iBit1);
                pc.printf("\n\r BIT 0 : %d HALL A               ",iBit0);
                */
                pc.printf("\n\r SECTEUR HALL : %d\n\r",iBit0*1+iBit1*2+iBit2*4);
                break;
            case 'g':
                pc.printf("\n\r Veuillez entrer une nouvelle valeur de limite bridage : \n\r");
                scanf("%g",&fLimiteBridage);
               
                SauvegarderFichier();
                Ticky.attach(&ModeAutoPWM,0.01);
                //fin de l'ecriture du fichier
                
                break;
            case 'h':
                printf("\n\rRemise a 0 ... ");iCompteurHallPartiel=0;printf("Fait !\n\r");
                break;
            case 'q':
                iConsignePWM=0;
                MyPLD.write(iConsignePWM); 
                Ticky.detach();
                SauvegarderFichier();
                
                break;
        }
    } // end while

    //************** thread deinit *********************
    //DeInit_Web_Server();
    //bCan_Active=false;
    //CanThread=false;// close can received thread
    pc.printf("\n\r=== FIN DU PROGRAMME === \n\r");
} // end main