ブレイルメモ・スマートへの対応
Windows 7 で USB 仮想シリアルポートを使って BMS40 を接続して、 KGS BrailleMemo 点字ドライバが有効な状態で NVDA を終了させようとすると、 NVDA が無反応になる(プロセスを簡単に終了させられなくなる)現象を確認しています。
開発版のソースから実行したときに起きていますが、 NVDA 2014.4jp でも同じような状況を把握しています。
他の機種との状況の違いはまだ確認していません。
KGS BrailleMemo 点字ドライバが有効な状態で NVDA を終了させようとすると NVDA が無反応になる状況での nvda.log は以下の通り:
INFO - core.main (11:39:03): Exiting WARNING - watchdog._watcher (11:39:26): Core frozen in stack: File "C:\work\nvda\nvdajp\source\nvda.pyw", line 166, in <module> core.main() File "C:\work\nvda\nvdajp\source\core.py", line 363, in main _terminate(watchdog) File "C:\work\nvda\nvdajp\source\core.py", line 408, in _terminate module.terminate() File "C:\work\nvda\nvdajp\source\watchdog.py", line 228, in terminate _watcherThread.join() File "C:\Python27\lib\threading.py", line 949, in join self.__block.wait() File "C:\Python27\lib\threading.py", line 340, in wait waiter.acquire() WARNING - watchdog._watcher (11:39:41): Core frozen in stack: File "C:\work\nvda\nvdajp\source\nvda.pyw", line 166, in <module> core.main() File "C:\work\nvda\nvdajp\source\core.py", line 363, in main _terminate(watchdog) File "C:\work\nvda\nvdajp\source\core.py", line 408, in _terminate module.terminate() File "C:\work\nvda\nvdajp\source\watchdog.py", line 228, in terminate _watcherThread.join() File "C:\Python27\lib\threading.py", line 949, in join self.__block.wait() File "C:\Python27\lib\threading.py", line 340, in wait waiter.acquire() WARNING - watchdog._watcher (11:39:56): Core frozen in stack: File "C:\work\nvda\nvdajp\source\nvda.pyw", line 166, in <module> core.main() File "C:\work\nvda\nvdajp\source\core.py", line 363, in main _terminate(watchdog) File "C:\work\nvda\nvdajp\source\core.py", line 408, in _terminate module.terminate() File "C:\work\nvda\nvdajp\source\watchdog.py", line 228, in terminate _watcherThread.join() File "C:\Python27\lib\threading.py", line 949, in join self.__block.wait() File "C:\Python27\lib\threading.py", line 340, in wait waiter.acquire() WARNING - watchdog._watcher (11:40:11): Core frozen in stack: File "C:\work\nvda\nvdajp\source\nvda.pyw", line 166, in <module> core.main() File "C:\work\nvda\nvdajp\source\core.py", line 363, in main _terminate(watchdog) File "C:\work\nvda\nvdajp\source\core.py", line 408, in _terminate module.terminate() File "C:\work\nvda\nvdajp\source\watchdog.py", line 228, in terminate _watcherThread.join() File "C:\Python27\lib\threading.py", line 949, in join self.__block.wait() File "C:\Python27\lib\threading.py", line 340, in wait waiter.acquire()
確認したこと
(1)
前述の NVDA 終了時の Core frozen in stack 現象は、 USB 仮想シリアルポートの接続で起きるが、BlueTooth 接続の場合は正常に NVDA を終了できて、 次回の NVDA 起動時には自動的に BMS40 に接続する。
(2)
実験的に IsKbdcInstalled() を呼び出さずに "BMシリーズ機器" の device name で bmStart するような 改変をしてみたところ KBDC を常駐させることなく NVDA が動作した。
念のために BMユーティリティをアンインストールしてみたが、問題なく BMS40 が接続できた。
BM ユーティリティのインストールが必須、という現在の仕様の見直しを検討する。
参考のために、KBDC チェックを行わないバージョン:
NVDA 日本語テスト版 jpbeta141229
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta141229.exe
このバージョンは本家の master をベースにしており 現在のバージョンの focusHightlight はエラーになるので注意してください。
NVDA 日本語テスト版 jpbeta141229 を dropbox に置いたと書いたのですが、 追加したデバッグコードに不具合があったので、削除しました。
修正版のスナップショットと kgsbms ブランチのアップロード:
NVDA 日本語テスト版 jpbeta141229
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta141229.exe
git commit -am "ti34739 (kgsbms) in progress" [kgsbms 96f6ab8] ti34739 (kgsbms) in progress 1 file changed, 7 insertions(+), 4 deletions(-) git push origin kgsbms Counting objects: 551, done. Delta compression using up to 2 threads. Compressing objects: 100% (116/116), done. Writing objects: 100% (350/350), 62.40 KiB | 0 bytes/s, done. Total 350 (delta 280), reused 292 (delta 232) To git@bitbucket.org:nvdajp/nvdajp.git * [new branch] kgsbms -> kgsbms
やはり USB 仮想ドライバーで直接(いったん「点字なし」に切り替えないで) NVDA を終了しようとすると kgs.py の terminate() に入る前に watchdog._watcher のフリーズが起きるようです。
jpbeta141229 を BM46 USB 接続で使う確認をしていたら、ポート自動選択の処理中にNVDAがクラッシュ、再起動する現象を確認したので、 ログをここに置いておきます:
INFO - __main__ (12:13:00): Starting NVDA INFO - core.main (12:13:00): Config dir: C:\nvdajp\userConfig INFO - core.main (12:13:00): NVDA version jpbeta141229 INFO - core.main (12:13:00): Using Windows version sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') INFO - core.main (12:13:00): Using Python version 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] INFO - core.main (12:13:00): Using comtypes version 0.6.2 INFO - synthDrivers.jtalk.mecab.Mecab_initialize (12:13:01): dic: C:\nvdajp\synthDrivers\jtalk\dic INFO - synthDrivers.jtalk.mecab.Mecab_initialize (12:13:01): mecab:0.996 nvdajp-jtalk-dic (utf-8) 20141128-071224 INFO - synthDrivers.jtalk.jtalkDriver.initialize (12:13:01): loaded C:\nvdajp\synthDrivers\jtalk\mei\mei_normal.htsvoice INFO - synthDriverHandler.setSynth (12:13:01): Loaded synthDriver nvdajp_jtalk INFO - core.main (12:13:01): Using wx version 2.8.12.1 (msw-unicode) INFO - braille.initialize (12:13:01): Using liblouis version 2.6.0 INFO - brailleDisplayDrivers.kgs.BrailleDisplayDriver.__init__ (12:13:01): first connection COM12 INFO - brailleDisplayDrivers.kgs._fixConnection (12:13:01): scanning port COM12 INFO - brailleDisplayDrivers.kgs.nvdaKgsStatusChangedProc (12:13:01): display size:46 INFO - brailleDisplayDrivers.kgs._fixConnection (12:13:01): connection:1 port:11 INFO - brailleDisplayDrivers.kgs.BrailleDisplayDriver.__init__ (12:13:01): connected COM12 INFO - braille.BrailleHandler.setDisplayByName (12:13:01): Loaded braille display driver kgs, current display has 46 cells. INFO - brailleInput.initialize (12:13:01): Braille input initialized INFO - core.main (12:13:02): NVDA initialized INFO - config.ConfigManager.save (12:13:03): Base configuration saved INFO - brailleDisplayDrivers.kgs.AutoPropertyType.getPossiblePorts (12:13:06): {u'COM9': u'Bluetooth リンク経由の標準シリアル (COM9)', u'COM11': u'Bluetooth リンク経由の標準シリアル (COM11)', u'COM10': u'Bluetooth リンク経由の標準シリアル (COM10)', u'COM12': u'KGS USB To Serial Com Port (COM12)', u'COM8': u'Bluetooth リンク経由の標準シリアル (COM8)'} INFO - brailleDisplayDrivers.kgs.BrailleDisplayDriver.terminate (12:13:11): KGS driver terminating INFO - brailleDisplayDrivers.kgs.bmDisConnect (12:13:11): BmEndDisplayMode COM12 1 INFO - brailleDisplayDrivers.kgs.bmDisConnect (12:13:13): BmEnd COM12 1 INFO - brailleDisplayDrivers.kgs.BrailleDisplayDriver.terminate (12:13:13): KGS driver terminated 1 INFO - brailleDisplayDrivers.kgs.BrailleDisplayDriver.terminate (12:13:13): KGS driver terminating done INFO - braille.BrailleHandler.setDisplayByName (12:13:13): Loaded braille display driver noBraille, current display has 0 cells. INFO - brailleDisplayDrivers.kgs.AutoPropertyType.getPossiblePorts (12:13:24): {u'COM9': u'Bluetooth リンク経由の標準シリアル (COM9)', u'COM11': u'Bluetooth リンク経由の標準シリアル (COM11)', u'COM10': u'Bluetooth リンク経由の標準シリアル (COM10)', u'COM12': u'KGS USB To Serial Com Port (COM12)', u'COM8': u'Bluetooth リンク経由の標準シリアル (COM8)'} INFO - brailleDisplayDrivers.kgs.BrailleDisplayDriver.__init__ (12:13:27): first connection auto INFO - brailleDisplayDrivers.kgs._autoConnection (12:13:27): set port:COM9 hw:BTHENUM\{00001101-0000-1000-8000-00805f9b34fb}_LOCALMFG&0000 fr:Bluetooth リンク経由の標準シリアル (COM9) bt:None INFO - brailleDisplayDrivers.kgs._fixConnection (12:13:27): scanning port COM9 INFO - brailleDisplayDrivers.kgs.nvdaKgsStatusChangedProc (12:13:40): unknown equipment INFO - brailleDisplayDrivers.kgs.nvdaKgsStatusChangedProc (12:13:48): unknown equipment INFO - brailleDisplayDrivers.kgs.nvdaKgsStatusChangedProc (12:13:56): unknown equipment INFO - brailleDisplayDrivers.kgs.bmDisConnect (12:14:02): BmEndDisplayMode 8 1 INFO - brailleDisplayDrivers.kgs.nvdaKgsStatusChangedProc (12:14:09): unknown equipment CRITICAL - watchdog._crashHandler (12:14:21): NVDA crashed! Minidump written to C:\Users\NISHIM~1\AppData\Local\Temp\nvda_crash.dmp INFO - watchdog._crashHandler (12:14:21): Restarting due to crash
kgsbms ブランチのスナップショット jpbeta150105
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta150105.exe
BMスマート40のUSBドライバがインストールされている場合に、 ポート選択でポート番号だけでなくデバイス名を表示する修正。
レジストリから情報を取得している。
ちなみに Bluetooth のシリアルポートの自動選択を実装するための情報を。 以下 COM13 が USB で、COM10 で Bluetooth 接続できていて、他のポートは BMS 以外のデバイス:
INFO - brailleDisplayDrivers.kgs._listComPorts (17:59:23): [{'friendlyName': u'KGS BM-SMART USB Serial (COM13)', 'hardwareID': u'', 'port': u'COM13'}, {'friendlyName': u'Bluetooth リンク経由の標準シリアル (COM9)', 'hardwareID': u'BTHENUM\\{00001101-0000-1000-8000-00805f9b34fb}_LOCALMFG&0000', 'bluetoothAddress': 0, 'port': u'COM9'}, {'friendlyName': u'Bluetooth リンク経由の標準シリアル (COM11)', 'hardwareID': u'BTHENUM\\{00001101-0000-1000-8000-00805f9b34fb}_LOCALMFG&0000', 'bluetoothAddress': 0, 'port': u'COM11'}, {'friendlyName': u'Bluetooth リンク経由の標準シリアル (COM8)', 'bluetoothName': u'BM Series', 'hardwareID': u'BTHENUM\\{00001101-0000-1000-8000-00805f9b34fb}_LOCALMFG&000f', 'bluetoothAddress': 46473942076L, 'port': u'COM8'}, {'friendlyName': u'Bluetooth リンク経由の標準シリアル (COM10)', 'bluetoothName': u'BMsmart-KGS', 'hardwareID': u'BTHENUM\\{00001101-0000-1000-8000-00805f9b34fb}_LOCALMFG&000f', 'bluetoothAddress': 62399805716174L, 'port': u'COM10'}]
kgsbms ブランチのテスト版 jpbeta150107
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta150107.exe
他の点字ディスプレイ用のドライバーで、 循環参照を回避するためにコールバック用の ctypes 関数オブジェクトを terminate で後処理しておく、 という記述があったので、kgs.py で同じことをやってみました。
いまのところ、BMS40 を USB でつないだまま NVDA を終了させてもハングアップしていません。
引き続き、自動接続の処理をもっとスピーディにできないか、検討したいと思います。
また、現在は kgsbn46 が別のドライバーにわかれてしまっていますが、 BMユーティリティに依存しないように改良したこともあり、 ブレイルノート、ブレイルメモ、スマートのドライバーの処理はほとんど同じ内容になりそうです。 なんとかひとつのドライバーに統合できないかと思っています。
接続したあとでどの機器が接続されたかわかれば、ジェスチャーマップを動的に切り替えられそうですが。。
手元の機材ではブレイルノートの検証ができないので、いずれテスト協力者を募りたいと思います。
ブレイルノートのドライバーの初期化が KBDC がない場合も失敗させないようにする変更:
[kgsbms a321bf5] kgsbn46 should not require KbdcName. 1 file changed, 1 insertion(+), 19 deletions(-)
ブレイルノートのドライバーも「循環参照を回避するためにコールバック用の ctypes 関数オブジェクトを terminate で後処理」の変更。
To git@bitbucket.org:nvdajp/nvdajp.git a321bf5..1333f66 kgsbms -> kgsbms
手元の BM46 は kgsbn46 ドライバーでも(おそらく互換モードで)動くので、以下の環境で動作を確認しています:
この状況で、前述の変更をしない場合は、「点字設定」で「点字なし」に戻さないで NVDA を終了するとハングアップする、前述の変更をした場合は正常に NVDA を終了できる、という効果を確認しています。
今後の作業ですが、他機種用の本家ドライバーの仕様を踏まえて、以下の3種類のドライバーに再編したいと思います:
実装については、デバイスごとの処理から、重複する処理を独立させて、共通コードに分けたいと思います。 (もともと私が書いたコードはそうでしたが、改良・追加されているうちに現状の状態になっていました)
本家版 NVDA の各機種用の点字ドライバーには、以下のような処理はないので、KGS 系のドライバーの仕様をどうするか、引き続き検討します。
特にポート自動選択の処理が長引くと、NVDA のダイアログが操作不能になってしまう問題は、改善が必要と考えています。
NVDA 日本語テスト版 jpbeta150113
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta150113.exe
DirectBM をインストールする必要がなくなって、 USB 接続の場合だけデバイスドライバが必要、 という状況になっているはずです。
前述した バッファロー USBシリアルコンバーター BSUSRC06 によるシリアルケーブル接続ですが、 やはり NVDA 終了時のフリーズが起きるようです。
検証を続けたいと思います。
NVDA 日本語テスト版 jpbeta150115
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta150115.exe
kgs ドライバーの変更点:
一部は ブレイルノート46 ドライバーでも対応済みです。
この仕様だと、たとえば下記のように動作します:
本当は Bluetooth もこういう感じに接続したいのですが、BM46 の BT ポートをスキャンすると DirectBM が応答しなくなる場合があり、 ケージーエスさんに相談中です。
これから newdirectbm ブランチでやる作業:
tools\build.cmd は c:\kgs\dev\DirectBM.dll を使ってビルドを行う。
DirectBM の更新版はいずれ KGS の開発者向けサイトから公開されるそうなので、 現時点では nvdajp のリポジトリには追加しないつもりです。
機能についての目標を達成できたと思うので、jpbeta にマージしました。
To git@bitbucket.org:nvdajp/nvdajp.git 1dbec20..2953208 jpbeta -> jpbeta
現状では c:\kgs\dev\DirectBM.dll として新しい DirectBM DLL の 場所を指定する必要がありますが、いずれリポジトリに統合する予定です。
仕様の変更や改良内容などを 2015.1jp に向けてドキュメントにまとめる必要があります。
また、可能ならソースのリファクタリングをしたいと思います。
launcher 環境(インストーラー)で kgs ドライバーの初期化に失敗する問題への対応:
To git@bitbucket.org:nvdajp/nvdajp.git 4e50d72..eaaf82d jpbeta -> jpbeta
「NVDA日本語版の説明」の改訂:
diff --git a/user_docs/en/readmejp.t2t b/user_docs/en/readmejp.t2t index f46cec2..9102373 100644 --- a/user_docs/en/readmejp.t2t +++ b/user_docs/en/readmejp.t2t @@ -370,17 +370,16 @@ eSpeak of NVDA cannot handle Japanese language. ++ KGS Braille Memo series ++ -The driver for braille display "KGS BrailleMemo series" from [KGS Corporation http://www.kgs-jpn.co.jp/] is added. BM46 is used for development and tests. BM32 is tested by the community members. +The driver for braille display "KGS BrailleMemo series" from [KGS Corporation http://www.kgs-jpn.co.jp/] is added. BMS40 and BM46 are used for development and tests. BM32 is tested by the community. Both automatic and manual port setting can be used. It also works with Bluetooth. -The BM Utility must be installed to the computer. +The BM Utility is used if it is installed to the computer. This driver is tested with BM Utility Version 6.2.2. For USB connection, virtual serial driver must also be installed. The device should be configured to use 9600BPS connection speed for virtual serial driver. -This driver allows you to choose connection port from COM1 to COM64. -If automatic setting fails, please choose the COM port directly. +This driver allows you to choose connection port from the available serial ports and the detected BM series devices via USB or Bluetooth connection. KGS Braille Memo driver supports following commands: @@ -531,7 +530,7 @@ Symbols: The driver for braille display "KGS BrailleNote 46C/46D" from [KGS Corporation http://www.kgs-jpn.co.jp/] is added. -The BM Utility must be installed to the computer. +The BM Utility can be used if it is installed to the computer. BrailleNote 46X is supported by "KGS BrailleMemo series" driver. Please do not use this driver for BrailleNote 46X. diff --git a/user_docs/ja/readmejp.t2t b/user_docs/ja/readmejp.t2t index dfe5595..69793c2 100644 --- a/user_docs/ja/readmejp.t2t +++ b/user_docs/ja/readmejp.t2t @@ -370,17 +370,16 @@ NVDA 日本語版ではメールアドレスやWebサイトのURLなどに日本 ++ KGS BrailleMemoシリーズ ++ -NVDA日本語版は点字ディスプレイドライバ "KGS BrailleMemoシリーズ" を追加しています。 +NVDA日本語版は点字ディスプレイドライバ "KGS BrailleMemoシリーズ" を追加しています。BMS40 および BM46 で検証されていますが、その他の機種でも動作が確認されています。 シリアルポート、USB(仮想Commドライバ)、Bluetoothの接続に対応しています。 -[ケージーエス株式会社 http://www.kgs-jpn.co.jp/] が提供する「BMシリーズ機器用ユーティリティ」をインストールしてお使いください。 +[ケージーエス株式会社 http://www.kgs-jpn.co.jp/] が提供する「BMシリーズ機器用ユーティリティ」にも対応しています。バージョン 6.2.2 での動作を確認しています。 USB 接続で使う場合は「ケージーエスUSB/仮想Commドライバ」をインストールしてください。 機器の通信速度が変更できる場合は 9600BPS に設定してください。 -このドライバーではポートの自動設定に加えて、COM1からCOM64までのポートが選択できます。 -USB接続で自動設定に失敗する場合は、ポートを指定して接続してください。 +このドライバーではポートの自動設定に加えて、手動でのポート選択ができます。 以下は KGS Braille Memo のコマンド割り当てです。 @@ -531,9 +530,9 @@ USB接続で自動設定に失敗する場合は、ポートを指定して接 NVDA日本語版は点字ディスプレイドライバ "BrailleNote 46C/46D" を追加しています。 -[ケージーエス株式会社 http://www.kgs-jpn.co.jp/] が提供する「BMシリーズ機器用ユーティリティ」をインストールしてお使いください。 +[ケージーエス株式会社 http://www.kgs-jpn.co.jp/] が提供する「BMシリーズ機器用ユーティリティ」にも対応しています。 -なお、ブレイルノート 46X にはこのドライバではなく、「BrailleMemoシリーズ」の点字ディスプレイドライバで使用してください。BM ユーティリティが必要です。 +なお、ブレイルノート 46X にはこのドライバではなく、「BrailleMemoシリーズ」の点字ディスプレイドライバで使用してください。 USB 接続で使う場合は「ケージーエスUSB/仮想Commドライバ」をインストールしてください。 機器の通信速度が変更できる場合は 9600BPS に設定してください。
NVDA 日本語チームとしてではなく西本の仕事なのですが、 ケージーエスさんから依頼を受けて、 NVDA 用のKGSドライバーの改良に取りかかっています。 2015年春までの契約でブレイルメモ・スマート BMS40 をお借りしています。 本チケットではこの作業について進捗を報告します。
関連チケット(いずれも対応済みですが、2015.1jp リリース前に再確認が必要)
#31455 KGS ブレイルノート46C/46D などへの対応
#33777 ブレイルメモBMスマート40がUSB接続で認識されない