Files
HikNetSDKPkg/Hikvision.go
2024-10-28 13:57:25 +08:00

208 lines
6.2 KiB
Go

package HikNetSDK
import (
"fmt"
"github.com/ebitengine/purego"
"runtime"
"unsafe"
)
var libc uintptr
var (
DVR_Init func() bool
newHIKBallCamera func() unsafe.Pointer
initBallCamera func(core unsafe.Pointer, ip string, port string, username string, password string, BallMachineType string) 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
startBus func(unsafe.Pointer, int, int) bool
newHIKNvr func() unsafe.Pointer
initNvr func(unsafe.Pointer, string, string, string, string, int) bool
checkTimeRegionWithMonth func(core unsafe.Pointer, year int, month int) string
checkTimeRegionWithDay func(core unsafe.Pointer, year int, month int, day int) string
nvrUTCDiff func(core unsafe.Pointer) int
)
func init() {
var err error
libc, err = openLibrary(getSystemLibrary())
if err != nil {
panic(err)
}
purego.RegisterLibFunc(&DVR_Init, libc, "DVR_Init")
purego.RegisterLibFunc(&newHIKBallCamera, libc, "NewHIKBallCamera")
purego.RegisterLibFunc(&initBallCamera, libc, "InitBallCamera")
purego.RegisterLibFunc(&ptzTo, libc, "PtzGotoPut")
purego.RegisterLibFunc(&ptzGet, libc, "PtzGet")
purego.RegisterLibFunc(&stopBus, libc, "StopBus")
purego.RegisterLibFunc(&startBus, libc, "StartBus")
purego.RegisterLibFunc(&newHIKNvr, libc, "NewHIKNvr")
purego.RegisterLibFunc(&initNvr, libc, "InitNvr")
purego.RegisterLibFunc(&checkTimeRegionWithMonth, libc, "CheckTimeRegionWithMonth")
purego.RegisterLibFunc(&checkTimeRegionWithDay, libc, "CheckTimeRegionWithDay")
purego.RegisterLibFunc(&nvrUTCDiff, libc, "NvrUTCDiff")
}
func getSystemLibrary() string {
switch runtime.GOOS {
case "linux":
if runtime.GOARCH == "amd64" || runtime.GOARCH == "386" {
return "libHikNetSDKPkg_linux_amd64.so"
} else {
return "libHikNetSDKPkg_linux_arm64.so"
}
case "windows":
return "HikNetSDKPkg_win_amd64.dll"
default:
panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
}
}
type HIKBallCamera struct {
core unsafe.Pointer
BallCameraCfg BallCamera
}
func NewHIKBallCamera(BallCameraCfg BallCamera) *HIKBallCamera {
return &HIKBallCamera{
core: newHIKBallCamera(),
BallCameraCfg: BallCameraCfg,
}
}
func (h *HIKBallCamera) Login() bool {
return initBallCamera(h.core, h.BallCameraCfg.Ip, h.BallCameraCfg.Port, h.BallCameraCfg.User, h.BallCameraCfg.Password, h.BallCameraCfg.Type)
}
func (h *HIKBallCamera) PtzTo(Action int, P, T, Z float32) bool {
return ptzTo(h.core, Action, P, T, Z)
}
func (h *HIKBallCamera) PTZGet(P, T, Z *float32) bool {
return ptzGet(h.core, unsafe.Pointer(P), unsafe.Pointer(T), unsafe.Pointer(Z))
}
func (h *HIKBallCamera) StopBus(Direction int) bool {
return stopBus(h.core, Direction)
}
func (h *HIKBallCamera) StartBus(Direction, Speed int) bool {
return startBus(h.core, Direction, Speed)
}
type HIKNvr struct {
core unsafe.Pointer
NvrConfig Nvr
}
func NewHIKNvr(nvrConfig Nvr) *HIKNvr {
return &HIKNvr{
core: newHIKNvr(),
NvrConfig: nvrConfig,
}
}
func (h *HIKNvr) Login() bool {
return initNvr(h.core, h.NvrConfig.Ip, h.NvrConfig.Port, h.NvrConfig.User, h.NvrConfig.Password, h.NvrConfig.Channel)
}
func (h *HIKNvr) CheckTimeRegionWithMonth(year int, month int) string {
return checkTimeRegionWithMonth(h.core, year, month)
}
func (h *HIKNvr) CheckTimeRegionWithDay(year int, month int, day int) string {
return checkTimeRegionWithDay(h.core, year, month, day)
}
func (h *HIKNvr) UTCDiff() int {
return nvrUTCDiff(h.core)
}
func (h *HIKBallCamera) WarpingPtByHomography(matrix []float64, p Point) Point {
var x, y, z float64
x = matrix[0]*p.X + matrix[1]*p.Y + 1.*matrix[2]
y = matrix[3]*p.X + matrix[4]*p.Y + 1.*matrix[5]
z = matrix[6]*p.X + matrix[7]*p.Y + 1.*matrix[8]
x /= z
y /= z
return Point{X: x, Y: y}
}
func (h *HIKBallCamera) mapping(startV float64, max float64, value float64, direction string, method string) float64 {
if direction == "+" {
if method == "inv" {
if value > (max - startV) {
return value - (max - startV)
} else {
return startV + value // 映射
}
} else {
if value > startV {
return value - startV
} else {
return (max - startV) + value // 映射
}
}
} else {
if value > startV {
return startV + max - value
} else {
return startV - value
}
}
}
func (h *HIKBallCamera) OneClickToSeeInFullView(point Point) bool {
TransPoint := h.WarpingPtByHomography(h.BallCameraCfg.Matrix.Matrix, point)
return h.PtzTo(5,
float32(h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, TransPoint.X, h.BallCameraCfg.Matrix.PPositiveDirection, "inv")),
float32(h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, TransPoint.Y, h.BallCameraCfg.Matrix.TPositiveDirection, "inv")),
0.0,
)
}
func (h *HIKBallCamera) PTZ2FullView() (Point, error) {
var ptz PTZ
if !h.PTZGet(&ptz.P, &ptz.T, &ptz.Z) {
return Point{}, fmt.Errorf("PTZ Get Error")
}
return h.WarpingPtByHomography(h.BallCameraCfg.Matrix.InvMatrix, Point{
X: h.mapping(h.BallCameraCfg.Matrix.PStart, h.BallCameraCfg.Matrix.PMax, float64(ptz.P), h.BallCameraCfg.Matrix.PPositiveDirection, ""),
Y: h.mapping(h.BallCameraCfg.Matrix.TStart, h.BallCameraCfg.Matrix.TMax, float64(ptz.T), h.BallCameraCfg.Matrix.TPositiveDirection, "")}), nil
}
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
}