从一个枚举状态转移到另一个枚举状态并循环


问题内容

我只使用了3种模式的枚举器ledOn,ledBlink,ledOFF,并且我有一个可变模式,可以跟踪特定对象的模式。因此,例如,我有一个以ledOn模式启动的LED,例如,我想在5秒钟后移至下一个元素,即ledBlink,然后转到ledOFF,然后循环到ledON,是否有一种简单的方法来实现这样的效果?

import time
from threading import Thread
from enum import Enum

class ledController(Thread):
    ledModes = Enum('ledModes', 'ledON ledBlink ledOFF')
    def __init__(self, GPIOID, state=False, blinkDuration=2, mode=ledModes.ledON):
        self.GPIOID = GPIOID
        self.state = state
        self.blinkDuration = blinkDuration
        self.mode = mode
        self.blinked = False
        Thread.__init__(self)
    def run(self):
        if(self.mode == self.ledModes.ledON):
            self.ledON()
        if(self.mode == self.ledModes.ledBlink):
            self.ledBlink()
        if(self.mode == self.ledModes.ledOFF):
            self.ledOFF()
        time.sleep(self.blinkDuration)
        self.mode.next()
    def ledSwitch(self):
        self.state = not self.state
        print(self.ledDetails())
    def ledON(self):
        self.state = True
        print(self.ledDetails())
    def ledOFF(self):
        self.state = False
        print(self.ledDetails())
    def ledBlink(self, duration):
        self.ledON()
        print(self.ledDetails())
        time.sleep(self.Blinkduration)
        self.ledOFF()
        print(self.ledDetails())
        time.sleep(self.Blinkduration)
    def ledDetails(self):
        return "Thread: "+self.getName()+", LED: "+str(self.GPIOID)+", State: "+str(self.state)+", Mode: "+str(self.mode.name)+", Blink duration: "+str(self.blinkDuration)

redLED = ledController(17, blinkDuration = 3)
blueLED = ledController(18, mode = ledController.ledModes.ledOFF)

redLED.setName('1')
blueLED.setName('2')

redLED.start()
blueLED.start()

redLED.join()
blueLED.join()

问题答案:

当前代码最简单的解决方法是:

  • 改变你的run方法
  • 添加next_mode方法:

像这样:

def run(self):
    while True:
        set_mode = getattr(self, self.mode)
        set_mode()
        time.sleep(self.blinkDuration)
        self.next_mode()

def next_mode(self):
    self.mode = {
            self.ledModes.ledON: self.ledModes.ledBlink,
            self.ledModes.ledBlink: self.ledModes.ledOFF,
            self.ledModes.ledOff: self.ledModes.ledOn,
            }[self.mode]