Как мне выставить сигнал для DBUS в Python? - PullRequest
0 голосов
/ 14 декабря 2018

Я хорошо знаю, как создавать методы - однако я хочу показать некоторые сигналы, используя Python, чтобы сразу можно было вызывать несколько программ.

class Bildschirm(dbus.service.Object):
    DBUS_NAME = 'hm.retro.Retro'
    DBUS_OBJECT_PATH = '/hm/retro/Retro'
    DBUS_INTERFACE = 'hm.retro.Retro'

    def __init__(self, _Visio):
        self.Visio = _Visio
        self.bus = dbus.SessionBus()
        bus_name = dbus.service.BusName(self.DBUS_NAME, bus=self.bus)

        super().__init__(bus_name, self.DBUS_OBJECT_PATH)


    @dbus.service.method(DBUS_INTERFACE, in_signature='i')
    def delta(self, nr):
        weiter = self.Visio.akt_sender_nr
        weiter = (weiter+nr) % SENDER_AM
        self.Visio.akt_sender_nr = weiter
        self.Visio.update_sender_labels()

        self.Visio.screen.force_update()
        self.Visio.screen.draw_next_frame()

    @dbus.service.signal(DBUS_INTERFACE)
    def config_change_visio(self):
        self.Visio.load_config()
        self.Visio.update_sender_labels()
        self.Visio.update_preset_labels()

        self.Visio.screen.force_update()
        self.Visio.screen.draw_next_frame()

Однако, если я попытаюсь вызвать сигналс помощью dbus-send:

dbus-send --session --print-reply --dest=hm.retro.Retro /hm/retro/Retro hm.retro.Retro.config_change_visio

Я получаю сообщение об ошибке:

    Error org.freedesktop.DBus.Error.UnknownMethod: Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/dbus/service.py", line 654, in _message_cb
    (candidate_method, parent_method) = _method_lookup(self, method_name, interface_name)
  File "/usr/lib/python3/dist-packages/dbus/service.py", line 246, in _method_lookup
    raise UnknownMethodException('%s is not a valid method of interface %s' % (method_name, dbus_interface))
dbus.exceptions.UnknownMethodException: org.freedesktop.DBus.Error.UnknownMethod: Unknown method: config_change_visio is not a valid method of interface hm.retro.Retro

Что я делаю не так?

1 Ответ

0 голосов
/ 25 декабря 2018

Если вы передаете --print-reply в dbus-send, вы подразумеваете, что тип отправляемого вами сообщения является вызовом метода, поскольку только вызовы метода могут иметь ответ.Страница руководства dbus-send гласит:

   --print-reply
       Block for a reply to the message sent, and print any reply received in
       a human-readable form. It also means the message type (--type=) is
       method_call.

Удалите аргумент --print-reply из вашего вызова dbus-send и добавьте --type=signal, и он должен работать.


Примечаниечто, хотя это не должно влиять на эту ошибку, более привычно, чтобы имена сигналов D-Bus были в CamelCase, а не в underscore_case.Спецификация D-Bus гласит:

Обычно имена членов в D-Bus состоят из заглавных слов без знаков препинания ("верблюжий регистр").Имена методов обычно должны быть глаголами, такими как GetItems, а имена сигналов обычно должны быть описанием события, например ItemsChanged.

Так что, возможно, ваш сигнал должен называться VisioConfigChanged.Точно так же, возможно, ваш метод должен называться что-то вроде AddDelta.

...