Пример #1
0
 def __init__(self, obj):
     threading.Thread.__init__(self, name="wiiremote")
     self.manager = EventManager()
     self.manager.add_object(
         obj,
         "WIIMOTE_BUTTON_PRESS",
         "WIIMOTE_BUTTON_RELEASE",
         "WIIMOTE_ACCEL",
         "WIIMOTE_GYRO",
         #"WIIMOTE_IR",
         "WIIMOTE_STATUS",
         "WIIMOTE_DISCONNECT",
         "QUIT")
     self.recv_mode = None
     self.set_mode = None
     self.MotionPlusInit = 0
     self.pause = False
     self.yaw = self.pitch = self.roll = -1
     self.yaw_fast = self.pitch_fast = self.roll_fast = -1
     self.Ax = self.Ay = self.Az = -1
     self.button = -1
     self.startup = Queue()
     self.funcs = Queue()
     self.setDaemon(1)
     self.start()
     self.startup.get(True)
Пример #2
0
 def __init__(self, obj):
     threading.Thread.__init__(self, name="wiiremote")
     self.manager = EventManager()
     self.manager.add_object(
         obj, 
         "WIIMOTE_BUTTON_PRESS", 
         "WIIMOTE_BUTTON_RELEASE",
         "WIIMOTE_ACCEL",
         "WIIMOTE_GYRO",
         #"WIIMOTE_IR",
         "WIIMOTE_STATUS",
         "WIIMOTE_DISCONNECT", 
         "QUIT")
     self.recv_mode = None
     self.set_mode = None
     self.MotionPlusInit = 0
     self.pause = False
     self.yaw = self.pitch = self.roll = -1
     self.yaw_fast = self.pitch_fast = self.roll_fast = -1
     self.Ax = self.Ay = self.Az = -1
     self.button = -1
     self.startup = Queue()
     self.funcs = Queue()
     self.setDaemon(1)
     self.start()
     self.startup.get(True)
Пример #3
0
    def __init__ (self):
        EventManager.__init__ (self)
        RenderLayer.__init__ (self)

        self._title = None
        self._screen = None
        self._background = None
        self._color = (255, 255, 255)

        # Timer value for the event system. 40 frames per second should
        # be enough as default.
        self._timer = 40

        # Internal widget(!) list for fast access to the widgets.
        self._index = []

        self.esc = 0
def main():
    # Initialize pygame
    pygame.display.init()
    pygame.font.init()

    # Framerate Clock
    clock = pygame.time.Clock()

    pygame.display.set_caption('Battle Viewer')

    # Desired delay between frame redraws (25 fps target framerate)
    frame_rate = 24

    # Create the display
    display_padding = 12
    # Values are hacked for specific XML, needs to be made generic in future
    display_size = (display_padding * 2 + 128 * 4,
                    display_padding * 3 + 400 + 128)
    display_depth = 24
    display_surface = pygame.display.set_mode(display_size, 0, display_depth)

    # Event manager
    event_manager = EventManager()

    # Create the battle controller instance.  This object is responsible for directing the battle
    battle_controller = battlecontroller.BattleController()
    battle_controller.manager = event_manager

    # Create the battle view instance.  This object is responsible for drawing the battle
    battle_view = battleview.BattleView(display_surface)
    battle_view.manager = event_manager

    # Validate and Parse the battle XML
    try:
        xml_validator.validate_dtd(battle_file)
    except xml_validator.ValidationError, e:
        print battle_file, "Failed Validation:", repr(e)
        sys.exit(1)
Пример #5
0
from ocempgui.object import ActionListener

count = 0

def emit_pong (event, manager):
    print "emit_pong received: [%s] - emitting pong..." % event
    manager.emit ("pong", "pong_event")

def emit_ping (event, manager):
    global count
    if count > 10:
        sys.exit ()
    count += 1
    print "emit_ping received: [%s] - emitting ping..." % event
    manager.emit ("ping", "ping_event")

# Create an event manager and two ping-pong listeners.
manager = EventManager ()

listener1 = ActionListener ()
listener1.connect_signal ("ping", emit_pong, manager)
listener1.manager = manager

listener2 = ActionListener ()
listener2.connect_signal ("pong", emit_ping, manager)
listener2.manager = manager

