[[プログラム周り]]

[[pythonでgainerを制御する]]を拡張して、pygameでgainerを制御する。

pygameでは、pygame.event.postを使って、イベントをpygameに通知し、pygameは、pygame.event.getを利用してそのイベントを受け取る。

毎回ポーリングしていては大変なので、別スレッドで動かして、アナログインプットやデジタルインプットの値が変わったときだけ、pygameに通知するシステムにする。

**写真 [#o0981c91]

&ref(./IMG_2531.JPG,20%);
&ref(./IMG_2532.JPG,20%);

金属のバーを動かせば、画面上のバーが動き、ボタンを押せば、青色の円が現れる。電子工作が汚いのはデフォルトなので気にしない。
Ain1,Ain2にスライドバーを接続し、Din1,Din2にそれぞれ押しボタンを接続した。

**ソース [#p26e6aa7]
 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)

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS