![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
IUT GEII SEMESTRE 3 SCOOTER PROJECT
Dependencies: EthernetInterface bloc_io html mbed-rtos mbed
Fork of scooter_mbed_etudiant by
main.cpp@1:8d356d22e69c, 2018-01-22 (annotated)
- Committer:
- syasya
- Date:
- Mon Jan 22 19:02:58 2018 +0000
- Revision:
- 1:8d356d22e69c
- Parent:
- 0:e30c9ba95bd4
IUT GEII NICE SEMESTRE 3 SCOOTER PROJECT
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
syasya | 1:8d356d22e69c | 1 | #include "EthernetInterface.h" |
superphil06 | 0:e30c9ba95bd4 | 2 | #include <stdlib.h> |
superphil06 | 0:e30c9ba95bd4 | 3 | #include <string.h> |
superphil06 | 0:e30c9ba95bd4 | 4 | #include "mbed.h" |
superphil06 | 0:e30c9ba95bd4 | 5 | #include "rtos.h" // need for main thread sleep |
superphil06 | 0:e30c9ba95bd4 | 6 | #include "html.h" // need for html patch working with web server |
superphil06 | 0:e30c9ba95bd4 | 7 | #include "bloc_io.h" |
syasya | 1:8d356d22e69c | 8 | #define RADIUS 0.22F // wheel size |
syasya | 1:8d356d22e69c | 9 | #define NBPOLES 19 // magnetic pole number |
syasya | 1:8d356d22e69c | 10 | #define DELTA_T 0.2F // speed measurement counting period |
syasya | 1:8d356d22e69c | 11 | #define T_TICKER 0.05 // time for ticker to call function Gaz |
syasya | 1:8d356d22e69c | 12 | #define PI 3.1415 // pie value |
syasya | 1:8d356d22e69c | 13 | #define RESISTANCE // resistance value |
syasya | 1:8d356d22e69c | 14 | #define T_COEF 0.01 // constant for temperature calculation |
syasya | 1:8d356d22e69c | 15 | #define T_REST 0.2 // constant for current mesure |
syasya | 1:8d356d22e69c | 16 | #define INIT_IREST 60000 // capacite initial en mAs |
superphil06 | 0:e30c9ba95bd4 | 17 | |
superphil06 | 0:e30c9ba95bd4 | 18 | Bloc_IO MyPLD(p25,p26,p5,p6,p7,p8,p9,p10,p23,p24);// instantiate object needed to communicate with PLD |
syasya | 1:8d356d22e69c | 19 | AnalogIn Val_Poignee(p17);// analog input for gaz connected to mbed |
syasya | 1:8d356d22e69c | 20 | AnalogIn Vbat(p18);// analog input for battery connected to mbed |
syasya | 1:8d356d22e69c | 21 | AnalogIn Vtemp(p19);// analog input for temperature connected to mbed |
syasya | 1:8d356d22e69c | 22 | AnalogIn VImes(p20);// analog input for current connected to mbed |
syasya | 1:8d356d22e69c | 23 | DigitalOut Valid_PWM(p21);// valid pmw mbed pin |
syasya | 1:8d356d22e69c | 24 | InterruptIn Valid_PWM_In(p22); // count value for pole number |
superphil06 | 0:e30c9ba95bd4 | 25 | Serial pc(USBTX, USBRX); // tx, rx |
syasya | 1:8d356d22e69c | 26 | // Top_Hall Pin |
superphil06 | 0:e30c9ba95bd4 | 27 | |
superphil06 | 0:e30c9ba95bd4 | 28 | |
superphil06 | 0:e30c9ba95bd4 | 29 | |
superphil06 | 0:e30c9ba95bd4 | 30 | |
syasya | 1:8d356d22e69c | 31 | /************ persistent file parameters section *****************/ |
syasya | 1:8d356d22e69c | 32 | LocalFileSystem local("local"); // Create the local filesystem under the name "local" |
superphil06 | 0:e30c9ba95bd4 | 33 | |
superphil06 | 0:e30c9ba95bd4 | 34 | |
superphil06 | 0:e30c9ba95bd4 | 35 | |
superphil06 | 0:e30c9ba95bd4 | 36 | |
superphil06 | 0:e30c9ba95bd4 | 37 | |
superphil06 | 0:e30c9ba95bd4 | 38 | |
superphil06 | 0:e30c9ba95bd4 | 39 | |
syasya | 1:8d356d22e69c | 40 | /********************* web server section **********************************/ |
syasya | 1:8d356d22e69c | 41 | var_field_t tab_balise[10]; //une balise est présente dans le squelette |
syasya | 1:8d356d22e69c | 42 | int giCounter=0,giCounter2=0;// acces counting |
syasya | 1:8d356d22e69c | 43 | int giMode=0,giFlag=0;//to validate between mode automatic or manual |
syasya | 1:8d356d22e69c | 44 | float gfNmax=0.0,gfNmin=0.0,gfVit=0.0;//initialising values minimum and maximum for equation |
syasya | 1:8d356d22e69c | 45 | int giBrake = 0; |
syasya | 1:8d356d22e69c | 46 | int giPwm=0; //value initial for PWM mode manuel |
syasya | 1:8d356d22e69c | 47 | float gfPwm=0.0; //value initial for PWM mode auto |
syasya | 1:8d356d22e69c | 48 | float gfPwm_final=0.0; //value initial for incrementation PWM mode auto |
syasya | 1:8d356d22e69c | 49 | float gfVit_bride; //speed value (bride) in mode auto |
syasya | 1:8d356d22e69c | 50 | float gfVbat,gfIbat,gfTemp,gfPourc,gfGIrest,gfImes; |
syasya | 1:8d356d22e69c | 51 | float gfIrest = 60000; |
superphil06 | 0:e30c9ba95bd4 | 52 | |
syasya | 1:8d356d22e69c | 53 | Ticker Tick;//Ticker to call function Gaz |
syasya | 1:8d356d22e69c | 54 | Ticker Tick2;//Ticker to call function Vitesse |
syasya | 1:8d356d22e69c | 55 | Ticker Tick3;//Ticker to call function Imesure |
superphil06 | 0:e30c9ba95bd4 | 56 | |
syasya | 1:8d356d22e69c | 57 | /*********************** can bus section ************/ |
syasya | 1:8d356d22e69c | 58 | // determine message ID used to send Gaz ref over can bus |
syasya | 1:8d356d22e69c | 59 | #define _CAN_DEBUG // used to debug can bus activity |
syasya | 1:8d356d22e69c | 60 | #define USE_CAN_REF // uncomment to receive gaz ref over can_bus |
syasya | 1:8d356d22e69c | 61 | CAN can_port (p30, p29); // initialisation du Bus CAN sur les broches 30 (rd) et 29(td) for lpc1768 + mbed shield |
syasya | 1:8d356d22e69c | 62 | bool bCan_Active=false; |
syasya | 1:8d356d22e69c | 63 | int iCounter=0;// a counter for speed counting |
superphil06 | 0:e30c9ba95bd4 | 64 | |
superphil06 | 0:e30c9ba95bd4 | 65 | |
syasya | 1:8d356d22e69c | 66 | DigitalOut led1(LED1); //initialisation des Leds présentes sur le micro-controleur Mbed*/ |
syasya | 1:8d356d22e69c | 67 | DigitalOut led2(LED2); |
syasya | 1:8d356d22e69c | 68 | DigitalOut led3(LED3); // blink when can message is sent |
syasya | 1:8d356d22e69c | 69 | DigitalOut led4(LED4); // blink when can message is received |
superphil06 | 0:e30c9ba95bd4 | 70 | |
superphil06 | 0:e30c9ba95bd4 | 71 | |
superphil06 | 0:e30c9ba95bd4 | 72 | |
superphil06 | 0:e30c9ba95bd4 | 73 | |
superphil06 | 0:e30c9ba95bd4 | 74 | |
syasya | 1:8d356d22e69c | 75 | //************ local function prototypes ******************* |
syasya | 1:8d356d22e69c | 76 | |
syasya | 1:8d356d22e69c | 77 | void Imessure () //function for mesuring battery current capacity to be called every 200ms |
syasya | 1:8d356d22e69c | 78 | { |
syasya | 1:8d356d22e69c | 79 | |
syasya | 1:8d356d22e69c | 80 | int ic; // local counter |
syasya | 1:8d356d22e69c | 81 | |
syasya | 1:8d356d22e69c | 82 | ic++; |
syasya | 1:8d356d22e69c | 83 | if(ic>5) { // to wait for calculation after 1s |
syasya | 1:8d356d22e69c | 84 | gfIrest = gfIrest - 1000; // because every 1s, the battery consume 1000 |
syasya | 1:8d356d22e69c | 85 | gfGIrest = (gfIrest/INIT_IREST)*100; |
syasya | 1:8d356d22e69c | 86 | |
syasya | 1:8d356d22e69c | 87 | if(gfGIrest>100) |
syasya | 1:8d356d22e69c | 88 | gfGIrest = 100; |
syasya | 1:8d356d22e69c | 89 | if(gfGIrest<0) |
syasya | 1:8d356d22e69c | 90 | gfGIrest=0; |
syasya | 1:8d356d22e69c | 91 | |
syasya | 1:8d356d22e69c | 92 | ic=1; |
syasya | 1:8d356d22e69c | 93 | gfImes = 0; |
syasya | 1:8d356d22e69c | 94 | } |
syasya | 1:8d356d22e69c | 95 | //gfImes = (gfImes + gfVbat)/ic ; |
syasya | 1:8d356d22e69c | 96 | } |
syasya | 1:8d356d22e69c | 97 | |
syasya | 1:8d356d22e69c | 98 | |
syasya | 1:8d356d22e69c | 99 | void Affiche(void) //function only for display |
syasya | 1:8d356d22e69c | 100 | { |
syasya | 1:8d356d22e69c | 101 | gfVbat=(25*Vbat.read())/0.33; // battery tension value |
syasya | 1:8d356d22e69c | 102 | gfIbat=(33000*VImes.read())-13510; // current value |
syasya | 1:8d356d22e69c | 103 | gfTemp=((Vtemp.read()*3.3)/T_COEF)-273; // surrounding temperature |
syasya | 1:8d356d22e69c | 104 | gfPourc=((gfPwm*100)/255); // pedal turning percentage |
syasya | 1:8d356d22e69c | 105 | |
syasya | 1:8d356d22e69c | 106 | pc.printf(" Vitesse = %g m/h\n\r",gfVit); //speed diplay |
syasya | 1:8d356d22e69c | 107 | pc.printf(" Vbat=%.3g \n\r",gfVbat); // battery tension display |
syasya | 1:8d356d22e69c | 108 | pc.printf(" Ibat=%.2f mA\n\r",gfIbat); //current value display |
syasya | 1:8d356d22e69c | 109 | pc.printf(" Temperature = %g C\n\r",gfTemp); // surrounding temperature display |
syasya | 1:8d356d22e69c | 110 | pc.printf(" Pourcentage = %.0f %% \n\r",gfPourc); //pedal turning percentage display |
syasya | 1:8d356d22e69c | 111 | pc.printf(" Capacite = %.0f %% \n\r",gfGIrest); // battery capacity display |
syasya | 1:8d356d22e69c | 112 | |
syasya | 1:8d356d22e69c | 113 | } |
syasya | 1:8d356d22e69c | 114 | |
syasya | 1:8d356d22e69c | 115 | void Registre_PLD(void) // function for internal checkups display |
syasya | 1:8d356d22e69c | 116 | { |
syasya | 1:8d356d22e69c | 117 | |
syasya | 1:8d356d22e69c | 118 | /**** association with block io****/ |
syasya | 1:8d356d22e69c | 119 | int iSect = MyPLD.read() & 7; |
syasya | 1:8d356d22e69c | 120 | int iDir = MyPLD.read() & 8; |
syasya | 1:8d356d22e69c | 121 | int iFLTA = MyPLD.read() & 16; |
syasya | 1:8d356d22e69c | 122 | int iOver_Current = MyPLD.read() & 64; |
syasya | 1:8d356d22e69c | 123 | |
syasya | 1:8d356d22e69c | 124 | pc.printf("\n\r\n\r"); |
syasya | 1:8d356d22e69c | 125 | |
syasya | 1:8d356d22e69c | 126 | pc.printf(" Secteur : %d\n\r" , iSect); |
syasya | 1:8d356d22e69c | 127 | |
syasya | 1:8d356d22e69c | 128 | //direction |
syasya | 1:8d356d22e69c | 129 | if ( iDir == 0) |
syasya | 1:8d356d22e69c | 130 | pc.printf(" Direction = ARRIERE \n\r"); |
syasya | 1:8d356d22e69c | 131 | else { |
syasya | 1:8d356d22e69c | 132 | pc.printf(" Direction = AVANCE \n\r"); |
syasya | 1:8d356d22e69c | 133 | } |
syasya | 1:8d356d22e69c | 134 | //braking system |
syasya | 1:8d356d22e69c | 135 | if ( giBrake == 0) |
syasya | 1:8d356d22e69c | 136 | pc.printf(" Brake = ON \n\r"); |
syasya | 1:8d356d22e69c | 137 | if ( giBrake != 0) |
syasya | 1:8d356d22e69c | 138 | pc.printf(" Brake = OFF \n\r"); |
syasya | 1:8d356d22e69c | 139 | //internal error |
syasya | 1:8d356d22e69c | 140 | if ( iFLTA == 1) |
syasya | 1:8d356d22e69c | 141 | pc.printf(" Il y a un erreur \n\r"); |
syasya | 1:8d356d22e69c | 142 | if ( iFLTA != 1) |
syasya | 1:8d356d22e69c | 143 | pc.printf(" Pas d'erreur \n\r"); |
syasya | 1:8d356d22e69c | 144 | //overcurrent |
syasya | 1:8d356d22e69c | 145 | if ( iOver_Current == 0) |
syasya | 1:8d356d22e69c | 146 | pc.printf(" Over Current \n\r"); |
syasya | 1:8d356d22e69c | 147 | if ( iOver_Current != 0) |
syasya | 1:8d356d22e69c | 148 | pc.printf(" Normal Current \n\r"); |
syasya | 1:8d356d22e69c | 149 | |
syasya | 1:8d356d22e69c | 150 | pc.printf("\n\r"); |
syasya | 1:8d356d22e69c | 151 | |
syasya | 1:8d356d22e69c | 152 | } |
syasya | 1:8d356d22e69c | 153 | |
syasya | 1:8d356d22e69c | 154 | |
syasya | 1:8d356d22e69c | 155 | |
syasya | 1:8d356d22e69c | 156 | /**************** Read persistent data from text file located on local file system ****************/ |
syasya | 1:8d356d22e69c | 157 | void Read_file(void) |
syasya | 1:8d356d22e69c | 158 | { |
syasya | 1:8d356d22e69c | 159 | FILE* Calibrage = fopen("/local/TEST.txt","r"); |
syasya | 1:8d356d22e69c | 160 | |
syasya | 1:8d356d22e69c | 161 | if(Calibrage != NULL) { |
syasya | 1:8d356d22e69c | 162 | pc.printf(" OK\n\r"); |
syasya | 1:8d356d22e69c | 163 | fscanf (Calibrage, "%g %g %g %g", &gfNmin,&gfNmax,&gfVit_bride); |
syasya | 1:8d356d22e69c | 164 | pc.printf(" Nmin = %.3g \n\r",gfNmin); |
syasya | 1:8d356d22e69c | 165 | pc.printf(" Nmax = %.3g \n\r",gfNmax); |
syasya | 1:8d356d22e69c | 166 | pc.printf(" Vbride = %.2f\n\r",gfVit_bride); |
syasya | 1:8d356d22e69c | 167 | |
syasya | 1:8d356d22e69c | 168 | } else { |
syasya | 1:8d356d22e69c | 169 | |
syasya | 1:8d356d22e69c | 170 | pc.printf(" KO\n\r"); |
syasya | 1:8d356d22e69c | 171 | } |
syasya | 1:8d356d22e69c | 172 | |
syasya | 1:8d356d22e69c | 173 | fclose(Calibrage); |
syasya | 1:8d356d22e69c | 174 | } |
syasya | 1:8d356d22e69c | 175 | |
syasya | 1:8d356d22e69c | 176 | //************** calibation gaz function needed to record min_gaz and max_gaz value to persistent text file ****************** |
syasya | 1:8d356d22e69c | 177 | void Calibration(void) |
syasya | 1:8d356d22e69c | 178 | { |
syasya | 1:8d356d22e69c | 179 | char cNext=0; //a variable just to exit command scanf |
syasya | 1:8d356d22e69c | 180 | |
syasya | 1:8d356d22e69c | 181 | FILE* Calibrage =fopen("/local/TEST.txt","w"); //opening file |
syasya | 1:8d356d22e69c | 182 | if(Calibrage != NULL) { //validation for file existence |
syasya | 1:8d356d22e69c | 183 | pc.printf(" OK\n\r"); |
syasya | 1:8d356d22e69c | 184 | switch (giFlag) { |
syasya | 1:8d356d22e69c | 185 | case 0 ://calibration of pedal |
syasya | 1:8d356d22e69c | 186 | |
syasya | 1:8d356d22e69c | 187 | pc.printf(" lachez la poignee, appuyez 'k' et 'entree' \n\r"); |
syasya | 1:8d356d22e69c | 188 | pc.scanf(" %c",&cNext); |
syasya | 1:8d356d22e69c | 189 | gfNmin = Val_Poignee.read(); |
syasya | 1:8d356d22e69c | 190 | pc.printf(" Nmin = %.3g \n\r",gfNmin); |
syasya | 1:8d356d22e69c | 191 | |
syasya | 1:8d356d22e69c | 192 | pc.printf(" enfoncez la poignee, appuyez 'k' et 'entree'\n\r"); |
syasya | 1:8d356d22e69c | 193 | pc.scanf(" %c",&cNext); |
syasya | 1:8d356d22e69c | 194 | gfNmax = Val_Poignee.read(); |
syasya | 1:8d356d22e69c | 195 | pc.printf(" Nmax = %.3g \n\r",gfNmax); |
syasya | 1:8d356d22e69c | 196 | break; |
syasya | 1:8d356d22e69c | 197 | |
syasya | 1:8d356d22e69c | 198 | case 1 ://calibration of maximum speed |
syasya | 1:8d356d22e69c | 199 | pc.printf(" veuillez saisir la vitesse de la bride : \n\r"); |
syasya | 1:8d356d22e69c | 200 | pc.scanf(" %f",&gfVit_bride); |
syasya | 1:8d356d22e69c | 201 | break; |
syasya | 1:8d356d22e69c | 202 | |
syasya | 1:8d356d22e69c | 203 | |
syasya | 1:8d356d22e69c | 204 | } |
syasya | 1:8d356d22e69c | 205 | } else { |
syasya | 1:8d356d22e69c | 206 | pc.printf(" KO\n\r"); |
syasya | 1:8d356d22e69c | 207 | } |
syasya | 1:8d356d22e69c | 208 | fprintf(Calibrage,"%f %f %f %f",gfNmin,gfNmax,gfVit_bride,gfIrest);//saving infos in text file |
syasya | 1:8d356d22e69c | 209 | fclose(Calibrage); |
syasya | 1:8d356d22e69c | 210 | } |
syasya | 1:8d356d22e69c | 211 | |
syasya | 1:8d356d22e69c | 212 | |
syasya | 1:8d356d22e69c | 213 | |
syasya | 1:8d356d22e69c | 214 | // ************top hall counting interrupt needed for speed measurement |
syasya | 1:8d356d22e69c | 215 | void toggle(void) |
syasya | 1:8d356d22e69c | 216 | { |
syasya | 1:8d356d22e69c | 217 | giCounter=giCounter+1; |
syasya | 1:8d356d22e69c | 218 | |
syasya | 1:8d356d22e69c | 219 | } |
syasya | 1:8d356d22e69c | 220 | |
syasya | 1:8d356d22e69c | 221 | //********************** timer interrupt for speed measurement each 100ms ************************* |
syasya | 1:8d356d22e69c | 222 | void Vitesse(void) |
syasya | 1:8d356d22e69c | 223 | { |
syasya | 1:8d356d22e69c | 224 | giCounter2=giCounter; |
syasya | 1:8d356d22e69c | 225 | giCounter=0; |
syasya | 1:8d356d22e69c | 226 | |
syasya | 1:8d356d22e69c | 227 | gfVit=((float)giCounter2*2*PI*RADIUS*3600)/(6*NBPOLES*DELTA_T);// speed calculation |
syasya | 1:8d356d22e69c | 228 | } |
syasya | 1:8d356d22e69c | 229 | |
syasya | 1:8d356d22e69c | 230 | /*********************** INITIALISATION **********************/ |
syasya | 1:8d356d22e69c | 231 | void Initial(void) |
syasya | 1:8d356d22e69c | 232 | { |
syasya | 1:8d356d22e69c | 233 | Valid_PWM.write(0); |
syasya | 1:8d356d22e69c | 234 | MyPLD.write(0); |
syasya | 1:8d356d22e69c | 235 | Valid_PWM.write(1); |
syasya | 1:8d356d22e69c | 236 | Read_file(); |
syasya | 1:8d356d22e69c | 237 | Valid_PWM_In.mode(PullUp); |
syasya | 1:8d356d22e69c | 238 | |
syasya | 1:8d356d22e69c | 239 | } |
syasya | 1:8d356d22e69c | 240 | |
syasya | 1:8d356d22e69c | 241 | |
syasya | 1:8d356d22e69c | 242 | //********************* Timer Interrupt for gaz ref management each 10ms ******************** |
syasya | 1:8d356d22e69c | 243 | void Gaz(void) |
syasya | 1:8d356d22e69c | 244 | { |
syasya | 1:8d356d22e69c | 245 | giBrake = MyPLD.read() & 32; |
syasya | 1:8d356d22e69c | 246 | |
syasya | 1:8d356d22e69c | 247 | |
syasya | 1:8d356d22e69c | 248 | switch (giMode) { |
syasya | 1:8d356d22e69c | 249 | case 0 ://mode manuel |
syasya | 1:8d356d22e69c | 250 | |
syasya | 1:8d356d22e69c | 251 | if (giPwm<0) |
syasya | 1:8d356d22e69c | 252 | giPwm=0; |
syasya | 1:8d356d22e69c | 253 | if (giPwm>255) |
syasya | 1:8d356d22e69c | 254 | giPwm=255; |
syasya | 1:8d356d22e69c | 255 | |
syasya | 1:8d356d22e69c | 256 | MyPLD.write(giPwm); |
syasya | 1:8d356d22e69c | 257 | break; |
syasya | 1:8d356d22e69c | 258 | case 1 :// mode auto |
syasya | 1:8d356d22e69c | 259 | |
syasya | 1:8d356d22e69c | 260 | gfPwm = 255*(Val_Poignee.read()-gfNmin)/(gfNmax-gfNmin); |
syasya | 1:8d356d22e69c | 261 | if (gfPwm<0) |
syasya | 1:8d356d22e69c | 262 | gfPwm=0; |
syasya | 1:8d356d22e69c | 263 | if (gfPwm>255) |
syasya | 1:8d356d22e69c | 264 | gfPwm=255; |
syasya | 1:8d356d22e69c | 265 | |
syasya | 1:8d356d22e69c | 266 | //safety |
syasya | 1:8d356d22e69c | 267 | if ( giBrake == 0) { |
syasya | 1:8d356d22e69c | 268 | gfPwm_final = 0; |
syasya | 1:8d356d22e69c | 269 | } else if (gfVit >= gfVit_bride) { |
syasya | 1:8d356d22e69c | 270 | if (gfPwm_final >= 1.0) |
syasya | 1:8d356d22e69c | 271 | gfPwm_final = gfPwm_final-1.0; |
syasya | 1:8d356d22e69c | 272 | } else if (gfPwm_final < gfPwm) { |
syasya | 1:8d356d22e69c | 273 | gfPwm_final = gfPwm_final+1.0; |
syasya | 1:8d356d22e69c | 274 | } else if (gfPwm_final >= gfPwm) { |
syasya | 1:8d356d22e69c | 275 | gfPwm_final = gfPwm_final-1.0; |
syasya | 1:8d356d22e69c | 276 | } |
syasya | 1:8d356d22e69c | 277 | |
syasya | 1:8d356d22e69c | 278 | |
syasya | 1:8d356d22e69c | 279 | MyPLD.write(gfPwm_final); |
syasya | 1:8d356d22e69c | 280 | break; |
syasya | 1:8d356d22e69c | 281 | } |
syasya | 1:8d356d22e69c | 282 | } |
syasya | 1:8d356d22e69c | 283 | |
syasya | 1:8d356d22e69c | 284 | |
superphil06 | 0:e30c9ba95bd4 | 285 | /********* main cgi function used to patch data to the web server thread **********************************/ |
superphil06 | 0:e30c9ba95bd4 | 286 | |
superphil06 | 0:e30c9ba95bd4 | 287 | |
superphil06 | 0:e30c9ba95bd4 | 288 | |
superphil06 | 0:e30c9ba95bd4 | 289 | |
syasya | 1:8d356d22e69c | 290 | |
syasya | 1:8d356d22e69c | 291 | void CGI_Function(void) // cgi function that patch web data to empty web page |
syasya | 1:8d356d22e69c | 292 | { |
syasya | 1:8d356d22e69c | 293 | |
syasya | 1:8d356d22e69c | 294 | gfVbat=(25*Vbat.read())/0.33; |
syasya | 1:8d356d22e69c | 295 | gfIbat=(33000*VImes.read())-13510; |
syasya | 1:8d356d22e69c | 296 | gfTemp=((Vtemp.read()*3.3)/T_COEF)-273; |
syasya | 1:8d356d22e69c | 297 | gfPourc=((gfPwm*100)/255); |
syasya | 1:8d356d22e69c | 298 | |
syasya | 1:8d356d22e69c | 299 | char ma_chaine4[20]= {}; // needed to form html response |
syasya | 1:8d356d22e69c | 300 | sprintf (ma_chaine4,"%d",iCounter);// convert speed as ascii string |
syasya | 1:8d356d22e69c | 301 | Html_Patch (tab_balise,0,ma_chaine4); |
syasya | 1:8d356d22e69c | 302 | iCounter++; |
syasya | 1:8d356d22e69c | 303 | |
syasya | 1:8d356d22e69c | 304 | sprintf (ma_chaine4,"%f",gfVbat); |
syasya | 1:8d356d22e69c | 305 | Html_Patch (tab_balise,1,ma_chaine4);// patch first label with dyn.string |
syasya | 1:8d356d22e69c | 306 | |
syasya | 1:8d356d22e69c | 307 | sprintf (ma_chaine4,"%.4f",gfIbat); |
syasya | 1:8d356d22e69c | 308 | Html_Patch (tab_balise,2,ma_chaine4); |
syasya | 1:8d356d22e69c | 309 | |
syasya | 1:8d356d22e69c | 310 | sprintf (ma_chaine4,"%.4f",gfTemp); |
syasya | 1:8d356d22e69c | 311 | Html_Patch (tab_balise,3,ma_chaine4); |
syasya | 1:8d356d22e69c | 312 | |
syasya | 1:8d356d22e69c | 313 | sprintf (ma_chaine4,"%.4f",gfPourc); |
syasya | 1:8d356d22e69c | 314 | Html_Patch (tab_balise,4,ma_chaine4); |
syasya | 1:8d356d22e69c | 315 | |
syasya | 1:8d356d22e69c | 316 | sprintf (ma_chaine4,"%.4f",gfVit); |
syasya | 1:8d356d22e69c | 317 | Html_Patch (tab_balise,5,ma_chaine4); |
syasya | 1:8d356d22e69c | 318 | |
syasya | 1:8d356d22e69c | 319 | sprintf (ma_chaine4,"%.4f",gfGIrest); |
syasya | 1:8d356d22e69c | 320 | Html_Patch (tab_balise,6,ma_chaine4); |
syasya | 1:8d356d22e69c | 321 | |
syasya | 1:8d356d22e69c | 322 | |
syasya | 1:8d356d22e69c | 323 | } |
syasya | 1:8d356d22e69c | 324 | |
syasya | 1:8d356d22e69c | 325 | |
syasya | 1:8d356d22e69c | 326 | /*********************** CAN BUS SECTION **********************/ |
syasya | 1:8d356d22e69c | 327 | |
syasya | 1:8d356d22e69c | 328 | |
syasya | 1:8d356d22e69c | 329 | |
syasya | 1:8d356d22e69c | 330 | void CAN_REC_THREAD(void const *args) |
syasya | 1:8d356d22e69c | 331 | { |
syasya | 1:8d356d22e69c | 332 | int iCount,iError; |
syasya | 1:8d356d22e69c | 333 | |
syasya | 1:8d356d22e69c | 334 | while (bCan_Active) { |
syasya | 1:8d356d22e69c | 335 | Thread::wait(100);// wait 100ms |
syasya | 1:8d356d22e69c | 336 | |
syasya | 1:8d356d22e69c | 337 | } |
syasya | 1:8d356d22e69c | 338 | |
syasya | 1:8d356d22e69c | 339 | } |
syasya | 1:8d356d22e69c | 340 | |
syasya | 1:8d356d22e69c | 341 | |
syasya | 1:8d356d22e69c | 342 | |
syasya | 1:8d356d22e69c | 343 | //*************************** main function ***************************************** |
syasya | 1:8d356d22e69c | 344 | int main() |
syasya | 1:8d356d22e69c | 345 | { |
syasya | 1:8d356d22e69c | 346 | //pc.printf("\n demarrage\n\r"); |
syasya | 1:8d356d22e69c | 347 | Initial(); |
syasya | 1:8d356d22e69c | 348 | |
syasya | 1:8d356d22e69c | 349 | Valid_PWM_In.rise(&toggle); |
syasya | 1:8d356d22e69c | 350 | Tick.attach(&Gaz,T_TICKER); |
syasya | 1:8d356d22e69c | 351 | Tick2.attach(&Vitesse,DELTA_T); |
syasya | 1:8d356d22e69c | 352 | Tick3.attach(&Imessure,T_REST); |
syasya | 1:8d356d22e69c | 353 | |
syasya | 1:8d356d22e69c | 354 | char cChoix=0; |
syasya | 1:8d356d22e69c | 355 | |
syasya | 1:8d356d22e69c | 356 | //***************************************** web section ********************************************/ |
syasya | 1:8d356d22e69c | 357 | Init_Web_Server(&CGI_Function); // create and initialize tcp server socket and pass function pointer to local CGI function |
syasya | 1:8d356d22e69c | 358 | Thread WebThread(Web_Server_Thread);// create and launch web server thread |
syasya | 1:8d356d22e69c | 359 | /********* main cgi function used to patch data to the web server thread **********************************/ |
syasya | 1:8d356d22e69c | 360 | Gen_HtmlCode_From_File("/local/pagecgi4.htm",tab_balise,7);// read and localise ^VARDEF[X] tag in empty html file |
syasya | 1:8d356d22e69c | 361 | //******************************************* end web section ************************************* / |
syasya | 1:8d356d22e69c | 362 | |
superphil06 | 0:e30c9ba95bd4 | 363 | |
superphil06 | 0:e30c9ba95bd4 | 364 | |
superphil06 | 0:e30c9ba95bd4 | 365 | |
superphil06 | 0:e30c9ba95bd4 | 366 | //********************* can bus section initialisation ******************************************* |
syasya | 1:8d356d22e69c | 367 | bCan_Active=true;// needed to lauchn CAN thread |
syasya | 1:8d356d22e69c | 368 | Thread CanThread(CAN_REC_THREAD);// create and launch can receiver thread |
superphil06 | 0:e30c9ba95bd4 | 369 | //********************* end can bus section ***************************************************** |
superphil06 | 0:e30c9ba95bd4 | 370 | |
superphil06 | 0:e30c9ba95bd4 | 371 | |
syasya | 1:8d356d22e69c | 372 | while(cChoix!='q' and cChoix!='Q') { |
syasya | 1:8d356d22e69c | 373 | pc.printf(" veuillez saisir un choix parmi la liste proposee: \n\r"); |
syasya | 1:8d356d22e69c | 374 | pc.printf(" a:Mode Manuel\n\r"); |
syasya | 1:8d356d22e69c | 375 | pc.printf(" b:Mode Auto \n\r"); |
syasya | 1:8d356d22e69c | 376 | pc.printf(" c:Calibration \n\r"); |
syasya | 1:8d356d22e69c | 377 | pc.printf(" d:Registre PLD \n\r"); |
syasya | 1:8d356d22e69c | 378 | pc.printf(" e:Affiche vitesse \n\r"); |
syasya | 1:8d356d22e69c | 379 | pc.printf(" f:Reset capacite \n\r"); |
syasya | 1:8d356d22e69c | 380 | pc.printf(" q:Quitter \n\r"); |
syasya | 1:8d356d22e69c | 381 | |
syasya | 1:8d356d22e69c | 382 | /************* multithreading : main thread need to sleep in order to allow web response */ |
syasya | 1:8d356d22e69c | 383 | while (pc.readable()==0) { // determine if char available |
syasya | 1:8d356d22e69c | 384 | Thread::wait(10); // wait 10 until char available on serial input |
syasya | 1:8d356d22e69c | 385 | } |
syasya | 1:8d356d22e69c | 386 | /************* end of main thread sleep ****************/ |
syasya | 1:8d356d22e69c | 387 | |
syasya | 1:8d356d22e69c | 388 | |
syasya | 1:8d356d22e69c | 389 | |
syasya | 1:8d356d22e69c | 390 | pc.scanf(" %c",&cChoix); |
syasya | 1:8d356d22e69c | 391 | switch (cChoix) { |
syasya | 1:8d356d22e69c | 392 | case 'a': |
syasya | 1:8d356d22e69c | 393 | giMode=0;//activation mode manual |
syasya | 1:8d356d22e69c | 394 | pc.printf(" veuillez saisir la valeur Pwm (0 jusqu'au 255) : \n\r"); |
syasya | 1:8d356d22e69c | 395 | pc.scanf("%d",&giPwm); |
syasya | 1:8d356d22e69c | 396 | break; |
syasya | 1:8d356d22e69c | 397 | |
syasya | 1:8d356d22e69c | 398 | case 'b': |
syasya | 1:8d356d22e69c | 399 | giMode=1;//activation mode auto |
syasya | 1:8d356d22e69c | 400 | giFlag=1;//activation calibration for speed limit |
syasya | 1:8d356d22e69c | 401 | Calibration(); |
syasya | 1:8d356d22e69c | 402 | break; |
syasya | 1:8d356d22e69c | 403 | |
syasya | 1:8d356d22e69c | 404 | case 'c': |
syasya | 1:8d356d22e69c | 405 | giMode=0;//activation mode manual to stop speed ticker function |
syasya | 1:8d356d22e69c | 406 | giFlag=0;//activation calibration for pedal |
syasya | 1:8d356d22e69c | 407 | Calibration(); |
syasya | 1:8d356d22e69c | 408 | break; |
syasya | 1:8d356d22e69c | 409 | |
syasya | 1:8d356d22e69c | 410 | case 'd': |
syasya | 1:8d356d22e69c | 411 | giMode=1;//activation mode auto to start speed ticker function |
syasya | 1:8d356d22e69c | 412 | Registre_PLD(); |
syasya | 1:8d356d22e69c | 413 | break; |
syasya | 1:8d356d22e69c | 414 | |
syasya | 1:8d356d22e69c | 415 | case 'e': |
syasya | 1:8d356d22e69c | 416 | giMode=1;//activation mode auto |
syasya | 1:8d356d22e69c | 417 | Affiche(); |
syasya | 1:8d356d22e69c | 418 | break; |
syasya | 1:8d356d22e69c | 419 | |
syasya | 1:8d356d22e69c | 420 | case 'f': |
syasya | 1:8d356d22e69c | 421 | giMode=1;//activation mode auto |
syasya | 1:8d356d22e69c | 422 | gfIrest=60000; // initialisation |
syasya | 1:8d356d22e69c | 423 | break; |
syasya | 1:8d356d22e69c | 424 | |
syasya | 1:8d356d22e69c | 425 | case 'q': |
syasya | 1:8d356d22e69c | 426 | giMode=0;//activation mode manual |
syasya | 1:8d356d22e69c | 427 | Valid_PWM.write(0); |
syasya | 1:8d356d22e69c | 428 | break; |
syasya | 1:8d356d22e69c | 429 | } |
syasya | 1:8d356d22e69c | 430 | } // end while |
syasya | 1:8d356d22e69c | 431 | |
syasya | 1:8d356d22e69c | 432 | //************** thread deinit ********************* |
syasya | 1:8d356d22e69c | 433 | // DeInit_Web_Server(); |
syasya | 1:8d356d22e69c | 434 | //bCan_Active=false; |
syasya | 1:8d356d22e69c | 435 | //CanThread=false;// close can received thread |
syasya | 1:8d356d22e69c | 436 | pc.printf(" fin programme scooter mbed \n\r"); |
superphil06 | 0:e30c9ba95bd4 | 437 | } // end main |