📄 form1.vb
字号:
Me.Controls.Add(Me.ComboBox1)
Me.Controls.Add(Me.RadioButton1)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.ListView1)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.RadioButton2)
Me.Controls.Add(Me.RadioButton3)
Me.Controls.Add(Me.RadioButton4)
Me.Controls.Add(Me.RadioButton5)
Me.Controls.Add(Me.RadioButton6)
Me.Controls.Add(Me.Button2)
Me.MaximizeBox = False
Me.Name = "Form1"
Me.Text = "SHR_DEvent"
CType(Me.Timer1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
End Sub
Public Sub ThreadHandleEvent()
Dim pucBuffer As IntPtr
Dim SsmEvent As SSM_EVENT
Dim szErrMsg As String
Dim nretWaitForEvent As Integer
pucBuffer = Marshal.AllocHGlobal(100)
Do While True
SsmEvent.pvBuffer = pucBuffer
SsmEvent.dwBufferLength = MAX_BUFFERLEN
nretWaitForEvent = SsmWaitForEventA(50, SsmEvent)
If (nretWaitForEvent = 0) Then
Me.EventHandler(SsmEvent)
ElseIf (nretWaitForEvent = -2) Then
Exit Do
End If
Loop
Marshal.FreeHGlobal(pucBuffer)
End Sub
Public Sub EventHandler(ByRef pEvent As SSM_EVENT)
Dim dwCondition As Int32
Dim strTemp As String
Dim ch As Int32
dwCondition = pEvent.dwParam And &HFFFF& 'Reason of state transfer;
ch = pEvent.nReference 'channel number;
Dim nIndex As Int32
Select Case (ChannelState(ch).WorkState) 'Judge state
Case CH_IDLE 'Idle state
Select Case (pEvent.wEventCode) 'Judge event
Case E_CHG_ChState
If ((pEvent.dwParam And &HFFFF&) = TRUNK_STATUS.S_CALL_OFFLINE) Then 'Judge channel state
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).WorkState = CH_OFFLINE
ChannelState(ch).Lcd = New Byte(MAX_LCD_LEN) {}
ClearCallID(pEvent) 'Clear phone number buffer
End If
Case E_RCV_DSTDChannel
Select Case (pEvent.dwParam) 'Judge D-Channel event
Case DST_OFFHOOK
ChannelState(ch).Dir = UP
ChannelState(ch).WorkState = CH_ACTIVE
ChannelState(ch).Lcd = New Byte(MAX_LCD_LEN) {}
ClearCallID(pEvent) 'Clear phone number buffer
StartRecord(ch) 'Start record
Case DST_RING_ON
ChannelState(ch).Dir = DOWN
ChannelState(ch).WorkState = CH_RING
ClearCallID(pEvent) 'Clear phone number buffer
ChannelState(ch).Lcd = New Byte(MAX_LCD_LEN) {}
Case DST_MSG_CHG
strTemp = Marshal.PtrToStringAnsi(pEvent.pvBuffer, pEvent.dwDataLength)
ChannelState(ch).Lcd = System.Text.Encoding.Default.GetBytes(strTemp)
ChannelState(ch).LCDLen = pEvent.dwDataLength
End Select
End Select
Case CH_RING
Select Case (pEvent.wEventCode)
Case E_CHG_ChState
If (pEvent.dwParam And &HFFFF&) = TRUNK_STATUS.S_CALL_OFFLINE Then 'Judge channel state
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).WorkState = CH_OFFLINE
ChannelState(ch).Lcd = New Byte(MAX_LCD_LEN) {}
ClearCallID(pEvent) 'Clear phone number buffer
End If
case E_RCV_DSTDChannel:
Select Case (pEvent.dwParam)
Case DST_RING_OFF
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).WorkState = CH_IDLE
GetCallID(pEvent) 'Get phone number
Case DST_OFFHOOK
ChannelState(ch).Dir = DOWN
ChannelState(ch).WorkState = CH_ACTIVE
StartRecord(ch)
Case DST_MSG_CHG
strTemp = Marshal.PtrToStringAnsi(pEvent.pvBuffer, pEvent.dwDataLength)
ChannelState(ch).Lcd = System.Text.Encoding.Default.GetBytes(strTemp)
ChannelState(ch).LCDLen = pEvent.dwDataLength
End Select
End Select
Case CH_ACTIVE
Select Case (pEvent.wEventCode)
Case E_CHG_ChState
If ((pEvent.dwParam & &HFFFF&) = TRUNK_STATUS.S_CALL_OFFLINE) Then 'Judge channel state
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).WorkState = CH_OFFLINE
ChannelState(ch).Lcd = New Byte(MAX_LCD_LEN) {}
ClearCallID(pEvent) 'Clear phone number buffer
If (ChannelState(ch).IsRecord <> 0) Then
StopRecord(ch) 'Stop record
End If
End If
Case E_RCV_DSTDChannel
Select Case (pEvent.dwParam)
Case DST_ONHOOK
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).WorkState = CH_IDLE
GetCallID(pEvent)
StopRecord(ch)
Case DST_MSG_CHG
strTemp = Marshal.PtrToStringAnsi(pEvent.pvBuffer, pEvent.dwDataLength)
ChannelState(ch).Lcd = System.Text.Encoding.Default.GetBytes(strTemp)
ChannelState(ch).LCDLen = pEvent.dwDataLength
Case DST_ABANDONED
ChannelState(ch).WorkState = CH_WAITFOR_ONHOOK
GetCallID(pEvent)
StopRecord(ch)
End Select
End Select
Case CH_OFFLINE
If ((pEvent.wEventCode = E_CHG_ChState) And ((pEvent.dwParam And &HFFFF&) = TRUNK_STATUS.S_CALL_STANDBY)) Then
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).Lcd = New Byte(MAX_LCD_LEN) {}
ChannelState(ch).WorkState = CH_IDLE
ClearCallID(pEvent) 'Clear phone number buffer
End If
Case CH_WAITFOR_ONHOOK
Select Case (pEvent.wEventCode)
Case E_CHG_ChState
If ((pEvent.dwParam And &HFFFF&) = TRUNK_STATUS.S_CALL_OFFLINE) Then 'Judge channel state
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).WorkState = CH_OFFLINE
If (ChannelState(ch).IsRecord <> 0) Then
StopRecord(ch) 'Stop record
End If
End If
Case E_RCV_DSTDChannel
Select Case (pEvent.dwParam)
Case DST_ONHOOK
ChannelState(ch).Dir = UNKNOWN
ChannelState(ch).WorkState = CH_IDLE
Case DST_MSG_CHG
strTemp = Marshal.PtrToStringAnsi(pEvent.pvBuffer, pEvent.dwDataLength)
ChannelState(ch).Lcd = System.Text.Encoding.Default.GetBytes(strTemp)
ChannelState(ch).LCDLen = pEvent.dwDataLength
End Select
End Select
End Select
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.ListView1.View = View.Details
Me.ListView1.HeaderStyle = ColumnHeaderStyle.Clickable
Me.ListView1.MultiSelect = True
Me.ListView1.FullRowSelect = True
Me.ListView1.GridLines = True
Me.ListView1.Columns.Add("Channel num", 80, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("Channel state", 90, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("Listen state", 90, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("Record state", 85, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("Phone num", 70, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("LCD info", 230, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("Call direction", 100, HorizontalAlignment.Center)
'load configuration file and initialize system
If (SsmStartCti("ShConfig.ini", "ShIndex.ini") = -1) Then
MsgBox(SsmGetLastErrMsgA())
Return
End If
'Judge if the number of initialized boards is the same as
'that of boards specified in the configuration file
If (SsmGetMaxUsableBoard() <> SsmGetMaxCfgBoard()) Then
MsgBox(SsmGetLastErrMsgA())
Return
End If
MaxLine = SsmGetMaxCh()
If (MaxLine = -1) Then
MsgBox("Fail to call SsmGetMaxCh")
Return
End If
'Set event-mode
Dim EventSet As EVENT_SET_INFO
EventSet.dwWorkMode = 1
If (SsmSetEvent(-1, -1, True, EventSet) = -1) Then
MsgBox("Fail to call SsmSetEvent")
Return
End If
ListenChannel = MaxLine
InitChannelState() 'Initialize channel info
Timer1.Enabled = True
ThreadHandle = New Thread(New ThreadStart(AddressOf ThreadHandleEvent))
ThreadHandle.Start()
nRecFormat = -1 'default format
RadioButton1.Checked = True
RadioButton2.Checked = False
RadioButton3.Checked = False
RadioButton4.Checked = False
RadioButton5.Checked = False
RadioButton6.Checked = False
End Sub
Public Sub InitChannelState()
Dim nGetChType As Int32
Dim nChState As Int32
Dim i As Int32
For i = 0 To MaxLine - 1
nGetChType = SsmGetChType(i) 'Get channel type
If (nGetChType = -1) Then
MsgBox(SsmGetLastErrMsgA())
End If
If (nGetChType = 12) Then 'Digital telephone record channel
ChannelState(i).WorkState = CH_IDLE 'Off line state
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -