デバイスロストの検出と再接続方法
概要
このサンプルは、デバイスロストしたときのイベントハンドラーの使用方法を説明しています。
サンプルプログラム
サンプル(Python) | device_lost_event_python.zip |
---|
サンプルの出力
コード全体
import ctypes
import tisgrabber as tis
import time
#tisgrabber_x64.dllをインポートする
ic = ctypes.cdll.LoadLibrary("./tisgrabber_x64.dll")
tis.declareFunctions(ic)
#ICImagingControlクラスライブラリを初期化します。
#この関数は、このライブラリの他の関数が呼び出される前に1回だけ呼び出す必要があります。
ic.IC_InitLibrary(0)
class CallbackUserdata(ctypes.Structure):
""" コールバック関数に渡されるユーザーデータの例 """
def __init__(self, ):
self.unsused = ""
self.devicename = ""
self.connected = False
def frameReadyCallback(hGrabber, pBuffer, framenumber, pData):
# コールバック関数処理
# 省略
return
def deviceLostCallback(hGrabber, userdata):
""" このデバイスはコールバック関数を失いました。 カメラが切断された場合に呼び出されます。
この関数は、メインスレッドではなく、別スレッドで実行されます。
:param:hGrabber:これはグラバーオブジェクトへの実際のポインターです。(使用禁止)
:param:userdata:ユーザーデータ構造へのポインター
"""
userdata.connected = False
print("Device {} lost".format(userdata.devicename))
# コールバック関数を定義
# 関数ポインタを作成
frameReadyCallbackfunc = ic.FRAMEREADYCALLBACK(frameReadyCallback)
userdata = CallbackUserdata()
devicelostcallbackfunc = ic.DEVICELOSTCALLBACK(deviceLostCallback)
#ダイアログ画面を表示
hGrabber = tis.openDevice(ic)
if ic.IC_IsDevValid(hGrabber):
userdata.devicename = ic.IC_GetDeviceName(hGrabber).decode('utf-8', 'ignore')
userdata.connected = True
ic.IC_SetCallbacks(hGrabber,
frameReadyCallbackfunc, None,
devicelostcallbackfunc, userdata)
#連続モードでは、フレームごとにコールバックが呼び出されます。
ic.IC_SetContinuousMode(hGrabber, 0) #コールバック関数を使用するときには必ず定義
#Windowサイズを640x480にする
ic.IC_SetDefaultWindowPosition(hGrabber, 0)
ic.IC_SetWindowPosition(hGrabber, 0,0, 640, 480)
ic.IC_StartLive(hGrabber, 1)
print("接続しているデバイスをPCから切断してください。")
# デバイスロストを検出
while(userdata.connected):
time.sleep(0.5)
ic.IC_StopLive(hGrabber)
ic.IC_ReleaseGrabber(hGrabber)
#デバイス再認識しライブストリーミング開始
while(not userdata.connected):
hGrabber = ic.IC_LoadDeviceStateFromFile(None, tis.T("device.xml"))
if(ic.IC_IsDevValid(hGrabber)):
ic.IC_SetDefaultWindowPosition(hGrabber, 0)
ic.IC_SetWindowPosition(hGrabber, 0,0, 640, 480)
ic.IC_StartLive(hGrabber, 1)
userdata.connected = True
key = ""
while key != "q":
print("qキー: プログラムを終了")
key = input('qキーを押下してください。:')
ic.IC_StopLive(hGrabber)
else:
ic.IC_MsgBox(tis.T("No device opened"), tis.T("Device Lost Example"))
ic.IC_ReleaseGrabber(hGrabber)
解説
userdata = CallbackUserdata() #ユーザーデータ構造
devicelostcallbackfunc = ic.DEVICELOSTCALLBACK(deviceLostCallback)
デバイスロストのイベントハンドラーを発火させるために上記の関数ポインタを作成します。
userdata.devicename = ic.IC_GetDeviceName(hGrabber).decode('utf-8', 'ignore')
userdata.connected = True
ic.IC_SetCallbacks(hGrabber,
frameReadyCallbackfunc, None,
devicelostcallbackfunc, userdata)
IC_SetCallbacksにdevicelostcallbackfuncをセットすればイベントハンドラーの設定が完了します。
def deviceLostCallback(hGrabber, userdata):
userdata.connected = False
print("Device {} lost".format(userdata.devicename))
USBケーブルやLanケーブルなどをカメラやデバイスから外すと上記のイベントが発火します。
# デバイスロストを検出
while(userdata.connected):
time.sleep(0.5)
ic.IC_StopLive(hGrabber)
ic.IC_ReleaseGrabber(hGrabber)
PCがカメラを認識できなくなった段階でuserdata.connectedの値がfalseになりますので、上記のようにデバイスロストを検出してグラバーオブジェクトを破棄することができます。
#デバイス再認識しライブストリーミング開始
while(not userdata.connected):
hGrabber = ic.IC_LoadDeviceStateFromFile(None, tis.T("device.xml"))
#デバイスが有効か
if(ic.IC_IsDevValid(hGrabber)):
ic.IC_SetDefaultWindowPosition(hGrabber, 0)
ic.IC_SetWindowPosition(hGrabber, 0,0, 640, 480)
ic.IC_StartLive(hGrabber, 1)
userdata.connected = True
key = ""
while key != "q":
print("qキー: プログラムを終了")
key = input('qキーを押下してください。:')
また、接続していたカメラを再認識するようにするには上記の通り記載します。
openDeviceメソッドによってカメラを開くと自動的にxmlファイルが生成されるようになっていますので、while文のループ内でxmlファイルを読み込みデバイスが有効な状態であるのか確認し、デバイスが有効になったらライブスタートすることができます。