libavg自定义事件处理程序

时间:2014-05-16 02:58:34

标签: python embedded raspberry-pi libavg

我正在尝试从嵌入式串行输出中找到一种使用libavg事件处理程序的方法。我的理解是我需要创建自己的Publisher,我将在处理串行命令时调用它。我需要的是一种在不同的串行输入下创建10个不同触发器的方法。我正在尝试做的类比是使用libavg的键盘处理来处理不同的键盘输入。

我希望自定义发布者获取10个串行输出,并将event.serialid参数传递给各个订阅者,类似于event.keystring。

以下是我所拥有的一些非功能性代码,我认为这些代码具有需要完成的基础知识。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from libavg import avg, statemachine, player

class Test():
    PRESSED = avg.Publisher.genMessageID()
    RELEASED = avg.Publisher.genMessageID()
    def __init__(self, parent=None, **kwargs):
        self.registerInstance(self, parent)
        self.publish(self.PRESSED)
        self.publish(self.RELEASED)
    def isActive(self):
        self.notifySubscribers(Test.PRESSED, [])
    def isInactive(self):
        self.notifySubscribers(Test.RELEASED, [])


def onKeyDown(event):
    global node
    if event.serialid == '1':
        #serialid isn't implemented anywhere but this is what ideally I would like to have happen
        node.color = "FF8000"

def onKeyUp(event):
    global node
    node.color = "FFFFFF" 




player = avg.Player.get()

canvas = player.createMainCanvas(size=(640,480))
rootNode = player.getRootNode()
node = avg.WordsNode(pos=(10,10), font="arial", text="Hello World", parent=rootNode)
vbutton=Test()

node.subscribe(vbutton.PRESSED, onKeyDown)
node.subscribe(vbutton.RELEASED, onKeyUp)


player.play()

来自here的自定义发布商的示例:

class _ButtonBase(avg.DivNode):

    PRESSED = avg.Publisher.genMessageID()
    RELEASED = avg.Publisher.genMessageID()

    def __init__(self, parent=None, **kwargs):
        super(_ButtonBase, self).__init__(**kwargs)
        self.registerInstance(self, parent)
        self.publish(self.PRESSED)
        self.publish(self.RELEASED)

    def _setActiveArea(self, upNode, activeAreaNode, fatFingerEnlarge):
        self.__activeAreaNode = activeAreaNode

        if fatFingerEnlarge:
            if self.__activeAreaNode != None:
                raise(RuntimeError(
                    "Button: Can't specify both fatFingerEnlarge and activeAreaNode"))
            size = upNode.size
            minSize = 20*player.getPixelsPerMM()
            size = avg.Point2D(max(minSize, size.x), max(minSize, size.y))
            self.__activeAreaNode = avg.RectNode(size=size, opacity=0, parent=self)
        else:
            if self.__activeAreaNode == None:
                self.__activeAreaNode = self
            else:
                self.appendChild(self.__activeAreaNode)

        self._tapRecognizer = gesture.TapRecognizer(self.__activeAreaNode,
                possibleHandler=self._onDown, 
                detectedHandler=self._onTap, 
                failHandler=self._onTapFail)

1 个答案:

答案 0 :(得分:2)

您可以通过发布 - 订阅界面传递任意参数。参数作为列表传递:

self.notifySubscribers(Test.PRESSED, [serialID])

在处理程序中:

def onKeyDown(serialID):
    global node
    if serialid == '1':
        node.color = "FF8000"