BallCamera.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package HikSDK
  2. import (
  3. "errors"
  4. "fmt"
  5. "sync"
  6. )
  7. const (
  8. Base = 0
  9. BuKongQiu = 1
  10. )
  11. type PTZEnumObj struct {
  12. PTZ_LEFT int
  13. PTZ_RIGHT int
  14. PTZ_UP int
  15. PTZ_DOWN int
  16. PTZ_UP_LEFT int
  17. PTZ_UP_RIGHT int
  18. PTZ_DOWN_LEFT int
  19. PTZ_DOWN_RIGHT int
  20. PTZ_ZOOM_IN int
  21. PTZ_ZOOM_OUT int
  22. PTZ_Focus_Far int
  23. PTZ_Focus_Near int
  24. }
  25. func (receiver *PTZEnumObj) toHikPTZEnum(v int) int {
  26. switch v {
  27. case PTZEnum.PTZ_LEFT:
  28. return HikPTZEnum.PAN_LEFT
  29. case PTZEnum.PTZ_RIGHT:
  30. return HikPTZEnum.PAN_RIGHT
  31. case PTZEnum.PTZ_UP:
  32. return HikPTZEnum.TILT_UP
  33. case PTZEnum.PTZ_DOWN:
  34. return HikPTZEnum.TILT_DOWN
  35. case PTZEnum.PTZ_ZOOM_IN:
  36. return HikPTZEnum.ZOOM_IN
  37. case PTZEnum.PTZ_ZOOM_OUT:
  38. return HikPTZEnum.ZOOM_OUT
  39. case PTZEnum.PTZ_Focus_Far:
  40. return HikPTZEnum.FOCUS_FAR
  41. case PTZEnum.PTZ_Focus_Near:
  42. return HikPTZEnum.FOCUS_NEAR
  43. case PTZEnum.PTZ_UP_LEFT:
  44. return HikPTZEnum.UP_LEFT
  45. case PTZEnum.PTZ_UP_RIGHT:
  46. return HikPTZEnum.UP_RIGHT
  47. case PTZEnum.PTZ_DOWN_LEFT:
  48. return HikPTZEnum.DOWN_LEFT
  49. case PTZEnum.PTZ_DOWN_RIGHT:
  50. return HikPTZEnum.DOWN_RIGHT
  51. default:
  52. return -1
  53. }
  54. }
  55. var PTZEnum = PTZEnumObj{
  56. PTZ_LEFT: 1,
  57. PTZ_RIGHT: 2,
  58. PTZ_UP: 3,
  59. PTZ_DOWN: 4,
  60. PTZ_UP_LEFT: 5,
  61. PTZ_UP_RIGHT: 6,
  62. PTZ_DOWN_LEFT: 7,
  63. PTZ_DOWN_RIGHT: 8,
  64. PTZ_ZOOM_IN: 9,
  65. PTZ_ZOOM_OUT: 10,
  66. PTZ_Focus_Far: 11,
  67. PTZ_Focus_Near: 12,
  68. }
  69. var HikPTZEnum = struct {
  70. LIGHT_PWRON int //接通灯光电源
  71. WIPER_PWRON int //接通雨刷开关
  72. FAN_PWRON int //接通风扇开关
  73. HEATER_PWRON int //接通加热器开关
  74. AUX_PWRON1 int //接通辅助设备开关
  75. AUX_PWRON2 int //接通辅助设备开关
  76. ZOOM_IN int //焦距变大(倍率变大)
  77. ZOOM_OUT int //焦距变小(倍率变小)
  78. FOCUS_NEAR int //焦点前调
  79. FOCUS_FAR int //焦点后调
  80. IRIS_OPEN int //光圈扩大
  81. IRIS_CLOSE int //光圈缩小
  82. TILT_UP int //云台上仰
  83. TILT_DOWN int //云台下俯
  84. PAN_LEFT int //云台左转
  85. PAN_RIGHT int //云台右转
  86. UP_LEFT int //云台上仰和左转
  87. UP_RIGHT int //云台上仰和右转
  88. DOWN_LEFT int //云台下俯和左转
  89. DOWN_RIGHT int //云台下俯和右转
  90. PAN_AUTO int //云台左右自动扫描
  91. TILT_DOWN_ZOOM_IN int //云台下俯和焦距变大(倍率变大)
  92. TILT_DOWN_ZOOM_OUT int //云台下俯和焦距变小(倍率变小)
  93. PAN_LEFT_ZOOM_IN int //云台左转和焦距变大(倍率变大)
  94. PAN_LEFT_ZOOM_OUT int //云台左转和焦距变小(倍率变小)
  95. PAN_RIGHT_ZOOM_IN int //云台右转和焦距变大(倍率变大)
  96. PAN_RIGHT_ZOOM_OUT int //云台右转和焦距变小(倍率变小)
  97. UP_LEFT_ZOOM_IN int //云台上仰和左转和焦距变大(倍率变大)
  98. UP_LEFT_ZOOM_OUT int //云台上仰和左转和焦距变小(倍率变小)
  99. UP_RIGHT_ZOOM_IN int //云台上仰和右转和焦距变大(倍率变大)
  100. UP_RIGHT_ZOOM_OUT int //云台上仰和右转和焦距变小(倍率变小)
  101. DOWN_LEFT_ZOOM_IN int //云台下俯和左转和焦距变大(倍率变大)
  102. DOWN_LEFT_ZOOM_OUT int //云台下俯和左转和焦距变小(倍率变小)
  103. DOWN_RIGHT_ZOOM_IN int //云台下俯和右转和焦距变大(倍率变大)
  104. DOWN_RIGHT_ZOOM_OUT int //云台下俯和右转和焦距变小(倍率变小)
  105. TILT_UP_ZOOM_IN int //云台上仰和焦距变大(倍率变大)
  106. TILT_UP_ZOOM_OUT int //云台上仰和焦距变小(倍率变小)
  107. }{LIGHT_PWRON: 2,
  108. WIPER_PWRON: 3,
  109. FAN_PWRON: 4,
  110. HEATER_PWRON: 5,
  111. AUX_PWRON1: 6,
  112. AUX_PWRON2: 7,
  113. ZOOM_IN: 11,
  114. ZOOM_OUT: 12,
  115. FOCUS_NEAR: 13,
  116. FOCUS_FAR: 14,
  117. IRIS_OPEN: 15,
  118. IRIS_CLOSE: 16,
  119. TILT_UP: 21,
  120. TILT_DOWN: 22,
  121. PAN_LEFT: 23,
  122. PAN_RIGHT: 24,
  123. UP_LEFT: 25,
  124. UP_RIGHT: 26,
  125. DOWN_LEFT: 27,
  126. DOWN_RIGHT: 28,
  127. PAN_AUTO: 29,
  128. TILT_DOWN_ZOOM_IN: 58,
  129. TILT_DOWN_ZOOM_OUT: 59,
  130. PAN_LEFT_ZOOM_IN: 60,
  131. PAN_LEFT_ZOOM_OUT: 61,
  132. PAN_RIGHT_ZOOM_IN: 62,
  133. PAN_RIGHT_ZOOM_OUT: 63,
  134. UP_LEFT_ZOOM_IN: 64,
  135. UP_LEFT_ZOOM_OUT: 65,
  136. UP_RIGHT_ZOOM_IN: 66,
  137. UP_RIGHT_ZOOM_OUT: 67,
  138. DOWN_LEFT_ZOOM_IN: 68,
  139. DOWN_LEFT_ZOOM_OUT: 69,
  140. DOWN_RIGHT_ZOOM_IN: 70,
  141. DOWN_RIGHT_ZOOM_OUT: 71,
  142. TILT_UP_ZOOM_IN: 72,
  143. TILT_UP_ZOOM_OUT: 73,
  144. }
  145. type BallCamera struct {
  146. userId LONG
  147. _type uint8
  148. deviceInfo NET_DVR_DEVICEINFO
  149. mu sync.Mutex
  150. expectedType byte
  151. }
  152. func NewBallCamera(Ip string, Port int, Username, Password string, Type uint8) (*BallCamera, error) {
  153. UserId, DeviceInfo, err := login(Ip, Port, Username, Password)
  154. if err != nil {
  155. return nil, err
  156. }
  157. return &BallCamera{
  158. userId: UserId,
  159. _type: Type,
  160. deviceInfo: DeviceInfo,
  161. }, nil
  162. }
  163. type PTZ struct {
  164. Action int
  165. P float64
  166. T float64
  167. Z float64
  168. }
  169. func (this *BallCamera) GetPTZ() (PTZ, error) {
  170. if this == nil {
  171. return PTZ{}, errors.New("BallCamera is nil")
  172. }
  173. if this._type == BuKongQiu {
  174. ptzpos, err := GetPTZPOS(this.userId)
  175. if err != nil {
  176. return PTZ{}, err
  177. }
  178. return PTZ{
  179. Action: ptzpos.Action,
  180. P: float64(ptzpos.P),
  181. T: float64(ptzpos.T),
  182. Z: float64(ptzpos.Z),
  183. }, nil
  184. }
  185. ptz, err := getPTZBase(this.userId)
  186. if err != nil {
  187. return PTZ{}, err
  188. }
  189. return PTZ{
  190. P: ptz.P,
  191. T: ptz.T,
  192. Z: ptz.Z,
  193. }, nil
  194. }
  195. func padding(n int) ([]byte, error) {
  196. if n < 0 || n > 65535 {
  197. return []byte{0x00, 0x00}, errors.New("n must be in the range 0-65535")
  198. }
  199. return []byte{byte(n >> 8), byte(n & 0xFF)}, nil
  200. }
  201. func (this *BallCamera) PtzGotoPut(Action int, P, T, Z float64) error {
  202. if this == nil {
  203. return errors.New("BallCamera is nil")
  204. }
  205. if this._type == BuKongQiu {
  206. PByte, err := padding(int(P * 100))
  207. if err != nil {
  208. return err
  209. }
  210. TByte, err := padding(int(T * 100))
  211. if err != nil {
  212. return err
  213. }
  214. ZByte, err := padding(int(Z * 100))
  215. if err != nil {
  216. return err
  217. }
  218. pBuf := append([]byte{0xff, 0x01, 0x00, 0x4b}, PByte...)
  219. tBuf := append([]byte{0xff, 0x01, 0x00, 0x4d}, TByte...)
  220. zBuf := append([]byte{0xff, 0x01, 0x00, 0x4f}, ZByte...)
  221. pBufv, err := verify(pBuf)
  222. if err != nil {
  223. return err
  224. }
  225. tBufv, err := verify(tBuf)
  226. if err != nil {
  227. return err
  228. }
  229. zBufv, err := verify(zBuf)
  230. if err != nil {
  231. return err
  232. }
  233. pBuf = append(pBuf, pBufv)
  234. tBuf = append(tBuf, tBufv)
  235. zBuf = append(zBuf, zBufv)
  236. err = SetPTZPos(this.userId, pBuf, tBuf, zBuf)
  237. if err != nil {
  238. return err
  239. }
  240. return nil
  241. }
  242. err := setPTZBase(this.userId, PTZ{Action, P, T, Z})
  243. if err != nil {
  244. return err
  245. }
  246. return nil
  247. }
  248. func (receiver *BallCamera) StartBus(direction int, speed int) error {
  249. if receiver == nil {
  250. return errors.New("BallCamera is nil")
  251. }
  252. err := pTZControlWithSpeed_Other(receiver.userId, DWORD(PTZEnum.toHikPTZEnum(direction)), DWORD(0), DWORD(speed))
  253. if err != nil {
  254. return err
  255. }
  256. return nil
  257. }
  258. func (receiver *BallCamera) StopBus(direction int, speed int) error {
  259. if receiver == nil {
  260. return errors.New("BallCamera is nil")
  261. }
  262. err := pTZControlWithSpeed_Other(receiver.userId, DWORD(PTZEnum.toHikPTZEnum(direction)), DWORD(1), DWORD(speed))
  263. if err != nil {
  264. return err
  265. }
  266. return nil
  267. }
  268. func verify(data []byte) (byte, error) {
  269. if len(data) < 6 {
  270. return 0, fmt.Errorf("data too short")
  271. }
  272. sum := 0
  273. for i := 1; i < 6; i++ {
  274. sum += int(data[i])
  275. }
  276. // 取模并转换为16进制
  277. checksum := sum % 0x100
  278. return byte(checksum), nil
  279. }
  280. func (this *BallCamera) Logout() error {
  281. if this == nil {
  282. return errors.New("BallCamera is nil")
  283. }
  284. return logout(this.userId)
  285. }
  286. func (this *BallCamera) Status() bool {
  287. if this == nil {
  288. return false
  289. }
  290. return deviceOnline(this.userId)
  291. }