SDLデバイスシミュレータを触ってみた

アスキーのラズパイによる疑似SDL車載機に、地図を表示してみよう！の記事を読んでみて実際に動かすための機器がそろっていたのと、
実際にデバイスシミュレータに触ってみての開発時になんかの役に立ちそうなことを一応書いておく

#実際に必要な機器、ソフト
理由は後述
PC[windows,MacどちらでもOK]×2
Raspberry Pi 3 
SDLBOOTCAMPのイメージファイル
マイクロSDカード
Android6以降の実機端末A
Raspberry Pi純正7インチタッチディスプレイ
USBケーブルmicroBと使用するandroid端末用のUSBケーブル
Andoroid Studio

###要る物の説明

PCに関しては、ログファイルをSDLBOOTCAMPをインストールしたラズパイから取得する際にもう一台あると楽だと思う。
あと、ラズパイ側のLANポートは動作していない模様

```
root@raspberrypi3:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
    link/ether b8:27:eb:d4:51:90 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel qlen 1000
    link/ether b8:27:eb:81:04:c5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fe81:4c5/64 scope link
       valid_lft forever preferred_lft forever
root@raspberrypi3:~#
```

用意するラズパイがRaspberry Pi 3なのかというとSDLBOOTCAMPがのみ対応らしいです。
まだ新品は手に入れられるぽいので手に入れられそう。

タッチディスプレイについては個人的に純正７インチを使用したほうがディスプレイ周りで悩むことはないと思う。
社外品のGPIOに接続するタイプだとかなり苦労すると思う。

下のようにSDLBOOTCAMPにはdpkgやaptが入ってない

```
root@raspberrypi3:~# dpkg
-sh: dpkg: command not found
root@raspberrypi3:~# apt
-sh: apt: command not found
root@raspberrypi3:~# apt-get install dig
-sh: apt-get: command not found
root@raspberrypi3:~#
```

