// エラー情報出力例
void ErrMsg(const char *ErrorMsg, int Line)
{
ACAPERRORINFOEX ErrInfoEx = { 0 };
// 第一引数は予約なので0
AcapGetLastErrorCodeEx(0, &ErrInfoEx, FALSE);
printf("[Line:%d] %s\n", Line, ErrorMsg);
printf(" nChannel = %d\n", ErrInfoEx.nChannel);
printf(" dwCommonErrorCode = 0x%x\n", ErrInfoEx.dwCommonErrorCode);
printf(" dwBoardErrorCode = 0x%x\n", ErrInfoEx.dwBoardErrorCode);
printf(" dwExtendErrorCode = 0x%x\n", ErrInfoEx.dwExtendErrorCode);
printf(" dwAckCode = 0x%x\n", ErrInfoEx.dwAckCode);
printf(" nBaseErrorCode = 0x%x\n", ErrInfoEx.nBaseErrorCode);
printf(" nGCErrorCode = 0x%x\n", ErrInfoEx.nGCErrorCode);
if (ErrInfoEx.pErrMsg != NULL)
{
printf(" Msg: %s\n", ErrInfoEx.pErrMsg);
}
}
// 温度異常用コールバック関数例
void ThermalCallback(int nChannel, DWORD dwEvent, int nFrameNo, int nMemoryNo, void* pParam)
{
HANDLE hAcap = (HANDLE)pParam;
int val = 0;
// 割り込み要因(アラームステータス)の取得
if (AcapGetInfo(hAcap, nChannel, ACL_ALARM_STATUS, 1, &val) == 0)
{
ErrMsg("Failed to get ACL_ALARM_STATUS.", __LINE__);
return;
}
printf("ThermalCallback!! Ch %d AlarmStatus = 0x%x\n", nChannel, val);
}
// コールバック登録例
int main(void)
{
HANDLE hAcap = INVALID_HANDLE_VALUE;
int ch = 1;
ACAPBOARDINFOEX bi = { 0 };
// ボード情報の取得
if (AcapGetBoardInfoEx(&bi) != ACL_RTN_OK)
{
// サーマルシャットダウン中のボードが存在する場合、
// BoardErrorCodeにACL_3300_THERMAL_SHUTDOWN_ERRORが発生します。
// サーマルシャットダウン発生基板を特定するにはWindowsイベントログを参照してください。
ErrMsg("Failed to AcapGetBoardInfoEx.", __LINE__);
return -1;
}
if (bi.nBoardNum == 0)
{
printf("Found no boards.\n");
return -1;
}
// ボードインデックス0の基板をOpen(必要に応じて選択ロジックを実装)
hAcap = AcapOpen(bi.BOARDINDEX[0].pBoardName,
bi.BOARDINDEX[0].nBoardID,
ch);
if (hAcap == INVALID_HANDLE_VALUE || hAcap == NULL)
{
// サーマルシャットダウン中のボードが存在する場合、
// BoardErrorCodeにACL_3300_THERMAL_SHUTDOWN_ERROR(0x**54)が設定されます。
// サーマルシャットダウン発生基板を特定するにはWindowsイベントログを参照してください。
ErrMsg("Failed to open Acap.", __LINE__);
return -1;
}
// コールバック登録
// デバイスハンドルhAcapをpParamに渡すことで、
// ThermalCallback 内から AcapGetInfo が使用できます。
if (AcapRegistCallbackEx(hAcap,
ch,
ACL_INT_DEVICE_ALM,
ThermalCallback,
hAcap) == 0)
{
ErrMsg("Failed to AcapRegistCallbackEx.", __LINE__);
return -1;
}
printf("Waiting Thermal events... \n");
while (1)
{
Sleep(1000);
}
// 到達しない例だが、終了処理の参考として
// AcapClose(hAcap);
return 0;
}
|