マツコネのスクリプトを少しいぢってみようと思い立ちました。
360°モニタでカメラ画像を表示していても車速が上がると消えてしまうのが何とかならないか、と思ったのが動機です。自分は運転中はラジオか音楽しか聴かないので、360°カメラの映像はずっと表示していて欲しいのです。
調べたこと、わかったこと、やったことなどを記録していきたいと思います。このブログ記事に追記することにします。
以下、文章を簡潔にするために文語体で書きます。
【2021.1.10 初稿】
360°モニタの映像は前後左右の4つのカメラ映像を合成して表示されるが、合成自体はマツコネが行っているのではなく、何か別のモジュールで合成した映像をマツコネが受け取っているものと推測される。
そして、Viewボタンが押されるか、リバースギアにしたときにマツコネは受け取った映像を表示し、車速が上がってくると映像表示をやめるような仕掛けになっているのだと思われる。
そこで、まずはマツコネが車両情報をどうやって取得しているのか調べてみる。
車速やエンジン回転数などの情報はHS-CANで取り込んでいるのだと思うが、CANデータを直接扱っているようなスクリプトはまだ見つかっていない。
マツコネの動作をカスタマイズできるAIOの追加アプリの一つに、車速やエンジン回転数などの車両情報をリアルタイムで表示するSpeedometerなるものがある。このスクリプトをみてみると、どうやら車両情報はsmdb(Shared Memory Database)というデータ領域(共有メモリ?)を経由して取り込んでいるようだ。
例えば、車速を読み込むスクリプトは
smdb-read -n vdm_vdt_current_data -e VehicleSpeed
となる。
-nの後のvdm_vdt_current_data がデータベース名
-eの後のVehicleSpeedがエントリー名
を示すらしい。
データベース自体はjci/smdbフォルダの中にあるようだ。しかし、ここにある情報をどのアプリがどうやって利用しているのか
チンプンカンプンである。
ーーーーー
別のアプローチとして、パーキング時にバックカメラ画像を表示するアプリケーションのスクリプトを探査してみた。
フォルダ名から推測して怪しそうなのは
/jci/gui/apps/backupparking/js のなかにある
backupparkingApp.jsというファイルだ。
リバースギアにするとこのスクリプトが呼ばれてバックカメラ画像、もしくは360°モニタ画像が表示されるのではないか。そしてこの中で車速を読み込んでいるらしい部分がある。例えば571行目の
this._cachedSpeed = framework.common.getAtSpeedValue();
等である。
framework.common.getAtSpeedValue()という関数?はどこに定義されているのだろうか。それが解れば、車速を「偽装」することによってマツコネ上で動くアプリの動作を変えられるかもしれない。
とは思うものの、具体的に何をどうすればいいのか、やはり
チンプンカンプンである。
ーーーー
こうなったらドブ板戦法ではあるが、JCIフォルダの中を”getAtSpeedValue”でテキスト検索し、ヒットしたファイルの中を片っ端からみてみる。多くのjsファイルがヒットした。
車速に関連した処理をしているような箇所がいくつかあった。
jci/gui/common/js/Common.jsの75行目に定義されている_atSpeedというプライベート変数。これはMMUIからAtSpeedイベントを受け取るとtrueになる、ようだ。
で、MMUIとは?AtSpeedイベントとは?
別のjci/gui/apps/system/js/systemApp.jsというファイルの725行目に興味深い記述がある。
// At speed : Available status will be skipped for the speed restricted apps
「At speed(trueのときは)有効状態が車速制限アプリに対してはスキップされる」と書いてある。興味深い記述ではあるのだが、何を言ってるのかチンプンカンプンである。
1340行目で_AtSpeedDisabledという変数にframework.common.getAtSpeedValue()からの戻り値を入れている。ここでもこの関数がでてきた。やはりこれは現車速に基づいて変化するフラグだと推測される。
さらに別のファイルの中身を見てみる。
jci/gui/apps/warnguide/js/warningguideApp.jsの194行目から定義されている
warnguideApp.prototype._AtSpeedMsgHandler = function(msg)
という関数中で_atSpeedValという変数をtrueにしている。これは「車速が閾値を超えた」ことを示すフラグのようだ。
逆に、
warnguideApp.prototype._NoSpeedMsgHandler = function(msg)
という関数中では_atSpeedValをfalseにしている。
さらに、その後ろにある
warnguideApp.prototype._warningListReadyToDisplay = function()
の中では_atSpeedValは framework.common.getAtSpeedValue()の戻り値にセットされている。
どうもこの関数は車速が閾値を超えているかどうかを判断していることで間違いないようだ。
そして、この関数が定義されているらしい箇所を見つけた!
jci/gui/common/js/Common.jsの1199行目に
Common.prototype.getAtSpeedValue = function()
がある。しかしここでは実際には何もしておらず、ローカル変数の_atSpeedを返すだけである。
_atSpeedは714行目と725行目のメッセージハンドラ関数の中で、これらのハンドラ関数が呼ばれたときにtrueまたはfalseにされている。
ということは、この部分を_atSpeedが常にfalseになるように書き換えれば車速制限がなくなるのではなかろうか。
そうすれば、車が動き出しても360°ビューモニタは表示されたままにできるかもしれない。
と、わかったようなフリをしてここまで書いてはみたが本当はチンプンカンプンである。先は長そうだ。。。
【2021年1月23日追記】 Common.jsを書き換えた
SSH接続まではできたが、/jci/gui/common/js/Common.js ファイルを書き換える権限まではないようなので、AIOが吐き出すtweak.shに次の1行を追記することによってCommon.jsを書き換えた。
sed -i 's/this._atSpeed = true;/this._atSpeed = false;/' /jci/gui/common/js/Common.js
これを入れておいてAIOのUSBを走らせると該当箇所のthis._atSpeedが常にfalseになった。
↓
しかし、360°ビューモニタは走行しだすとやはり消えてしまった。
ここではなかったようだ。
Posted at 2021/01/10 14:34:33 | |
トラックバック(0) |
整備 忘備 | クルマ