« October 2005 | Main | December 2005 »

2005.11.25

続々・NS Basic/PalmでWristPDAのボタン入力を判定

前回記事に、またHALさんからアドバイスをいただいた。

結局、NS Basic/PalmによるWristPDAのボタン入力判定は、以下のようになった。
これで完璧……だと思いたい。ダブルプッシュの判定もやってみた。
ダブルプッシュはsysinfo(1)で取得したTickを計測して実現。
長押し判定もやりたいけど、どうやって実現しようか?

'ダブルプッシュ判定無し版

Sub Form1003_Event()
If geteventtype() = nsbKeyOrButton Then
Select Case getkey()
Case &hb
Field1004.Text = "Page Up"
Case &hc
Field1004.Text = "Page Down"
Case &h2e
Field1004.Text = "Rocker Up"
SetEventHandled
Case &h2f
Field1004.Text = "Rocker Down"
SetEventHandled
Case &h30
Field1004.Text = "Rocker Enter"
End Select
End If

End Sub

---------------

'ダブルプッシュ判定付き版

Sub Project_Startup()
Global UpDoublePush as Integer
Global DownDoublePush as Integer
Global EnterDoublePush as Integer
End Sub

Sub Form1003_Event()
Dim DoublePushTick as Integer
DoublePushTick = Val(Field1010.Text)
If geteventtype() = nsbKeyOrButton Then
Select Case getkey()
Case &hb
Field1004.Text = "Page Up"
Case &hc
Field1004.Text = "Page Down"
Case &h2e
Field1004.Text = "Rocker Up"
If (sysinfo(1) - UpDoublepush) < DoublePushTick Then
Field1008.Text = "Up Double Push"
Else
Field1008.Text = "Not Up Double Push"
End If
UpDoublepush = sysinfo(1)
SetEventHandled
Case &h2f
Field1004.Text = "Rocker Down"
If (sysinfo(1) - DownDoublepush) < DoublePushTick Then
Field1008.Text = "Down Double Push"
Else
Field1008.Text = "Not Down Double Push"
End If
DownDoublepush = sysinfo(1)
SetEventHandled
Case &h30
Field1004.Text = "Rocker Enter"
If (sysinfo(1) - EnterDoublepush) < DoublePushTick Then
Field1008.Text = "Enter Double Push"
Else
Field1008.Text = "Not Enter Double Push"
End If
EnterDoublepush = sysinfo(1)
End Select
End If

End Sub

------------------

でもこれだと、ボタンを押していない時間が長いと、ダブルプッシュ判定の変数がオーバーフローするかな。

wristpda_getkey

--
検索用: nsbasic

|

2005.11.24

続・NS Basic/PalmでWristPDAのボタン入力を判定(未完)

前回の記事の引き続き。
WristPDAには欠かせない存在であるHALさんより、前回の記事にアドバイスをいただいた。
曰く、

具体的には FrmDispatchEvent() が false を返した場合に2度目のキーイベントが生成されるので,そうならないように自前のイベントハンドラで true を返してやればいいはずです。

とのことで、これそのものの実現はよく分からなかったものの、以下のようにSetEventHandledを書くと、Rocker Down/Upの2回目のイベントは来なくなるので、普通に判定すればOKになった。
でも、これを施術したアプリを起動中、電源が落ちなくなった……。
冒険はまだ続く。

もう古いので、こちら参照。

Sub Form1003_Event()
If geteventtype() = nsbKeyOrButton Then
Select Case asc(getkey())
Case 11
Field1004.Text = "Page Up"
Case 12
Field1004.Text = "Page Down"
Case 46
Field1004.Text = "Rocker Up"
Case 47
Field1004.Text = "Rocker Down"
Case 48
Field1004.Text = "Rocker Enter"
Case 17
Stop
End Select
End If
SetEventHandled
End Sub

|

2005.11.23

iPAQ h2210の保守、修理

■十字ボタンの自作

h2210-00

iPAQ h2210は、とてもcomfortableだけど華奢。
つまり、ぶっこわれやすい。

特に問題なのは十字ボタン。ツルシの状態から操作しにくいばかりか、使っているとすぐバカになってしまう。
十字ボタンの裏にある四角い穴が広がっていってしまい、ジョイスティック状のスイッチを押してくれなくなってしまうのだ。

