Attribute VB_Name = "basCallBackEventProc"
'///////////////////////////////////////////////////////////////////////////////
'// Device       ：Card Reader/Writer Device Communication Control Liblary
'//
'// File Name    ：basCallBackEventProc.bas
'//
'// Purpose      ：Visual Basic 6 Standard Module
'//
'// Update       ：2013.03.26    Panasonic System Networks Co.,Ltd.
'//
'///////////////////////////////////////////////////////////////////////////////

' メモリコピー
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, _
                                                             ByVal Source As Long, _
                                                             ByVal Length As Long _
                                                             )

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
'//
'//     レスポンス受信イベントハンドラ登録（コールバック関数登録）
'//
'//     説明：ポーリングレスポンス受信イベント用のコールバック関数を登録いたします。
'//           （ポートクローズ時には強制解除されます。）
'//
'//     Integer = crwSetResponseEventProc(
'//                             iPortNo  (As Integer), _        '受信するポート[1〜256]
'//                             iRecMode (As Integer), _        'BusyStatus時polling[1:する/0:しない]
'//                             lTimeOut (As Long), _           'データ受信待ちタイマー(ms)[0:無限待ち]
'//                             AddressOf pResponseEventProc, _ 'CallBack関数名(0:登録解除)
'//                             pParam   (As Long), _           'Applicationによって定義された値(0で良い)
'//                             lEvent   (As Long) _            'CallBack関数で受け取る論理和
'//                             )
'//
'//     例 ：[COM7],[Busy Polling On],[10秒待ち],["ResponseEvent"],["A"受信＋DSR OFF信号]
'//               lEvent = EVT_RSP_CRW_RESPONSE + EVT_RSP_CRW_ERR_DSR（イベント指定）
'//         登録：Rtn = crwSetResponseEventProc(7,1,10000,AddressOf ResponseEvent,0,lEvent)
'//
'//         解除：Rtn = crwSetResponseEventProc(7,1,10000,0,0,lEvent)
'//
'//         コールバック関数に渡されるパラメータ:
'//         Public Sub ResponseEvent(ByVal iPortNo As Integer, _    'イベントが発生したポート
'//                                  ByVal lEvent As Long, _        'イベントが発生した論理和
'//                                  ByVal lpData As String, _      '受信データ
'//                                  ByVal iDataLen As Integer, _   '受信したデータの長さ
'//                                  ByVal pParam As Long _         'Applicationによって定義された値
'//                                  )
'//
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
Public Sub ResponseEvent(ByVal iPortNo As Integer, _
                         ByVal lEvent As Long, _
                         ByVal lpData As String, _
                         ByVal iDataLen As Integer, _
                         ByVal pParam As Long _
                         )

    Select Case lEvent
        Case EVT_RSP_CRW_RESPONSE
                'レスポンスデータ(“A”)受信
        Case EVT_RSP_CRW_READY
                'レスポンスデータ(“R”)受信
        Case EVT_RSP_CRW_BUSY
                'レスポンスデータ(“B”)受信が継続している
        Case EVT_RSP_CRW_CANCELED
                '登録解除による受信待ちキャンセル(ポーリング再送停止メソッドによりポーリング中止)
        Case EVT_RSP_CRW_ERR_RES_TIMEOUT
                'デバイスからの応答待ちタイムアウト
        Case EVT_RSP_CRW_ERR_CTS_TIMEOUT
                'CTSオン待ちタイムアウト
        Case EVT_RSP_CRW_ERR_DSR
                'DSRオフエラー（端末未接続／電源オフ）
        Case EVT_RSP_CRW_ERR_BCC_RETRY
                'BCCエラーリトライオーバー
        Case EVT_RSP_CRW_ERR_COMM_WRITE
                '送信時のWIN32APIエラー発生
        Case EVT_RSP_CRW_ERR_COMM_READ
                '受信時のWIN32APIエラー発生
    End Select
