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 __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)
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")
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
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()
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
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)