これは、四角い穴が小さくなるように、穴の側面にゼリー状瞬間接着剤を塗ると症状が改善するのだが、ついにどうにもならなくなった。

というわけで、自作に挑戦。

まずは方針。「お湯で溶ける自由樹脂をペンのキャップ状のものの中に詰め込み、やわらかいうちにスイッチの四角い突起に押し付けて型を取る」

手始めに、スイッチの四角い突起のサイズをノギスで測る。2.5φ(1辺2.5mm)。
それでは、材料の物色に、渋谷のハンズにレッツゴー!

[材料その1]自由樹脂

h2210-01

お湯で溶け、冷えると十分な強度が出る自由樹脂。
以前、beyerdynamicのDT-250のコードを、重いカールコードから軽いコードに付け替えるときに必要になった部品を作った経験があり、固さは折り紙付き。でも、思った形に整形するのは難しいので、今回は外殻となるパーツが別に必要と判断。

黒を持っていたけど、銀色にしたかったので、銀色を追加。

[材料その2]ペンキャップみたいなパーツ

h2210-02

外殻となるパーツ。
最初はトラックポイントの頭を使おうと思ったけれど、うまく行きそうになかったのと、東急ハンズなんぞで入手できるはずもなく。
運良く見つけたのが、この針金のエンドキャップ。外径6φ/内径4.5φ。
樹脂製。ワニ口のビニールみたいな素材。
銀色のキャップも買ったが、サイズが大きかった。
このサイズのものは黒しか無かった。

[材料その3]2.5mmの角棒

h2210-03

スイッチの四角い突起に押し付けて型を取る作業に不安を感じていたので、同サイズの角棒を用意。
これは正解だった。
といっても、そうそうこのサイズのものは無いはず。東急ハンズ渋谷店の模型売り場で運良く発見。

[作業手順]

・自由樹脂をお湯で煮る
・やわらかくなった自由樹脂をエンドキャップに詰め込む
・角棒にグリスや剥離材を塗り、押し付ける
・冷えたら穴が深くなり過ぎないよう、また平面を出すためにカッターで開口面を削る
・グリスや剥離材を洗い流す
・装着テスト
・穴がゆるかったら、ゼリー状瞬間接着剤を側面にようじなどで塗布し、穴を狭める
・ちょうどいい長さにてっぺんも切断
・完成

h2210-05

h2210-06

書くと簡単だけど、きちんとした型を取るのが結構大変。それに、グリスでやったせいか、角棒を抜くのが大変。
自由樹脂と接着してしまう。
ダメだったら、またお湯であっためてやりなおし。

■スイッチをテスタで当たる

来るべきスイッチの根こそぎリプレイスへ向け、テスタで調査してみる。
ボタンからは八つの端子が出ており、うち三つがGND。
一つが、ボタン押し込み時に導通する端子。
ほかの四つがそれぞれ4方向に対応しているが、よく分からないのは、一つの端子が、2方向で導通状態になること。
例えば、右上の端子は、上と右の両方で導通状態になる。
これを再現するにはどういうやり方をすればいいのか? ダイオードでできるかな。
携帯電話のモックから方向ボタンを取り外して、移植することを考えているのだけど。

h2210-08

■失敗編・スリープスイッチ(仮称)を殺す

h2210は、バッテリの蓋が緩んでくると、バッテリ蓋の縁にあるスリープスイッチ(仮称)がうまく押されなくなって、使っていると、いきなりスリープがかかることがある。この症状も、結構頻発している様子。
バッテリ蓋をへの字に若干曲げて、スイッチの押し込みが強くなるようにすると直るのだけど、たまーになる。
分解ついでに、このウザいスイッチを殺すかと思ってジャンパを飛ばし、常に導通状態にしたところ、突発性スリープは当然起きなくなるものの、これはバックアップバッテリ動作への切り替えスイッチを兼ねているようで、この状態でバッテリを取り外すとハードリセット状態に。大失敗でした。

h2210-07

|

2005.11.22

NS Basic/PalmでWristPDAのボタン入力を判定

もう古いのでこっち参照。

