class Controller: def __init__(self): self.cogX=0. self.cogY=0. self.clickPos=(0,0) self.width=480 self.height=480 self.recvQueue=[] self.sendArrow=False self.pushed=False self.barInit=False def screenUpdate(self): self.screen.fill((255,255,255)) pygame.draw.line(self.screen, (0,0,0), (0,self.height/2), (self.width,self.height/2)) pygame.draw.line(self.screen, (0,0,0), (self.width/2,0), (self.width/2,self.height)) pygame.draw.circle(self.screen, (255,0,0), (int(0.5*(1+self.cogX)*self.width),int((1-0.5*(1+self.cogY))*self.height)), 5) #pygame.draw.circle(self.screen, (255,255,0), self.clickPos, 5) send="Enabled" if self.sendArrow else "Disabled" if(self.barInit): drawText(self.screen,"S key: Enable/Disable Sending (Now "+send+")",True,(0,0,0),(30,20),fontSize=24) else: drawText(self.screen,"S key: Enable/Disable Sending (Now Waiting bar_width)",True,(0,0,0),(30,20),fontSize=24) drawText(self.screen,"C key: Calibrate (or push Board button)",True,(0,0,0),(30,40),fontSize=24) drawText(self.screen,"Q key: Quit",True,(0,0,0),(30,60),fontSize=24) pygame.display.update() # 画面を更新 def connectServer(self): self.client=SioClient() #受信するイベント名一覧をリストとしてclientに渡す eventList=["bar_width"]; self.client.setEventList(eventList) #自身を表す部屋名を設定する(Game Serverなら例えば"Game"と決める) self.client.setMyRoom("Controller") #受信データを格納するキューを追加する self.client.setDataQueue(self.recvQueue) #URLを指定して接続開始 #self.client.start("http://ailab-mayfestival2016-base.herokuapp.com") self.client.start("http://192.168.1.58:8000") #self.client.start("http://localhost:8000") def main(self): pygame.init() self.connectServer() self.bar=Bar() self.board = wiiboard.Wiiboard() self.address = self.board.discover() #self.address ="00:1F:C5:AA:4F:6D" self.board.connect(self.address) #The wii board must be in sync mode at this time time.sleep(0.1) self.board.setLight(True) self.sysfont = pygame.font.SysFont(None, 80) self.screen = pygame.display.set_mode((self.width,self.height)) # タイトルバーの文字列をセット pygame.display.set_caption(u"Wii Board Controller") self.screenUpdate() send=False done = False validity=False while (not done): time.sleep(1./30.) self.screenUpdate() while(len(self.recvQueue)>0): e=self.recvQueue[0] del self.recvQueue[0] if(e[0]=="bar_config"): self.barInit=True self.bar.width=float(e[1]["width"]) self.bar.region=[float(e[1]["region"][0]),float(e[1]["region"][1])] self.bar.calib=[float(e[1]["calib"][0]),float(e[1]["calib"][1])] print "bar width initialized" for event in pygame.event.get(): if event.type == KEYDOWN: # キーを押したとき # ESCキーならスクリプトを終了 if event.key == K_s: if(self.barInit): self.sendArrow=not self.sendArrow else: self.sendArrow=False elif(event.key==K_b): self.barInit=True elif event.key==K_c: self.board.calibrate() elif event.key==K_o: self.client.sendData("px_ready",["Manager"],True) elif event.key==K_p: self.client.sendData("px_ready",["Manager"],False) elif event.key == K_q: done=True if event.type == wiiboard.WIIBOARD_MASS: if (event.mass.totalWeight > 10): self.cogX = ((event.mass.topRight + event.mass.bottomRight) - (event.mass.topLeft + event.mass.bottomLeft))/(event.mass.totalWeight) self.cogY = ((event.mass.topRight + event.mass.topLeft) - (event.mass.bottomRight + event.mass.bottomLeft))/(event.mass.totalWeight) validity=True #print "COG (x,y)=("+`self.cogX`+","+`self.cogY`+")" else: validity=False self.cogX = 0. self.cogY = 0. elif event.type == wiiboard.WIIBOARD_BUTTON_PRESS: print "Button pressed!" elif event.type == wiiboard.WIIBOARD_BUTTON_RELEASE: print "Button released" self.board.calibrate() # done = True elif event.type == QUIT: print "Quit" done=True #Other event types: #wiiboard.WIIBOARD_CONNECTED #wiiboard.WIIBOARD_DISCONNECTED if(self.client.isConnected and self.sendArrow): if(self.cogX>1): self.cogX=1.0 elif(self.cogX<-1.0): self.cogX=-1.0 if(validity): self.bar.calculate(self.client,self.cogX) print "send : cog=X",self.cogX,",pos=",self.bar.position self.board.disconnect() pygame.quit()
class Controller: def __init__(self): self.cogX=0. self.cogY=0. self.clickPos=(0,0) self.width=480 self.height=480 self.recvQueue=[] self.sendArrow=False self.pushed=False self.barInit=False def screenUpdate(self): self.screen.fill((255,255,255)) pygame.draw.line(self.screen, (0,0,0), (0,self.height/2), (self.width,self.height/2)) pygame.draw.line(self.screen, (0,0,0), (self.width/2,0), (self.width/2,self.height)) pygame.draw.circle(self.screen, (255,0,0), (int(0.5*(1+self.board.cogX)*self.width),int((1-0.5*(1+self.board.cogY))*self.height)), 5) #pygame.draw.circle(self.screen, (255,255,0), self.clickPos, 5) send="Enabled" if self.sendArrow else "Disabled" if(self.barInit): drawText(self.screen,"S key: Enable/Disable Sending (Now "+send+")",True,(0,0,0),(30,20),fontSize=24) else: drawText(self.screen,"S key: Enable/Disable Sending (Now Waiting bar_width)",True,(0,0,0),(30,20),fontSize=24) drawText(self.screen,"C key: Calibrate (or push Board button)",True,(0,0,0),(30,40),fontSize=24) drawText(self.screen,"Q key: Quit",True,(0,0,0),(30,60),fontSize=24) pygame.display.update() # 画面を更新 def connectServer(self): self.client=SioClient() #受信するイベント名一覧をリストとしてclientに渡す eventList=["bar_width","bar_config"]; self.client.setEventList(eventList) #自身を表す部屋名を設定する(Game Serverなら例えば"Game"と決める) self.client.setMyRoom("Controller") #受信データを格納するキューを追加する self.client.setDataQueue(self.recvQueue) #URLを指定して接続開始 #self.client.start("http://ailab-mayfestival2016-base.herokuapp.com") self.client.start("http://192.168.1.58:8000") #self.client.start("http://localhost:8000") def updateCallback(self): self.board=self.wii.getBoardState() if(self.wii.isPressed("A")): self.pushed=True else: if(self.pushed): self.wii.calibrate() self.pushed=False def main(self): pygame.init() self.connectServer() self.bar=Bar() self.wii=WiiRemote.WiiRemote() self.wii.setUpdateCallback(self.updateCallback) self.wii.connect() self.board = self.wii.getBoardState() self.wii.startListening() self.wii.setDataReportingMode(True,0x31) self.wii.requestStatus() time.sleep(0.1) self.wii.setLED(0x0F) led=0x0F print "make window" #self.sysfont = pygame.font.SysFont(None, 80) self.screen = pygame.display.set_mode((self.width,self.height)) pygame.display.update() pygame.display.set_caption(u"Wii Board Controller") self.screenUpdate() done = False validity=False print "MainLoop" while (not done): time.sleep(1./30.) self.screenUpdate() while(len(self.recvQueue)>0): e=self.recvQueue[0] del self.recvQueue[0] if(e[0]=="bar_config"): self.barInit=True self.bar.width=float(e[1]["width"]) self.bar.region=[float(e[1]["region"][0]),float(e[1]["region"][1])] self.bar.calib=[float(e[1]["calib"][0]),float(e[1]["calib"][1])] print "bar width initialized" for event in pygame.event.get(): if event.type == KEYDOWN: # キーを押したとき # ESCキーならスクリプトを終了 if event.key == K_s: if(self.barInit): self.sendArrow=not self.sendArrow else: self.sendArrow=False elif(event.key==K_b): self.barInit=True elif event.key==K_c: self.wii.calibrate() elif event.key==K_o: self.client.sendData("px_ready",["Manager"],True) elif event.key==K_p: self.client.sendData("px_ready",["Manager"],False) elif event.key == K_q: done=True elif event.type == QUIT: print "Quit" done=True if(self.client.isConnected and self.sendArrow and self.board.calibrated): if(self.board.cogX>1): self.board.cogX=1.0 elif(self.board.cogX<-1.0): self.board.cogX=-1.0 #self.client.sendData("controller",["Game"],self.board.cogX) #self.client.sendData("controller",["Game"],self.board.cogX) if(self.board.totalWeight>10.): self.bar.calculate(self.client,self.board.cogX) print "send : cog=X",self.board.cogX,",pos=",self.bar.position,"total=",self.board.totalWeight #self.wii.disconnect() self.wii.endListening() pygame.quit()