うーん・・・
LibreOffice の Python マクロで FeliCa カードの連続読み込みができない。
こういうソース(無限ループしてるけど、テストで break 処理書くのが面倒くさかっただけなんで(^^;;)をマクロ登録して、CardRead 関数を実行する。
# -*- coding: utf-8 -*-# LibreOffice 用マクロimport unodef CardRead(*args):import nfcfrom nfc.clf import RemoteTargetdef on_connect(tag):doc = XSCRIPTCONTEXT.getDocument()sheet = doc.getSheets().getByName('CardMst')cell = sheet.getCellByPosition(1,1)cell.String = str(tag)def main():while True:with nfc.ContactlessFrontend('usb') as clf:clf.connect(rdwr={'on-connect': on_connect})main()
そうすると、一枚目はちゃんと読み込んでシートの左上に ID が表示されるんだけど、二枚目のカードを読むと
com.sun.star.uno.RuntimeException: Error during invoking function CardRead in module file:///C:/Program%20Files/LibreOffice/share/Scripts/python/nfc_get_card_info.py (<class 'usb1.USBErrorAccess'>: LIBUSB_ERROR_ACCESS [-3]File "C:\Program Files\LibreOffice\program\pythonscript.py", line 907, in invokeret = self.func( *args )<略>File "C:\Users\hoge\AppData\Roaming\Python\Python35\site-packages\usb1\__init__.py", line 125, in raiseUSBErrorraise __STATUS_TO_EXCEPTION_DICT.get(value, __USBError)(value))
こんなエラーが出ちゃう。これ以降、一切カードは読めない。
どうも、権限の無いアクセスを USB デバイスにしたってことらしい(ちょっとググったが英語のページしかヒットしなかったので意訳(^^; 違ってたら正解を教えてくれナンス>識者の皆様)
ちなみに、このスクリプトをマクロではなく普通の Python スクリプトとして実行すると、そういうエラーは出ない。マクロ独自の症状のようだ。
結局、どうしてもこのエラーを解決できなかったので、外部の Python スクリプトとして実行しておいて、カード情報を読み込んだら内容を CSV ファイルに吐いて、LibreOffice Calc からその CSV ファイルを一定時間毎に読み込む形にしようと思ってるところだけど、「お前、馬鹿だなあ。こう直したら一発で解決だべ」って情報をお持ちの識者の方がいらっしゃったら、ぜひご教示くださいませ。