1

埋め込まれたシリアル出力から libavg のイベント ハンドラーを使用する方法を見つけようとしています。私の理解では、シリアル コマンドを処理するときに呼び出す独自の Publisher を作成する必要があります。必要なのは、異なるシリアル入力を指定して 10 個の異なるトリガーを作成する方法だけです。私がやろうとしていることの類推は、libavg のキーボード処理を使用してさまざまなキーボード入力を処理することです。

カスタム パブリッシャーが 10 個のシリアル出力を取得し、event.keystring と同様にさまざまなサブスクライバーに event.serialid パラメーターを渡すようにします。

これは私が持っている機能しないコードで、何をする必要があるかの基本を持っていると思います。

#!/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()

ここからのカスタム パブリッシャーの例:

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

1 に答える 1