|  |  |  | @@ -10,7 +10,7 @@ import ( | 
		
	
		
			
				|  |  |  |  | 	"encoding/binary" | 
		
	
		
			
				|  |  |  |  | 	"errors" | 
		
	
		
			
				|  |  |  |  | 	"fmt" | 
		
	
		
			
				|  |  |  |  | 	"gitea.com/kunmeng/HikNetSDKPkg/core" | 
		
	
		
			
				|  |  |  |  | 	"gitea.com/kunmeng/HikNetSDKPkg/Core" | 
		
	
		
			
				|  |  |  |  | 	"sync" | 
		
	
		
			
				|  |  |  |  | 	"time" | 
		
	
		
			
				|  |  |  |  | 	"unsafe" | 
		
	
	
		
			
				
					
					|  |  |  | @@ -161,15 +161,15 @@ var HikPTZEnum = struct { | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | type BallCamera struct { | 
		
	
		
			
				|  |  |  |  | 	userId       core.LONG | 
		
	
		
			
				|  |  |  |  | 	userId       Core.LONG | 
		
	
		
			
				|  |  |  |  | 	_type        uint8 | 
		
	
		
			
				|  |  |  |  | 	deviceInfo   core.NET_DVR_DEVICEINFO_V30 | 
		
	
		
			
				|  |  |  |  | 	deviceInfo   Core.NET_DVR_DEVICEINFO_V30 | 
		
	
		
			
				|  |  |  |  | 	mu           sync.Mutex | 
		
	
		
			
				|  |  |  |  | 	expectedType byte | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | func NewBallCamera(Ip string, Port int, Username, Password string, Type uint8) (*BallCamera, error) { | 
		
	
		
			
				|  |  |  |  | 	UserId, DeviceInfo, err := core.Login(Ip, Port, Username, Password) | 
		
	
		
			
				|  |  |  |  | 	UserId, DeviceInfo, err := Core.Login(Ip, Port, Username, Password) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		return nil, err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					
					|  |  |  | @@ -191,7 +191,7 @@ func (this *BallCamera) GetPTZ() (PTZ, error) { | 
		
	
		
			
				|  |  |  |  | 		var data PTZ | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		ch := make(chan bool) | 
		
	
		
			
				|  |  |  |  | 		SerialStartHandle, err := core.SerialStart(this.userId, func(lSerialHandle core.LONG, lChannel core.LONG, pRecvDataBuffer []byte, dwBufSize core.DWORD, pUser unsafe.Pointer) { | 
		
	
		
			
				|  |  |  |  | 		SerialStartHandle, err := Core.SerialStart(this.userId, func(lSerialHandle Core.LONG, lChannel Core.LONG, pRecvDataBuffer []byte, dwBufSize Core.DWORD, pUser unsafe.Pointer) { | 
		
	
		
			
				|  |  |  |  | 			if dwBufSize != 7 { | 
		
	
		
			
				|  |  |  |  | 				ch <- false | 
		
	
		
			
				|  |  |  |  | 				return | 
		
	
	
		
			
				
					
					|  |  |  | @@ -220,7 +220,7 @@ func (this *BallCamera) GetPTZ() (PTZ, error) { | 
		
	
		
			
				|  |  |  |  | 			return data, err | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 		defer func() { | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialStop(SerialStartHandle) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialStop(SerialStartHandle) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				println(err.Error()) | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
	
		
			
				
					
					|  |  |  | @@ -250,9 +250,9 @@ func (this *BallCamera) GetPTZ() (PTZ, error) { | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 		return data, nil | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	var data core.CDVR_PTZPOS | 
		
	
		
			
				|  |  |  |  | 	var data Core.CDVR_PTZPOS | 
		
	
		
			
				|  |  |  |  | 	var dataPtr = unsafe.Pointer(&data) | 
		
	
		
			
				|  |  |  |  | 	err := core.GetDVRConfig(this.userId, 293, 1, dataPtr, core.DWORD(unsafe.Sizeof(data))) | 
		
	
		
			
				|  |  |  |  | 	err := Core.GetDVRConfig(this.userId, 293, 1, dataPtr, Core.DWORD(unsafe.Sizeof(data))) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		return PTZ{}, err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					
					|  |  |  | @@ -274,13 +274,13 @@ func padding(n int) ([]byte, error) { | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | func (this *BallCamera) PtzGotoPut(Action int, P, T, Z float64) error { | 
		
	
		
			
				|  |  |  |  | 	if this._type == BuKongQiu { | 
		
	
		
			
				|  |  |  |  | 		SerialStartHandle, err := core.SerialStart(this.userId, func(lSerialHandle core.LONG, lChannel core.LONG, pRecvDataBuffer []byte, dwBufSize core.DWORD, pUser unsafe.Pointer) { | 
		
	
		
			
				|  |  |  |  | 		SerialStartHandle, err := Core.SerialStart(this.userId, func(lSerialHandle Core.LONG, lChannel Core.LONG, pRecvDataBuffer []byte, dwBufSize Core.DWORD, pUser unsafe.Pointer) { | 
		
	
		
			
				|  |  |  |  | 		}) | 
		
	
		
			
				|  |  |  |  | 		if err != nil { | 
		
	
		
			
				|  |  |  |  | 			return err | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 		defer func() { | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialStop(SerialStartHandle) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialStop(SerialStartHandle) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				println(err.Error()) | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
	
		
			
				
					
					|  |  |  | @@ -321,43 +321,43 @@ func (this *BallCamera) PtzGotoPut(Action int, P, T, Z float64) error { | 
		
	
		
			
				|  |  |  |  | 		zBuf = append(zBuf, zBufv) | 
		
	
		
			
				|  |  |  |  | 		switch Action { | 
		
	
		
			
				|  |  |  |  | 		case 1: | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, pBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, pBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, tBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, tBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, zBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, zBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			break | 
		
	
		
			
				|  |  |  |  | 		case 2: | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, pBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, pBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			break | 
		
	
		
			
				|  |  |  |  | 		case 3: | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, tBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, tBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			break | 
		
	
		
			
				|  |  |  |  | 		case 4: | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, zBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, zBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			break | 
		
	
		
			
				|  |  |  |  | 		case 5: | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, pBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, pBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			err = core.SerialSend(SerialStartHandle, tBuf) | 
		
	
		
			
				|  |  |  |  | 			err = Core.SerialSend(SerialStartHandle, tBuf) | 
		
	
		
			
				|  |  |  |  | 			if err != nil { | 
		
	
		
			
				|  |  |  |  | 				return err | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
	
		
			
				
					
					|  |  |  | @@ -367,19 +367,19 @@ func (this *BallCamera) PtzGotoPut(Action int, P, T, Z float64) error { | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 		return nil | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	var data core.CDVR_PTZPOS | 
		
	
		
			
				|  |  |  |  | 	var data Core.CDVR_PTZPOS | 
		
	
		
			
				|  |  |  |  | 	data.Set(float64(Action), P, T, Z) | 
		
	
		
			
				|  |  |  |  | 	var dataPtr = unsafe.Pointer(&data) | 
		
	
		
			
				|  |  |  |  | 	err := core.SetDVRConfig(this.userId, 292, 1, dataPtr, core.DWORD(unsafe.Sizeof(data))) | 
		
	
		
			
				|  |  |  |  | 	err := Core.SetDVRConfig(this.userId, 292, 1, dataPtr, Core.DWORD(unsafe.Sizeof(data))) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	return nil | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | func (this *BallCamera) retrySend(handle core.LONG, cmd []byte, maxRetries int, ch <-chan bool) error { | 
		
	
		
			
				|  |  |  |  | func (this *BallCamera) retrySend(handle Core.LONG, cmd []byte, maxRetries int, ch <-chan bool) error { | 
		
	
		
			
				|  |  |  |  | 	for retry := 0; retry < maxRetries; retry++ { | 
		
	
		
			
				|  |  |  |  | 		if err := core.SerialSend(handle, cmd); err != nil { | 
		
	
		
			
				|  |  |  |  | 		if err := Core.SerialSend(handle, cmd); err != nil { | 
		
	
		
			
				|  |  |  |  | 			return err | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @@ -401,14 +401,14 @@ func (this *BallCamera) retrySend(handle core.LONG, cmd []byte, maxRetries int, | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | func (receiver *BallCamera) StartBus(direction int, speed int) error { | 
		
	
		
			
				|  |  |  |  | 	err := core.PTZControlWithSpeed_Other(receiver.userId, core.LONG(receiver.deviceInfo.ByStartChan), core.DWORD(direction), core.DWORD(0), core.DWORD(speed)) | 
		
	
		
			
				|  |  |  |  | 	err := Core.PTZControlWithSpeed_Other(receiver.userId, Core.LONG(receiver.deviceInfo.ByStartChan), Core.DWORD(direction), Core.DWORD(0), Core.DWORD(speed)) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	return nil | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | func (receiver *BallCamera) StopBus(direction int, speed int) error { | 
		
	
		
			
				|  |  |  |  | 	err := core.PTZControlWithSpeed_Other(receiver.userId, core.LONG(receiver.deviceInfo.ByStartChan), core.DWORD(direction), core.DWORD(1), core.DWORD(speed)) | 
		
	
		
			
				|  |  |  |  | 	err := Core.PTZControlWithSpeed_Other(receiver.userId, Core.LONG(receiver.deviceInfo.ByStartChan), Core.DWORD(direction), Core.DWORD(1), Core.DWORD(speed)) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					
					|  |  |  | @@ -436,7 +436,7 @@ func (receiver *BallCamera) Logout() error { | 
		
	
		
			
				|  |  |  |  | 	//		return err | 
		
	
		
			
				|  |  |  |  | 	//	} | 
		
	
		
			
				|  |  |  |  | 	//} | 
		
	
		
			
				|  |  |  |  | 	err := core.Logout(receiver.userId) | 
		
	
		
			
				|  |  |  |  | 	err := Core.Logout(receiver.userId) | 
		
	
		
			
				|  |  |  |  | 	if err != nil { | 
		
	
		
			
				|  |  |  |  | 		return err | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
	
		
			
				
					
					|  |  |  |   |