NS Basic/PalmでWristPDAのボタン入力判定をやってみた。
全部GetKey()で値を返してくれたが、Rockerボタンがやっかい。
これは1度の入力につき、2回イベントが発生。それぞれ別の値を返してくる。
Rocker Upが46-->11、Rocker Downが47-->12といった感じだ。
1回目の46, 47はユニーク(固有)だが、2回目の11, 12はPage Up、Page Downと同じ値。
だから、46か47が来たら、その時点ではフラグを立てるだけでやり過ごし、11か12が来たら、フラグが立っているかどうかで、Rocker Up/Downか、Page Up/Downのどっちかと判定すればOK。

Rocker Up/Downの反応が鈍いのは、入力判定に2イベントループ分の時間がかかるからなのかと納得。

Asc()でIntegerに変換してから判定しているけど、Hexのまま判定したら、少しはレスポンスへの貢献があるだろうか。

'Startupでフラグ用のGlobalな変数を用意。
Sub Project_Startup()
Global RockerFlag as Integer
RockerFlag = 0
End Sub

'フォームのEventでボタン入力判定
Sub Form1003_Event()
If geteventtype() = nsbKeyOrButton Then
Select Case asc(getkey())
'Rocker Up2回目、もしくはPage Up
Case 11
If RockerFlag = 1 Then
Field1004.Text = "Rocker Up"
RockerFlag = 0
Else
Field1004.Text = "Page Up"
End If
'Rocker Down2回目、もしくはPage Down
Case 12
If RockerFlag = 1 Then
Field1004.Text = "Rocker Down"
RockerFlag = 0
Else
Field1004.Text = "Page Down"
End If
Case 46
'Rocker Up初回はフラグ立てるだけ
RockerFlag = 1
Case 47
'Rocker Down初回もフラグ立てるだけ
RockerFlag = 1
Case 48
'Rocker Enter
Field1004.Text = "Rocker Enter"
End Select
End If
End Sub
----
検索用: nsbasic

|

2005.11.19

NS/Basic Palmで実行ファイルに共有ライブラリを埋め込む

WristPDA用のアプリを作ろうとすると、デカフォントのためにNSBSystemLib.prcという共有ライブラリが必要になるけれども、それまでユーザにインストールさせるのは負担。
そんな場合は、実行ファイルの中に共有ライブラリをリソースとして埋め込む手が使えると知った。

共有ライブラリが必要な処理の前(普通はStartupだろう)に、共有ライブラリの存在判定をして、無かったらリソースからの展開処理を実行。
下記の例でいくと、「dbcreatedatabasefromresource("DBIM", 1009)」が実行されると、実行ファイルに埋め込んだNSBSystemLib.prcがメモリ中に復元され、共有ライブラリのインストールが完了。

実行ファイルに埋め込まれたNSBSystemLib.prcと、メモリに展開されたNSBSystemLib.prcとで、メモリを倍消費することになるが、Fatal Error知らずで、こりゃいいかも。

Sub Project_Startup()
Dim res as Integer
Dim dblib as Database

'NSBSystemLibが存在するかどうか、試しに開いてみる
res = dbopen(dblib, "NSBSystemLib", 0)
'NSBSystemLibが存在しなかったら、
If res > 0 Then
'リソースからデータベースファイル(共有ライブラリ)を作る
'Object IDは、プロジェクトにリソースとして放り込んだNSBSystemLibのもの
dbcreatedatabasefromresource("DBIM", 1009)
Else
'もし存在してたら、開いたNSBSystemLibを閉じる
res = dbclose(dblib)
End If
'共有ライブラリの読み込み
LoadLibrary "NSBSystemLib", "NSL"
End Sub

----
検索用: nsbasic

|

2005.11.18

Sigmarion IIIでNavi2chとRieceを動かす

Sigmarion III上でEmacsCEを動かしたスクリーンショットを見たことがないので、一応上げてみるテスト。
白黒反転表示が好きなのですが、昼間の視認性と消費電力を考えるとノーマルで。
町田さんwceSKKSERVを動かしています。快適。

Navi2ch(実際には1ペインで使ってます)

20051118032354

Riece(IRCはあんまりやんないのですが)

20051118031233

|

2005.11.17

続・NS Basic/PalmでWristPDAのラージフォントを使う

やっぱりFieldでもラージフォント(Font ID 18, 23)使えました。
ProjectのStartupで例によってNSBSystemLibを読み込み、以下のようにすればOKです。

FieldSetFontの最初の引数はオブジェクトのID。Field1005ってNameのオブジェクトのIDは、デフォルトでは1005なので、1005ですね。第二引数はFont IDなので、WristPDAのデカ太フォントだと23です。
返り値は受け取らない形です。

