package stack
import (
"fmt"
"gb-cms/common"
)
const (
DeviceControlFormat = "\r\n" +
"\r\n" +
"DeviceControl\r\n" +
"%d\r\n" +
"%s\r\n" +
"%s\r\n" +
"\r\n"
)
// PTZCmd A.3.1 指令格式
type PTZCmd struct {
}
func (c *PTZCmd) Unmarshal() {
}
func (c *PTZCmd) Marshal(cmd, horizontalSpeed, verticalSpeed, zoomSpeed byte) string {
checkCode := uint16(0xA5+0x0F+0x01+cmd+horizontalSpeed+verticalSpeed+(zoomSpeed&0xF0)) % 256
// 地址范围000H—FFFH(即0—4095),其中000H地址作为广播地址。
// 注: 前端设备控制中,不使用字节3和字节7的低4位地址码,使用前端设备控制消息体中的统一编码标
// 识控制的前端设备。
// addr 12 bit
return fmt.Sprintf("A50F01%02X%02X%02X%02X%02X", cmd, horizontalSpeed, verticalSpeed, zoomSpeed, checkCode)
}
func (d *Device) ControlPTZ(command string, channelId string) {
var cmd byte
var horizontalSpeed, verticalSpeed, zoomSpeed byte = 0, 0, 0
switch command {
case "right":
cmd |= 1 << 0
horizontalSpeed = 30
break
case "left":
cmd |= 1 << 1
horizontalSpeed = 30
break
case "down":
cmd |= 1 << 2
verticalSpeed = 30
break
case "up":
cmd |= 1 << 3
verticalSpeed = 30
break
case "zoomin":
cmd |= 1 << 4
zoomSpeed = 30
break
case "zoomout":
cmd |= 1 << 5
zoomSpeed = 30
break
case "stop":
break
default:
return
}
ptzCmd := &PTZCmd{}
cmdHex := ptzCmd.Marshal(cmd, horizontalSpeed, verticalSpeed, zoomSpeed)
body := fmt.Sprintf(DeviceControlFormat, GetSN(), channelId, cmdHex)
request := d.BuildMessageRequest(channelId, body)
common.SipStack.SendRequest(request)
}