卓上ロボット掃除機の改造 (5)
以前のブログにも書いたのですが、改造卓上ロボット掃除機(もはや掃除機ではないですが)は制御プログラムがLuaridaスクリプトで書かれており、スクリプト自体はサーバからダウンロードして動く仕組みになっています。
もう一度、動作の仕組みを書いておきます。
- PICマイコンのリセットボタンを押す。または、電源が入る。
- PICマイコンのプログラムがAndroidにアクセスして、Robot Script Loaderを起動する。
- Robot Script Loaderはサーバにアクセスし、自分がダウンロードすべきスクリプトを問い合わせる。
- サーバからダウンロードすべきLuaridaスクリプトを教えてもらう。
- 教えてもらったプログラムをAndroidにダウンロードする。
- ダウンロードしたLuaridaスクリプトを実行する。
- ロボットが動き出す。
1番のPICマイコンの動作開始は前回のブログに書いたように、石井さんが作られたPIC ADK Miniboard用のプログラムPIC Microbridgeプログラムと全く同じです。その後のRobot Script Loaderの起動から解説したいと思います。
Robot Script Loaderの起動
PICマイコンはMicrobridgeを使ってADB経由で、AndroidにインストールされているRobot Script Loaderを起動します。PICマイコンのプログラムは、下のようにRobotScriptプログラムをamコマンドを使って実行しています。StartingActivity()関数は、卓上ロボット掃除機の改造(4)に書いています。
StartingActivity("com.momoonga.luarida.robotscript/.RobotScriptActivity")
Robot Script Loaderの中身
Robot Script Loaderは、実はサーバに問い合わせるというよりも、ダウンロードすべきスクリプトの置いているURLを読みに行っているだけです。Robot Script Loaderのプロジェクト一式もgithubに公開しています。
Robot Script Loaderの中身は空っぽで、/assets/install/luarida/robotscript/フォルダに入っているスクリプトrobotscript.lua をLuaridaに渡して、Luaridaを起動しているだけです。
robotscript.luaについて
robotscript.luaが行っていることを簡単に説明します。robotscriptはLuaridaで実行できるスクリプトで書かれており、言語はLua言語です。やっていることは単純で、下の図のようなことをしています。
電源が入ると、Robot Script Loaderに同梱されているrbmodule.txtというファイルに書かれたURLにアクセスします。そして、自分がダウンロードすべきスクリプトが置いているURLを知ります。次に、そのURLから実行スクリプトをダウンロードします。
以下はmain関数からの抜粋です。readLastData()では、ダウンロードに失敗したときのために、本体に保存している直前に動かしていたスクリプトのファイル名を取得しています。
--最後に動作させたデータを読み出します if(readLastData()==-1)then dialog( "" , "エラーが発生したので終了します", 1 ) system.exit() --終了します end
RbModulePathは、下記のように宣言しています。
RbModulePath = system.getAppPath().."/rbmodule.txt"
readURL(RbModulePath)で、rbmodule.txtに書かれているURLを取得し、filedowmload(urlofurl)で、ダウンロードすべきスクリプトのURLが書かれたファイルを見にいきます。
--RB-Moduleから読み込むスクリプトのURLを書いたファイルのURLを読み込みます local urlofurl = readURL(RbModulePath) if( urlofurl=="error" )then if( RbLast.moduleURL=="error" )then dialog( "" , "エラーが発生したので終了します", 1 ) system.exit() --終了します else urlofurl = RbLast.moduleURL end end --読み込むスクリプトのURLを書いたファイルのURLをダウンロードします local urloffilename = filedowmload( urlofurl ) if( urloffilename=="error" )then if( RbLast.scriptURL=="error" )then dialog( "" , "エラーが発生したので終了します", 1 ) system.exit() --終了します else urloffilename = RbLast.scriptURL end end
こんどは、readURL(urloffilename)で、実際に動かすスクリプトのURLを読み込んで、filedowmload(urlofscript)で、Luaridaスクリプトをダウンロードします。
--filenameからロボットスクリプトのURLを読み込みます local urlofscript = readURL(urloffilename) if( urlofscript=="error" )then if( urloffilename==RbLast.scriptURL )then --失敗したURLがRbLast.scriptURLと同じであれば終了します dialog( "" , "エラーが発生したので終了します", 1 ) system.exit() --終了します else --今度はRbLast.scriptURLを読み込みます urlofscript = readURL(RbLast.scriptURL) if(urlofscript=="error" )then dialog( "" , "エラーが発生したので終了します", 1 ) system.exit() --終了します end end end --ロボットスクリプトをダウンロードします local filename = filedowmload( urlofscript ) if( filename=="error" )then filename = RbLast.scriptname end
Luaridaスクリプトのダウンロードが終了したら、読み込んだ現状データを保存して、読み込んだLuaridaスクリプトを実行します。
--読み込んだurlとファイル名データを保存します savedata( urlofurl, urlofscript, filename ) --実行ファイルをセットします system.setrun( filename )
詳しくは、githubのrobotscript.luaを見てください。