プログラム周り

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

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

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

写真

IMG_2531.JPG IMG_2532.JPG

金属のバーを動かせば、画面上のバーが動き、ボタンを押せば、青色の円が現れる。電子工作が汚いのはデフォルトなので気にしない。 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)

添付ファイル: fileIMG_2531.JPG 10090件 [詳細] fileIMG_2532.JPG 9762件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-02-01 (日) 14:38:23 (3540d)