Skip to content

Display

alekay2200 edited this page Sep 16, 2022 · 3 revisions

Resumen

En el módulo display/abstract_display.py se encuentra la clase abstracta Display, Fonts y colors que funcionan de interfaz para poder añadir cualquier tipo de pantalla al sistema.

Al crear una nueva pantalla se deben programar estas 3 clases.

Colors

Se debe asignar un valor a cada uno de los colores de la clase. En caso de que la pantalla no pueda reproducirlos todos, se debe poner un valor por defecto de color. Por ejemplo, si la pantalla solo reproduce blancos y negros, se puede asignar el color blanco al blanco y para todos los demás el valor de negro.

class Colors:
    BLACK = None
    BLUE = None
    RED = None
    GREEN = None
    CYAN = None
    MAGENTA = None
    YELLOW = None
    WHITE = None

Definición de colores para una pantalla concreta

colors = Colors()
colors.BLACK = st7789.BLACK
colors.BLUE = st7789.BLUE
colors.RED = st7789.RED
colors.GREEN = st7789.GREEN
colors.CYAN = st7789.CYAN
colors.MAGENTA = st7789.MAGENTA
colors.YELLOW = st7789.YELLOW
colors.WHITE = st7789.WHITE

Fonts

Se definen 4 tipos diferentes de fuentes. Al igual que los colores se deben de asignar un valor a todas. Las fuentes son tuplas de 2 elementos. El primero es la fuente a utilizar, que dependiendo de cada pantalla puede estar contenida en un archivo diferente. El segundo es una tupla que indica el tamaño de cada caracter --> (ancho, alto).

class Fonts:
    FONT1 = None
    FONT2 = None
    FONT3 = None
    FONT4 = None

Definición de fuentes para pantalla concreta (ST7789).

import vga1_8x8 as font1
import vga1_8x16 as font2
import vga1_bold_16x16 as font3
import vga1_bold_16x32 as font4

fonts = Fonts()
fonts.FONT1 = (font1, (8,8))
fonts.FONT2 = (font2, (8,16))
fonts.FONT3 = (font3, (16,16))
fonts.FONT4 = (font4, (16,32))

Display (Abstract)

Display(colors: Colors, fonts: Fonts)

El constructor recibe las clases colores y fuentes a utilizar.

get_sys_manager() --> System_Manager:

Devuelve el sistema al que esta asignado o, None en su defecto.

set_sys_manager(sys: System_Manager)

Asigna un sistema a la pantalla

get_view()

Devuelve la vista actual o, en su defecto None.

set_view(view: View)

Agina una nueva vista a la pantalla

get_colors() -> Colors

get_fonts() -> Fonts

def get_width(self) -> int

def get_height(self) -> int

refresh()

Refresca la vista actual

clean()

Limpia todos los elementos de la pantalla

draw_pixel(x: int, y: int, color: Colors)

Dibuja el pixel en la posición (x,y) del color seleccionado.

draw_pixel(text:str, x: int, y: int, font:Fonts, font_color: Colors, bg_color: Colors)

Dibuja el texto dado empezando en la posición (x,y) con un tamaño de fuente, color y color de fondo determinados

draw_fill_rect(self, x: int, y: int, width: int, height: int, color: Colors)

Dibuja un rectangulo sólido empezando en la posición (x,y) con las dimensiones especificadas

draw_jpg(self, x: int, y: int, filename: str)

Dibuja una imágen en formato jpg, empezando en la posición (x,y). La imagen se pasa como una ruta en el sistema de archivos.

power_off()

Apaga la pantalla para no consumir batería.

power_on()

Enciende la pantalla

Cualquier pantalla debe implementar las funciones abstractas de la clase para poder funcionar correctamente.

Ejemplo con pantalla ST7789

from display.abstract_display import Display, Colors, Fonts
from machine import SoftSPI, Pin
import st7789
from system import System_Manager
import vga1_8x8 as font1
import vga1_8x16 as font2
import vga1_bold_16x16 as font3
import vga1_bold_16x32 as font4
    
WIDTH = 135
HEIGHT = 240

class Color_Display(Display):

    def __init__(self, system_manager: System_Manager = None):

        # Define colors
        colors = Colors()
        colors.BLACK = st7789.BLACK
        colors.BLUE = st7789.BLUE
        colors.RED = st7789.RED
        colors.GREEN = st7789.GREEN
        colors.CYAN = st7789.CYAN
        colors.MAGENTA = st7789.MAGENTA
        colors.YELLOW = st7789.YELLOW
        colors.WHITE = st7789.WHITE

        # Define fonts, --> (Font, (width, height))
        fonts = Fonts()
        fonts.FONT1 = (font1, (8,8))
        fonts.FONT2 = (font2, (8,16))
        fonts.FONT3 = (font3, (16,16))
        fonts.FONT4 = (font4, (16,32))

        super().__init__(colors, fonts)

        spi = SoftSPI(
        baudrate=40000000,
        polarity=1,
        phase=0,
        sck=Pin(18),
        mosi=Pin(19),
        miso=Pin(13))

        self.__tft = st7789.ST7789(
            spi,
            WIDTH, # width
            HEIGHT, # height
            reset=Pin(23, Pin.OUT),
            cs=Pin(5, Pin.OUT),
            dc=Pin(16, Pin.OUT),
            backlight=Pin(4, Pin.OUT),
            rotation=1)

        self.__tft.init()
        self.__tft.fill(st7789.BLACK)


    def get_width(self) -> int: 
        return self.__tft.width()

    def get_height(self) -> int:
        return self.__tft.height()

    def clean(self): 
        self.__tft.fill(st7789.BLACK)

    def draw_pixel(self, x: int, y: int, color: Colors):
        self.__tft.pixel(x, y, color)

    def print_text(self, text: str, x: int, y: int, font: Fonts, font_color: Colors, bg_color: Colors):
        self.__tft.text(font[0], text, x, y, font_color, bg_color)

    def draw_fill_rect(self, x: int, y: int, width: int, height: int, color: Colors):
        self.__tft.fill_rect(x, y, width, height, color)

    def draw_jpg(self, x: int, y: int, filename: str):
        self.__tft.jpg(filename, x, y, st7789.SLOW)

    def power_off(self):
        self.__tft.off()

    def power_on(self):
        self.__tft.on()