End Sub

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
'//
'//     バイナリデータ受信イベントハンドラ登録（コールバック関数登録）
'//
'//     説明：ＰＣＣ ＵＨＦ帯バイナリ受信イベント用のコールバック関数を登録いたします。
'//           （ポートクローズ時には強制解除されます。）
'//
'//     受信電文形式：[SYN][STX][lpData][SYN][ETX][LRC]
'//
'//     Integer = crwSetReceiveBinaryEventProc(
'//                         iPortNo  (As Integer), _                '受信するポート[1〜256]
'//                         lTimeOut (As Long), _                   'データ受信待ちタイマー(ms)[0:無限待ち]
'//                         AddressOf pReceiveBinaryEventProc, _    'CallBack関数名(0:登録解除)
'//                         pParam   (As Long), _                   'Applicationによって定義された値(0で良い)
'//                         lEvent   (As Long) _                    'CallBack関数で受け取る論理和
'//                             )
'//
'//     例 ：[COM11],[5秒待ち],["BinaryEvent"],[データ受信＋DSR OFF信号]
'//               lEvent = EVT_BIN_CRW_RESPONSE + EVT_BIN_CRW_ERR_DSR（イベント指定）
'//         登録：Rtn = crwSetResponseEventProc(11,5000,AddressOf BinaryEvent,0,lEvent)
'//
'//         解除：Rtn = crwSetResponseEventProc(11,5000,0,0,lEvent)
'//
'//         コールバック関数に渡されるパラメータ:
'//         Public Sub BinaryEvent(ByVal iPortNo As Integer, _      'イベントが発生したポート
'//                                  ByVal lEvent As Long, _        'イベントが発生した論理和
'//                                  ByVal lpData As String, _      '受信データ
'//                                  ByVal iDataLen As Integer, _   '受信したデータの長さ
'//                                  ByVal pParam As Long _         'Applicationによって定義された値
'//                                  )
'//
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
Public Sub BinaryEvent(ByVal iPortNo As Integer, _
                            ByVal lEvent As Long, _
                            ByVal lpData As Long, _
                            ByVal iDataLen As Integer, _
                            ByVal pParam As Long _
                            )

    ' バイナリデータ受信イベント
    Dim rData()     As Byte
    Dim strData     As String
    Dim i           As Integer
    Dim ptr         As Long
    
    Select Case lEvent
        Case EVT_BIN_CRW_RESPONSE
                'レスポンスデータ受信
                If iDataLen > 0 Then
                    ReDim rData(iDataLen)
                    ptr = VarPtr(rData(0))
                    Call MoveMemory(ptr, lpData, iDataLen)
                    strData = ""
                    For i = 0 To iDataLen - 1
                        strData = strData & Right$("0" & Hex(rData(i)), 2)
                    Next
                    MsgBox "Port No." & iPortNo & vbCrLf & _
                           "Receive Data = " & strData & vbCrLf & _
                           "RData Length = " & CStr(iDataLen) _
                           , vbInformation, "[ReceiveBinaryEvent]"
                Else
                    MsgBox "Port No." & iPortNo & " 0byte 受信?"
                End If
        Case EVT_BIN_CRW_CANCELED
                '登録解除による受信待ちキャンセル
        Case EVT_BIN_CRW_ERR_RES_TIMEOUT
                'デバイスからの応答待ちタイムアウト
        Case EVT_BIN_CRW_ERR_CTS_TIMEOUT
                'CTSオン待ちタイムアウト
        Case EVT_BIN_CRW_ERR_DSR
                'DSRオフエラー（端末未接続／電源オフ）
        Case EVT_BIN_CRW_ERR_BCC_RETRY
                'LRCエラーリトライオーバー
        Case EVT_BIN_CRW_ERR_COMM_WRITE
                '送信時のWIN32APIエラー発生
        Case EVT_BIN_CRW_ERR_COMM_READ
                '受信時のWIN32APIエラー発生
    End Select
