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

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

スポンサーサイト   [English]

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

時計アプリの変数   [English]

今回はプログラミングの話です。さきらさんのとこ海苔音さんのとこで WristPDA の時計モードで動く TrainTime のようなものについて検討されているようなので,その参考になるかな?と思ってちょっと時計モードのプログラムについての覚書を記しておきます。

WristPDA の時計モード用のプログラムは普通の Palmware を作るのと比べて多少の制約や決まりごとがあります。でもまあ SDK のドキュメントを見ればわかりますがそれほど大した決まりごとでは無いです。既に Palmware の開発をしたことがある人ならすぐ時計アプリを作れると思います。

ただ,海苔音さんがまとめている通り時計モードでは操作できることが非常に限られているので,TrainTime のように複数のパラメータを変更する必要がある場合にはひと工夫必要です。

以下,ソースコードを交えて説明しますので興味のある方は続きを読むをクリックしてください。


以下は HalWatch 暫定版その2のソースの抜粋です。他にメモリの確保とかいろいろな処理は必要ですが,骨組みとしてはこんな感じです。
typedef struct {
UInt16 faceID;
UInt16 moduleID;
} MyGlobalVars_t;

UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags){

MyGlobalVars_t *gP = getMyGlobals();

switch(cmd){

/* PDAモードで普通のアプリとして起動した場合 */
case sysAppLaunchCmdNormalLaunch:
FrmGotoForm(FormID_PdaMain);
drawFace(gP->faceID, gP->moduleID);
myEventLoop();
FrmCloseAllForms();
break;

/* 以下は時計モード専用。これらの起動コードで呼び出された場合
* 一般的なイベントハンドリングは行えない。従ってパラメータの
* 変更は起動コードに応じて行わざるを得ない。
*/


/* 時計アプリ-必須。時計モードで1分に1回自動的に呼び出される */
case wpdaAppLaunchWatchDrawTime:
drawFace(gP->faceID, gP->moduleID);
break;

/* 時計アプリ-オプション。RockerDown が押された場合に呼び出される */
case wpdaAppLaunchWatchFaceNext:
/* 通常の時計アプリではここで gP->faceID++; を行う */
gP->moduleID++;
drawFace(gP->faceID, gP->moduleID);
break;

/* 時計アプリ-オプション。RockerUp が押された場合に呼び出される */
case wpdaAppLaunchWatchFacePrev:
gP->faceID--;
drawFace(gP->faceID, gP->moduleID);
break;

default:
break;
}
return errNone;
}

HalWatch はモジュール切り替えを行うために gP->moduleID という変数を使っていますが,単体の時計アプリならこの変数は不要です。
つまり普通の時計アプリは RockerUp/Down で一つの変数,faceID の値だけを変更して,その値に応じた時計を描画します。
一方 HalWatch ではモジュールの番号と各モジュールでのフェイスの切り替えをする必要があるのでそれぞれの切り替えを2つのキー操作に割り振っています。

Fossil の時計アプリ:変数の数=1,faceID
→ 変数の増減が可能

HalWatch:変数の数=2,moduleID, faceID
→ 変数は一方向にしか変えられない

さてここで3つ以上のパラメータを2つのキー操作だけで行う方法ですが,例えば
#define VarStation   0
#define VarTrain 1
#define VarDisp 2
#define NumberOfVars 3
int varID, varList[NumberOfVars];
として,上のコードでは
RockerDown → gP->moduleID++;
RockerUp → gP->faceID++;
のようになっているのを
RockerDown → varID++;
RockerUp → varList[varID]++;
として,描画ルーチンでは
varList[VarStation] で出発駅の指定
varList[VarTrain] で先発か次発かの指定
varList[VarDisp] で表示行数やフォントなどの指定
のように処理してやれば理屈では3つ以上の変数を扱うことが出来るはずです。つまり RockerUp で注目する変数(出発駅/先発か次発か/表示形式)を切り替えて,RockerDown で実際の値を切り替えるというやり方です。

ただ理屈では出来ると思いますが,これが使いやすいだろうかと考えると疑問です。このやり方では変数を一方向にしか変えられないので目的の駅や電車の項目を行き過ぎてしまうと,もう一度リストを一回りさせないと目的の項目に辿り着けません。データが少なければこれでもいいでしょうが,時刻表という性質上データが少ないとも思えません。

ではどうするのか?昨日までは私はこの方法しか無いと思っていたのですが,海苔音さんの記事を見て別な方法を思いつきました。かなり変則的ですがバックライトの状態を監視する方法です。

まずバックライトの状態取得関数を定義します。
Boolean HwrBacklight(Boolean set, Boolean newState)
SYS_TRAP(sysTrapHwrBacklightV33);

Boolean isBacklightOn(void){
return HwrBacklight(false, false);
}
時計モードではイベント処理などは行えませんが,このコードを実行すればバックライトの状態を知ることは出来ます。実際に簡単な時計アプリを作ってこのコードが実機の時計モードでちゃんと働くことは確かめました。

それでこの関数の利用例が以下のコードです。これは確かめたわけではないですが,多分大丈夫じゃないかと思います。
#define VarStation 0
#define VarTrain 1
#define VarDisp 2
#define NumberOfVars 3

typedef struct {
UInt16 varID;
Int32 varList[NumberOfVars];
} MyGlobalVars_t;

UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags){

MyGlobalVars_t *gP = getMyGlobals();

switch(cmd){

case sysAppLaunchCmdNormalLaunch:
/* 略 */
break;

case wpdaAppLaunchWatchDrawTime:
drawFace(gP->varList, gP->varID);
break;

case wpdaAppLaunchWatchFaceNext:
if(isBacklightOn())
gP->varID++;
else
gP->varList[gP->varID]++;
drawFace(gP->varList, gP->varID);
break;

case wpdaAppLaunchWatchFacePrev:
if(isBacklightOn())
gP->varID--;
else
gP->varList[gP->varID]--;
drawFace(gP->varList, gP->varID);
break;

default:
break;
}
return errNone;
}

これが目論見通りに働けば,バックライト点灯状態でのロッカーキー操作で注目する変数の切り替え(駅選択モード/先発,次発選択モード)を行い,非点灯状態の操作でその時のモードに応じて駅などの選択が可能になり,しかもリストの双方向移動が可能になるんじゃないかと思います。

コメント

コメントの投稿 (Post Comment)

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

トラックバック

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

電車時刻表搭載腕時計

いや、TrainTimeを参考にせずにTimeTable Viewerを参考にするという方向も考えているんで「TrainTime」と書かない方がいいかなぁと、でも「時刻表表示時計」だと当たり前すぎて意味わかんないなぁとか。いや、このサブジェクトもかなりわけわかんないですが。そんな事はどう

  • 2005/07/20(水) 16:13:45 |
  • ありし日の気分(改)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。