# start ping-pong actions
print "Starting Ping-Pong"
manager.emit ("ping", "ping_event")
Пример #6
0
class WiiRemote(threading.Thread):
    def __init__(self, obj):
        threading.Thread.__init__(self, name="wiiremote")
        self.manager = EventManager()
        self.manager.add_object(
            obj, 
            "WIIMOTE_BUTTON_PRESS", 
            "WIIMOTE_BUTTON_RELEASE",
            "WIIMOTE_ACCEL",
            "WIIMOTE_GYRO",
            #"WIIMOTE_IR",
            "WIIMOTE_STATUS",
            "WIIMOTE_DISCONNECT", 
            "QUIT")
        self.recv_mode = None
        self.set_mode = None
        self.MotionPlusInit = 0
        self.pause = False
        self.yaw = self.pitch = self.roll = -1
        self.yaw_fast = self.pitch_fast = self.roll_fast = -1
        self.Ax = self.Ay = self.Az = -1
        self.button = -1
        self.startup = Queue()
        self.funcs = Queue()
        self.setDaemon(1)
        self.start()
        self.startup.get(True)
        
    def Report_0x11(self, data): #c_ubyte
        report = OutputReport()
        length = c_int()
        report[0] = 0x11 #Report ID
        report[1] = data
        WriteReport(self.handle, report, byref(length))
        return
    
    def Report_0x12(self, data1, data2): #c_ubyte, c_ubyte
        report = OutputReport()
        length = c_int()
        report[0] = 0x12 #Report ID
        report[1] = data1
        report[2] = data2
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x13(self, data): #c_ubyte
        report = OutputReport()
        length = c_int()
        report[0] = 0x13 #Report ID
        report[1] = data
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x15(self, data):
        report = OutputReport()
        length = c_int()
        report[0] = 0x15
        report[1] = data
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x16(self, adr, len_, d1, d2): # write data
        report = OutputReport()
        length = c_int()
        report[0] = 0x16
        report[1] = 0x04 # 00(EEPROM) or 0x04(other i2c device)  or 0x08(other type2)
        report[2] = adr # I2C ADRS
        report[3] = 0x00 # ignore?
        report[4] = d1 # mem adr or command
        report[5] = len_ - 1 # len = 2 ...  if you want to send 2 bytes (d1 and d2)
        report[6] = d2 # data
        WriteReport(self.handle, report, byref(length))
        return
    
    def Report_0x17(self, adr, len_, d1): # read data
        report = OutputReport()
        length = c_int()
        report[0] = 0x17
        report[1] = 0x04 # 00(EEPROM) or 04(other ... 1byte type)
        report[2] = adr # I2C ADRS
        report[3] = 0x00 # ignore?
        report[4] = d1 # mem adr or command
        report[5] = 0x00 # length H
        report[6] = len_ # length L
        WriteReport(self.handle, report, byref(length))
        return

    def Read_i2c_device(self, offset, adr): # offset = 0xA4 or 0xA6
        self.Report_0x17(offset, 16, adr)
        return

    def MotionPlus_init(self):
        self.Read_i2c_device(0xA6, 0xFA)
        self.MotionPlusInit = 1
        while 1:
            self.Wii_Remote_Input()
            if self.MotionPlusInit <= 0: break
        return self.MotionPlusInit
    
    def Wii_Remote_mode(self, mode):
        #0x20 : Status mode
        #0x30 : button ONLY Report mode
        #0x31 : Acc Sensor + button  Report mode
        #0x33 : Acc Sensor + button + IR Report mode
        #0x37 : Acc Sensor + button + IR + ext Report mode
        if not mode:
            return
        self.set_mode = mode
        self.Report_0x12(0x00, mode)
        return
    
    def Wii_Remote_Input(self):
        report = InputReport()
        length = c_int()
        ReadReport(self.handle, report, byref(length))
        self.recv_mode = report[0]
        #print hex(self.recv_mode)
        if self.recv_mode & 0xF0 == 0x20:
            self.button = report[1] * 0x100 + report[2]
            if self.recv_mode & 0x01: # mode:0x21
                if report[3] & 0x0F == 0x07:
                    #print "[gyro error]"
                    buf = [0] * 11
                else:
                    buf = report[6:17]
                if not self.MotionPlusInit:
                    self.yaw = buf[0] + (buf[3] >> 2) * 256
                    self.pitch = buf[1] + (buf[4] >> 2) * 256
                    self.roll = buf[2] + (buf[5] >> 2) * 256
                    self.yaw_fast = self.pitch_fast = self.roll_fast = 0
                    if buf[3] & 0x02 == 0: self.yaw_fast = 1
                    if buf[3] & 0x01 == 0: self.pitch_fast = 1
                    if buf[4] & 0x02 == 0: self.roll_fast = 1
                elif self.MotionPlusInit == 1:
                    if (buf[0] != 1) | (buf[1] != 0) | (buf[2] != 0xA6) | (buf[3] != 0x20) | (buf[4] != 0) | (buf[5] != 5):
                        self.Read_i2c_device(0xA4, 0xFA)
                        self.MotionPlusInit = 2
                    else:
                        self.Report_0x16(0xA6, 2, 0xFE, 0x04)
                        self.Report_0x15(0x00)
                        self.MotionPlusInit = 0
                elif self.MotionPlusInit == 2:
                    if (buf[0] != 1) | (buf[1] != 0) | (buf[2] != 0xA4) | (buf[3] != 0x20) | (buf[4] != 0) | (buf[5] != 5):
                        self.MotionPlusInit = 0
                    else:
                        self.MotionPlusInit = -1
            elif self.recv_mode & 0x02: # mode:0x22
                pass
            else: # mode:0x20
                flag = report[3] & 0x0F
                LEDs = report[3] & 0xF0
                battery = float(report[6]) / 255
                self.manager.emit("WIIMOTE_STATUS", 
                                  {"flag":flag, "LEDs":LEDs, "battery":battery})
        elif self.recv_mode & 0xF0 == 0x30:
            self.button = report[1] * 0x100 + report[2]
            if self.recv_mode & 0x01:
                self.Ax = report[3]
                self.Ay = report[4]
                self.Az = report[5]
            elif self.recv_mode & 0x02:
                pass
            elif self.recv_mode & 0x04:
                report[16] = (report[16] ^ 0x17) + 0x17
                report[17] = (report[17] ^ 0x17) + 0x17
                report[18] = (report[18] ^ 0x17) + 0x17
                report[19] = (report[19] ^ 0x17) + 0x17
                report[20] = (report[20] ^ 0x17) + 0x17
                report[21] = (report[21] ^ 0x17) + 0x17
        return
 
    def quit(self):
        if self.go == True:
            self.Report_0x11(0)
            self.Report_0x13(0)
            self.go = False
            print "[*] disconnecting"
            CloseHidHandle(self.handle)
            self.manager.emit("WIIMOTE_DISCONNECT", None)
        return

    def do(self, func):
        self.funcs.put(func)
        return
    
    def run(self):
        self.handle = OpenHidHandle(VID, PID)
        if self.handle == INVALID_HANDLE_VALUE:
            MessageBox(0, "Wii Remote not found.", 0, 0)
            self.startup.put(False)
            self.go = False
            return False
        else:
            self.go = True
            
        print "[*] connected"
        self.Wii_Remote_mode(0x31)
        
        if -1 != -1:
            MessageBox(0, "Wii Remote cannot open.", 0, 0)
            self.startup.put(False)
            self.quit()
            return False
        self.Report_0x13(0x01) #Rumble on
        time.sleep(1) #Sleep2(200)
        self.Report_0x11(LED[0]|LED[1]|LED[2]|LED[3]) #LEDs on
        self.Report_0x13(0x00) #Rumble off
        time.sleep(1) #Sleep2(200) 
        self.Report_0x11(0x00) #LEDs off
        
        if self.MotionPlus_init() == -1:
            MessageBox(0, "Wii MotionPlus not found.", 0, 0)
            self.startup.put(False)
            self.quit()
            return False
        else:
            print "[*] conected Wii MotionPlus."
            self.Wii_Remote_mode(0x31)

        self.startup.put(True)
        
        self.pressed = []
        while self.go:
            #time.sleep(0.1)
            self.Wii_Remote_Input()
            
            self.Read_i2c_device(0xA4, 0x00) # Wii Motion Plus bottom of regs
            self.Wii_Remote_Input()
            
            self.prev_pressed = self.pressed
            self.pressed = []
            self.new_pressed = []
            self.released = []
            #if self.button & 0x0080 == 0x0080: #Home button to quit
            #    #print "pressed Home"
            #    self.quit()
            for b, name in buttons.items():
                if self.button & b == b:
                    self.pressed.append(b)
            #Event management
            for b in self.pressed:
                if not b in self.prev_pressed:
                    self.new_pressed.append(b)
                    if not self.pause:
                        self.manager.emit("WIIMOTE_BUTTON_PRESS",
                                          {"button":buttons[b],
                                           "time":time.time()})
            for b in self.prev_pressed:
                if not b in self.pressed:
                    self.released.append(b)
                    if not self.pause:
                        self.manager.emit("WIIMOTE_BUTTON_RELEASE",
                                          {"button":buttons[b],
                                           "time":time.time()})
            if not self.pause:
                self.manager.emit("WIIMOTE_ACCEL",
                                  {"accel":(float(self.Ax), float(self.Ay), float(self.Az)),
                                   "time":time.time()})
                self.manager.emit("WIIMOTE_GYRO",
                                  {"gyro":(self.yaw, self.pitch, self.roll),
                                   "fast_mode":(self.yaw_fast, self.pitch_fast, self.roll_fast),
                                   "time":time.time()})
            while 1:
                try:
                    func = self.funcs.get_nowait()
                except Empty:
                    break
                else:
                    th = threading.Thread(target=func)
                    th.start()
        self.quit()
        return True
