[[プログラム周り]]
[[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)