fc2ブログ

HALの不定期雑記 電子小物の話題など

自作ソフト/過去記事のまとめ Fossil Wrist PDA 関連リンク集
Softwares for the Fossil Wrist PDA (English page)

開発中…   [English]

いつの間にやら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時間以上も電池が持つんですね。ありがたいことではありますが完全放電させてしまいたい今、ちょっとじれったいです。

コメント

ひぐち:

ご無沙汰してます、ひぐちです。いやー、大変でしたね。お疲れ様です。
早く最新版のHalWatchを使いたい身としては、トラブルから復旧するのを
ひたすら心待ちにしております。

>多分 Pref を書き換えたことによる不整合はハードウェアに記憶されていて
>ハードリセットでも回復できないのでしょう。

これは、通常のPalmデバイスであればあり得ないと思うのですが、WristPDAは
時計モードという特殊な機能を持っているので、何とも言えませんね。

ちなみに、ハードリセットは1回だけでは完全に初期化されず、連続して
3回くらい行った方が良い、という話を聞いたことがあります。特に、
PalmOS 4.X ではこのようなことがあるらしいので、一度お試しくださいませ。

それでは、復旧を祈っております。

  • 2005/11/15(火) 13:24:50 |
  • URL |
  • ひぐち #-
  • [ Edit]

HAL:

ひぐちさん,こんにちは。
いやー,トラブルというかなんというか。ほぼ全て自分でやったことに起因する問題なので理不尽さはあんまり感じないんですけどね。
(これで HalLaunch が他の作者さんのものだったりしたら解決はできていなかったかも知れないです。そう考えるとやっぱりソースコードは公開したほうがいいのかも…。まあメールを下さればソースを渡すことにはしているのですが)

ともあれ一つ問題を解決するごとに別の問題が起きている感じで,当初実現したかった機能といま解決している問題とのギャップに我ながらあきれてます。

ところで本文に書き忘れましたがひぐちさんから以前教わった FileZ を使って Preference のデータを読む手法を活用させてもらっています。ありがとうございます。

> これは、通常のPalmデバイスであればあり得ないと思うのですが、WristPDAは
> 時計モードという特殊な機能を持っているので、何とも言えませんね。

そうですね。本当の所は良く分かりません。
つい先日似たような問題が Yahoo Groups に書かれていたのでその記事からの類推です。

> ちなみに、ハードリセットは1回だけでは完全に初期化されず

それは知りませんでした。ぜひ試してみます。ありがとうございます。

ちなみに現在 PDA モードのまま放置して15時間経過しましたがやっとバッテリが残り5%を切りました。あとちょっとで完全放電するでしょうからそれからさらに半日か1日ほど置いて,その後連続してハードリセットを試してみます。

  • 2005/11/15(火) 15:19:23 |
  • URL |
  • HAL #sqCyeZqA
  • [ Edit]

ゆう:

かなり期待しちゃいます。
電気の消耗をいろいろ設定できるなんて、今の私にはとってもありがたいです。 気長に待ってます。

  • 2005/11/16(水) 12:00:41 |
  • URL |
  • ゆう #-
  • [ Edit]

HAL:

いやまあ,省電力効果もあれば嬉しいですけど実際にデバイスの電源を自動的に落とせるわけではないので,どちらかというとバッテリが少ないことをユーザーに意識させるための仕組みと思っててください。

画面を消せば多少は省電力効果もあるはずですけどそれが実際どのくらい稼働時間の延長に繋がるのかは未検証です。

本当は自動的に電源を落とせるようにしたくて色々試しているんですけど今のところうまくいってないです。

ちなみに本文で書いた挙動のおかしくなった機体は
完全放電 → 3連続ハードリセット → 一から環境再構築
で,何とか回復したみたいです。(ひぐちさんアドバイスありがとうございました)
まあまだ最低限のアプリしか入れていないのでもう少し環境を構築してから開発に復帰します。

  • 2005/11/16(水) 14:07:22 |
  • URL |
  • HAL #sqCyeZqA
  • [ Edit]

コメントの投稿 (Post Comment)

管理者にだけ表示を許可する (Only administrator can read this comment)

トラックバック

トラックバックURLはこちら
http://hal9.blog3.fc2.com/tb.php/66-5ee2e2c8