End Sub

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
'//
'//     電文データ受信イベントハンドラ登録（コールバック関数登録）
'//
'//     説明：電文形式 [STX]+”lpData”+[ETX]+[BCC] 受信イベント用のコールバック関数を登録します。
'//           （ポートクローズ時には強制解除されます。）
'//
'//     受信電文形式：[SYN][STX][lpData][SYN][ETX][LRC]
'//
'//     Integer = crwSetReceiveDataBCCEventProc(
'//                         iPortNo         (As Integer), _             '受信するポート[1〜256]
'//                         iACKResponse    (As Integer), _             'ACK/NAKを返却するかどうかのフラグ（0 : しない / 0以外 : する）
'//                         lTimeOut        (As Long), _                'データ受信待ちタイマー(ms)[0:無限待ち]
'//                         AddressOf pReceiveBCCEventProc, _           'CallBack関数名(0:登録解除)
'//                         pParam          (As Long), _                'Applicationによって定義された値(0で良い)
'//                         lEvent          (As Long) _                 'CallBack関数で受け取る論理和
'//                             )
'//
'//     例 ：[COM11],[ACK返却],[5秒待ち],["BinaryEvent"],[データ受信＋DSR OFF信号]
'//               lEvent = EVT_BCC_CRW_RESPONSE + EVT_BCC_CRW_ERR_DSR（イベント指定）
'//         登録：Rtn = crwSetReceiveDataBCCEventProc(11,1,5000,AddressOf BCCEvent,0,lEvent)
'//
'//         解除：Rtn = crwSetReceiveDataBCCEventProc(11,5000,0,0,lEvent)
'//
'//         コールバック関数に渡されるパラメータ:
'//         Public Sub BCCEvent(ByVal iPortNo As Integer, _         'イベントが発生したポート
'//                                  ByVal lEvent As Long, _        'イベントが発生した論理和
'//                                  ByVal bstrData As String, _    '受信データ
'//                                  ByVal iDataLen As Integer, _   '受信したデータの長さ
'//                                  ByVal pParam As Long _         'Applicationによって定義された値
'//                                  )
'//
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
Public Sub BCCEvent(ByVal iPortNo As Integer, _
                    ByVal lEvent As Long, _
                    ByVal bstrData As String, _
                    ByVal iDataLen As Integer, _
                    ByVal pParam As Long _
                    )

    Select Case lEvent
        Case EVT_BCC_CRW_RESPONSE
                'レスポンスデータ受信
                If iDataLen > 0 Then
                    MsgBox "Port No." & iPortNo & vbCrLf & _
                           "Receive Data = " & bstrData & vbCrLf & _
                           "RData Length = " & CStr(iDataLen) _
                           , vbInformation, "[ReceiveDataBCCEvent]"
                End If
        Case EVT_BCC_CRW_CANCELED
                '登録解除による受信待ちキャンセル
        Case EVT_BCC_CRW_ERR_RES_TIMEOUT
                'デバイスからの応答待ちタイムアウト
        Case EVT_BCC_CRW_ERR_CTS_TIMEOUT
                'CTSオン待ちタイムアウト
        Case EVT_BCC_CRW_ERR_DSR
                'DSRオフエラー（端末未接続／電源オフ）
        Case EVT_BCC_CRW_ERR_BCC_RETRY
                'LRCエラーリトライオーバー
        Case EVT_BCC_CRW_ERR_COMM_WRITE
                '送信時のWIN32APIエラー発生
        Case EVT_BCC_CRW_ERR_COMM_READ
                '受信時のWIN32APIエラー発生
    End Select
End Sub

