Convertisseur de code morse Morse code converter

Dependencies:   F746_GUI mbed

main.cpp

Committer:
olivier14750
Date:
2019-06-06
Revision:
0:2173fcfdaac6

File content as of revision 0:2173fcfdaac6:

#include "mbed.h"
#include <string>

#include "LCD_DISCO_F746NG.h"
#include "TS_DISCO_F746NG.h"
#include "F746_GUI.hpp"
#define Seuil 0.9

#define SeuilMinTimeP 70
#define SeuilMaxTimeP 250

#define SeuilMaxTimeEL 600
#define SeuilMAXTimeEM 2000

bool etat_precedent;
int TabTemps[100];

char morse[100];
int index_morse = 0;
int check = 1;
int flagBPReco = 0;

using namespace std;

//Déclaration de la base de donnée morse

static char *ListCara[36]=  {".-",
                             "-...",
                             "-.-.",
                             "-..",
                             ".",
                             "..-.",
                             "--.",
                             "....",
                             "..",
                             ".---",
                             "-.-",
                             ".-..",
                             "--",
                             "-.",
                             "---",
                             ".--.",
                             "--.-",
                             ".-.",
                             "...",
                             "-",
                             "..-",
                             "...-",
                             ".--",
                             "-..-",
                             "-.--",
                             "--..",
                             ".----",
                             "..---",
                             "...--",
                             "....-",
                             ".....",
                             "-....",
                             "--...",
                             "---..",
                             "----.",
                             "-----"
                            };

char ListLettre[36]= {'a',
                      'b',
                      'c',
                      'd',
                      'e',
                      'f',
                      'g',
                      'h',
                      'i',
                      'j',
                      'k',
                      'l',
                      'm',
                      'n',
                      'o',
                      'p',
                      'q',
                      'r',
                      's',
                      't',
                      'u',
                      'v',
                      'w',
                      'x',
                      'y',
                      'z',
                      '1',
                      '2',
                      '3',
                      '4',
                      '5',
                      '6',
                      '7',
                      '8',
                      '9',
                      '0'
                     };


Timer t;
DigitalOut led(LED1);
AnalogIn AnaIn(PF_10);
DigitalIn BP(USER_BUTTON);
Serial pc(USBTX, USBRX); // tx, rx

TS_DISCO_F746NG ts;
LCD_DISCO_F746NG lcd;

//Bouton utilisés pour le control du convertisseur morse
// Pour les couleurs, dans l'ordre on a la couleur du text, la couleure du fond d'écran et la couleur du bouton
Button Commencer(50,100,100,100,"BEGIN",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE); 
Button Arrete(195,100,100,100,"STOP",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE);
Button Recommencer(340,100,100,100,"RESTART",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE);


