Convertisseur de code morse Morse code converter

Dependencies:   F746_GUI mbed

Committer:
olivier14750
Date:
Thu Jun 06 21:43:44 2019 +0000
Revision:
0:2173fcfdaac6
Convertisseur de code morse

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olivier14750 0:2173fcfdaac6 1 #include "mbed.h"
olivier14750 0:2173fcfdaac6 2 #include <string>
olivier14750 0:2173fcfdaac6 3
olivier14750 0:2173fcfdaac6 4 #include "LCD_DISCO_F746NG.h"
olivier14750 0:2173fcfdaac6 5 #include "TS_DISCO_F746NG.h"
olivier14750 0:2173fcfdaac6 6 #include "F746_GUI.hpp"
olivier14750 0:2173fcfdaac6 7 #define Seuil 0.9
olivier14750 0:2173fcfdaac6 8
olivier14750 0:2173fcfdaac6 9 #define SeuilMinTimeP 70
olivier14750 0:2173fcfdaac6 10 #define SeuilMaxTimeP 250
olivier14750 0:2173fcfdaac6 11
olivier14750 0:2173fcfdaac6 12 #define SeuilMaxTimeEL 600
olivier14750 0:2173fcfdaac6 13 #define SeuilMAXTimeEM 2000
olivier14750 0:2173fcfdaac6 14
olivier14750 0:2173fcfdaac6 15 bool etat_precedent;
olivier14750 0:2173fcfdaac6 16 int TabTemps[100];
olivier14750 0:2173fcfdaac6 17
olivier14750 0:2173fcfdaac6 18 char morse[100];
olivier14750 0:2173fcfdaac6 19 int index_morse = 0;
olivier14750 0:2173fcfdaac6 20 int check = 1;
olivier14750 0:2173fcfdaac6 21 int flagBPReco = 0;
olivier14750 0:2173fcfdaac6 22
olivier14750 0:2173fcfdaac6 23 using namespace std;
olivier14750 0:2173fcfdaac6 24
olivier14750 0:2173fcfdaac6 25 //Déclaration de la base de donnée morse
olivier14750 0:2173fcfdaac6 26
olivier14750 0:2173fcfdaac6 27 static char *ListCara[36]= {".-",
olivier14750 0:2173fcfdaac6 28 "-...",
olivier14750 0:2173fcfdaac6 29 "-.-.",
olivier14750 0:2173fcfdaac6 30 "-..",
olivier14750 0:2173fcfdaac6 31 ".",
olivier14750 0:2173fcfdaac6 32 "..-.",
olivier14750 0:2173fcfdaac6 33 "--.",
olivier14750 0:2173fcfdaac6 34 "....",
olivier14750 0:2173fcfdaac6 35 "..",
olivier14750 0:2173fcfdaac6 36 ".---",
olivier14750 0:2173fcfdaac6 37 "-.-",
olivier14750 0:2173fcfdaac6 38 ".-..",
olivier14750 0:2173fcfdaac6 39 "--",
olivier14750 0:2173fcfdaac6 40 "-.",
olivier14750 0:2173fcfdaac6 41 "---",
olivier14750 0:2173fcfdaac6 42 ".--.",
olivier14750 0:2173fcfdaac6 43 "--.-",
olivier14750 0:2173fcfdaac6 44 ".-.",
olivier14750 0:2173fcfdaac6 45 "...",
olivier14750 0:2173fcfdaac6 46 "-",
olivier14750 0:2173fcfdaac6 47 "..-",
olivier14750 0:2173fcfdaac6 48 "...-",
olivier14750 0:2173fcfdaac6 49 ".--",
olivier14750 0:2173fcfdaac6 50 "-..-",
olivier14750 0:2173fcfdaac6 51 "-.--",
olivier14750 0:2173fcfdaac6 52 "--..",
olivier14750 0:2173fcfdaac6 53 ".----",
olivier14750 0:2173fcfdaac6 54 "..---",
olivier14750 0:2173fcfdaac6 55 "...--",
olivier14750 0:2173fcfdaac6 56 "....-",
olivier14750 0:2173fcfdaac6 57 ".....",
olivier14750 0:2173fcfdaac6 58 "-....",
olivier14750 0:2173fcfdaac6 59 "--...",
olivier14750 0:2173fcfdaac6 60 "---..",
olivier14750 0:2173fcfdaac6 61 "----.",
olivier14750 0:2173fcfdaac6 62 "-----"
olivier14750 0:2173fcfdaac6 63 };
olivier14750 0:2173fcfdaac6 64
olivier14750 0:2173fcfdaac6 65 char ListLettre[36]= {'a',
olivier14750 0:2173fcfdaac6 66 'b',
olivier14750 0:2173fcfdaac6 67 'c',
olivier14750 0:2173fcfdaac6 68 'd',
olivier14750 0:2173fcfdaac6 69 'e',
olivier14750 0:2173fcfdaac6 70 'f',
olivier14750 0:2173fcfdaac6 71 'g',
olivier14750 0:2173fcfdaac6 72 'h',
olivier14750 0:2173fcfdaac6 73 'i',
olivier14750 0:2173fcfdaac6 74 'j',
olivier14750 0:2173fcfdaac6 75 'k',
olivier14750 0:2173fcfdaac6 76 'l',
olivier14750 0:2173fcfdaac6 77 'm',
olivier14750 0:2173fcfdaac6 78 'n',
olivier14750 0:2173fcfdaac6 79 'o',
olivier14750 0:2173fcfdaac6 80 'p',
olivier14750 0:2173fcfdaac6 81 'q',
olivier14750 0:2173fcfdaac6 82 'r',
olivier14750 0:2173fcfdaac6 83 's',
olivier14750 0:2173fcfdaac6 84 't',
olivier14750 0:2173fcfdaac6 85 'u',
olivier14750 0:2173fcfdaac6 86 'v',
olivier14750 0:2173fcfdaac6 87 'w',
olivier14750 0:2173fcfdaac6 88 'x',
olivier14750 0:2173fcfdaac6 89 'y',
olivier14750 0:2173fcfdaac6 90 'z',
olivier14750 0:2173fcfdaac6 91 '1',
olivier14750 0:2173fcfdaac6 92 '2',
olivier14750 0:2173fcfdaac6 93 '3',
olivier14750 0:2173fcfdaac6 94 '4',
olivier14750 0:2173fcfdaac6 95 '5',
olivier14750 0:2173fcfdaac6 96 '6',
olivier14750 0:2173fcfdaac6 97 '7',
olivier14750 0:2173fcfdaac6 98 '8',
olivier14750 0:2173fcfdaac6 99 '9',
olivier14750 0:2173fcfdaac6 100 '0'
olivier14750 0:2173fcfdaac6 101 };
olivier14750 0:2173fcfdaac6 102
olivier14750 0:2173fcfdaac6 103
olivier14750 0:2173fcfdaac6 104 Timer t;
olivier14750 0:2173fcfdaac6 105 DigitalOut led(LED1);
olivier14750 0:2173fcfdaac6 106 AnalogIn AnaIn(PF_10);
olivier14750 0:2173fcfdaac6 107 DigitalIn BP(USER_BUTTON);
olivier14750 0:2173fcfdaac6 108 Serial pc(USBTX, USBRX); // tx, rx
olivier14750 0:2173fcfdaac6 109
olivier14750 0:2173fcfdaac6 110 TS_DISCO_F746NG ts;
olivier14750 0:2173fcfdaac6 111 LCD_DISCO_F746NG lcd;
olivier14750 0:2173fcfdaac6 112
olivier14750 0:2173fcfdaac6 113 //Bouton utilisés pour le control du convertisseur morse
olivier14750 0:2173fcfdaac6 114 // Pour les couleurs, dans l'ordre on a la couleur du text, la couleure du fond d'écran et la couleur du bouton
olivier14750 0:2173fcfdaac6 115 Button Commencer(50,100,100,100,"BEGIN",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE);
olivier14750 0:2173fcfdaac6 116 Button Arrete(195,100,100,100,"STOP",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE);
olivier14750 0:2173fcfdaac6 117 Button Recommencer(340,100,100,100,"RESTART",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE);
olivier14750 0:2173fcfdaac6 118
olivier14750 0:2173fcfdaac6 119
olivier14750 0:2173fcfdaac6 120 int main()
olivier14750 0:2173fcfdaac6 121 {
olivier14750 0:2173fcfdaac6 122 float LDR;
olivier14750 0:2173fcfdaac6 123 bool etat;
olivier14750 0:2173fcfdaac6 124 int index_TabTemps = 0;
olivier14750 0:2173fcfdaac6 125 int index_Temps = 0;
olivier14750 0:2173fcfdaac6 126 int index_TabCara = 0;
olivier14750 0:2173fcfdaac6 127 int i, Temps[100][2];
olivier14750 0:2173fcfdaac6 128 lcd.SetTextColor(LCD_COLOR_BLACK);
olivier14750 0:2173fcfdaac6 129
olivier14750 0:2173fcfdaac6 130 unsigned char morse_decode[200];
olivier14750 0:2173fcfdaac6 131 int index_morse_decode = 0;
olivier14750 0:2173fcfdaac6 132 char cara[6];
olivier14750 0:2173fcfdaac6 133 int index_cara=0;
olivier14750 0:2173fcfdaac6 134 etat_precedent = false;
olivier14750 0:2173fcfdaac6 135
olivier14750 0:2173fcfdaac6 136 t.start();
olivier14750 0:2173fcfdaac6 137 while(Commencer.Touched()!=true);// On clique sur la touche "commencer" pour commencer l'enregistrement
olivier14750 0:2173fcfdaac6 138
olivier14750 0:2173fcfdaac6 139 lcd.DisplayStringAt(0,LINE(1),(uint8_t *)"En cours...",CENTER_MODE);
olivier14750 0:2173fcfdaac6 140 while(1) {
olivier14750 0:2173fcfdaac6 141
olivier14750 0:2173fcfdaac6 142 LDR= AnaIn.read(); // Lecture de la valeur analogique
olivier14750 0:2173fcfdaac6 143 pc.printf("LDR = %.2f\n\r",LDR);
olivier14750 0:2173fcfdaac6 144 if(LDR>Seuil) { //Si la valeur analogique dépasse le seuil, cela veut dire que la lumière est détecter sinon pas de lumière
olivier14750 0:2173fcfdaac6 145
olivier14750 0:2173fcfdaac6 146 etat = true;
olivier14750 0:2173fcfdaac6 147
olivier14750 0:2173fcfdaac6 148 }
olivier14750 0:2173fcfdaac6 149
olivier14750 0:2173fcfdaac6 150 else
olivier14750 0:2173fcfdaac6 151
olivier14750 0:2173fcfdaac6 152 {
olivier14750 0:2173fcfdaac6 153 etat = false;
olivier14750 0:2173fcfdaac6 154
olivier14750 0:2173fcfdaac6 155 }
olivier14750 0:2173fcfdaac6 156
olivier14750 0:2173fcfdaac6 157 if(etat !=etat_precedent) { // Si l'état actuel est différent de l'état précédent
olivier14750 0:2173fcfdaac6 158 pc.printf("get time\n\r");
olivier14750 0:2173fcfdaac6 159 TabTemps[index_TabTemps]= t.read_ms(); // Lecture du temps
olivier14750 0:2173fcfdaac6 160 index_TabTemps++;
olivier14750 0:2173fcfdaac6 161 // On indique ici si le temps stocké précédement était une partie du code morse ou pas
olivier14750 0:2173fcfdaac6 162 if(etat==true) {
olivier14750 0:2173fcfdaac6 163 Temps[index_Temps][0] = 1;
olivier14750 0:2173fcfdaac6 164 index_Temps++;
olivier14750 0:2173fcfdaac6 165 } else {
olivier14750 0:2173fcfdaac6 166 Temps[index_Temps][0] = 0;
olivier14750 0:2173fcfdaac6 167 index_Temps++;
olivier14750 0:2173fcfdaac6 168 }
olivier14750 0:2173fcfdaac6 169
olivier14750 0:2173fcfdaac6 170 } else {
olivier14750 0:2173fcfdaac6 171 pc.printf("no\n\r");
olivier14750 0:2173fcfdaac6 172
olivier14750 0:2173fcfdaac6 173 }
olivier14750 0:2173fcfdaac6 174 etat_precedent = etat;
olivier14750 0:2173fcfdaac6 175
olivier14750 0:2173fcfdaac6 176 if(Arrete.Touched()==true) { // Si la touche "Arreter est apuyer, on arrete l'enregistrement pour passer au décodage
olivier14750 0:2173fcfdaac6 177
olivier14750 0:2173fcfdaac6 178
olivier14750 0:2173fcfdaac6 179 lcd.ClearStringLine(1);
olivier14750 0:2173fcfdaac6 180
olivier14750 0:2173fcfdaac6 181 //ici, on récupère tous les temps qu'on a lus pour optenir les temps correspondant au code morse
olivier14750 0:2173fcfdaac6 182 for( i = 0; i<index_TabTemps; i++) {
olivier14750 0:2173fcfdaac6 183 Temps[i][1] = TabTemps[i+1] - TabTemps[i];
olivier14750 0:2173fcfdaac6 184 }
olivier14750 0:2173fcfdaac6 185
olivier14750 0:2173fcfdaac6 186
olivier14750 0:2173fcfdaac6 187 for( i = 0; i<index_Temps; i++) {
olivier14750 0:2173fcfdaac6 188 // On vérifie chaque temps correspondant à un bout du code morse pour savoir si c'était un point ou un tirait
olivier14750 0:2173fcfdaac6 189 if(Temps[i][0] ==1) {
olivier14750 0:2173fcfdaac6 190 if(Temps[i][1]<SeuilMaxTimeP) {
olivier14750 0:2173fcfdaac6 191 morse[index_TabCara] = '.';
olivier14750 0:2173fcfdaac6 192
olivier14750 0:2173fcfdaac6 193 pc.printf("%c",morse[index_TabCara]);
olivier14750 0:2173fcfdaac6 194 index_TabCara++;
olivier14750 0:2173fcfdaac6 195 } else {
olivier14750 0:2173fcfdaac6 196 morse[index_TabCara] = '-';
olivier14750 0:2173fcfdaac6 197
olivier14750 0:2173fcfdaac6 198 pc.printf("%c",morse[index_TabCara]);
olivier14750 0:2173fcfdaac6 199 index_TabCara++;
olivier14750 0:2173fcfdaac6 200 }
olivier14750 0:2173fcfdaac6 201 } else {
olivier14750 0:2173fcfdaac6 202 //Si le temps ne correspondait pas à bout du code morse, trois cas de figure se présente à nous :
olivier14750 0:2173fcfdaac6 203 if(Temps[i][1]<SeuilMaxTimeP) {
olivier14750 0:2173fcfdaac6 204 //Ici, on ne fait rien. Cela veut dire que le caractère n'est pas encore complet
olivier14750 0:2173fcfdaac6 205 } else if(Temps[i][1]<SeuilMaxTimeEL) {
olivier14750 0:2173fcfdaac6 206 morse[index_TabCara] = '*';
olivier14750 0:2173fcfdaac6 207 index_TabCara++;
olivier14750 0:2173fcfdaac6 208 //Ici, cela veut dire que le temps correspond à un espacemeent entre deux lettres. Donc on ajoute une étoile pour marquer la fin du caractère
olivier14750 0:2173fcfdaac6 209 } else if (Temps[i][1]<SeuilMAXTimeEM) {
olivier14750 0:2173fcfdaac6 210
olivier14750 0:2173fcfdaac6 211 morse[index_TabCara] = ' ';
olivier14750 0:2173fcfdaac6 212 index_TabCara++;
olivier14750 0:2173fcfdaac6 213 //Ici, cela signifie que le mot est terminé. On met donc un espace pour pouvoir decoder le prochain mot.
olivier14750 0:2173fcfdaac6 214
olivier14750 0:2173fcfdaac6 215 }
olivier14750 0:2173fcfdaac6 216 }
olivier14750 0:2173fcfdaac6 217 }
olivier14750 0:2173fcfdaac6 218 morse[index_TabCara]+='*';
olivier14750 0:2173fcfdaac6 219 index_TabCara++;
olivier14750 0:2173fcfdaac6 220 pc.printf("%d\n\r",index_TabCara);
olivier14750 0:2173fcfdaac6 221
olivier14750 0:2173fcfdaac6 222 pc.printf("code morse : %s\n\r",morse);
olivier14750 0:2173fcfdaac6 223
olivier14750 0:2173fcfdaac6 224 //Nous procédons ici au decodage lettre par lettre
olivier14750 0:2173fcfdaac6 225
olivier14750 0:2173fcfdaac6 226 for(i=0; i<index_TabCara; i++) {
olivier14750 0:2173fcfdaac6 227
olivier14750 0:2173fcfdaac6 228
olivier14750 0:2173fcfdaac6 229 if(morse[i]== ' ') {
olivier14750 0:2173fcfdaac6 230 //Si le caractère rencontré est un espace, tu decode le code morse dans la variable cara qui correspond à un caractère
olivier14750 0:2173fcfdaac6 231 for(int j=0; j<36; j++) {
olivier14750 0:2173fcfdaac6 232 if(strcmp(ListCara[j], cara) == 0) {// On compare le code morse cara a notre basse de donnée. Si il reconnait le caractère, tu l'ajoutes à la chaine de caractère finale
olivier14750 0:2173fcfdaac6 233 morse_decode[index_morse_decode]= ListLettre[j];
olivier14750 0:2173fcfdaac6 234 index_morse_decode++;
olivier14750 0:2173fcfdaac6 235 check = 0;
olivier14750 0:2173fcfdaac6 236
olivier14750 0:2173fcfdaac6 237 }
olivier14750 0:2173fcfdaac6 238 }
olivier14750 0:2173fcfdaac6 239 //Si il ne reconnait pas le caractère, alors tu ajoutes un point d'intérogation à ta chaine de caractère
olivier14750 0:2173fcfdaac6 240 if(check!=0) {
olivier14750 0:2173fcfdaac6 241 morse_decode[index_morse_decode]= '?';
olivier14750 0:2173fcfdaac6 242 index_morse_decode++;
olivier14750 0:2173fcfdaac6 243 }
olivier14750 0:2173fcfdaac6 244 //On remet à zero la variable 'cara' pour decoder le prochain caractère
olivier14750 0:2173fcfdaac6 245 for (int y=0;y<6;y++){
olivier14750 0:2173fcfdaac6 246 cara[y] = ' ';
olivier14750 0:2173fcfdaac6 247
olivier14750 0:2173fcfdaac6 248 }
olivier14750 0:2173fcfdaac6 249 index_cara=0;
olivier14750 0:2173fcfdaac6 250 morse_decode[index_morse_decode]= ' ';
olivier14750 0:2173fcfdaac6 251 index_morse_decode++;
olivier14750 0:2173fcfdaac6 252
olivier14750 0:2173fcfdaac6 253 } else if(morse[i]=='*') {
olivier14750 0:2173fcfdaac6 254 //Si le caractère rencontré est une étoile, tu decode le code morse dans la variable cara qui correspond à un caractère
olivier14750 0:2173fcfdaac6 255 for(int j=0; j<36; j++) {
olivier14750 0:2173fcfdaac6 256 if(strcmp(ListCara[j], cara) == 0) {
olivier14750 0:2173fcfdaac6 257 morse_decode[index_morse_decode]= ListLettre[j];
olivier14750 0:2173fcfdaac6 258 index_morse_decode++;
olivier14750 0:2173fcfdaac6 259
olivier14750 0:2173fcfdaac6 260 check = 0;
olivier14750 0:2173fcfdaac6 261
olivier14750 0:2173fcfdaac6 262 }
olivier14750 0:2173fcfdaac6 263 }
olivier14750 0:2173fcfdaac6 264 if(check!=0) {
olivier14750 0:2173fcfdaac6 265 morse_decode[index_morse_decode]= '?';
olivier14750 0:2173fcfdaac6 266 index_morse_decode++;
olivier14750 0:2173fcfdaac6 267 }
olivier14750 0:2173fcfdaac6 268 for (int y=0;y<6;y++){
olivier14750 0:2173fcfdaac6 269 cara[y] = ' ';
olivier14750 0:2173fcfdaac6 270 index_cara=0;
olivier14750 0:2173fcfdaac6 271 }
olivier14750 0:2173fcfdaac6 272
olivier14750 0:2173fcfdaac6 273 } else {
olivier14750 0:2173fcfdaac6 274 cara[index_cara]= morse[i];
olivier14750 0:2173fcfdaac6 275 index_cara++;
olivier14750 0:2173fcfdaac6 276 cara[index_cara]='\0'; // c'est pour decoder la chaine de caractère
olivier14750 0:2173fcfdaac6 277
olivier14750 0:2173fcfdaac6 278 }
olivier14750 0:2173fcfdaac6 279
olivier14750 0:2173fcfdaac6 280 }
olivier14750 0:2173fcfdaac6 281
olivier14750 0:2173fcfdaac6 282 //On affiche le code decodé sur l'écran LCD
olivier14750 0:2173fcfdaac6 283 lcd.DisplayStringAt(0,LINE(1),(uint8_t *)morse_decode,CENTER_MODE);
olivier14750 0:2173fcfdaac6 284 flagBPReco =1;
olivier14750 0:2173fcfdaac6 285 pc.printf("code converti : %s\n\r",morse_decode);
olivier14750 0:2173fcfdaac6 286
olivier14750 0:2173fcfdaac6 287
olivier14750 0:2173fcfdaac6 288
olivier14750 0:2173fcfdaac6 289 }
olivier14750 0:2173fcfdaac6 290 //On attend que la touche "recommencer" soit appuyer pour tout réinitialiser
olivier14750 0:2173fcfdaac6 291 if(flagBPReco==1){
olivier14750 0:2173fcfdaac6 292 while(Recommencer.Touched()!=true);
olivier14750 0:2173fcfdaac6 293 //morse_decode = "";
olivier14750 0:2173fcfdaac6 294 flagBPReco=0;
olivier14750 0:2173fcfdaac6 295 index_TabCara=0;
olivier14750 0:2173fcfdaac6 296 index_Temps=0;
olivier14750 0:2173fcfdaac6 297 index_TabTemps=0;
olivier14750 0:2173fcfdaac6 298
olivier14750 0:2173fcfdaac6 299 lcd.ClearStringLine(1);
olivier14750 0:2173fcfdaac6 300 lcd.DisplayStringAt(0,LINE(1),(uint8_t *)"En cours...",CENTER_MODE);
olivier14750 0:2173fcfdaac6 301 for(i = 0;i<index_morse_decode;i++){
olivier14750 0:2173fcfdaac6 302 morse_decode[index_morse_decode]=0;
olivier14750 0:2173fcfdaac6 303 }
olivier14750 0:2173fcfdaac6 304 index_morse_decode=0;
olivier14750 0:2173fcfdaac6 305
olivier14750 0:2173fcfdaac6 306
olivier14750 0:2173fcfdaac6 307 Recommencer.Activate();
olivier14750 0:2173fcfdaac6 308 Arrete.Activate();
olivier14750 0:2173fcfdaac6 309
olivier14750 0:2173fcfdaac6 310
olivier14750 0:2173fcfdaac6 311 }
olivier14750 0:2173fcfdaac6 312
olivier14750 0:2173fcfdaac6 313
olivier14750 0:2173fcfdaac6 314
olivier14750 0:2173fcfdaac6 315 }
olivier14750 0:2173fcfdaac6 316 }