'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
'//
'//     通信イベントハンドラ登録（コールバック関数登録）
'//
'//     説明：シリアルポート通信イベント用のコールバック関数を登録いたします。
'//           （ポートクローズ時には強制解除されます。）
'//
'//     Integer = crwSetCommEventProc(
'//                         iPortNo  (As Integer), _       '受信するポート[1〜256]
'//                         AddressOf pCommEventProc, _    'CallBack関数名(0:登録解除)
'//                         pParam   (As Long), _          'Applicationによって定義された値(0で良い)
'//                         lEvent   (As Long) _           'CallBack関数で受け取る論理和
'//                             )
'//
'//     例 ：[COM6],,["CommEvent"],[データ受信検出 + BREAK信号＋DSR OFF信号]
'//               lEvent = EVT_CRW_RXCHAR + EVT_CRW_BREAK + EVT_CRW_DSR（イベント指定）
'//         登録：Rtn = crwSetCommEventProc(11,AddressOf CommEvent,0,lEvent)
'//
'//         解除：Rtn = crwSetCommEventProc(11,0,0,lEvent)
'//
'//         コールバック関数に渡されるパラメータ:
'//         Public Sub CommEvent(ByVal iPortNo As Integer, _      'イベントが発生したポート
'//                              ByVal lBufferLength As String, _ 'EVT_CRW_RXCHARが発生した時の入力バッファサイズ
'//                              ByVal lEvent As Long, _          'イベントが発生した論理和
'//                              ByVal pParam As Long _           'Applicationによって定義された値
'//                              )
'//
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////
Public Sub CommEvent(ByVal iPortNo As Integer, _
                     ByVal lBufferLength As Long, _
                     ByVal lEvent As Long, _
                     ByVal pParam As Long _
                     )
                     
    Dim ret         As Integer
    Dim rData()     As Byte
    Dim rDataLen    As Integer
    Dim strData     As String
    Dim i           As Integer
    
    Select Case lEvent
        Case EVT_CRW_RXCHAR
                '入力バッファにデータを受信した。
                    '例：バイナリ受信関数にて取得する場合
                    'ReDim rData(2048) As Byte
                    'ret = crwReceiveBinaryReport(iPortNo, 1000, 3, 1, 1, rData(0), 2048, rDataLen)
                    'If ret = RET_CRW_RESPONSE Then
                    '    strData = ""
                    '    For i = 0 To rDataLen - 1
                    '        strData = strData & Right$("0" & Hex(rData(i)), 2)
                    '    Next
                    '    MsgBox "Port No." & iPortNo & vbCrLf & _
                    '           "Receive Data = " & strData & vbCrLf & _
                    '           "Buffer Length = " & CStr(lBufferLength) & vbCrLf & _
                    '           "RData Length = " & CStr(rDataLen) _
                    '           , vbInformation, "[COMEvent]"
                    'Else
                    '    MsgBox " Error : " & ret, vbOKOnly
                    'End If
        Case EVT_CRW_TXEMPTY
                '出力バッファの最後の文字を送信した。
        Case EVT_CRW_ERR_FRAME
                'フレーミングエラーが発生した。
        Case EVT_CRW_ERR_OVERRUN
                'オーバーランエラーが発生した
        Case EVT_CRW_ERR_PARITY
                'パリティエラーが発生した。
        Case EVT_CRW_CTS
                'CTS (送信可) 信号の状態が変わった。
        Case EVT_CRW_DSR
                'DSR (データセットレディ) 信号の状態が変わった。
        Case EVT_CRW_RLSD
                'RLSD (受信線信号検出)信号の状態が変わった。
        Case EVT_CRW_BREAK
                'Break信号を検出した。
                    'PCC USB Virtual COM搭載デバイスをご使用の場合は、Break信号検出にてUSBケーブルの切断を検地することができます。
                    '例：
                    'crwClosePort(iPortNo)
                    'MsgBox "端末がＯＦＦです" & vbCrLf & "ケーブルの挿入状態を確認してください", vbOKOnly + vbCritical, "USBケーブル切断検地"
        Case EVT_CRW_RING
                '呼び出し信号を検出した。
    End Select
End Sub