#導入
まず、SDLBOOTCAMPのイメージファイルをSDLBOOTCAMPのページからダウンロードしてSDカードに書き込みます。
[SDLBOOTCAMP](https://micdev-jp.github.io/sdlbootcamp/0.preparation_kit/contents.html#sdlbootcamp-ssh"SDLBOOTCAMP")

今回はEtcherを使用してSDカードに書き込みます。
[etcher](https://www.balena.io/etcher/"etcher")

etcherを使用して書き込みを行うブートイメージは20190705のほうを使用して書き込みます。
使用方法については簡単でFlash from fileでブートイメージを選択し書き込むSDカードを選択してFlash!をクリックするだけです。

###純正７インチタッチディスプレイの接続方法
SDLBOOTCAMPのブートSDカードを作成している間は純正７インチタッチディスプレイの接続をしましょう。
電源回りのつなぎ方を忘れがちなので今回ここに書いておきます。

最初にディスプレイから出ている大き目のケーブルを接続します。
![start.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/44f41d10-9271-fcd0-48bc-6b6323dbe6f8.jpeg)

次にディスプレイ側から出ている小さいケーブルをディスプレイ側の基盤に接続します。
![start2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/dceb53aa-9024-b4b1-948e-81281ea14da2.jpeg)

高ナットを対角線上に締めて基盤にリボンケーブルを接続します。
![リボン.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/64aed9e6-de83-2745-7b2f-a2513bd19345.jpeg)

続いて、Raspberry Pi側のGPIOに写真中の赤丸と青丸の部分にジャンパーケーブルを接続します。
![raspGPIO.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/a1698169-348c-5b16-699b-ae0b96739075.jpeg)

イメージが書き終わっていたら、microSDスロットにmicroSDカードを挿入します。
![SD.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/ec38e791-90e2-474a-ffdb-344e0f66dad7.jpeg)

基盤側の5Vピンに赤のジャンパーケーブルを、GNDに黒のジャンパーケーブルを接続し、ディスプレイ側基盤に接続したリボンケーブルを
Raspberry Piに接続します。
![displaypwr.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/83eb5cf0-1735-8af1-db28-e95bc25c2f72.jpeg)

これで電源に接続して画面に出力されればOK。

#サンプルコードの展開
Android Stadioの導入方法と日本語化については割愛します。
なお、使用するandroid端末のADBドライバは必要ですので各端末ごとに探してインストールする必要があります。
サンプルコードの入手先については参考サイトの[ラズパイによる疑似SDL車載機に、地図を表示してみよう！](https://ascii.jp/elem/000/004/017/4017233/"ラズパイによる疑似SDL車載機に、地図を表示してみよう！)からダウンロードしてください。

サンプルコードダウンロード後インポートして実際に起動していきます。
Android端末をデバックモードでPCに接続後、ビルド＞ビルドバリアンドの選択を開きます。
![スクリーンショット 2020-11-07 143252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/c8a6207a-0f24-5d43-4dad-a78e7d443628.png)

ビルド・バリアンドの部分でアクティブ・ビルド・バリアンドの部分でmulti_high_bandwidthDebugを選択し、
![スクリーンショット 2020-11-07 143845.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/4e10cf60-938c-b57b-dbfb-d8eaf3a31c20.png)

右上の実行ボタンで実行し、端末側でアプリが立ち上がったらPCから端末を切断しRaspberry Piに接続する。
![スクリーンショット 2020-11-07 154436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/9595f302-351f-06c7-5745-d0fdd70de7fa.png)

なお、Raspberry Pi側は以下の画像の画面の状態になっている状態で接続すること。
![DSC_0036.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/36f0e1a2-7846-cf9a-9e16-2fa97d2acf22.jpeg)

Raspberry Piに接続するとandroid端末側は以下の表示になるので、SDL Projectionを選択する
![Screenshot_20201107-154621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/92f763d6-0b25-63fe-8116-e21de892422e.png)

画像はないがDeviceListの画面が表示されたら一番上をタッチし、SDLDisplayをタッチするとandroid端末の画面が表示される。
![DSC_0037.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323146/970be794-777d-6551-53cb-580d2acb47b0.jpeg)

#デバック方法
Android Stadio でデバックする際は基本的にはエミュレータかUSBデバックを行うが、デバック時にRaspberry Piに接続するという、
手法を用いる以上、USBで接続してデバックはできないのでWi-Fi経由でデバックする。

一旦、android端末をデバックモードでUSB接続し、以下のコマンドを入力する。

```
C:\>%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe shell ip addr "|" grep inet "|" grep global  "|" cut -d "' '" -f 6 "|" cut -d "/" -f 1
192.168.0.102
****:****:****:****:****:****:****
***.***.***.151
```

端末側のローカルIPアドレスが表示されるので控えておく
ここでPCから一旦端末をUSB接続を切断して、次のコマンドでポート番号を設定する。
なお、ポート番号はかぶらなければ問題ないポートを設定する。

```
C:\>%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe tcpip 4444
restarting in TCP mode port: 4444
```

ポートを設定したら、次のコマンドで接続する

```
C:\>%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe connect 192.168.0.102:4444
connected to 192.168.0.102:4444
```

USBデバックに戻す場合は以下のコマンド

```
C:\> %USERPROFILE%\AppData\Local\Android\Sdk\platform-tools\adb.exe usb
restarting in USB mode
```

###Raspberry Pi側のログ
Raspberry Pi側のログは次の方法で取得する

まず、Raspberry PiのWi-Fiに接続する必要があるため次のSSIDに接続する
ssid:sdlbootcamp
pw:sdlbootcamp

接続後、TeraTarmなどでssh接続をする。
IPアドレス:10.0.0.1
ユーザー:root
パスワードなしで接続できる

```
C:\Users\localuser>ssh root@10.0.0.1
The authenticity of host '10.0.0.1 (10.0.0.1)' can't be established.
RSA key fingerprint is SHA256:f5s/An6l61TsYyJT2iK3SN2yG8hK06ytTns9T38jwcg.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.1' (RSA) to the list of known hosts.
root@raspberrypi3:~#
```

なお、SDLBOOTCAMPのログは/var/volatile/log/にある。

```
root@raspberrypi3:~# ls -la /var/volatile/log
drwxr-xr-x    4 root     root           240 Jul  1 00:02 .
drwxrwxrwt   10 root     root           200 Mar 26 03:04 ..
-rw-r--r--    1 root     root       5420212 Jul  1 00:28 Xorg.0.log
-rw-rw----    1 root     utmp             0 Mar 26 03:04 btmp
-rw-rw-r--    1 root     utmp           292 Jul  1 00:07 lastlog
-rw-r--r--    1 root     root         43717 Jul  1 00:39 messages
drwx------    2 root     root            40 Mar 26 03:04 private
-rw-r--r--    1 root     root        136363 Jul  1 00:33 sdlc.log
-rw-r--r--    1 root     root        204821 Jul  1 00:02 sdlc.log.0
-rw-r--r--    1 root     root         75073 Jul  1 00:18 sdlhmi.log
drwxr-xr-x    2 root     root           100 Mar 26 03:04 smartdevicelink
-rw-rw-r--    1 root     utmp          1920 Jul  1 00:07 wtmp
root@raspberrypi3:~# tail /var/volatile/log/sdlhmi.log
Jul  1 00:18:20 raspberrypi3 local6.info root: click
Jul  1 00:18:20 raspberrypi3 local6.info root: 18>0 (281, 141)
Jul  1 00:18:20 raspberrypi3 local6.info root: ^[[44mNotifySdlTouchEvent^[[m
Jul  1 00:18:20 raspberrypi3 local6.info root: TouchEvent id:18, type:0 xy(359,161)
Jul  1 00:18:20 raspberrypi3 local6.info root: motion
Jul  1 00:18:20 raspberrypi3 local6.info root: 18>1 (281, 141)
Jul  1 00:18:20 raspberrypi3 local6.info root: ^[[44mNotifySdlTouchEvent^[[m
Jul  1 00:18:20 raspberrypi3 local6.info root: TouchEvent id:18, type:1 xy(359,161)
Jul  1 00:18:20 raspberrypi3 local6.info root: 18>2 (281, 141)
Jul  1 00:18:20 raspberrypi3 local6.info root: ^[[44mNotifySdlTouchEvent^[[m
root@raspberrypi3:~# tail /var/volatile/log/sdlc.log
Jul  1 00:41:00 raspberrypi3 local5.info root:  ],
Jul  1 00:41:00 raspberrypi3 local5.info root:  "touchEventX" :
Jul  1 00:41:00 raspberrypi3 local5.info root:  [
Jul  1 00:41:00 raspberrypi3 local5.info root:          477
Jul  1 00:41:00 raspberrypi3 local5.info root:  ],
Jul  1 00:41:00 raspberrypi3 local5.info root:  "touchEventY" :
Jul  1 00:41:00 raspberrypi3 local5.info root:  [
Jul  1 00:41:00 raspberrypi3 local5.info root:          392
Jul  1 00:41:00 raspberrypi3 local5.info root:  ]
Jul  1 00:41:00 raspberrypi3 local5.info root: }
root@raspberrypi3:~#
```
#今後
おそらく、アマチュアレベルでSDL端末を入手しようとすると、SDL端末がついた車両を入手するか、もしくは部品単位で購入して(実車のワイヤーハーネス、ECU,本体、ステアリングリモコンetc..)安定化電源で運用とか必要になってくるが、Raspberry Piと純正タッチディスプレイがあれば作成可能だし、いろいろ作れるかも。

ただOS側の制約もあり今後発展してく可能性があるので、AndroidStadioでナビゲーションアプリを作成しRaspberry Piに表示がやりやすくなると思うし、OBDも使うことができるぽいけど、まだまだって感じ。

あと車載向けの技術になってくるので１人でログ見ながら運転は無理だし、デバックは最低でも２人でやらないといけない。
それこそシャシダイがあれば、車のECUチューンよろしくできるけど、どっちにしろメインとなってくるのはナビ関連となってくるので、
アプリに関しては1人でできるが、デバックは１人では難しいと思う。

さらに本格的にやろうとすると、Raspberry PiでGPIOが使えないのは痛すぎる。
AACの電源監視して、システムのハイバネーションをやったり、イルミネーションの電源監視してバックライト制御ができない。
音声出力に関してもRaspberry Piでできればと歯がゆい部分が多いが今後バージョンアップがされればできることが広がるので、
今のうち作っておくのも損じゃないかも

#参考サイト
[ラズパイによる疑似SDL車載機に、地図を表示してみよう！](https://ascii.jp/elem/000/004/017/4017233/"ラズパイによる疑似SDL車載機に、地図を表示してみよう！)
[AndroidアプリをWiFi経由でデバッグ](https://qiita.com/fukasawah/items/3f5b24819fac24c6686a"AndroidアプリをWiFi経由でデバッグ")