Sub Form1003_After()
Field1005.Text = "FieldでFont ID 23を利用するテストです。"
NSL.FieldSetFont 1005, 23
End Sub

LargeFontTest2

名前の通り、指定はFieldにしか効かないのが残念。

----
検索用: nsbasic

|

NS Basic/PalmでWristPDAのラージフォントを表示する

NS Basic/Palmは、標準的な方法だとFont ID 7までのフォントしか使えず、WristPDA上で見ると、文字が小さくて辛いですが、NSBSystemLibを使った師の教えを実行したら、NS Basic/PalmでもWristPDAのラージフォント(Font ID 18, 23)を表示できました。

この手は以前書いたようにDrawCharでしか使えないようなので、Fieldなどのコントロール内の文字を大きくすることはできませんが、それでも助かることは確か。

スクリーンショットのボタン上のデカテキストは、ボタンのLabelを空白にしておいて、その上にDrawCharsで座標合わせて描いてます。名付けてUniFEP方式(w
POSE上では描いている様が丸分かりですが(VirtualPC上のPOSEなもんで)、WristPDAの実機では大丈夫。
FormのAfterに書いておけば、画面を変遷するアプリでも、ちゃんとFormの描画時に描き直してくれるので大丈夫。ボタンを押したときの反転においても、四角いフチが露呈するというようなことも無く、実に自然。

Fieldで文字入力するときの文字を大きくできないのが実に残念ですが……。

追記:ちょ、ちょっと待った。Fieldは同じNSBSystemLibのFieldSetFontでできそうではないか。後で試します……。

LargeFont

'スタートアップで共有ライブラリ読み込み。実行環境にもNSBSystemLib.prc必要。

Sub Project_Startup()

LoadLibrary "NSBSystemLib", "NSL"

End Sub

'FormのAfterで文字を直接描画。

Sub Form1003_After()

Dim res as Integer

'フォームに直接書く
res = NSL.FontSetFont(18)
DrawChars "テスト(Font ID 18)" ,2 ,30

res = NSL.FontSetFont(23)
DrawChars "テスト(Font ID 23)" ,2 ,60

res = NSL.FontSetFont(7)
DrawChars "テスト(Font ID 7)" ,2 ,90

res = NSL.FontSetFont(18)
DrawChars "ボタン" ,55 ,128

End Sub

----
検索用: nsbasic

|

2005.11.03

GSPlayer2.22aをWindows Mobile 2003(Pocket PC 2003)用にビルドする手順

NagamidoriさんのWindows Mobile (WindowsCE)用メディアプレイヤーの名作であるGSPlayerは、紆余曲折あって日本版のデバイスで動くバイナリが配布されていないので、ソースからビルドしてみる。

やってみると案外簡単。

ここを見て開発環境を整える(手抜き)。基本はMSからダウンロードしてきてインストールするだけ。
eVC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストールすればOK。

続いて、GreenSoftwareからGSPlayerのソースをいただいてくる。現時点での最新版は2.2a。解凍する。

eVC++ 4.0を起動する。「ファイル>ワークスペースを開く...」でダイアログを開き、GSPlayerのソースを解凍した場所までたどる。

まずは、「libmad」ディレクトリに下り、「libmad.vcw」を開く。

ポップアップメニュー「アクティブな WCE 構成を選択」から「POCKET PC 2003」を選択、右隣の「アクティブな構成の選択」から「Win32 (WCE ARMV4) Release」、もしくは「Win32 (WCE ARMV4) ReleaseXScale」から手持ちのデバイスに適合した方を選択。その右隣「既定のデバイスの選択」は、ActiveSync中なら「POCKET PC 2003 Device」にしておくといいのかもしれない。この設定を、本記事内では「ターゲットの設定」と呼ぶことにします。

F7キーを押してビルド。

ログにエラーが無いことを確認して、次へ。警告はいいです。

「ファイル>ワークスペースを開く...」でダイアログを開き、一つ上のフォルダへ移動し、「libovd」ディレクトリに下り、「libovd.vcw」を開く。「ターゲットの設定」を確認。

F7キーを押してビルド。

「ファイル>ワークスペースを開く...」でダイアログを開き、一つ上のフォルダへ移動し、「madplay」ディレクトリに下り、「madplay.vcw」を開く。「ターゲットの設定」を確認。

F7キーを押してビルド。

「ファイル>ワークスペースを開く...」でダイアログを開き、一つ上のフォルダへ移動し、「GSPlayer2>WinCE_PPC2」ディレクトリに下り、「GSPlayer2.vcw」を開く。「ターゲットの設定」を確認。

F7キーを押してビルド。

これで、ソースを解凍したフォルダの「bin」ディレクトリの奥底にバイナリが出来ているはず。
デバイスにコピーして実行してみてください。

ただ、どうもスクリーン下端のメニューバーがおかしくて、本来「ファイル、リスト、再生、ツール」という並びのはずが、「ツール」のところがプレイリスト追加ボタンになってしまい、そこから一つずつずれていって、SIPアイコンの左隣の空白の部分が削除ボタンになっています。このことを知っていれば普通に使えますが、気持ち悪いといえば気持ち悪いですね。

直して使っている人が居たら教えてください。RAD環境でしかGUIいじったことないので全然分からない……。

jornada7**で動くH/PC版は、同様にH/PCのSDKを落としてきてインストール、「ターゲットの設定」でしかるべき指定をしながらライブラリをビルド、なおかつ最終段階は「WinCE_HPC>GSPlayer2.vcw」のワークスペースを開いてビルドすればできるんじゃないかと思います。jornadaは音が悪いからビルドする気ゼロですが……。Sigmarion III専用版は、「WinCE4>GSPlayer2.vcw」を使うのかな。Sigmarion IIIは、jornadaより断然音いいですが、大きいしなあ。

|

Mac OS X用Palm Desktop 4.2.1 revB、revDで緊急の問題

ムスティさんのところで、Palm Desktop 4.2.1 revB及びrevDの注意点という記事が。rev B、rev Dをインストールすると、アクセス権がおかしなことになるそうだ。
Palm Desktop 4.2.1 rev B及びrev Dのインストール経験のある方は、アクセス権の修復を。

|

2005.11.02

NS Basic/Palm習作(WristPDA用アプリ)

WristPDA用に何か作ろうということで、NS Basic/Palmデモ版で作ってみた。

本の発売日から発行日と返品期限を求めるくだらないものだ。
Jot、Graffiti、スタイラスを使わずに人差し指で操作するインターフェイスというのを考えながら作ってみた。

app1

app2

フォームデザイナー上では、FONTはNS Basic/PalmデフォルトのFONT ID 0~7までしか指定できず、最大12ドットだからまだ字が小さい。

NSBSystemLib.inf / NSBSystemLib.prcがあれば、

当該プログラムのStartup codeに Sub main() LoadLibrary "NSBSystemLib", "NSL" End Sub をいれ After codeに

Dim WristPDAFontID as Integer

WristPDAFontId = NSL.FontSetFont(18)
DrawChars "TEST" ,10 ,40 'フォームに直接書く
WristPDAFontId = NSL.FontSetFont(23)
DrawChars "TEST" ,60 ,40 'フォームに直接書く

こんな風にしてNSBSystemLibのFieldSetFontやFontSetFontを使えば7以上のFONT IDが指定できるようだ。
しかし、デモ版には共有ライブラリNSBSystemLib.inf / NSBSystemLib.prcが添付されてない(デモ版の制限)ので、残念ながら試すことができない。

FieldSetFontは指定したフィールドのFONT IDに、FontSetFontは、直後のDrawCharsのFONT IDに影響を与えるもののようだ。
NS Basic/Palmは、NS Basic/CEのAddObjectステートメントのように、コードからコントロールを配置することができないようで、これではコントロールに大きな文字を使ったりができなさそう。
つまり、フォームデザイナーでもFONT ID 7以上に指定できないばかりか、コードからFontSetFontでFONT IDを指定してからコントロールを配置しようにも、コントロールを配置するファンクションが無いので八方塞がり。コントロールにFONT IDのR/Wなプロパティがあればいいが、これはフォームデザイナーのみで設定可能なプロパティということで、コードからは見えない。

コントロールのLabelを空白にしておいて、その上にDrawCharsでLabelを書けばいいのかもしれないが、なんかPSIONの日本語化キットであるところのEnFourのUniFEPの手法みたいで気持ち悪いなぁ(笑)。

やっぱりGCCでチクチク開発するしかないのだろうか。

|

« October 2005 | Main | December 2005 »