ページ

2014/10/21

[android]Lは2つ!

LOLIPOP、じゃなくて、LOLLIPOP、なのね。。。
みんなも注意しよう!

2014/10/20

[android]LollipopからSmart Lockという機能が付いたらしい

Android 5.0(になるのかな)から、ロックの解除にNFCタグも使えるらしい。
http://getnews.jp/archives/685243
試しておこう。

まず、設定画面>セキュリティで、ロック方法を設定する。
私はいつもパターン入力しているので、それを設定した。
そうすると、設定できる項目がいろいろ現れ、その中に「Smart Lock」がある。
image
Nexus7なので、画面が大きくて済まんね・・・。
とにかく、こういう画面が出てくるので、赤いプラスをタップ。

image
Bluetoothか、さもなくばNFCかの選択を迫られる。
私はNFCなので、下をタップ。

image
タップを促す画面が表示される。

image
タグが見つかると、名前入力する画面になる。

image
おしまい。
複数の登録が可能だ。

では、使い方。
まず、ロックして画面が消えている状態では、何もならない。
これは今まで通りだ。
電源ボタンを押してロック画面を表示させ、かざしてみた。
・・・変化がない・・・・・・。
パターン入力画面になってからかざすのか?
・・それでも変化がない。
なんだ???
正解は、「ロック画面でタップしてから、画面をスワイプ」だ。
そうすると、パターン入力画面が出てこずにホーム画面が出てきた。
ロックが外れる音がするわけじゃないので、気付かんかったわ。。。
何回かやってわかったけど、タグを読めなかったときの音はするみたいだ。
そういえばHCEはロック画面でも使えるような設定があったから、そっちなのかな?

パターンよりも、すごく複雑なパスワードとかPINにしておいて、ほとんど記憶での入力ができないようにしておき、普段はNFCタグを使うとかがよいのかなぁ。
あるいは、外では電話専用にするために、タグは家の中に固定しておくとか。

2014/10/19

[nrf51]softdevice_sys_evt_handler_set()は、何だ? - (3)

ちょっと追った。

softdevice_sys_evt_handler_set()は、sd_common/softdevice_handler.cにある。
これは、m_sys_evt_handlerという変数に覚えるだけ。

使っているのは、intern_softdevice_events_execute()だけ。
これの呼び出し元は、SWI2_IRQHandler()。
名前からすると、ソフトウェア割り込みのハンドラだろう。
スケジューラの関数が登録されていればそちらを呼び、登録されていなければintern_softdevice_events_execute()を呼ぶ。

ここでいうスケジューラの関数は、SOFTDEVICE_HANDLER_INIT()でスケジューラを使うと指定すると、自動的に割り当てている。
softdevice_evt_schedule()という関数で、やっているのはapp_sched_event_put()でスケジューラに登録するだけ。
登録するのは関数呼び出しで、結局はintern_softdevice_events_execute()を呼ぶようにしている。
私のイメージだと、とりあえず発生したイベントだけは吸い上げて、それをスケジューラに登録するんだろうと思ったんだけど、そうではないんだな。

intern_softdevice_events_execute()では、SoftDeviceからのイベントとBLEスタックからのイベントの両方をさばいている。
SoftDeviceの方は必ず処理するが、BLEスタックはBLE_STACK_SUPPORT_REQDが定義されているときだけだ。
softdevice_sys_evt_handler_set()は引数がNULLの場合には処理されないので、それが"Once the application has registered for the events, it is not possible to possible to cancel the registration"と説明している意味だろう。

 

さて、最初の疑問に戻ろう。
「なんでBLEスタック初期化の中で呼び出しているの?」だ。
関数コメントを信じるなら、SWI2_IRQHandler()はBLEスタックイベントの割込ハンドラらしい。
だから、ble_stack_init()でしか呼び出さないということか。

じゃあ、なんでBLEスタックイベントの割込とSoftDeviceのイベントが一緒になってるんだ?
また、SoftDeviceイベントというのは、sd_evt_get()で取得しているので、enum NRF_SOC_EVTSみたいなのだ。
これはNRF_EVT_FLASH_OPERATION_SUCCESSみたいな定義があることから、必ずしも異常発生だけとは限っていない。

あまり考えても仕方ないから、こんな感じになるだろうか。

  • BLEを使うなら、softdevice_sys_evt_handler_set()でコールバック関数を設定した方がよい。
  • FLASH操作するなら、その処理結果がコールバックされるようである。
  • なので、必ずエラー処理にするのではなく、内容によりけり。

 

