ページ

ラベル RfLedRestrictor の投稿を表示しています。 すべての投稿を表示
ラベル RfLedRestrictor の投稿を表示しています。 すべての投稿を表示

2007年12月24日

RfLedRestrictor更新

先週公開した RfLedRestrictorのエントリにコメントを頂きました。
匿名 さんのコメント...

/trafic は /traffic とすべきじゃないでしょうか?

...痛い、痛いよ(笑
ある意味「動かない」と言われるよりダメージ大きいですね。

でも、ご指摘ありがとうございます。
これ以上傷口が広がる前に修正しました。 通信に応じてLEDを点滅させるオプションは /packetまたは /trafficです。
(一応、/traficも有効にしています)

ついでに別件で修正中だった内容として電話で通話中にもLEDの制御をするようになっています。
また /blinkオプションと/trafficオプションを併用することで、 無通信時に一定間隔で点滅して、送受信時に通信に応じて点滅するようになっていると思います。

ただ、慌ててリリースしているのでいつも以上にバグが混入している可能性大です。
深刻なトラブルに見舞われた方は前の版に戻してください。
その時は /traficでお願いします(笑

2007年12月15日

電源供給中の判別

RfLedRestrictorの/psupply(電源供給時にだけLEDを制御)オプションが 満充電時に機能していないという指摘を頂いたのでプログラムを修正しました。
これまでは HKLM\System\State\Battery\Mainの値を snapi.hで定義されているSN_POWERBATTERYSTATE_FLAG_CHARGINGでマスクすることで 電源供給中かどうかを判定していました。
if (S_OK != RegistryGetDWORD(
 SN_POWERBATTERYSTATE_ROOT ,
 SN_POWERBATTERYSTATE_PATH ,
 SN_POWERBATTERYSTATE_VALUE ,
 &dwPowerBatteryState)) {
 dwPowerBatteryState = 0;
}
if (dwPowerBatteryState & SN_POWERBATTERYSTATE_FLAG_CHARGING) {
 // 電源供給中
}

ところが改めて確認してみると、充電中はビットが立っていますが 満充電になると下16ビットは 0になるようです。

確かによく見ると定数の名前は SN_POWERBATTERYSTATE_FLAG_CHARGING
今回も確認が足りませんでしたね。

という訳でレジストリを使う方法は諦めて GetSystemPowerStatusEx2を 使って電源供給中の判断をするように変更しました。
if (0 == GetSystemPowerStatusEx2(&systemPowerStatus, sizeof(systemPowerStatus), TRUE)) {
 systemPowerStatus.ACLineStatus = AC_LINE_UNKNOWN;
}
if (AC_LINE_ONLINE == systemPowerStatus.ACLineStatus) {
 // 電源供給中
}

こう書くと随分都合よく GetSystemPowerStatusEx2を見つけて来たようにも見えますが、 実際は Visual Studioで何気なく"ac_"と打った時に AC_LINE_OFFLINE, AC_LINE_ONLINEという候補が表示されて偶然見つけることができました。
統合開発環境様様ですね。

2007年12月12日

RfLedRestrictor更新

先日頂いていた要望への対応として RfLedRestrictorに通信にあわせてLEDを点滅させる機能を追加しました。
今回最後まで頭を抱えたのが、この機能を有効にするオプションの名前。
「/packet」と「/trafic」の2案を頂いていたので実装を終えてからも しばらく悩んでいました。
(ちなみに実装中のオプション名は「/blink2」でした...センス無いですね(笑 )

という訳で自分ではオプション名を決めかねたので両方有効にしています。
皆さんがしっくりくる方を使ってください。
RfLedRestrictor.exe /packet
RfLedRestrictor.exe /trafic

いずれかのオプションを指定することで、1秒ごとに通信状態を監視して 0.1秒ごとにLEDを点滅させます。
「もっと細かく通信状態をチェックしろ」とか「もう少し負荷を下げて」という場合は、 オプションの後に監視間隔、点滅間隔を指定できますので色々試して最適な値を探してみて下さい。
RfLedRestrictor.exe /packet 500 100
RfLedRestrictor.exe /trafic 1500 200
※指定はミリ秒単位になります

通信状態の監視もLEDの点滅も小さい方が奇麗に見えるのですが、負荷も気になるところです。
プロセスごとの負荷を確認する方法を調べてみないといけませんね。

2007年12月11日

パケット通信の送受信バイト数

RfLedRestrictorでパケットの送受信にあわせてLEDを点滅させて欲しいと要望を頂きました。

WifiAutoDisconnectでもパケット数を取得していますが、 あちらで利用しているIP Helper APIはパケット通信では利用できないようです。
代わりになるもを探してみたところ、 RAS関連のAPIで送受信バイト数及びフレーム数を取得できました。

RASCONN rasConn = {0};
RAS_STATS rasStatus = {0};
DWORD dwSize = sizeof(RASCONN),
 dwCount = 0;
rasConn.dwSize = dwSize;
RasEnumConnections(&rasConn, &dwSize, &dwCount);
if (0 != dwCount) {
 rasStatus.dwSize = sizeof(RAS_STATS);
 if (ERROR_SUCCESS == RasGetLinkStatistics(rasConn.hrasconn, 1, &rasStatus)) {
 // 受信フレーム数 : rasStatus.dwFramesRcved
 // 受信バイト数 : rasStatus.dwBytesRcved
 // 送信フレーム数 : rasStatus.dwFramesXmited
 // 受信バイト数 : rasStatus.dwBytesXmited
 }
}

これでパケット(実際には1つ下のレイヤのフレームですが)の送受信を判断できるので、 それにあわせてLEDを点滅させてやればよさそうです。
送受信フレーム数を取得する間隔と LED点滅の間隔をもう調整してやる必要がありますが、 それ以上に問題なのが 指定するオプションの名前(笑。

/blinkは既に使っているので別の名前を考えないといけないのですが、いい名前を思いつきません。> 何かわかりやすいオプション名は無いものでしょうか...。

2007年12月08日

RfLedRestrictor更新

RfLedRestrictorを更新しました。
  • (削除) up0818.zip (削除ここまで)
  • up0821.zip
    (12/09追記)
    /on /offオプションを追加しました。
通信終了後も LEDが点滅したままになる問題の対策として、一定時間ごとに接続状態を監視するように変更しました。
完全非常駐ではなくなりますが、これまでも LEDを点滅させる場合は点滅させるためのスレッドが動いていたので妥協しました。

これで LEDが点滅したまま残るということは無くなったように思うのですが、みなさんの環境ではいかがでしょう。

また、junさんから頂いていた要望で /silentオプションを指定することで 登録時・解除時のメッセージを表示しないようにしました。
本当に何も表示されないので 本当に登録されているのか不安な気もしますが 通信を開始すればわかるから大丈夫...ですよね。

2007年11月29日

RfLedRestrictor更新

RfLedRestrictorを更新しました。 そそそのそさんから頂いていた要望への対応として /psupplyオプションを指定することで電源供給時のみLEDの制御を行います。
アドエスで USB給電する設定にしておけばモデムとして使用中のみ LEDを点灯させることができると思います。

また、今回からコンパイルオプションを変更することで Windows Mobile 5.0でも動作るようになっています。
(W-ZERO3[es]での動作を確認しました)

切断後もLEDが点滅したままになることがある問題については、いくつか気になる点を変更してみたものの 再現手順がわからないので改善しているかどうか不明です。

トンネル等で圏外になったときに点滅したままになるという情報も頂いたので、 今しがた車を走らせてきましたが、 トンネルの中で圏外になったときは点滅が止まって圏内に戻ると点滅が再開しました。
(点滅が止まったのではなく、圏外になることによる消灯とLEDを使わない設定による消灯を繰り返しているのだと思います)

圏内に戻った時点で正常に通信できていたので、これはこれでいいのでしょうか?

2007年11月23日

RfLedRestrictor更新

RfLedRestrictorを更新しました。
モデムとして使用している時にも動作するようになっています。
そもそもの問題はアドエス単体で接続すると HKLM\System\State\Connections\Modem\Countが 0→1に変化するのですが、モデムとして使った場合は変化しない事でした。
最終的に HKCU\Software\Sharp\ShPhoneLib\PppConnectを監視するように変更しました。

次に問題になったのは /barerfオプションで [PT]アイコンを無効化させるときの処理。
これまでは接続が完了した段階でレジストリが変化していたのでそこからアイコン表示を戻す処理をすれば良かったのですが、 今回のレジストリは接続を開始した瞬間に変化するため [PT]アイコンに変わるのを待ってから表示を戻してやる必要がありました。

でも、今回最も手間取ったのはテスト用のモデム設定です(笑
モデムドライバを入れた後でPRINのダイアルアップ先の電話番号がわからずに結構探し回りました。
willcomのページの中の「データカード向けサービス」で紹介されているのですが、ずっと「電話機向けサービス」ばかり探していました...。
こんな馬鹿者もいるということで改善お願いします。>willcom様

あと、最初に白状しておきますがいろいろオプションを変えながらのテスト中に1回だけ回線を切断しても LEDが点滅し続けていた事がありました。
再現手順がわかった方はこっそり教えてください。

2007年11月19日

RfLedRestrictor更新

RfLedRestrictorを更新しました。
psythさんからご指摘頂いていた問題で、起動オプションを何も指定しなかった場合に通信終了イベントの登録に失敗してLEDが消灯していませんでした。
ついでに /barerfオプションだけを指定したときに通信を監視せずにプログラムを終了するように変更しました。
通常動作と同様、通信終了時にプログラムが起動してLEDを消灯します。

一通り動かしてみたつもりだったのですが 別の間違いもあって現象確認に手間取ってしまいました。
psythさんご連絡ありがとうございました。

2007年11月16日

RfLedRestrictor更新

RfLedRestrictorを更新しました。
  • (削除) up0780.zip (削除ここまで)
  • up0788.zip
    (11/19 追記)
    オプションを何も指定しなかった場合にLEDが消灯しないバグを修正しました。
起動時に "/barerf"オプションを指定することで、パケット通信中の[PT]アイコンを無効化することができます。
名前の通り BareRFのパクリです。ごめんなさい。

ところで RfLedRestrictorのテスト中にイヤな現象に気付きました。
パケット通信中に KeyLockSuspenderで強制サスペンドさせると LEDが光りっぱなしになりますね...。

サスペンドへの移行を検出したら一瞬踏みとどまって後始末ができればいいのですが、問答無用で落ちてしまうみたいです。
BareRFパクる前に 私家版KeyLockSuspenderが必要になりそうですね。

2007年11月09日

RfLedRestrictor更新

先日公開した RfLedRestrictorを更新しました。
修正点は以下の通りです。
  • tnjさんに頂いた非常駐化とバグ修正パッチの取り込み
  • パケット通信中の待機処理を廃止して完全非常駐に変更
  • eXarchさんから頂いていた要望でパケット通信中にLEDを点滅させる"/blink"オプションの追加
    (このときは今まで通り監視プロセスが常駐します)

今回このプログラムを WM5用にもビルドしようと思ったのですが、 自宅のPC(Windows Vista)に WM5 SDKをインストールすることができませんでした。
(インストール途中の画面のまま先に進みません...)

esを引っ張り出して動作確認してみたのですが、WM6 SDKでビルドしたバイナリだと例のエラーが表示されて実行できないみたいです。


WM6 SDKでWM5互換モードのようなものが欲しいですよね。

2007年11月08日

電波状態LEDの制御 その2

2chのソフトスレから「パケット通信中だけ LED表示したい」という話が聞こえてきました。
別の人が RfLedを紹介してくれていたのですが、単にLEDを点灯させるだけの RfLedは趣旨が違いますね。
(でも、作った本人も忘れかけているようなソフトの名前を出していただいてありがとうございます)

という訳で、パケット通信中だけLEDを使用するアプリを作ってみました。
最初「パケット通信中かどうかを判断してパケット通信中であればLEDを使用するようにすればいいだけ」と思って作り始めたのですが、 LEDの使用・未使用を切り替えるために HKEY_CURRENT_USER\ControlPanel\Utility\RFIndicatorを変更しても動作を切り替えることができずに行き詰ってしまいました。

いろいろ調べた結果、電波状態LEDの切り替えは "RFindicator"というイベントをセットしてやらないと有効にならないとの事。
そんなのどうやって調べろと...

何でも実際に手を動かしてみると勉強することがたくさんあるものですね。


(追記)
(削除) esで動かないという話があったのですが、WM6からの機能(RegistryNotifyCallback)を使っていたので WM5用にはビルドできませんでした (削除ここまで)
RegistryNotifyCallbackは WM5でも使えました。WM5 SDKを入れるとビルドできるみたいです。
とりあえずソースだけアップしておきますので、誰か修正お願いします。

AltStyle によって変換されたページ (->オリジナル) /