morse_code_transcoder/transcodeur/morse.c
2021-03-20 19:29:19 +01:00

214 lines
No EOL
6.4 KiB
C

/*
* morse.c
*
* Created: 18/05/2021 15:47:14
* Author: yboujon1
*/
#include "main.h"
#include "morse.h"
unsigned char morse_library[LETTRES][7]= { {'a',POINT,TRAIT,'\0'},
{'b',TRAIT,POINT,POINT,POINT,'\0'},
{'c',TRAIT,POINT,TRAIT,POINT,'\0'},
{'d',TRAIT,POINT,POINT,'\0'},
{'e',POINT,'\0'},
{'f',POINT,POINT,TRAIT,POINT,'\0'},
{'g',TRAIT,TRAIT,POINT,'\0'},
{'h',POINT,POINT,POINT,POINT,'\0'},
{'i',POINT,POINT,'\0'},
{'j',POINT,TRAIT,TRAIT,TRAIT,'\0'},
{'k',TRAIT,POINT,TRAIT,'\0'},
{'l',POINT,TRAIT,POINT,POINT,'\0'},
{'m',TRAIT,TRAIT,'\0'},
{'n',TRAIT,POINT,'\0'},
{'o',TRAIT,TRAIT,TRAIT,'\0'},
{'p',POINT,TRAIT,TRAIT,POINT,'\0'},
{'q',TRAIT,TRAIT,POINT,TRAIT,'\0'},
{'r',POINT,TRAIT,POINT,'\0'},
{'s',POINT,POINT,POINT,'\0'},
{'t',TRAIT,'\0'},
{'u',POINT,POINT,TRAIT,'\0'},
{'v',POINT,POINT,POINT,TRAIT,'\0'},
{'w',POINT,TRAIT,TRAIT,'\0'},
{'x',TRAIT,POINT,POINT,TRAIT,'\0'},
{'y',TRAIT,POINT,TRAIT,TRAIT,'\0'},
{'z',TRAIT,TRAIT,POINT,POINT,'\0'},
{'0',TRAIT,TRAIT,TRAIT,TRAIT,TRAIT,'\0'},
{'1',POINT,TRAIT,TRAIT,TRAIT,TRAIT,'\0'},
{'2',POINT,POINT,TRAIT,TRAIT,TRAIT,'\0'},
{'3',POINT,POINT,POINT,TRAIT,TRAIT,'\0'},
{'4',POINT,POINT,POINT,POINT,TRAIT,'\0'},
{'5',POINT,POINT,POINT,POINT,POINT,'\0'},
{'6',TRAIT,POINT,POINT,POINT,POINT,'\0'},
{'7',TRAIT,TRAIT,POINT,POINT,POINT,'\0'},
{'8',TRAIT,TRAIT,TRAIT,POINT,POINT,'\0'},
{'9',TRAIT,TRAIT,TRAIT,TRAIT,POINT,'\0'}
};
void envoyer_signe_morse(unsigned char signe_morse)
{
switch(signe_morse){
case POINT:
start_timer0(); //démarre la fréquence 440 Hz
start_timer1(ONEMS*speed); // 100ms*vitesse
wait_ocf1a_timer1(); // d'attente
stop_timer0(); //arrêt de 440 Hz
start_timer1(ONEMS*speed); // 100ms*vitesse
wait_ocf1a_timer1(); // d'attente
break;
case TRAIT:
start_timer0(); //démarre la fréquence 440 Hz
start_timer1(3*ONEMS*speed); // 300ms*vitesse
wait_ocf1a_timer1(); // d'attente
stop_timer0(); //arrêt de 440 Hz
start_timer1(ONEMS*speed); // 100ms*vitesse
wait_ocf1a_timer1(); // d'attente
break;
case INTERLETTRE:
start_timer1(2*ONEMS*speed); // 200ms*vitesse
wait_ocf1a_timer1(); // d'attente
break;
case INTERMOT:
start_timer1(10*ONEMS*speed); // 1s*vitesse
wait_ocf1a_timer1(); // d'attente
break;
case FIN:
resume_timer1(); //on relance l'attente
stop_timer1(); //on arrête les attentes
break;
default:
break;
};
}
void maj2min_convert(char *tab, int n)
{
int i; //on initialise i
for(i=0; i<=n; i++) //on incrémente tant qu'il n'est pas plus grand que la taille n
{
if(tab[i]>=65 && tab[i]<=90) //si c'est une majuscule
{
tab[i]=tab[i]+32; //la met en minuscule
}
else
{
tab[i]=tab[i]; //sinon rien
};
};
}
void printandtranslate(char *tab, int n)
{
int i=0; //varie la chaine de caractere
int j=0; //varie la librarie
int multiple=0; //tous les 16 caractères, s'incrémente
do
{
firstlinetext(tab,i,&multiple,n); //16 caractères de la chaîne sur la première ligne
switch(j)
{
case 0: //UNIQUEMENT quand j=0
secondlinetext(tab,&i,multiple);//seconde ligne de la chaîne pour un caractère
maj2min_convert(tab,i); //converti les majuscules en minuscule
default: //SINON dans tous les autres cas
latin2morse(tab,&i,&j); //traduction morse
break;
};
}while(i<n); //tant qu'on arrive a la fin du tableau
}
void latin2morse(char *tab,int* i,int* j)
{
if(tab[*i]==morse_library[*j][0]) //verifie si le caractere correspond ? la librarie
{
library_checker(tab,&i,&j); //traduit dans la librairie et renvoie les deux variables pour continuer
}
else //si ce n'est pas dans la librarie
{
simple_terms(tab,&i,&j); //traduit directement les termes plus simples
};
}
void library_checker(char *tab,int** i,int** j)
{
morselibrary_output(*j); //traduit en morse
**j=0; //on revient au debut de la librairie
**i=**i+1; //on avance dans la chaine
if(tab[**i]!=32 && tab[**i]!='\0') //s'il n'y a pas d'espace ou de fin de mot apr?s, INTERLETTRE
{
envoyer_signe_morse(INTERLETTRE);
};
}
void simple_terms(char *tab,int** i,int** j)
{
switch(tab[**i]) //en fonction du caractere
{
case 32: //si c'est un espace alors INTERMOT
envoyer_signe_morse(INTERMOT);
**j=0; //on revient au debut de la librairie
**i=**i+1; //on avance dans la chaine
break;
case '\0':
envoyer_signe_morse(FIN); //si c'est la fin de la chaine, FIN
**j=0; //on revient au debut de la librairie
**i=**i+1; //on avance dans la chaine
break;
default: //dans d'autres cas continuer l'analyse de la chaine
**j=**j+1; //on avance dans la tableau
};
}
void morselibrary_output(int* id)
{
int y=1; //on commence a la 2eme colonne
do
{
if(etat==0){ //si l'interruption n'est pas active
envoyer_signe_morse(morse_library[*id][y]); //fonction qui envoie un trait ou un point en fonction de la librarie
y++;
}
else{
//rien
};
}
while(morse_library[*id][y]!='\0'); //jusqu'a la fin de la traduction dans la librairie
}
void secondlinetext(char *tab,int* i,int multiple)
{
if(tab[*i]=='\0') //si nous sommes à la fin de la chaîne, ne rien faire
{
//nothing
}
else{ //sinon
if((*i)==16*(multiple-1)) //tous les 16 caractères en partant de 0
{
LCD_Command(POSITION | SECOND_LINE); //nous allons sur le premier caractère de la seconde ligne
printf("%c",tab[*i]); //on affiche le caractère en cours de la chaîne
}
else{ //dans les autres cas
printf("%c",tab[*i]); //on affiche le caractère en cours de la chaîne
};
};
}
void firstlinetext(char* tab,int i,int* multiple,int taille)
{
if(i==16*(*multiple)) //tous les 16 caractères en partant de 0
{
switch(tab[i]) //en fonction du caractère
{
case '\0': //fin de la chaine, ne fait rien
break;
default:
LCD_Command(ENTIRE_SHIFT_ON); //on décale l'affichage
do{
printf("%c",tab[i]); //on print les caractères un par un en fonction de i
i++;
}while(i < (*multiple+1)*16 && i < taille-1); //jusquà ce que ce soit le 'multiple*16 + 1' caractère ou qu'on arrive à la fin de la chaîne
*multiple = *multiple + 1; //on incrémente multiple car nous sommes à un nouveau multiple de 16
};
};
}