Chrono

Dependencies:   mbed SDFileSystem

Committer:
pathae
Date:
Tue Apr 07 12:24:23 2020 +0000
Revision:
5:e565265fdf23
Tir

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pathae 5:e565265fdf23 1 #include "mbed.h"
pathae 5:e565265fdf23 2 #include "mbed_genie.h"
pathae 5:e565265fdf23 3 #include "SDFileSystem.h"
pathae 5:e565265fdf23 4 #include "eeprom_flash.h"
pathae 5:e565265fdf23 5 SDFileSystem sd(D11, D12, D13, D10, "sd"); // the pinout on the mbed Cool Components workshop board
pathae 5:e565265fdf23 6 AnalogIn TensionBatterie(A1);
pathae 5:e565265fdf23 7 DigitalOut DELVERTE (PB_2);
pathae 5:e565265fdf23 8 DigitalOut DELORANGE (PB_1);
pathae 5:e565265fdf23 9 DigitalOut DELROUGE (PB_15,1);
pathae 5:e565265fdf23 10 InterruptIn BOUTONPAUSE(USER_BUTTON);
pathae 5:e565265fdf23 11 //Prototype des routines d'interruption
pathae 5:e565265fdf23 12 void compt_secondes();
pathae 5:e565265fdf23 13 void valeur_volt();
pathae 5:e565265fdf23 14 int temps_global_secondes, temps_global_minutes, temps_global_heures, numero_tir1 = 1, numero_tir2 = 0, numero_tir_depart = 1, pause = 0,bloqueur, kchrono = 0,locker =0;
pathae 5:e565265fdf23 15 int i = 15, j_tir = 0;
pathae 5:e565265fdf23 16 int adresse = 0x00;
pathae 5:e565265fdf23 17 char donnee1 = 11;
pathae 5:e565265fdf23 18 char donnee2 = 22;
pathae 5:e565265fdf23 19 char donnee3 = 33;
pathae 5:e565265fdf23 20 float valeur_tension, valeur_analogique; // Permet d'avoir des mesures precises pour la tension
pathae 5:e565265fdf23 21 char cMonText[1024];
pathae 5:e565265fdf23 22 char cMonText2[1024];
pathae 5:e565265fdf23 23 char chiffre1[6];
pathae 5:e565265fdf23 24 char chrono[40];
pathae 5:e565265fdf23 25 char i1=0;
pathae 5:e565265fdf23 26 char j=0;
pathae 5:e565265fdf23 27 char k=0;
pathae 5:e565265fdf23 28 int val1;
pathae 5:e565265fdf23 29 char chiffre2[6];
pathae 5:e565265fdf23 30 char type_tir[40];
pathae 5:e565265fdf23 31 char i2=0;
pathae 5:e565265fdf23 32 char j2=0;
pathae 5:e565265fdf23 33 char k2=0;
pathae 5:e565265fdf23 34 int val2;
pathae 5:e565265fdf23 35 //Déclaration des interruptions Ticker
pathae 5:e565265fdf23 36 Ticker Horloge_Global_Seconde;
pathae 5:e565265fdf23 37 Ticker Valeur_Tension_Volt;
pathae 5:e565265fdf23 38 /*************************************************************************************************
pathae 5:e565265fdf23 39 Interruption générée automatiquement toutes les secondes pour décrémenter le compteur **
pathae 5:e565265fdf23 40 *************************************************************************************************/
pathae 5:e565265fdf23 41 //Must call this first to enable writing
pathae 5:e565265fdf23 42 void enableEEPROMWriting() {
pathae 5:e565265fdf23 43 HAL_StatusTypeDef status = HAL_FLASH_Unlock();
pathae 5:e565265fdf23 44 FLASH_PageErase(EEPROM_START_ADDRESS); // required to re-write
pathae 5:e565265fdf23 45 CLEAR_BIT(FLASH->CR, FLASH_CR_PER); // Bug fix: bit PER has been set in Flash_PageErase(), must clear it here
pathae 5:e565265fdf23 46 }
pathae 5:e565265fdf23 47 void disableEEPROMWriting() {
pathae 5:e565265fdf23 48 HAL_FLASH_Lock();
pathae 5:e565265fdf23 49 }
pathae 5:e565265fdf23 50 //Writing function
pathae 5:e565265fdf23 51 //Must call enableEEPROMWriting() first
pathae 5:e565265fdf23 52 HAL_StatusTypeDef writeEEPROMHalfWord(uint32_t address, uint16_t data) {
pathae 5:e565265fdf23 53 HAL_StatusTypeDef status;
pathae 5:e565265fdf23 54 address = address + EEPROM_START_ADDRESS;
pathae 5:e565265fdf23 55 status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data);
pathae 5:e565265fdf23 56 return status;
pathae 5:e565265fdf23 57 }
pathae 5:e565265fdf23 58 //Reading functions
pathae 5:e565265fdf23 59 uint16_t readEEPROMHalfWord(uint32_t address) {
pathae 5:e565265fdf23 60 uint16_t val = 0;
pathae 5:e565265fdf23 61 address = address + EEPROM_START_ADDRESS;
pathae 5:e565265fdf23 62 val = *(__IO uint16_t*)address;
pathae 5:e565265fdf23 63 return val;
pathae 5:e565265fdf23 64 }
pathae 5:e565265fdf23 65
pathae 5:e565265fdf23 66 void vidReadText(char * cTxt)
pathae 5:e565265fdf23 67 {
pathae 5:e565265fdf23 68 unsigned char caractereActuel; // Début lecture SD
pathae 5:e565265fdf23 69 int iIndex=0;
pathae 5:e565265fdf23 70 FILE *fp = fopen("/sd/Temps.txt", "r");
pathae 5:e565265fdf23 71 if(fp == NULL)
pathae 5:e565265fdf23 72 {
pathae 5:e565265fdf23 73 error("Could not open file \n");
pathae 5:e565265fdf23 74 }
pathae 5:e565265fdf23 75 else
pathae 5:e565265fdf23 76 {
pathae 5:e565265fdf23 77 // Boucle de lecture des caractères un à un
pathae 5:e565265fdf23 78 strcpy(cTxt,"");
pathae 5:e565265fdf23 79 printf("\n\r");
pathae 5:e565265fdf23 80 do{
pathae 5:e565265fdf23 81 caractereActuel = fgetc(fp); // On lit le caractère
pathae 5:e565265fdf23 82 if(caractereActuel != 255) sprintf(cTxt,"%s%c",cTxt, caractereActuel); // On l'affiche
pathae 5:e565265fdf23 83 iIndex++;
pathae 5:e565265fdf23 84 } while (caractereActuel != 255);
pathae 5:e565265fdf23 85 fclose(fp);
pathae 5:e565265fdf23 86 } // Fin lecture SD
pathae 5:e565265fdf23 87 }
pathae 5:e565265fdf23 88
pathae 5:e565265fdf23 89 void vidReadText2(char * cTxt2)
pathae 5:e565265fdf23 90 {
pathae 5:e565265fdf23 91 unsigned char caractereActuel2; // Début lecture SD 2
pathae 5:e565265fdf23 92 int iIndex2=0;
pathae 5:e565265fdf23 93 FILE *fp = fopen("/sd/Ordre.txt", "r");
pathae 5:e565265fdf23 94 if(fp == NULL)
pathae 5:e565265fdf23 95 {
pathae 5:e565265fdf23 96 error("Could not open file \n");
pathae 5:e565265fdf23 97 }
pathae 5:e565265fdf23 98 else
pathae 5:e565265fdf23 99 {
pathae 5:e565265fdf23 100 // Boucle de lecture des caractères un à un
pathae 5:e565265fdf23 101 strcpy(cTxt2,"");
pathae 5:e565265fdf23 102 printf("\n\r");
pathae 5:e565265fdf23 103 do{
pathae 5:e565265fdf23 104 caractereActuel2 = fgetc(fp); // On lit le caractère
pathae 5:e565265fdf23 105 if(caractereActuel2 != 255) sprintf(cTxt2,"%s%c",cTxt2, caractereActuel2); // On l'affiche
pathae 5:e565265fdf23 106 iIndex2++;
pathae 5:e565265fdf23 107 } while (caractereActuel2 != 255);
pathae 5:e565265fdf23 108 fclose(fp);
pathae 5:e565265fdf23 109 } // Fin lecture SD 2
pathae 5:e565265fdf23 110 }
pathae 5:e565265fdf23 111
pathae 5:e565265fdf23 112
pathae 5:e565265fdf23 113 void compt_secondes() //-------------------------------- Compteur seconde ----------------------------------------
pathae 5:e565265fdf23 114 {
pathae 5:e565265fdf23 115 if(bloqueur == 0) // Début bloqueur
pathae 5:e565265fdf23 116 {
pathae 5:e565265fdf23 117 chrono[kchrono]=chrono[kchrono]-1;
pathae 5:e565265fdf23 118 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x00, chrono[kchrono]); //Ecrit sur Leddigits0 la valeur de chrono
pathae 5:e565265fdf23 119 genieWriteObject(GENIE_OBJ_GAUGE , 0x00, chrono[kchrono]);
pathae 5:e565265fdf23 120 temps_global_secondes = temps_global_secondes + 1;
pathae 5:e565265fdf23 121 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x01, temps_global_secondes);
pathae 5:e565265fdf23 122 if(temps_global_secondes == 60){
pathae 5:e565265fdf23 123 temps_global_secondes = 0;
pathae 5:e565265fdf23 124 temps_global_minutes = temps_global_minutes + 1;
pathae 5:e565265fdf23 125 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x02, temps_global_minutes);
pathae 5:e565265fdf23 126 if(temps_global_minutes == 60)
pathae 5:e565265fdf23 127 {
pathae 5:e565265fdf23 128 temps_global_minutes = 0;
pathae 5:e565265fdf23 129 temps_global_heures = temps_global_heures + 1;
pathae 5:e565265fdf23 130 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x03, temps_global_heures);
pathae 5:e565265fdf23 131 }
pathae 5:e565265fdf23 132 }
pathae 5:e565265fdf23 133
pathae 5:e565265fdf23 134 if (numero_tir_depart == 1){ // Début décompte
pathae 5:e565265fdf23 135 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x04, numero_tir1);
pathae 5:e565265fdf23 136 temps_global_secondes= 0;
pathae 5:e565265fdf23 137 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x02, temps_global_secondes);
pathae 5:e565265fdf23 138 temps_global_minutes = 0;
pathae 5:e565265fdf23 139 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x02, temps_global_minutes);
pathae 5:e565265fdf23 140 temps_global_heures = 0;
pathae 5:e565265fdf23 141 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x02, temps_global_heures);
pathae 5:e565265fdf23 142 numero_tir_depart++;
pathae 5:e565265fdf23 143 genieWriteObject(GENIE_OBJ_USER_LED, 0x00, 0);
pathae 5:e565265fdf23 144 }
pathae 5:e565265fdf23 145 if(chrono[kchrono] == 0){
pathae 5:e565265fdf23 146
pathae 5:e565265fdf23 147 if (type_tir[j_tir+1] == 0) // Tir normale
pathae 5:e565265fdf23 148 {
pathae 5:e565265fdf23 149 numero_tir1++;
pathae 5:e565265fdf23 150 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x04, numero_tir1);
pathae 5:e565265fdf23 151 genieWriteObject(GENIE_OBJ_USER_LED, 0x00, 0);
pathae 5:e565265fdf23 152 }
pathae 5:e565265fdf23 153
pathae 5:e565265fdf23 154 if (type_tir[j_tir+1] == 1) // Tir distance
pathae 5:e565265fdf23 155 {
pathae 5:e565265fdf23 156 numero_tir2++;
pathae 5:e565265fdf23 157 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x04, numero_tir2);
pathae 5:e565265fdf23 158 genieWriteObject(GENIE_OBJ_USER_LED, 0x00, 1);
pathae 5:e565265fdf23 159 }
pathae 5:e565265fdf23 160
pathae 5:e565265fdf23 161 j_tir++;
pathae 5:e565265fdf23 162 chrono[kchrono] = chrono[kchrono+1];
pathae 5:e565265fdf23 163 kchrono++;
pathae 5:e565265fdf23 164 } // Fin partie décompte seconde
pathae 5:e565265fdf23 165 } // Fin bloqueur
pathae 5:e565265fdf23 166 genieFrame Event;
pathae 5:e565265fdf23 167 genieDequeueEvent(&Event);
pathae 5:e565265fdf23 168 //event report from an object
pathae 5:e565265fdf23 169 if(Event.reportObject.cmd == GENIE_REPORT_EVENT) {
pathae 5:e565265fdf23 170 /*
pathae 5:e565265fdf23 171 for example here we check if we received a message from 4dbuttons objects
pathae 5:e565265fdf23 172 the index is the button number, refer to the 4dgenie project to know the index
pathae 5:e565265fdf23 173 */
pathae 5:e565265fdf23 174 if (Event.reportObject.object == GENIE_OBJ_4DBUTTON) { // If the Reported Message was from a button
pathae 5:e565265fdf23 175 if (Event.reportObject.index == 9) { // Début Enclenchement bouton 9
pathae 5:e565265fdf23 176 if (i<15)
pathae 5:e565265fdf23 177 {
pathae 5:e565265fdf23 178 i++;
pathae 5:e565265fdf23 179 }
pathae 5:e565265fdf23 180 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x05, i);
pathae 5:e565265fdf23 181 genieWriteContrast(i);
pathae 5:e565265fdf23 182 } // Fin Enclenchement bouton 9
pathae 5:e565265fdf23 183 if (Event.reportObject.index == 10) { // Début Enclenchement bouton 10
pathae 5:e565265fdf23 184 if (i>0)
pathae 5:e565265fdf23 185 {
pathae 5:e565265fdf23 186 i--;
pathae 5:e565265fdf23 187 }
pathae 5:e565265fdf23 188 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x05, i);
pathae 5:e565265fdf23 189 genieWriteContrast(i);
pathae 5:e565265fdf23 190 } // Fin Enclenchement bouton 10
pathae 5:e565265fdf23 191 if (Event.reportObject.index == 15) { // Début Enclenchement bouton 15
pathae 5:e565265fdf23 192 vidReadText(cMonText);
pathae 5:e565265fdf23 193 vidReadText2(cMonText2);
pathae 5:e565265fdf23 194 i1=0;
pathae 5:e565265fdf23 195 k=0;
pathae 5:e565265fdf23 196 i2=0;
pathae 5:e565265fdf23 197 k2=0;
pathae 5:e565265fdf23 198
pathae 5:e565265fdf23 199 while(cMonText[i1]!='*')
pathae 5:e565265fdf23 200 {
pathae 5:e565265fdf23 201 while(cMonText[i1]!=',')
pathae 5:e565265fdf23 202 {
pathae 5:e565265fdf23 203 chiffre1[j]=cMonText[i1];
pathae 5:e565265fdf23 204 i1++;
pathae 5:e565265fdf23 205 j++;
pathae 5:e565265fdf23 206 }
pathae 5:e565265fdf23 207 val1 = atoi(chiffre1);
pathae 5:e565265fdf23 208 chrono[k]=val1;
pathae 5:e565265fdf23 209 j=0;
pathae 5:e565265fdf23 210 i1++;
pathae 5:e565265fdf23 211 k++;
pathae 5:e565265fdf23 212 }
pathae 5:e565265fdf23 213 i1=0;
pathae 5:e565265fdf23 214 k=0;
pathae 5:e565265fdf23 215
pathae 5:e565265fdf23 216 while(cMonText2[i2]!='*')
pathae 5:e565265fdf23 217 {
pathae 5:e565265fdf23 218 while(cMonText2[i2]!=',')
pathae 5:e565265fdf23 219 {
pathae 5:e565265fdf23 220 chiffre2[j2]=cMonText2[i2];
pathae 5:e565265fdf23 221 i2++;
pathae 5:e565265fdf23 222 j2++;
pathae 5:e565265fdf23 223 }
pathae 5:e565265fdf23 224 val2 = atoi(chiffre2);
pathae 5:e565265fdf23 225 type_tir[k2]=val2;
pathae 5:e565265fdf23 226 j2=0;
pathae 5:e565265fdf23 227 i2++;
pathae 5:e565265fdf23 228 k2++;
pathae 5:e565265fdf23 229 }
pathae 5:e565265fdf23 230 i2=0;
pathae 5:e565265fdf23 231 k2=0;
pathae 5:e565265fdf23 232 } // Fin Enclenchement bouton 15
pathae 5:e565265fdf23 233
pathae 5:e565265fdf23 234 }
pathae 5:e565265fdf23 235 }
pathae 5:e565265fdf23 236 return;
pathae 5:e565265fdf23 237 }
pathae 5:e565265fdf23 238
pathae 5:e565265fdf23 239 void valeur_volt() // ---------------------------------------------- Lecteur Tension ------------------------
pathae 5:e565265fdf23 240 {
pathae 5:e565265fdf23 241 valeur_analogique = TensionBatterie.read(); // Convertis la valeur obtenus entre 0 et 1
pathae 5:e565265fdf23 242 valeur_tension = valeur_analogique * 6; // On multiplie notre valeur obtenus pour avoir la tension d entree
pathae 5:e565265fdf23 243 genieWriteObject(GENIE_OBJ_METER , 0x00,valeur_tension);
pathae 5:e565265fdf23 244 return;
pathae 5:e565265fdf23 245 }
pathae 5:e565265fdf23 246
pathae 5:e565265fdf23 247 void pause1()
pathae 5:e565265fdf23 248 {
pathae 5:e565265fdf23 249 if(pause == 0)
pathae 5:e565265fdf23 250 {
pathae 5:e565265fdf23 251 pause++;
pathae 5:e565265fdf23 252 }
pathae 5:e565265fdf23 253 else
pathae 5:e565265fdf23 254 {
pathae 5:e565265fdf23 255 pause--;
pathae 5:e565265fdf23 256 }
pathae 5:e565265fdf23 257 }
pathae 5:e565265fdf23 258
pathae 5:e565265fdf23 259 /************************
pathae 5:e565265fdf23 260 * Programme principal *
pathae 5:e565265fdf23 261 *************************/
pathae 5:e565265fdf23 262
pathae 5:e565265fdf23 263 int main()
pathae 5:e565265fdf23 264 {
pathae 5:e565265fdf23 265
pathae 5:e565265fdf23 266 wait(3);
pathae 5:e565265fdf23 267 DELROUGE = 0;
pathae 5:e565265fdf23 268
pathae 5:e565265fdf23 269 /* Ecriture*/
pathae 5:e565265fdf23 270 enableEEPROMWriting(); //autorisation d'ecriture dans l'eeprom
pathae 5:e565265fdf23 271 writeEEPROMHalfWord(adresse, donnee1);
pathae 5:e565265fdf23 272 writeEEPROMHalfWord(adresse+2, donnee2);
pathae 5:e565265fdf23 273 writeEEPROMHalfWord(adresse+4, donnee3);
pathae 5:e565265fdf23 274 disableEEPROMWriting(); //Interdiction d'ecriture
pathae 5:e565265fdf23 275
pathae 5:e565265fdf23 276 SetupGenie();
pathae 5:e565265fdf23 277 genieWriteContrast(i); //Permet de modifier la luminosite
pathae 5:e565265fdf23 278 genieWriteObject(GENIE_OBJ_LED_DIGITS, 0x05, i);
pathae 5:e565265fdf23 279 BOUTONPAUSE.fall(&pause1);
pathae 5:e565265fdf23 280 //Initialisation de l'interruption "Ticker" toutes les secondes
pathae 5:e565265fdf23 281 Horloge_Global_Seconde.attach(&compt_secondes,1); //Appel de la fonction toutes les secondes.
pathae 5:e565265fdf23 282 Valeur_Tension_Volt.attach(&valeur_volt,30);
pathae 5:e565265fdf23 283
pathae 5:e565265fdf23 284 while(1) {
pathae 5:e565265fdf23 285 if(pause == 0)
pathae 5:e565265fdf23 286 {
pathae 5:e565265fdf23 287 DELVERTE = 0;
pathae 5:e565265fdf23 288 DELORANGE = 1;
pathae 5:e565265fdf23 289 bloqueur = 1;
pathae 5:e565265fdf23 290 }
pathae 5:e565265fdf23 291 if(pause == 1)
pathae 5:e565265fdf23 292 {
pathae 5:e565265fdf23 293 DELVERTE = 1;
pathae 5:e565265fdf23 294 DELORANGE = 0;
pathae 5:e565265fdf23 295 bloqueur = 0;
pathae 5:e565265fdf23 296 }
pathae 5:e565265fdf23 297 } // Fin while
pathae 5:e565265fdf23 298 } // Fin main