Пример #7
0
            name, position = event.data
            self.append_entity(Entity(name))
            self.emit(EVENT_ENTITY_MOVE, (name, position))


# BattleController class.  Responsible for distributing battle events


class BattleController(BaseObject):
    def __init__(self):
        BaseObject.__init__(self)

    def start(self):
        entity_list = ['Sam', 'Max', 'Joe']
        for entity_name in entity_list:
            self.emit(EVENT_ENTITY_NEW, (entity_name, (0, 0)))


# Main

if __name__ == '__main__':
    event_manager = EventManager()

    controller = BattleController()
    controller.manager = event_manager

    view = BattleView()
    view.manager = event_manager

    # start the ball rolling
    controller.start()
Пример #8
0
class WiiRemote(threading.Thread):
    def __init__(self, obj):
        threading.Thread.__init__(self, name="wiiremote")
        self.manager = EventManager()
        self.manager.add_object(
            obj,
            "WIIMOTE_BUTTON_PRESS",
            "WIIMOTE_BUTTON_RELEASE",
            "WIIMOTE_ACCEL",
            "WIIMOTE_GYRO",
            #"WIIMOTE_IR",
            "WIIMOTE_STATUS",
            "WIIMOTE_DISCONNECT",
            "QUIT")
        self.recv_mode = None
        self.set_mode = None
        self.MotionPlusInit = 0
        self.pause = False
        self.yaw = self.pitch = self.roll = -1
        self.yaw_fast = self.pitch_fast = self.roll_fast = -1
        self.Ax = self.Ay = self.Az = -1
        self.button = -1
        self.startup = Queue()
        self.funcs = Queue()
        self.setDaemon(1)
        self.start()
        self.startup.get(True)

    def Report_0x11(self, data):  #c_ubyte
        report = OutputReport()
        length = c_int()
        report[0] = 0x11  #Report ID
        report[1] = data
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x12(self, data1, data2):  #c_ubyte, c_ubyte
        report = OutputReport()
        length = c_int()
        report[0] = 0x12  #Report ID
        report[1] = data1
        report[2] = data2
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x13(self, data):  #c_ubyte
        report = OutputReport()
        length = c_int()
        report[0] = 0x13  #Report ID
        report[1] = data
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x15(self, data):
        report = OutputReport()
        length = c_int()
        report[0] = 0x15
        report[1] = data
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x16(self, adr, len_, d1, d2):  # write data
        report = OutputReport()
        length = c_int()
        report[0] = 0x16
        report[
            1] = 0x04  # 00(EEPROM) or 0x04(other i2c device)  or 0x08(other type2)
        report[2] = adr  # I2C ADRS
        report[3] = 0x00  # ignore?
        report[4] = d1  # mem adr or command
        report[
            5] = len_ - 1  # len = 2 ...  if you want to send 2 bytes (d1 and d2)
        report[6] = d2  # data
        WriteReport(self.handle, report, byref(length))
        return

    def Report_0x17(self, adr, len_, d1):  # read data
        report = OutputReport()
        length = c_int()
        report[0] = 0x17
        report[1] = 0x04  # 00(EEPROM) or 04(other ... 1byte type)
        report[2] = adr  # I2C ADRS
        report[3] = 0x00  # ignore?
        report[4] = d1  # mem adr or command
        report[5] = 0x00  # length H
        report[6] = len_  # length L
        WriteReport(self.handle, report, byref(length))
        return

    def Read_i2c_device(self, offset, adr):  # offset = 0xA4 or 0xA6
        self.Report_0x17(offset, 16, adr)
        return

    def MotionPlus_init(self):
        self.Read_i2c_device(0xA6, 0xFA)
        self.MotionPlusInit = 1
        while 1:
            self.Wii_Remote_Input()
            if self.MotionPlusInit <= 0: break
        return self.MotionPlusInit

    def Wii_Remote_mode(self, mode):
        #0x20 : Status mode
        #0x30 : button ONLY Report mode
        #0x31 : Acc Sensor + button  Report mode
        #0x33 : Acc Sensor + button + IR Report mode
        #0x37 : Acc Sensor + button + IR + ext Report mode
        if not mode:
            return
        self.set_mode = mode
        self.Report_0x12(0x00, mode)
        return

    def Wii_Remote_Input(self):
        report = InputReport()
        length = c_int()
        ReadReport(self.handle, report, byref(length))
        self.recv_mode = report[0]
        #print hex(self.recv_mode)
        if self.recv_mode & 0xF0 == 0x20:
            self.button = report[1] * 0x100 + report[2]
            if self.recv_mode & 0x01:  # mode:0x21
                if report[3] & 0x0F == 0x07:
                    #print "[gyro error]"
                    buf = [0] * 11
                else:
                    buf = report[6:17]
                if not self.MotionPlusInit:
                    self.yaw = buf[0] + (buf[3] >> 2) * 256
                    self.pitch = buf[1] + (buf[4] >> 2) * 256
                    self.roll = buf[2] + (buf[5] >> 2) * 256
                    self.yaw_fast = self.pitch_fast = self.roll_fast = 0
                    if buf[3] & 0x02 == 0: self.yaw_fast = 1
                    if buf[3] & 0x01 == 0: self.pitch_fast = 1
                    if buf[4] & 0x02 == 0: self.roll_fast = 1
                elif self.MotionPlusInit == 1:
                    if (buf[0] != 1) | (buf[1] != 0) | (buf[2] != 0xA6) | (
                            buf[3] != 0x20) | (buf[4] != 0) | (buf[5] != 5):
                        self.Read_i2c_device(0xA4, 0xFA)
                        self.MotionPlusInit = 2
                    else:
                        self.Report_0x16(0xA6, 2, 0xFE, 0x04)
                        self.Report_0x15(0x00)
                        self.MotionPlusInit = 0
                elif self.MotionPlusInit == 2:
                    if (buf[0] != 1) | (buf[1] != 0) | (buf[2] != 0xA4) | (
                            buf[3] != 0x20) | (buf[4] != 0) | (buf[5] != 5):
                        self.MotionPlusInit = 0
                    else:
                        self.MotionPlusInit = -1
            elif self.recv_mode & 0x02:  # mode:0x22
                pass
            else:  # mode:0x20
                flag = report[3] & 0x0F
                LEDs = report[3] & 0xF0
                battery = float(report[6]) / 255
                self.manager.emit("WIIMOTE_STATUS", {
                    "flag": flag,
                    "LEDs": LEDs,
                    "battery": battery
                })
        elif self.recv_mode & 0xF0 == 0x30:
            self.button = report[1] * 0x100 + report[2]
            if self.recv_mode & 0x01:
                self.Ax = report[3]
                self.Ay = report[4]
                self.Az = report[5]
            elif self.recv_mode & 0x02:
                pass
            elif self.recv_mode & 0x04:
                report[16] = (report[16] ^ 0x17) + 0x17
                report[17] = (report[17] ^ 0x17) + 0x17
                report[18] = (report[18] ^ 0x17) + 0x17
                report[19] = (report[19] ^ 0x17) + 0x17
                report[20] = (report[20] ^ 0x17) + 0x17
                report[21] = (report[21] ^ 0x17) + 0x17
        return

    def quit(self):
        if self.go == True:
            self.Report_0x11(0)
            self.Report_0x13(0)
            self.go = False
            print "[*] disconnecting"
            CloseHidHandle(self.handle)
            self.manager.emit("WIIMOTE_DISCONNECT", None)
        return

    def do(self, func):
        self.funcs.put(func)
        return

    def run(self):
        self.handle = OpenHidHandle(VID, PID)
        if self.handle == INVALID_HANDLE_VALUE:
            MessageBox(0, "Wii Remote not found.", 0, 0)
            self.startup.put(False)
            self.go = False
            return False
        else:
            self.go = True

        print "[*] connected"
        self.Wii_Remote_mode(0x31)

        if -1 != -1:
            MessageBox(0, "Wii Remote cannot open.", 0, 0)
            self.startup.put(False)
            self.quit()
            return False
        self.Report_0x13(0x01)  #Rumble on
        time.sleep(1)  #Sleep2(200)
        self.Report_0x11(LED[0] | LED[1] | LED[2] | LED[3])  #LEDs on
        self.Report_0x13(0x00)  #Rumble off
        time.sleep(1)  #Sleep2(200)
        self.Report_0x11(0x00)  #LEDs off

        if self.MotionPlus_init() == -1:
            MessageBox(0, "Wii MotionPlus not found.", 0, 0)
            self.startup.put(False)
            self.quit()
            return False
        else:
            print "[*] conected Wii MotionPlus."
            self.Wii_Remote_mode(0x31)

        self.startup.put(True)

        self.pressed = []
        while self.go:
            #time.sleep(0.1)
            self.Wii_Remote_Input()

            self.Read_i2c_device(0xA4, 0x00)  # Wii Motion Plus bottom of regs
            self.Wii_Remote_Input()

            self.prev_pressed = self.pressed
            self.pressed = []
            self.new_pressed = []
            self.released = []
            #if self.button & 0x0080 == 0x0080: #Home button to quit
            #    #print "pressed Home"
            #    self.quit()
            for b, name in buttons.items():
                if self.button & b == b:
                    self.pressed.append(b)
            #Event management
            for b in self.pressed:
                if not b in self.prev_pressed:
                    self.new_pressed.append(b)
                    if not self.pause:
                        self.manager.emit("WIIMOTE_BUTTON_PRESS", {
                            "button": buttons[b],
                            "time": time.time()
                        })
            for b in self.prev_pressed:
                if not b in self.pressed:
                    self.released.append(b)
                    if not self.pause:
                        self.manager.emit("WIIMOTE_BUTTON_RELEASE", {
                            "button": buttons[b],
                            "time": time.time()
                        })
            if not self.pause:
                self.manager.emit(
                    "WIIMOTE_ACCEL", {
                        "accel":
                        (float(self.Ax), float(self.Ay), float(self.Az)),
                        "time": time.time()
                    })
                self.manager.emit(
                    "WIIMOTE_GYRO", {
                        "gyro": (self.yaw, self.pitch, self.roll),
                        "fast_mode":
                        (self.yaw_fast, self.pitch_fast, self.roll_fast),
                        "time":
                        time.time()
                    })
            while 1:
                try:
                    func = self.funcs.get_nowait()
                except Empty:
                    break
                else:
                    th = threading.Thread(target=func)
                    th.start()
        self.quit()
        return True
Пример #9
0
        self.name = name
        # The object should be able to listen to 'ping' and 'pong'
        # events.
        self._signals["ping"] = []
        self._signals["pong"] = []

    def notify(self, event):
        # This simple notify method will not be used in this
        # example. Instead, the signals are invoked directly.
        if event.signal == "ping":
            self.run_signal_handlers("ping")
        elif event.signal == "pong":
            self.run_signal_handlers("pong")


manager = EventManager()

# Create an object and connect callbacks to its both events.
my_obj = OwnObject("First object")
ev1 = my_obj.connect_signal("ping", ping_callback, my_obj, "data")
ev2 = my_obj.connect_signal("pong", pong_callback)

# Connect it to the event manager
my_obj.manager = manager

# Invoke the connected signals handlers for a specific event.
manager.emit("ping", None)
manager.emit("pong", None)

# After disconnecting a callback, it will not be invoked anymore.
my_obj.disconnect_signal(ev1)