Как лучше всего управлять цифровым вводом-выводом в python

#python #enums

Вопрос:

Я пишу фрагмент кода для управления тремя цветными лампами, подключенными к Jetson nano.

Каждый пин-код GPIO предназначен для его цвета, пин-кода и состояния. Скажи

 Pins[0] = [Color.RED, pin=11, state=State.OFF]   
Pins[1] = [Color.YEL, pin=13, state=State.SOLID_ON]   
Pins[2] = [Color.GRN, pin=15, state=State.BLINK]  
 

и в функции SetGPIO я хотел бы управлять каждым пин-кодом следующим образом

 def SetGPIO(self, color, state):  
   if color == Color.RED:  
       Pins[0].state = state  
   elif color == Color.YEL:  
       Pins[1].state = state  
   elif color == Color.GRN:  
       Pins[2].state = state  
 

Затем в функции обновления, которая вызывается каждые 0,5 секунды,

 def Update(self):  
   foreach Pin in Pins  
      if Pins.state == State.off:  
           GPIO.output(Pins.pin, GPIO.LOW)  
      elif Pins.state == State.SOLID_ON:  
           GPIO.outpu(Pins.pin, GPIO.HIGH)  
      elif Pins.state == State.BLINK:  
           toggle GPIO(Pins.pin, state)  
 

Есть какие-либо предложения о том, как реализовать такие функции в python?

Ответ №1:

Мне удалось реализовать нечто подобное. Все выглядит нормально? Какие-либо улучшения или предложения?

 import Jetson.GPIO as GPIO
from enum import Enum

class Color(Enum):
    RED = 0
    YEL = 1
    GRN = 2

class LampState(Enum):
    OFF = 0
    ON = 1
    BLINK = 2

class Lamp:
    def __init__(self, color, pinNum):
        self.color = color
        self.pin = pinNum
        self.state = LampState.OFF
        self.onoff = False
        GPIO.setup(self.pin, GPIO.OUT)
        GPIO.output(self.pin, GPIO.LOW)

    def On(self):
        self.onoff = True
        GPIO.outpu(self.pin, self.onoff)
    
    def Off(self):
        self.onoff = False
        GPIO.output(self.pin, self.onoff)

    def Toggle(self):
        self.onoff = not self.onoff
        GPIO.output(self.pin, self.onoff)
    
    def SetState(self, state):
        self.state = state

class LampHandler:
    def __init__(self):
        GPIO.setmode(GPIO.BOARD)
        self.lamps = [ Lamp(Color.RED, 11),
                        Lamp(Color.YEL, 13),
                        Lamp(Color.GRN, 15)]

    def Update_5Hz(self):
        for i in range(len(self.lamps)):
            if self.lamps[i].state == LampState.BLINK:
                self.lamps[i].Toggle()
            elif self.lamps[i].state == LampState.ON:
                self.lamps[i].On()
            elif self.lamps[i].state == LampState.OFF:
                self.lamps[i].Off()
    
    def SetState(self, color, state):
        if color == Color.RED:
            self.lamps[0].state = state
        elif color == Color.YEL:
            self.lamps[1].state = state
        elif color == Color.GRN:
            self.lamps[2].state = state