1. 增加 GetDVRDeviceConfig函数
2. 增加 NET_DVR_FindNextFile_V30 函数 3. 增加 NET_DVR_FindFile_V30 函数 4. 增加 新的 Go 数据模型 5. 规范化 Go 数据模型 6. 调整部分的 C 头文件中的结构体,以修复 CGo 无法识别函数参数类型的问题(https://stackoverflow.com/questions/59353668/get-the-struct-from-c-to-golang) 7. 简化球机退出登陆 8. 实现 NVR 相关接口 9. 编写 NVR 接口测试用例
This commit is contained in:
79
Core/core.go
79
Core/core.go
@@ -49,13 +49,13 @@ func Login(Ip string, Port int, Username string, Password string) (LONG, NET_DVR
|
||||
defer C.free(unsafe.Pointer(cUsername))
|
||||
cPassword := C.CString(Password)
|
||||
defer C.free(unsafe.Pointer(cPassword))
|
||||
var DeviceInfo C.NET_DVR_DEVICEINFO_V30
|
||||
cUserId := C.NET_DVR_Login_V30(cIp, C.WORD(Port), cUsername, cPassword, &DeviceInfo)
|
||||
var DeviceInfo NET_DVR_DEVICEINFO_V30
|
||||
cUserId := C.NET_DVR_Login_V30(cIp, C.WORD(Port), cUsername, cPassword, DeviceInfo.GetCPtr())
|
||||
if LONG(cUserId) == -1 {
|
||||
return -1, NET_DVR_DEVICEINFO_V30{}, LastError("NET_DVR_Login_V30")
|
||||
}
|
||||
DATA := CNET_DVR_DEVICEINFO_V30ToGO(&DeviceInfo)
|
||||
return LONG(cUserId), DATA, nil
|
||||
DeviceInfo.Go()
|
||||
return LONG(cUserId), DeviceInfo, nil
|
||||
}
|
||||
|
||||
func Logout(userId LONG) error {
|
||||
@@ -67,6 +67,12 @@ func Logout(userId LONG) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func NET_DVR_FindClose_V30(QueryHandle LONG) error {
|
||||
if C.NET_DVR_FindClose_V30(C.LONG(QueryHandle)) == C.FALSE {
|
||||
return LastError("NET_DVR_FindClose_V30")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func SerialStart(UserId LONG, CallBack serialDataCallBack) (LONG, error) {
|
||||
SerialStartParam := C.NET_DVR_SERIALSTART_V40{}
|
||||
@@ -111,19 +117,10 @@ func (d *CDVR_PTZPOS) Go() DVR_PTZPOS {
|
||||
}
|
||||
}
|
||||
func (d *CDVR_PTZPOS) Set(Action, PanPos, TiltPos, ZoomPos float64) {
|
||||
//a1 := DEC2HEX(Action)
|
||||
//a2 := DEC2HEX(PanPos)
|
||||
//a3 := DEC2HEX(TiltPos)
|
||||
//a4 := DEC2HEX(ZoomPos)
|
||||
//println(a1, a2, a3, a4)
|
||||
d.wAction = C.WORD(Action)
|
||||
d.wPanPos = C.WORD(DEC2HEX(PanPos))
|
||||
d.wTiltPos = C.WORD(DEC2HEX(TiltPos))
|
||||
d.wZoomPos = C.WORD(DEC2HEX(ZoomPos))
|
||||
//d.wAction = C.WORD(1)
|
||||
//d.wPanPos = C.WORD(0x77)
|
||||
//d.wTiltPos = C.WORD(0x88)
|
||||
//d.wZoomPos = C.WORD(0x99)
|
||||
}
|
||||
|
||||
type DVR_PTZPOS struct {
|
||||
@@ -189,6 +186,14 @@ func SetDVRConfig(lUserID LONG, dwCommand DWORD, lChannel LONG, lpInBuffer unsaf
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDVRDeviceConfig(lUserID LONG, dwCommand DWORD, dwCount DWORD, lpInBuffer unsafe.Pointer, dwInBufferSize DWORD, lpStatusList unsafe.Pointer, lpOutBuffer unsafe.Pointer, dwOutBufferSize DWORD) error {
|
||||
cResult := C.NET_DVR_GetDeviceConfig(C.LONG(lUserID), C.DWORD(dwCommand), C.DWORD(dwCount), C.LPVOID(lpInBuffer), C.DWORD(dwInBufferSize), C.LPVOID(lpStatusList), C.LPVOID(lpOutBuffer), C.DWORD(dwOutBufferSize))
|
||||
if cResult != 1 {
|
||||
return LastError("NET_DVR_GetDeviceConfig")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func LastError(funcName string) error {
|
||||
cCode := C.NET_DVR_GetLastError()
|
||||
if cCode == 0 {
|
||||
@@ -214,39 +219,19 @@ func PTZControlWithSpeed_Other(lUserID LONG, lChannel LONG, dwPTZCommand DWORD,
|
||||
return nil
|
||||
}
|
||||
|
||||
func CNET_DVR_DEVICEINFO_V30ToGO(CData *C.NET_DVR_DEVICEINFO_V30) NET_DVR_DEVICEINFO_V30 {
|
||||
var goData NET_DVR_DEVICEINFO_V30
|
||||
|
||||
// Copy the SSerialNumber field
|
||||
for i := 0; i < 48; i++ {
|
||||
goData.SSerialNumber[i] = BYTE(byte(CData.sSerialNumber[i]))
|
||||
func NET_DVR_FindFile_V30(lUserID LONG, lpFindFileInfo NET_DVR_FILECOND) (LONG, error) {
|
||||
Handle := C.NET_DVR_FindFile_V30(C.LONG(lUserID), lpFindFileInfo.GetCPtr())
|
||||
if Handle == -1 {
|
||||
return 0, LastError("NET_DVR_FindFile_V30")
|
||||
}
|
||||
|
||||
// Copy other fields
|
||||
goData.ByAlarmInPortNum = BYTE(CData.byAlarmInPortNum)
|
||||
goData.ByAlarmOutPortNum = BYTE(CData.byAlarmOutPortNum)
|
||||
goData.ByDiskNum = BYTE(CData.byDiskNum)
|
||||
goData.ByDVRType = BYTE(CData.byDVRType)
|
||||
goData.ByChanNum = BYTE(CData.byChanNum)
|
||||
goData.ByStartChan = BYTE(CData.byStartChan)
|
||||
goData.ByAudioChanNum = BYTE(CData.byAudioChanNum)
|
||||
goData.ByIPChanNum = BYTE(CData.byIPChanNum)
|
||||
goData.ByZeroChanNum = BYTE(CData.byZeroChanNum)
|
||||
goData.ByMainProto = BYTE(CData.byMainProto)
|
||||
goData.BySubProto = BYTE(CData.bySubProto)
|
||||
goData.BySupport = BYTE(CData.bySupport)
|
||||
goData.BySupport1 = BYTE(CData.bySupport1)
|
||||
goData.BySupport2 = BYTE(CData.bySupport2)
|
||||
goData.WDevType = WORD(CData.wDevType)
|
||||
goData.BySupport3 = BYTE(CData.bySupport3)
|
||||
goData.ByMultiStreamProto = BYTE(CData.byMultiStreamProto)
|
||||
goData.ByStartDChan = BYTE(CData.byStartDChan)
|
||||
goData.ByStartDTalkChan = BYTE(CData.byStartDTalkChan)
|
||||
goData.ByHighDChanNum = BYTE(CData.byHighDChanNum)
|
||||
goData.BySupport4 = BYTE(CData.bySupport4)
|
||||
goData.ByLanguageType = BYTE(CData.byLanguageType)
|
||||
goData.ByVoiceInChanNum = BYTE(CData.byVoiceInChanNum)
|
||||
goData.ByStartVoiceInChanNo = BYTE(CData.byStartVoiceInChanNo)
|
||||
|
||||
return goData
|
||||
return LONG(Handle), nil
|
||||
}
|
||||
|
||||
func NET_DVR_FindNextFile_V30(lFindHandle LONG, lpFindData *NET_DVR_FINDDATA_V30) (LONG, error) {
|
||||
state := C.NET_DVR_FindNextFile_V30(C.LONG(lFindHandle), (*lpFindData).GetCPtr())
|
||||
if state == -1 {
|
||||
return 0, LastError("NET_DVR_FindNextFile_V30")
|
||||
}
|
||||
lpFindData.Go()
|
||||
return LONG(state), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user