从一个枚举状态移动到下一个状态并循环

2023-12-07

我只有具有 3 种模式 ledOn、ledBlink、ledOFF 的枚举器,并且有一个可变模式来跟踪特定对象的模式。例如,我有一个 LED 以 ledOn 模式启动,我想在 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()

我只想用itertools.cycle而不是你的枚举:

>>> from itertools import cycle
>>> ledModes = cycle(['ledON', 'ledBlink', 'LedOFF'])
>>> first = next(ledModes)
>>> second = next(ledModes)
>>> third = next(ledModes)
>>> fourth = next(ledModes)
>>> 
>>> first
'ledON'
>>> second
'ledBlink'
>>> third
'LedOFF'
>>> fourth
'ledON'
>>> 

仅供参考,你可以这样做next(ledModes) or ledModes.next(),两者都在做同样的事情。

编辑:您可以使用类似的方法作为您的类的方法:

from itertools import cycle

def initialize_cycle(start_mode):
    states = ['ledON', 'ledBlink', 'ledOFF']

    if start_mode not in states:
        raise ValueError('start_mode invalid')

    iterable = cycle(states)
    for _ in states[:states.index(start_mode)]:
        iterable.next()

    return iterable

test1 = initialize_cycle('ledON')
test2 = initialize_cycle('ledOFF')
test3 = initialize_cycle('ledBlink')

# validation
for test in test1, test2, test3:
    for _ in range(5):
        print test.next()
    print '-' * 20

Output:

$ python cycle.py
ledON
ledBlink
ledOFF
ledON
ledBlink
--------------------
ledOFF
ledON
ledBlink
ledOFF
ledON
--------------------
ledBlink
ledOFF
ledON
ledBlink
ledOFF
--------------------
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从一个枚举状态移动到下一个状态并循环 的相关文章

随机推荐