前回は、Unityからエクスポートした内容をAndroidStudioに取り込めるようにしたところまで進みました。今回の備忘録は、Android側のスクリプト部分についてになります。
引き続き参考サイト(http://tokyo.supersoftware.co.jp/code/4807)の手順したがって、Arduinoに出力できるように改造していきたいと思います。
といっても、今回はほとんど手をいれるところがないのですぐ終わっちゃうかも。
AndroidStudioで適当な名前でプロジェクトを作って、参考サイトのコードをコピペしてみると、Unityで書き出したものは前回の移植の結果取り込めており、エラーは出なくなりました。
ですが~、コピペした段階でやたら警告が出てきます。
private ProgressDialog waitDialog; //非推奨のコード。
このサンプルプログラムで使われている上のようなダイアログ系の命令がことごとく非推奨になってしまっているので、このままでは使えません。そのままビルドするとエラーになります。ではどうしろというか調べたら、DialogFragmentを使えとかでてきますが、そんな使ったこと無いもので人様の書いたコードをいじくりましたらますます動かなくなってしまうおそれがあるので絶対イヤ!゚(゚´Д`゚)゚ こうゆうところでコケると、結構萎えます。
どこを参考にしたか忘れてしまいましたが、AndroidStudioの[ファイル]-[プロジェクト構造]の[Module]-[app]から、右列の[Complile SDK version]をAPI 25まで引き下げればそのままこのスクリプトは使えますので、設定を変えてしまいます。DialogFragmentは、本筋でないので今回は追いません。
なんとかエラーも消えましたので、参考サイトの2つのコードについて進めていきます。
ほとんどそのまんまで使います。変更点は、
BluetoothTestActivity.javaについては、
onClickButtonの中身が変更になります。引数としてUnityから受け取ったint型の値を元コードでは、switch文で場合分けして、新たなstring型のメッセージを飛ばしていますが、
String msg; msg = String.format("%03d",position); Log.d("メッセージの内容2",msg); bluetoothTask.doSend(msg);
といった感じに、int型のRGB値を整形してからメッセージとして飛ばしています。
(整形前 例)
1
55
512
という形で入ってくるint型のRGB値のデータを、
(整形後 例)
001
055
512
といった感じの3桁の文字列に変形して送信用の関数に飛ばします。こうしておかないと、後でArduinoでデータを受け取った時に困ったことになります。
参考サイトのコードでは、ボタンをクリックした時にボタンアクションに対応する1個のメッセージが飛ぶ仕組みになってましたが、スライダーの場合はスライド中の値をメッセージとして次々飛ばしてきますので、少し細工をしてからArduinoに渡すようにしないと後で悶絶することになります。
という訳で、BluetoothTask.javaの方も一行だけ手を加えておきます。
/* * サーバにメッセージの送信を行う非同期タスク。 */ private class SendTask extends AsyncTask<String, Void, Object>{ @Override protected Object doInBackground(String... params){ try{ //btOut.write(params[0].getBytes()); btOut.write(params[0].getBytes(),0,3); // 第二、オフセット。第三、長さ (参考)https://docs.oracle.com/javase/jp/8/docs/api/java/io/OutputStream.html btOut.flush(); // 強制的に書き出し return ""; }catch (Throwable t){ doClose(); return t; } }
元コードでは、引数として渡されたString型データの長さ分全部送信しちゃいなさいと書かれてますが(参考 https://msdn.microsoft.com/ja-jp/library/aa904361(v=vs.71).aspx)、ここを書き換えて、念のため3byte単位で抽出して書き出しなさいという風にしてしまいます。
この部分、一見無くてもいいように見えるんですが(引数はonClickButton関数で3桁に整形済みなので)、
この非同期のスレッド(doInBackground)からArduinoにメッセージが飛ぶ様子をArduinoのシリアルモニタで観察してみると、何も細工をしないで飛ばすと、1byte受信したり、3byteだったり、9byteとかまちまちな長さで飛んでいってるのが観察できます。
確信は出来ないですが、ここで先頭からのオフセット3byteのみ飛ばすという指定をすることで、例えば、
溜まっていたメッセージが
001
だけなら、そのまま3byte送信。
溜まっていたメッセージが
001055なら、
055は捨てて、001のみ発信という形になるのを期待して書いています。
メッセージの後ろから3byteを抽出して送信というのがもっともいいんでしょうが、多少のズレがあってもいいやと思ったのでこのままにしてあります。後ろから3byte指定にしたい場合は、lenを取得して-3の位置をオフセットの開始位置にして発信すればできそうな気がします。
次で、やっとArduinoにはいります。
コメント