Skip to content
alekay2200 edited this page Sep 15, 2022 · 1 revision

Resumen

En el módulo input/abstract_input.py se encuentra la clase abstracta Input en la que se deben basar todas las entradas.

Input(pin_numbers: Set[int], signals: Set[int], init_value: Any)

pin_numbers

Conjunto de pines físicos a los que esta conectado la entrada.

signals

Conjunto de señales que disparará cuando se active.

init_value

Estado inicial de la entrada para controlar si se ha activado o no.

get_value()

En caso de ser un dispositivo analógico devuelve el valor medido.

enable()

Activa la entrada

disable()

Desactiva la entrada

get_pin_numbers()

Devuelve el conjunto de pines al que esta conectado.

get_sys_manager()

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

get_signals()

Devuelve el conjunto de señales que puede disparar.

_irq(pin)

Función para controlar la entrada haciendo uso de las rutinas de tratamiento de la interrupción que proporcionada MicroPython.

Ejemplo implementación para un Boton

from machine import Pin
from input.abstract_input import Input

IRQ_FALLING = Pin.IRQ_FALLING
IRQ_RISING = Pin.IRQ_RISING

class Button(Input):

    # __pin = Pin
    # __trigger = IRQ_FALLING | IRQ_RISING
    # _pin_numbers: Set<int>
    # _trigger: IRQ_TRIGGER --> IRQ_FALLING | IRQ_RISING
    # _signla: int

    def __init__(self, pin_numbers, trigger, signal):
        """
        Parameters
        ----------

        handler: function to execute when irq activated
        trigger: when to launch the irq
        """
        super().__init__({pin_numbers}, {signal}, None)
        self.__pin = Pin(pin_numbers, Pin.IN, Pin.PULL_UP)
        self.__trigger = trigger

    def get_value(self):
        return None

    def enable(self):
        if not self._enable:
            self.__pin.irq(self._irq, self.__trigger)
            self._enable = True
        
    def disable(self):
        if self._enable:
            self.__pin.irq(handler = None) 
            self._enable = False

    def _irq(self, pin):
        if self._system_manager is not None:
            signal = next(iter(self._signals))
            self.disable()
            self._system_manager.send_signal(signal, data = None)
            self.enable()

Clone this wiki locally