214 lines
No EOL
6.4 KiB
C
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
|
|
};
|
|
};
|
|
} |