現在までで整理した内容を、githubにプッシュした。
残るは、main.cのBLE周りですな。
https://github.com/hirokuma/nrf51822_templete

みんなはどのlibusbを使っているのだろうか?

疑問系だ。

LinuxやWindowsで、あるいはMacでもかもしれないが、USBデバイスを制御したいとなるとlibusbを使うことが多いんじゃなかろうか。
デバイスドライバを作ればいいのかもしれないけど、アプリ層からUSBアクセスできるというのを知ってしまうと、もういいや、と思ってしまう。

で、libusbなのだけど、バージョンが存在する。
大きくは、0.1系と1.0系だと思っている。
0.1と1.0があれば、そりゃ1.0だよねぇ。

そう思っていたんだけど、「cygwin libusb」で検索すると、ここが先頭に出てきた。

http://sourceforge.net/p/libusb-win32/wiki/Home/

Homeって書いてあるので、メインページみたいな位置づけだろうと思う。
そしてこれは、libusb-0.1系なのだ。

1.0系は、おそらくこちらがメインページ。
http://www.libusb.org/wiki/windows_backend

libusb.orgの方が本物っぽいので、一番上のページを見た。
http://www.libusb.org/wiki
表を見ると、1.0系がtrunkで、0.1系のソースを使っている人のためにcompatibleなソースも提供している、という位置づけのようだ。


で、だ。

バージョンが新しいものをみんなが使うわけじゃ無いし、新しい方がよいというばかりでもないのはよくあることだ。
それに、たとえ新しい方が良かったとしても、使われなければ無いのに等しくなる(私は、倉庫に眠るベータのビデオデッキを思い出した)。

じゃあ、みんなはどのlibusbを使っているんだろう?が気になるのだ。
長いものに巻かれる必要はないのだが、今回みたいに「USBが扱えれば良い」というものについて、マイナーなものを選択する理由がないというだけだ。

 

なんで急にlibusbのことを言い出したかというと、AndroidのADKだ。
当時はBeagleBoardにAndroidをインストールして使っていたのと、Arduinoを持っていなかったこともあり、よくわからんけど仕様書どおりにやってみようと思って、libusbで通信してみたのだ、たしか。
もう2年半も前なので、全然記憶はない・・・。
リンク先にあったgithubのリポジトリも削除していたので、著作権的にまずいと思ったか、なんか動かないとかあったのだろう。
もちろん、手元にあるソースでNexus7にアクセスしてみたけどだめだった。

[android]Lollipopゲームが難しい

Nexus7(2013)に、Lollipop Previewをインストールした。
前回はL previewという名前だったんだけど、今回はLollipopという名前が付いている。
チュッパチャップスじゃないんだ。。
インストールして起動すると、新規立ち上げと一緒なのであれこれ設定が必要になる。
が、今回は「タップアンドゴー」というものが出てきた。
タッチアンドゴーみたいな感じがするが、NFCを使うので、少し近い気がしたけど、関係はやっぱりない。
Nexus5端末(4.4が入っている)を向かい合わせると、Bluetoothを有効にするか確認され、OKするとアカウントの移行がある程度できた。
もちろん、パスワード入力は必要だけどね。2段階認証してるけど、そっちの入力は求められなかった。
今、アプリが自動でダウンロード&インストールされているところだ。
とりあえず開発者モードにでもしておくか、といつもの手順を踏もうとした。
が、間違えてイースターエッグというのか?あっちをやったようだ。
なんか、ゲームが起動した。
image
画面をタップすると、ドロイド君が跳ね、何もしないと落ちていく。
なので、手際よくタップしつつ、現れるロリポップの間をくぐり抜けていくという、横スクロール型のゲームだ。
けっこう、難しくないかい??

アプリの同期が終わったようだ。
Nexus5のホーム画面と同じアイコン並びになっている。
まあ、タップしたのがNexus5だから仕方ないけど、タブレットとは別になってる方がうれしいかな。
  • アプリ一覧画面の背景が白くなった。
  • 「ブラウザ」が追加? Chromeがアンインストールできる。
  • 「メール」が2つある・・・片方はアンインストールできたから、ダウンロードしてきたのかな

Lollipopとは関係ないのだけど、写真とかのバックアップ機能が良くわからない。
4つくらいGoogleアカウントがあり、メールを読むためだけにアカウント登録してるのだけど、どのアカウントがいつ使われているのかがわかっていないのだ。
よく読めばわかるのかねぇ。