いつの間にやら11月も半ばで、今月に入ってから一度も更新してませんでした。
現在 HalWatch の開発をしてます。前にも書きましたがちょっとうまく行かないことがあって停滞してます。
で、あんまり blog を放置しっぱなしなのもアレなので何でもいいから更新しておこうと思い、現在の開発状況のメモでも書いておきます。
まあ開発状況を公開することに意味があるか分かりませんが、自分用の覚書として。たぶん大方の人にとっては読んでも意味は無いと思いますし、まとまりの無い文章になってしまったので興味のある方だけ読んでください。
8月上旬:HalLaunch/KeyConfig 公開後ちょっと気になっていた部分を修正。目に見える変更ではないので次回の修正版を出すときでいいやと思い公開はせず。
8月中旬-9月下旬:HalWatch の開発。
以前のコードは破棄し、スクラッチから書き直す。
盛り込んだ機能は
・プログラムを PDA モード部分と Watch モード部分に分離
・モジュールの表示順をユーザが指定可
・各モジュールの表示/非表示を設定可
・時計アプリを起動する機能(PDA モード)
・特定の時計アプリを削除する機能(PDA モード)
・低バッテリ時の動作を 簡易時計/表示のオフ/何もしない から選択可
・低バッテリの閾値/有効/無効をユーザーが指定可
・低バッテリ時の動作をを2段階に分けて指定可(1段階目では簡易時計、2段階目で表示を消す等)
・夜間消灯モード(例えば深夜0時から6時までは画面表示を行わない等)
・アラームの選択、独自の音/システムデフォルトの音/画面反転/アイコン表示
・特定の時計アプリでは HalWatch のアラームを鳴らさないように設定可(時計アプリと HalWatch で二重に鳴るのを防ぐ)
・ロッカーキーの動作をモジュールごとに変更可(例えば HotTimeV のデフォルトでは RockerDown で秒表示するが、これを RockerUp で秒表示するようにしたり、またモジュールの切り替えがバックライト点灯状態でなければ出来なくしたり出来る)
…ここまではさしたる問題も無く9月中には実装済みでした。
この上でやりたいことは
・モジュール作成の仕様を確定して公開する
・時計モードを抜けるときに一度だけ必ず実行されるような仕組みをモジュールに提供する
なぜ2点目が必要かということは Wrist PDA の時計モードの動作についての理解が必要なのですが、簡単に言うと初期化処理と終了処理にコストがかかるような時計アプリを作ろうとする時に、毎分ごとにそのコストのかかる処理をするのではなく、時計モード突入時の一度だけ初期化処理し、時計モードから PDA モードに戻る時に一度だけ終了処理をするようにしたい、ということです。
時計アプリを自作されていない方にはピンと来ないとは思いますが、時計アプリは時計モードの間ずっと起動されたままいるのではなく、1分ごとに起動と終了を繰り返しているのです。
初期化処理のほうは簡単です、feature を使って初期化済みフラグを立てればいいだけですから。
終了処理もそのことだけを考えるなら簡単です。時計モードを抜けるときに発行される Fossil 独自の notification (fossilNotifyWatchModeWakeup) があるのでそれを受けて処理すればいいのです。
問題は fossilNotifyWatchModeWakeup の実行に副作用(?)が2点あるらしいことです。
1つは fossilNotifyWatchModeWakeup の呼び出しを受けるようにしてしまうと呼び出された処理の中で画面に描画するようなことは一切行わなくても、時計から抜けたときに画面が元に戻りません。
これを回避するには時計モードに突入するときに画面のコピーを撮っておき、復帰時に書き戻すということをやればいいのですが、今度はいつ画面のコピーを撮るのかが問題になります。
sysNotifySleepNotifyEvent は PDA → Watch の時にも呼び出されますが、時計モードの間にも毎分ごとに呼び出されるので扱いづらいですが、最初の一度目だけを使えばいいのでまあ何とかなります。
問題は HalWatch が時計アプリとして Pref>WristPDA>WatchApp に現在指定されていないときにはこの処理をすべきではない、これをどうやって解決するかでしばらく悩みましたが Pref>WristPDA>WatchApp の Preference データの構造を解析して、これを sysNotifySleepNotifyEvent の時点でチェックし、HalWatch が現在の時計アプリでなければ処理しない、という風にすることで何とかなりました。
これが大体10月の下旬ごろで、この時点でリリースに向けて動作チェックをしていたのですが、さらにひとつ問題が見つかってしまいました。
具体的には DA を起動したまま時計モードに移行すると、時計から復帰し DA を終了した後でかなりの高確率でメモリ関連のエラーが起きるといったものです。
HalLaunch の常駐をやめればこの問題は全く起きませんが、そもそもその状態では DA の起動が出来ないのでそれが原因か特定できません。
HalLaunch はキーの長押し機能などのためにメモリに常駐しなければならない部分と、通常アプリとして機能し常駐は必要ない部分があるのですが、これらをまとめてメモリ上に常駐していました。
確証は無いながらもメモリの常駐量を減らせばひょっとして先の問題が解決するかもしれないと思い HalLaunch を常駐部分と非常駐部分に分離すべく修正を行っていました。
修正はできましたが結局常駐サイズは問題ではありませんでした。
その後もいろいろと試して、どうも sysNotifySleepNotifyEvent の時点で DA 用に確保したヒープメモリが破壊されているような感じだったので DA のためにヒープを確保するのをやめてみました。
これが原因だったようでようやく HalWatch から安全に sysNotifySleepNotifyEvent を呼び出せるようになりました。
これが先週までのことで、さあ今度こそリリースに向けたテストだ!と思いテストしようとしたのですが、HalWatch のコードにしばらく触っていなかったのでちょっと見直してからテストしようと思って眺めているうちにちょっと機能追加したくなってしまいました。(ここで余計な事をしなければ今頃公開できていたと思うのですが…)
具体的には省電力モードとして単に画面表示を消すのではなく、HalWatch から Pref>WristPDA>Mode=Off として本当にオフにするモードに自動的に移行できないかと思い、先に解析した Preference データを時計モードの間に書き換えるコードを加えてテストしてみました。
結果は×で、Pref を開くと確かに設定は変わっている様に見えるのですが実際には Off モードに移行せず Watch モードのままでした。
どうも Preference のデータを書き換えるだけでは不足で何らかのコードを実行する必要があるみたいです。
まあしょうがないかと思い一つ前の安定バージョンに戻していざテストを始めたのですが今度は時計モードに移行するとすぐにハングアップしてしまいました。
時計が使えないと困るのでとりあえず日常使用のために Fossil の時計アプリを使用するようにしてまた翌日調べようと思いましたが Fossil の時計アプリもハングしてしまいます。
HalLaunch も CJKOS も常駐系のものを一切外しても、どの時計アプリを使っても時計モードに移行するとハングアップしてしまいます。
推測ですが Pref>WristPDA>Mode の Preference を書き換えてしまったためにどこかで不整合が起きてしまっているみたいです。これはソフトリセットでは回復しないみたいです。
しょうがないので半年振りにハードリセットしました。
ハードリセット後に HotSync してデータを書き戻したのですが、今度は2度目の HotSync が Identifyng User のところで止まってしまい先に進みません。何度ハードリセットと HotSync をやっても同じです。
調べてみると長期間 HotSync をしなかった場合にこういうことが起こる場合(HotSync/PalmDesktop のバグ)があるらしいです。
PalmDesktop のバグなら Z22 付属の最新版なら大丈夫かと思いアップデート後 WristPDA のドライバを読み込ませて無事回復し HotSync することも出来ました。
これが昨日までの状況です。で、改めて修正版の HalLaunch と一つ前の安定版の HalWatch をインストールしたのですがハングする症状が相変わらず出ます。
多分 Pref を書き換えたことによる不整合はハードウェアに記憶されていてハードリセットでも回復できないのでしょう。
最後の手段として完全放電させてから新たに環境構築をやり直してみます。これでダメだったらこの個体はお蔵入りです。まあ予備機があと2台あるので何とかなるでしょう。
というわけで現在 AOCtrl DA を使って時計モードに移行しないよう PDA モードのままにして既に10時間以上放置しているのですが、まだバッテリが 40% 以上残っていて完全放電にはもうしばらくかかりそうです。まあいくらなんでも明日の朝には放電してしまっているでしょう。
ところで PDA モードのままで10時間以上も電池が持つんですね。ありがたいことではありますが完全放電させてしまいたい今、ちょっとじれったいです。
トラックバック
- トラックバックURLはこちら
- http://hal9.blog3.fc2.com/tb.php/66-5ee2e2c8