#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Importation des bibliothèques utilisées par le script
import time
# Gestion du circuit 7219
from luma.led_matrix.device import max7219
# Gestion du bus SPI
from luma.core.interface.serial import spi, noop
# Affichage des messages
from luma.core.legacy import show_message
# Polices utilisées par le script
from luma.core.legacy.font import proportional, CP437_FONT

# Fonction de gestion des matrices
# Elle reçoit en paramètres le nombre de matrices cascadées n
# L'orientation des matrices  block_orientation en degrés [0, 90, -90, 180]
# La rotation à appliquer aux caractères   rotate [0, 1, 2, 3]
# L'inversion de l'ordre des matrices   inreverse [0, 1]
def demo(n, block_orientation, rotate, inreverse):
    # Création du périphérique à gérer
    # 1 - Création de la liaison série sur le bus SPI
    serial = spi(port=0, device=0, gpio=noop())
    # 2 - Création du circuit d'affichage 7219
    afficheur = max7219(serial, cascaded=n, block_orientation=block_orientation,
                     rotate=rotate or 0, blocks_arranged_in_reverse_order=inreverse)
    print("Dispositif d'affichage créé")

    # Démarrage de la démonstration
    msg = " D"+(chr(130))+"mo Raspberry Pi 4 sur matrice de LED" 
    # Afficher le message à l'écran
    print(msg)
    # Afficher le message sur les matrices de LED
    show_message(afficheur, msg, fill="white", font=proportional(CP437_FONT))
    # Pause pour gérer la vitesse de défilement du message
    time.sleep(0.3)

# En Python toutes les instructions situées entre try et except sont exécutées 
# jusqu'à ce qu'une exception (ici l'appui sur CTRL C) interrompe le script
try:
    # Boucle infinie - programme principal
    while True:
        # Appel de la fonction de gestion des matrices. 
        # Les paramètres sont dans l'ordre 
        # - Le nombre de matrices
        # - L'orientation des matrices
        # - La rotation des caractères
        # - L'inversion de l'ordre des matrices
        demo(3, 0, 0, 0)
# Sortir du programme si l'utilisateur appuie sur CTRL C
except KeyboardInterrupt:
        # L'instruction pass ne fait rien. Elle est présente car 
        # il doit obligatoirement y avoir
        # une instruction après except
        pass
