SpotMicro(mini) その28 ーリモコン そうだIphoneを使おう (その4)ー [ROBOT]
ということでリモコンプログラムがとりあえずできた。
現状のソースをなんと惜しげもなく(恥ずかしげもなく)公開する
解説を期待している人はあまりいないだろうが、そんなのは無視してやると、
インポートのブロックのあとにあるonAction関数は、ボタンを押された後の動作を行う。
ボタンが押されると、onActionは、Senderを受け取る。senderには、押されたボタンのオブジェクトが格納されており、そのボタンのtitle を読みだしたことで押されたボタンの正体が判明し、それから
コマンドを送る
cmds配列は、ボタン名からコマンドへの変換テーブルで、コマンドは半角3文字とした。
コマンドが押された後の動きは、受け取った側でコントロールする。
選択されたコマンドは、socで指定されるソケットにより、commanderに送信される。
コマンドは、3文字の固定長文字列としている。
次のブロックは、ボタンを定義するサブルーチンで、画像にあるような9個のボタンを画面上に配置するために、タイトル、X位置、Y位置、ボタン高さ(幅)を指定する。
ボタンを押されたときの処理を決定するonAction関数を設定している。
これ以降はメインプログラムで、最初はソケットの作成を行っている。
ソケット作成した後、ベース画面を作成し、画面タイトル、背景色などを設定している。
ui.viewでは、titleではなく、nameで名前を設定するようだ。
iv は、受信した画像を表示するためのImageViewを指定する。Iphoneの画面は、本当は縦長なのだが、横位置に指定したかったので、背景windowを横位置にして、そこから計算される縦位置から、400x300にサイズを決定した。
次のブロックは、ボタンを配置している。画面の左に3個、右に3個、下に3個だ。
次のブロックで、作成した画像window、ボタンを背景に追加している。
whileから始まるブロックで、画像を受信する。
画像は、32バイトで指定される、フレーム番号、フレーム時刻、サイズで指定されたヘッダをまず受け取り、ここで、指定されるサイズバイトを実際に受け取り、バッファに格納している。
画像自体は、JPEGであるがバイナリによる動作の不安定さを防ぐために、いったんBase64に変換したもので通信している。
受け取ったバッファを、Base64でデコードした後ByteIoを使って、Jpegイメージかして、それを先ほど作った画像Windowに張り付けているということになる。
ただ、このプログラムには欠点があり、それを直さないといけないとは思うんだが、ほおってある。
現状のソースをなんと惜しげもなく(恥ずかしげもなく)公開する
# # import socket import ImageFile import Image import ui import io import base64 import ui import time def onAction(sender): bt=sender.title cmds={ '歩':'stp','座':'sit','立':'std','伏':'lie', '前':'fwd','停':'sto','後':'bck','左':'lft', '央':'ctr','右':'rgt'} soc.send(bytes(cmds[bt],'utf-8')) def addButton(_title,x,y,_height): btn = ui.Button(title=_title) btn.bounds=(0,0,_height,_height) btn.font=('',30) btn.background_color='#f0f0f0' btn.flex ='' btn.center=(x,y) btn.action=onAction return btn soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM) soc.connect(("192.168.11.129",11320)) v=ui.View() v.title='SpotMicro Control' v.name='SpotMicro Control' v.background_color='#aaaaaa' iv = ui.ImageView() v.present(style='fullscreen',orientations=['landscape']) iv.flex='LRB' iv.ackground_color='yellow' iv.bounds=(0,0,400,300) iv.center=(v.width/2,150) LeftAllign=60 btnHeight=40 RightAllign = v.width-btnHeight BottomAllign = v.height-btnHeight/2 btnStp= addButton('歩',LeftAllign,btnHeight*1,btnHeight) btnSit= addButton('座',LeftAllign,btnHeight*2.5,btnHeight) btnLay= addButton('伏',LeftAllign,btnHeight*4,btnHeight) btnFwd= addButton('前',RightAllign,btnHeight*1,btnHeight) btnBan= addButton('停',RightAllign,btnHeight*2.5,btnHeight) btnBck= addButton('後',RightAllign,btnHeight*4,btnHeight) btnCtr= addButton('央',v.width/2,BottomAllign, btnHeight) btnLft= addButton('左',v.width/2-70 , BottomAllign,btnHeight) btnRgt= addButton('右',v.width/2+70 , BottomAllign,btnHeight) v.add_subview(iv) v.add_subview(btnStp) v.add_subview(btnSit) v.add_subview(btnLay) v.add_subview(btnFwd) v.add_subview(btnBan) v.add_subview(btnBck) v.add_subview(btnCtr) v.add_subview(btnLft) v.add_subview(btnRgt) while True: line = soc.recv(32).decode() head=line.split(':') tag=head[0] frm=int(head[1]) tim=int(head[2]) siz=int(head[3]) len=siz if tag == 'jpeg': img='' buf=soc.recv(siz,socket.MSG_WAITALL) jpg=base64.b64decode(buf) parser = ImageFile.Parser() parser.feed(jpg) jpgimg = parser.close() with io.BytesIO() as bIO: jpgimg.save(bIO,'png') img=ui.Image.from_data(bIO.getvalue()) iv.image = img
解説を期待している人はあまりいないだろうが、そんなのは無視してやると、
インポートのブロックのあとにあるonAction関数は、ボタンを押された後の動作を行う。
ボタンが押されると、onActionは、Senderを受け取る。senderには、押されたボタンのオブジェクトが格納されており、そのボタンのtitle を読みだしたことで押されたボタンの正体が判明し、それから
コマンドを送る
cmds配列は、ボタン名からコマンドへの変換テーブルで、コマンドは半角3文字とした。
コマンドが押された後の動きは、受け取った側でコントロールする。
選択されたコマンドは、socで指定されるソケットにより、commanderに送信される。
コマンドは、3文字の固定長文字列としている。
次のブロックは、ボタンを定義するサブルーチンで、画像にあるような9個のボタンを画面上に配置するために、タイトル、X位置、Y位置、ボタン高さ(幅)を指定する。
ボタンを押されたときの処理を決定するonAction関数を設定している。
これ以降はメインプログラムで、最初はソケットの作成を行っている。
ソケット作成した後、ベース画面を作成し、画面タイトル、背景色などを設定している。
ui.viewでは、titleではなく、nameで名前を設定するようだ。
iv は、受信した画像を表示するためのImageViewを指定する。Iphoneの画面は、本当は縦長なのだが、横位置に指定したかったので、背景windowを横位置にして、そこから計算される縦位置から、400x300にサイズを決定した。
次のブロックは、ボタンを配置している。画面の左に3個、右に3個、下に3個だ。
次のブロックで、作成した画像window、ボタンを背景に追加している。
whileから始まるブロックで、画像を受信する。
画像は、32バイトで指定される、フレーム番号、フレーム時刻、サイズで指定されたヘッダをまず受け取り、ここで、指定されるサイズバイトを実際に受け取り、バッファに格納している。
画像自体は、JPEGであるがバイナリによる動作の不安定さを防ぐために、いったんBase64に変換したもので通信している。
受け取ったバッファを、Base64でデコードした後ByteIoを使って、Jpegイメージかして、それを先ほど作った画像Windowに張り付けているということになる。
ただ、このプログラムには欠点があり、それを直さないといけないとは思うんだが、ほおってある。
コメント 0