################################## # # # prototype de convertisseur # # texte -> morse avec la # # lumière # # # ################################## ########## # IMPORT # ########## from time import sleep import unicodedata import logging try: import RPi.GPIO as GPIO except ImportError: logging.error("Dépendance RPi introuvable.") raise except RuntimeError: logging.error("Lancez ce programme sur un Raspberry.") raise ###################### # INITIALISATION DES # # VARIABLES # ###################### __author__ = "rick@gnous.eu" __licence__ = "GPL3 or later" class TraducteurMorse: def __init__(self, portGpio=7, point=0.1): """ Initialise la durée d'un point et le port GPIO de la led ou du relai. Parameters ---------- portGpio : int Port GPIO qui sera utilisé. 7 par défaut. point : float Temps en seconde de la durée d'un point. 0.1 par défaut. Raises: ------- TypeError Si les paramètes entrés ne sont pas du bon type. ValueError Si le port GPIO est incorrect ou si le temps est négatif ou nul. """ global loggerMorse loggerMorse = logging.getLogger("morse-light") logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.ERROR) if not isinstance(portGpio, int): loggerMorse.error("Le port GPIO doit être de type int.") raise TypeError("Le port GPIO doit être de type int.") if not isinstance(point, float): loggerMorse.error("Le temps d'un point doit être de type float.") raise TypeError("Le temps d'un point doit être de type float.") self.point = point if point <= 0: loggerMorse.error("Durée négative ou nulle.") raise ValueError("Durée négative ou nulle.") if point > 2: loggerMorse.warning("Durée du point supérieur à 2 secondes.") # Configuration du port GPIO self.portGpio = portGpio try : GPIO.setmode(GPIO.BOARD) GPIO.setup(self.portGpio, GPIO.OUT) except ValueError: loggerMorse.error("Le port GPIO entré n’existe pas.") raise self.CODE_MORSE = { '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':"_____", " ":" " } def codageMorse(self, mot): """ Fonction traduisant un mot en morse Parameters ---------- mot : str Le mot à traduire en morse Returns ------- array of str Un tableau contenant les symboles. Exemple : ["_","."] Raises ------ TypeError Si le paramètre mot n'est pas de type str. """ if not isinstance(mot, str): loggerMorse.error("codageMorse() : le mot passé en paramètre n’est pas de type str.") raise TypeError("mot doit être de type str.") mot = unicodedata.normalize('NFKD', mot).encode('ascii', 'ignore') mot = mot.decode() loggerMorse.info("Traduction du mot %s", mot) motMorse = [] for lettre in mot: symbole = self.CODE_MORSE.get(lettre, " ") loggerMorse.info("%s -> %s", lettre, symbole) motMorse.append(symbole) return motMorse def decodageMorse(self, motMorse): """ Décode le mot en morse en texte Parameters ----------- motMorse : list Mot qui va etre décodé. Doit etre au format : ['._', '.'] par ex Returns -------- str Le mot traduit Raises ------ TypeError Si le paramètre mot n’est pas du type str """ if not isinstance(mot, list): loggerMorse.error("codageMorse() : le mot passé en paramètre n’est pas de type list.") raise TypeError("mot doit être de type list.") loggerMorse.info("Traduction du mot %s", motMorse) mot = "" listeClefs = list(self.CODE_MORSE.keys()) listeValeurs = list(self.CODE_MORSE.values()) for symbole in motMorse: try: lettre = listeClefs[listeValeurs.index(symbole)] loggerMorse.info("%s -> %s", symbole, lettre) mot += lettre except ValueError: loggerMorse.warning("Symbole inconnu : %s. Remplacement par un espace.", symbole) mot += "-" return mot def lumiere(self, symbole): """ Allume la LED selon le symbole passé en paramètre Parameters ---------- symbole : str Le symbole qui va déterminer la durée d'allumage de la lampe. Doit être _ ou . """ if symbole == "_": loggerMorse.info("Allumage. Durée : 3 points.") GPIO.output(self.portGpio, GPIO.HIGH) sleep(3 * self.point) elif symbole == ".": loggerMorse.info("Allumage. Durée : 1 points.") GPIO.output(self.portGpio, GPIO.HIGH) sleep(self.point) else: loggerMorse.warning("Caractère inconnu :", symbole) def eteint(self, temps=1): """ Eteint la LED selon le temps passé en paramètre. Parameters ---------- temps : int Le temps d'extinction en points. Exemple, temps = 7 alors la lampe s'éteint 7 * durée d'un poitn. Valeur par défaut : 1 Raises ------ TypeError Si le paramètre n'est pas de type int. """ if not isinstance(temps, int): loggerMorse.error("eteint() : le temps passé en paramètre n’est pas de type int.") raise TypeError("temps doit être de type int.") loggerMorse.info("Extinction. Durée : %s points", temps) GPIO.output(self.portGpio, GPIO.LOW) sleep(temps * self.point) def envoieMot(self, motMorse, mot=None): """ Transforme un tableau contenant du morse en signaux lumineux. Parameters: ----------- motMorse : array of str Tableau contenant les symboles morses. mot : str Mot qui sera envoyé Raises ------ TypeError Si le paramètre motMorse n'est pas de type list. See also: -------- codageMorse : Code un mot en morse. """ if not isinstance(motMorse, list): loggerMorse.error("envoieMot() : le mot en morse passé en paramètre n’est pas de type list.") raise TypeError("motMorse doit être de type list.") GPIO.setmode(GPIO.BOARD) GPIO.setup(self.portGpio, GPIO.OUT) if mot != None: print("=== Envoie du mot :", mot, "===") else: print("=== Envoie d'un mot ===") for i in range(len(motMorse)): if motMorse[i] is not " ": for j, symbole in enumerate(motMorse[i]): self.lumiere(symbole) if j != len(motMorse[i])-1 : self.eteint() if i < len(motMorse) - 1: if motMorse[i+1] is " ": self.eteint(self.portGpio) else: self.eteint(3) loggerMorse.info("Fin de l’envoi du signal.") GPIO.output(self.portGpio, GPIO.LOW) GPIO.cleanup() def traductionEtEnvoie(self, mot): """ Traduit un mot passé en paramètre en morse puis envoie les signaux lumineux. Parameters: ----------- mot : str Le mot qui serai traduit en morse et converti en signaux lumineux """ motMorse = self.codageMorse(mot) self.envoieMot(motMorse, mot) #test = traducteurMorse(point=0.1) #test.point = -1 #test.traductionEtEnvoie("test morse &")