从一个枚举状态转移到下一个循环 [英] Moving from one enum state to the next and cycling through

查看:155
本文介绍了从一个枚举状态转移到下一个循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只是有3个模式的枚举器ledOn,ledBlink,ledOFF和我有一个变量模式,跟踪特定对象的模式。所以例如我有一个LED开始在模式ledOn我想例如在5秒后移动到下一个元素,那将被ledBlink然后到ledOFF然后循环到ledON有一个简单的方法来实现这样的东西? / p>

 导入时间
从线程导入线程
从枚举导入枚举

类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
线程。 __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 =不是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())
时间。睡眠(self.Blinkduration)
def ledDetails(self):
returnThread:+ self.getName()+,LED:+ str(self.GPIOID)+,状态: + str(self.state)+,模式:+ str(self.mode.name)+,闪烁持续时间:+ str(self.blinkDuration)

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

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

redLED.start()
blueLED.start()

redLED.join()
blueLED.join()


解决方案

您当前的代码最简单的修复是:




  • 更改您的运行方法,

  • 添加一个 next_mode 方法:



    • 像这样:

        def run(self):
      而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]


      I simply have enumerator with 3 modes ledOn, ledBlink, ledOFF and I have a variable mode that keeps track of modes for particular object. So for example I have one LED starting in mode ledOn i would like to for example after 5 seconds move to the next element which would be ledBlink then to ledOFF and then cycle through to ledON is there an easy way to achieve something like this?

      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()
      

      解决方案

      The easiest fix for your current code is to:

      • change your run method, and
      • add a next_mode method:

      like so:

      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]
      

      这篇关于从一个枚举状态转移到下一个循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