1

我正在尝试将DmxPy与用Transitions编写的状态机一起使用,但尝试将 DmxPy 传递给有限状态机会引发元类错误。似乎 DmxPy 的输出是一个 Nonetype ,它不在转换状态机中运行。

有谁知道如何使以下简单的、不起作用的脚本工作或根据我们所处的状态使灯亮起的变体?

class DmxPy:
def __init__(self, serialPort):
    self.serial =serialPort(serialPort, baudrate=57600)
    ...other DMX code...

    def set_red(self, channel)
    ...RGBW color red mix...

def set_green(self, channel)
    ...RGBW color green mix...

def render(self)
    self.serial.write(...DMX code...)

以上是简单的,但运行它会

dmx = DmxPy('COM5')
dmx.set_red(1)
dmx.render()

或者

dmx = DmxPy('COM5')
dmx.set_red(1)
dmx.render()

Transitions 状态机代码示例,非功能代码是

class State:
    pass

classFSMOpen(State, DmxPy):
    dmx = DmxPy('COM5')
    dmx.set_red(1)
    dmx.render()

classFSMClosed(State,DmxPy):
    dmx = DmxPy('COM5')
    dmx.set_green(1)
    dmx.render()

classFSM(object)
    ...creation of the FSM...

从上面的代码中,我收到一个TypeError: metaclass conflict,当我检查 DmxPy 运行代码的类型时,它告诉我它是一个<class 'NoneType'>.

那么,如何使用 FSM 中的 DmxPy 代码根据 FSM 的状态更改灯光?或者,有人有更好的主意吗?

4

1 回答 1

0

我已经加密了一种使代码工作的方法,只是不知道为什么。而且我很聪明,不会在这一点上在意,直到下一次它坏了。

我只是通过像这样删除对 DmxPy 代码的调用来更改这两个类

class State:
    pass

classFSMOpen(State):
    dmx = DmxPy('COM5')
    dmx.set_red(1)
    dmx.render()

classFSMClosed(State):
    dmx = DmxPy('COM5')
    dmx.set_green(1)
    dmx.render()

classFSM(object)
    ...creation of the FSM...

如果有人有理由这样做,我会全力以赴。

于 2020-05-25T23:45:10.147 回答