int main()
{
    float LDR;
    bool etat;
    int index_TabTemps = 0;
    int index_Temps = 0;
    int index_TabCara = 0;
    int i, Temps[100][2];
    lcd.SetTextColor(LCD_COLOR_BLACK);
    
    unsigned char morse_decode[200];
    int index_morse_decode = 0;
    char cara[6];
    int index_cara=0;
    etat_precedent = false;
    
    t.start();
    while(Commencer.Touched()!=true);// On clique sur la touche "commencer" pour commencer l'enregistrement
    
    lcd.DisplayStringAt(0,LINE(1),(uint8_t *)"En cours...",CENTER_MODE);
    while(1) {
        
        LDR= AnaIn.read(); // Lecture de la valeur analogique
        pc.printf("LDR = %.2f\n\r",LDR);
        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
           
            etat = true;
            
        }

        else

        {
            etat = false;
            
        }

        if(etat !=etat_precedent) { // Si l'état actuel est différent de l'état précédent
            pc.printf("get time\n\r");
            TabTemps[index_TabTemps]= t.read_ms(); // Lecture du temps
            index_TabTemps++;
            // On indique ici si le temps stocké précédement était une partie du code morse ou pas
            if(etat==true) {
                Temps[index_Temps][0] = 1; 
                index_Temps++;
            } else {
                Temps[index_Temps][0] = 0;
                index_Temps++;
            }

        } else {
            pc.printf("no\n\r");

        }
        etat_precedent = etat;

        if(Arrete.Touched()==true) { // Si la touche "Arreter est apuyer, on arrete l'enregistrement pour passer au décodage
            
            
            lcd.ClearStringLine(1);
            
            //ici, on récupère tous les temps qu'on a lus pour optenir les temps correspondant au code morse
            for( i = 0; i<index_TabTemps; i++) {
                Temps[i][1] = TabTemps[i+1] - TabTemps[i];
            }
            
            
            for( i = 0; i<index_Temps; i++) {
                // On vérifie chaque temps correspondant à un bout du code morse pour savoir si c'était un point ou un tirait
                if(Temps[i][0] ==1) {
                    if(Temps[i][1]<SeuilMaxTimeP) {
                        morse[index_TabCara] =  '.';

                        pc.printf("%c",morse[index_TabCara]);
                        index_TabCara++;
                    } else {
                        morse[index_TabCara] =  '-';

                        pc.printf("%c",morse[index_TabCara]);
                        index_TabCara++;
                    }
                } else {
                    //Si le temps ne correspondait pas à bout du code morse, trois cas de figure se présente à nous : 
                    if(Temps[i][1]<SeuilMaxTimeP) {
                        //Ici, on  ne fait rien. Cela veut dire que le caractère n'est pas encore complet
                    } else if(Temps[i][1]<SeuilMaxTimeEL) {
                        morse[index_TabCara] = '*';
                        index_TabCara++;
                        //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
                    } else if (Temps[i][1]<SeuilMAXTimeEM) {

                        morse[index_TabCara] =  ' ';
                        index_TabCara++;
                        //Ici, cela signifie que le mot est terminé. On met donc un espace pour pouvoir decoder le prochain mot.

                    }
                }
            }
            morse[index_TabCara]+='*';
            index_TabCara++;
            pc.printf("%d\n\r",index_TabCara);

            pc.printf("code morse : %s\n\r",morse);
            
            //Nous procédons ici au decodage lettre par lettre 

            for(i=0; i<index_TabCara; i++) {
                
                
                if(morse[i]== ' ') {
                    //Si le caractère rencontré est un espace, tu decode le code morse dans la variable cara qui correspond à un caractère
                    for(int j=0; j<36; j++) {
                        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
                            morse_decode[index_morse_decode]= ListLettre[j];
                            index_morse_decode++;
                            check = 0;
                            
                        }
                    }
                    //Si il ne reconnait pas le caractère, alors tu ajoutes un point d'intérogation à ta chaine de caractère
                    if(check!=0) {
                        morse_decode[index_morse_decode]= '?';
                        index_morse_decode++;
                    }
                    //On remet à zero la variable 'cara' pour decoder le prochain caractère
                    for (int y=0;y<6;y++){
                        cara[y] = ' ';
                        
                        }
                    index_cara=0;
                    morse_decode[index_morse_decode]= ' ';
                    index_morse_decode++;
                    
                } else if(morse[i]=='*') {
                    //Si le caractère rencontré est une étoile, tu decode le code morse dans la variable cara qui correspond à un caractère
                    for(int j=0; j<36; j++) {
                        if(strcmp(ListCara[j], cara) == 0) {
                            morse_decode[index_morse_decode]= ListLettre[j];
                            index_morse_decode++;
                            
                            check = 0;
                            
                        }
                    }
                    if(check!=0) {
                        morse_decode[index_morse_decode]= '?';
                        index_morse_decode++;
                    }
                    for (int y=0;y<6;y++){
                        cara[y] = ' ';
                        index_cara=0;
                        }
                    
                } else {
                    cara[index_cara]= morse[i];
                    index_cara++;
                    cara[index_cara]='\0'; // c'est pour decoder la chaine de caractère
                    
                }

            }
            
            //On affiche le code decodé sur l'écran LCD
            lcd.DisplayStringAt(0,LINE(1),(uint8_t *)morse_decode,CENTER_MODE);
            flagBPReco =1;
            pc.printf("code converti : %s\n\r",morse_decode);
            
            

        }
        //On attend que la touche "recommencer" soit appuyer pour tout réinitialiser
        if(flagBPReco==1){
            while(Recommencer.Touched()!=true);
            //morse_decode = "";
            flagBPReco=0;
            index_TabCara=0;
            index_Temps=0;
            index_TabTemps=0;

            lcd.ClearStringLine(1);
            lcd.DisplayStringAt(0,LINE(1),(uint8_t *)"En cours...",CENTER_MODE);
            for(i = 0;i<index_morse_decode;i++){
                morse_decode[index_morse_decode]=0;
                }
            index_morse_decode=0;
            
        
            Recommencer.Activate();
            Arrete.Activate(); 
        
           
        }
            
        

    }
}