pythonでgainerを制御するを拡張して、pygameでgainerを制御する。 pygameでは、pygame.event.postを使って、イベントをpygameに通知し、pygameは、pygame.event.getを利用してそのイベントを受け取る。 毎回ポーリングしていては大変なので、別スレッドで動かして、アナログインプットやデジタルインプットの値が変わったときだけ、pygameに通知するシステムにする。 写真 †金属のバーを動かせば、画面上のバーが動き、ボタンを押せば、青色の円が現れる。電子工作が汚いのはデフォルトなので気にしない。 Ain1,Ain2にスライドバーを接続し、Din1,Din2にそれぞれ押しボタンを接続した。 ソース †import pygame,serial,time,threading class Gainer(threading.Thread): #スレッドクラスを拡張して、Gainerクラスを作る。 def __init__(self): threading.Thread.__init__(self) self.ser=serial.Serial(3,38400,timeout=1) self.ser.write('KONFIGURATION_1*') print self.spr(self.ser) time.sleep(0.1) self.ain1=0 self.ain2=0 self.din=0 self.isRunning=True def spr(self,ser): k="" while True: p=ser.read() if p=='*': break k+=p return k def dins(self,cmd): k="" din=0 if not self.ser: return self.ser.write(cmd) while True: p=self.ser.read() if p=='*': break k+=p k=k[1:] k=int(k) return k def probe(self,cmd): k="" numa=[] if not self.ser: return self.ser.write(cmd) while True: p=self.ser.read() if p=='*': break k+=p k=k[1:] for i in range(0,8,2): num=k[i:i+2] num=int(num,16) numa.append(num) return numa def event_post(self,evdict): #eventはpygame.USEREVENT,辞書)を渡して生成する。 e=pygame.event.Event(pygame.USEREVENT,evdict) pygame.event.post(e) def run(self): print 'start' while self.isRunning: #値をポーリングして、前回の値と異なれば変化したとみなして、pygame.eventに値を送る。 ains=self.probe('I*') if ains[0]!=self.ain1: d={'ain1':ains[0]} self.event_post(d) if ains[1]!=self.ain2: d={'ain2':ains[1]} self.event_post(d) dins=self.dins('R*') if dins!=self.din: d={'din':dins} self.event_post(d) time.sleep(0.1) self.ain1=ains[0] self.ain2=ains[1] self.din=dins def stop(self): self.isRunning=False print "stop" self.ser.write('Q*') print self.spr(self.ser) time.sleep(0.05) self.ser.close() def init(): pygame.init() screen=pygame.display.set_mode((640,480)) print screen gainer=Gainer() gainer.start() return screen,gainer def loop(screen,gainer): loopexit=False red=0 clock=pygame.time.Clock() ain1=ain2=din=0 while True: clock.tick(60) for e in pygame.event.get(): if e.type==pygame.USEREVENT: #USEREVENTでain1などの属性を持てばそれを取り出す。 if hasattr(e,'ain1'): ain1=e.ain1 elif hasattr(e,'ain2'): ain2=e.ain2 elif hasattr(e,'din'): din=e.din if e.type==pygame.QUIT: gainer.stop() del gainer loopexit=True screen.fill((red,0,0)) rect1=pygame.Rect(80,20,ain1,40) pygame.draw.rect(screen,(255-red,0,0),rect1) rect2=pygame.Rect(20,20,40,ain2) pygame.draw.rect(screen,(255-red,255,0),rect2) if din==1: pygame.draw.ellipse(screen,(0,0,255),(180,160,40,40)) elif din==2: pygame.draw.ellipse(screen,(0,255,255),(100,160,40,40)) pygame.display.flip() #print clock.get_fps() red+=1 if red>255:red=0 if loopexit: break if __name__=='__main__': (screen,gainer)=init() loop(screen,gainer) |