1. 移除计算 3*3 矩阵的逆的函数

2. 优化球机的登陆接口
3. 新增球机的登出接口
This commit is contained in:
kunmeng
2025-02-10 15:57:03 +08:00
parent 0aad52eef1
commit 4974011eee
3 changed files with 139 additions and 116 deletions

View File

@@ -1,6 +1,7 @@
package HikNetSDK
import (
"errors"
"fmt"
"sync"
"unsafe"
@@ -22,11 +23,41 @@ func NewHIKBallCamera(BallCameraCfg BallCamera) *HIKBallCamera {
}
}
func (hikBC *HIKBallCamera) Login() bool {
func (hikBC *HIKBallCamera) Login() (bool, uint, error) {
var ErrorCode uint
ErrorInfo := make([]byte, 128)
ErrorInfoPtr := &ErrorInfo[0]
hikBC.mux.Lock()
hikBC.State = initBallCamera(hikBC.core, hikBC.BallCameraCfg.Ip, hikBC.BallCameraCfg.Port, hikBC.BallCameraCfg.User, hikBC.BallCameraCfg.Password, hikBC.BallCameraCfg.Type)
hikBC.State = initBallCamera(hikBC.core, hikBC.BallCameraCfg.Ip, hikBC.BallCameraCfg.Port, hikBC.BallCameraCfg.User, hikBC.BallCameraCfg.Password, hikBC.BallCameraCfg.Type, unsafe.Pointer(&ErrorCode), ErrorInfoPtr)
outState := hikBC.State
hikBC.mux.Unlock()
return hikBC.State
return outState, ErrorCode, errors.New(goString(ErrorInfoPtr))
}
func (hikBC *HIKBallCamera) Logout() (bool, uint, error) {
var ErrorCode uint
ErrorInfo := make([]byte, 128)
ErrorInfoPtr := &ErrorInfo[0]
hikBC.mux.Lock()
hikBC.State = ballCameraLogout(hikBC.core, unsafe.Pointer(&ErrorCode), ErrorInfoPtr)
outState := hikBC.State
hikBC.mux.Unlock()
return outState, ErrorCode, errors.New(goString(ErrorInfoPtr))
}
// goString 将 `char*` 转换为 Go 字符串
func goString(cstr *byte) string {
if cstr == nil {
return ""
}
// 找到 C 字符串的长度(以 null 结尾)
data := unsafe.Slice(cstr, 128) // 假设最大长度 128实际可根据情况调整
for i, b := range data {
if b == 0 { // 遇到 null 终止符
return string(data[:i])
}
}
return string(data) // 如果没有 null 终止符,返回整个 slice
}
func (hikBC *HIKBallCamera) opt(action func() bool) bool {
@@ -97,39 +128,6 @@ func (hikBC *HIKBallCamera) WarpingPtByHomography(matrix []float64, p Point) Poi
return Point{X: x, Y: y}
}
func (hikBC *HIKBallCamera) Invert3x3() bool {
a := hikBC.BallCameraCfg.Matrix.Matrix[0]
b := hikBC.BallCameraCfg.Matrix.Matrix[1]
c := hikBC.BallCameraCfg.Matrix.Matrix[2]
d := hikBC.BallCameraCfg.Matrix.Matrix[3]
e := hikBC.BallCameraCfg.Matrix.Matrix[4]
f := hikBC.BallCameraCfg.Matrix.Matrix[5]
g := hikBC.BallCameraCfg.Matrix.Matrix[6]
h := hikBC.BallCameraCfg.Matrix.Matrix[7]
i := hikBC.BallCameraCfg.Matrix.Matrix[8]
det := a*(e*i-f*h) - b*(d*i-f*g) + c*(d*h-e*g)
if det == 0 {
return false
}
invDet := 1.0 / det
hikBC.BallCameraCfg.Matrix.InvMatrix = []float64{
(e*i - f*h) * invDet,
(c*h - b*i) * invDet,
(b*f - c*e) * invDet,
(f*g - d*i) * invDet,
(a*i - c*g) * invDet,
(c*d - a*f) * invDet,
(d*h - e*g) * invDet,
(b*g - a*h) * invDet,
(a*e - b*d) * invDet,
}
return true
}
func (hikBC *HIKBallCamera) mapping(startV float64, max float64, value float64, direction string, method string) float64 {
if direction == "+" {
if method == "inv" {

24
HikBallCamera_test.go Normal file
View File

@@ -0,0 +1,24 @@
package HikNetSDK
import "testing"
func TestHIKBallCamera_Login(t *testing.T) {
Init()
if DvrInit() != 0 {
t.Error("Dvr init failed")
}
Camera := NewHIKBallCamera(BallCamera{
Type: "BuKongQiu",
Name: "布控球",
Ip: "192.168.211.44",
Port: "8000",
User: "admin",
Password: "okwy1234",
Channel: 1,
})
State, ErrorCode, ErrorInfo := Camera.Login()
if !State {
t.Error(ErrorCode, ErrorInfo)
return
}
}

View File

@@ -10,10 +10,11 @@ import (
var libc uintptr
var (
DvrInit func() bool
DvrInit func() int
newHIKBallCamera func() unsafe.Pointer
initBallCamera func(core unsafe.Pointer, ip string, port string, username string, password string, BallMachineType string) bool
initBallCamera func(core unsafe.Pointer, ip string, port string, username string, password string, BallMachineType string, ErrorCode unsafe.Pointer, ErrorInfo *byte) bool
ballCameraLogout func(core unsafe.Pointer, ErrorCode unsafe.Pointer, ErrorInfo *byte) bool
ptzTo func(core unsafe.Pointer, Action int, P float32, T float32, Z float32) bool
ptzGet func(unsafe.Pointer, unsafe.Pointer, unsafe.Pointer, unsafe.Pointer) bool
stopBus func(unsafe.Pointer, int) bool