コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

卓上ロボット掃除機の改造 (5)

以前のブログにも書いたのですが、改造卓上ロボット掃除機(もはや掃除機ではないですが)は制御プログラムがLuaridaスクリプトで書かれており、スクリプト自体はサーバからダウンロードして動く仕組みになっています。
もう一度、動作の仕組みを書いておきます。

  1. PICマイコンのリセットボタンを押す。または、電源が入る。
  2. PICマイコンのプログラムがAndroidにアクセスして、Robot Script Loaderを起動する。
  3. Robot Script Loaderはサーバにアクセスし、自分がダウンロードすべきスクリプトを問い合わせる。
  4. サーバからダウンロードすべきLuaridaスクリプトを教えてもらう。
  5. 教えてもらったプログラムをAndroidにダウンロードする。
  6. ダウンロードしたLuaridaスクリプトを実行する。
  7. ロボットが動き出す。

絵で描くと下のようなイメージになります。

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 )

詳しくは、githubrobotscript.luaを見てください。