📄 canon_vcc4_ptz.cpp
字号:
return false;
if(!ReadAnswer(answer, answer_len))
return false;
return true;
case PAN_SPEED_REQUEST:
if(!WriteFile(m_hComPort, "\xff\x30\x30\x00\x52\x30\xef", 7, &dNum, NULL))
return false;
if(!ReadAnswer(answer, answer_len))
return false;
return true;
case TILT_SPEED_REQUEST:
if(!WriteFile(m_hComPort, "\xff\x30\x30\x00\x52\x31\xef", 7, &dNum, NULL))
return false;
if(!ReadAnswer(answer, answer_len))
return false;
return true;
case ZOOM_SPEED_REQUEST:
if(!WriteFile(m_hComPort, "\xff\x30\x30\x00\xb4\x32\xef", 7, &dNum, NULL))
return false;
if(!ReadAnswer(answer, answer_len))
return false;
return true;
case PAN_TILT_ANGLE_REQUEST:
if(!WriteFile(m_hComPort, "\xff\x30\x30\x00\x63\xef", 6, &dNum, NULL))
return false;
if(!ReadAnswer(answer, answer_len))
return false;
return true;
case ZOOM_POSITION2_REQUEST:
if(!WriteFile(m_hComPort, "\xff\x30\x30\x00\xb4\x30\xef", 7, &dNum, NULL))
return false;
if(!ReadAnswer(answer, answer_len))
return false;
return true;
case ZOOM_MAX_REQUEST:
if(!WriteFile(m_hComPort, "\xff\x30\x30\x00\xb4\x33\xef", 7, &dNum, NULL))
return false;
if(!ReadAnswer(answer, answer_len))
return false;
return true;
}
return false;
}
BOOL C_CanonVCC4PTZ::Command(C4COMMAND cmd)
{
BYTE answer[20];
BYTE answer_len = 20;
if(!SendCommand(cmd, NULL, 0, answer, &answer_len))
return false;
if(answer[3] == 0x30 && answer[4] == 0x30)
return true;
else
return false;
}
BOOL C_CanonVCC4PTZ::RequestCommand(C4COMMAND cmd, BYTE *answer, BYTE *answer_len)
{
if(!SendCommand(cmd, NULL, 0, answer, answer_len))
return false;
if(answer[3] == 0x30 && answer[4] == 0x30)
return true;
else
return false;
}
BOOL C_CanonVCC4PTZ::AssignCommand(C4COMMAND cmd, BYTE *assign, BYTE len)
{
BYTE answer[20];
BYTE answer_len = 20;
if(!SendCommand(cmd, assign, answer_len, answer, &answer_len))
return false;
if(answer[3] == 0x30 && answer[4] == 0x30)
return true;
else
return false;
}
BOOL C_CanonVCC4PTZ::SpeedRequest(C4COMMAND cmd, DWORD *speed)
{
BYTE request[20];
BYTE len = 20;
//HexStringToDWORD("0AF3B33C", &dNum, 8);
//DWORDToHexString((char *)rcv_data, dNum, 8);
switch(cmd)
{
case PAN_SLOWEST_SPEED_REQUEST:
case PAN_FASTEST_SPEED_REQUEST:
case TILT_SLOWEST_SPEED_REQUEST:
case TILT_FASTEST_SPEED_REQUEST:
case PAN_SPEED_REQUEST:
case TILT_SPEED_REQUEST:
if(!RequestCommand(cmd, request, &len))
return false;
request[8] = 0;
HexStringToDWORD((char *)request + 5, speed, 3);
return true;
case ZOOM_SPEED_REQUEST:
if(!RequestCommand(cmd, request, &len))
return false;
request[6] = 0;
HexStringToDWORD((char *)request + 5, speed, 1);
return true;
default:
return false;
}
}
BOOL C_CanonVCC4PTZ::PanSpeedAssign(DWORD speed)
{
BYTE assign[20];
DWORDToHexString((char *)assign, speed, 3);
if(!AssignCommand(PAN_SPEED_ASSIGN, assign, 3))
return false;
return true;
}
BOOL C_CanonVCC4PTZ::TiltSpeedAssign(DWORD speed)
{
BYTE assign[20];
DWORDToHexString((char *)assign, speed, 3);
if(!AssignCommand(TILT_SPEED_ASSIGN, assign, 3))
return false;
return true;
}
BOOL C_CanonVCC4PTZ::IrisRequest(DWORD *iris)
{
BYTE request[20];
BYTE len = 20;
if(!RequestCommand(IRIS_REQUEST, request, &len))
return false;
HexStringToDWORD((char *)request + 5, iris, 2);
return true;
}
BOOL C_CanonVCC4PTZ::IrisAssign(DWORD iris)
{
BYTE assign[20];
DWORDToHexString((char *)assign, iris, 2);
if(!AssignCommand(IRIS_ASSIGN, assign, 2))
return false;
return true;
}
BOOL C_CanonVCC4PTZ::PanTiltAngleRequest(DWORD *pan, DWORD *tilt)
{
BYTE request[20];
BYTE len = 20;
if(!RequestCommand(PAN_TILT_ANGLE_REQUEST, request, &len))
return false;
HexStringToDWORD((char *)request + 5, pan, 4);
HexStringToDWORD((char *)request + 9, tilt, 4);
return true;
}
BOOL C_CanonVCC4PTZ::PanTiltAngleAssign(DWORD pan, DWORD tilt)
{
BYTE assign[20];
DWORDToHexString((char *)assign, pan, 4);
DWORDToHexString((char *)assign + 4, tilt, 4);
if(!AssignCommand(PAN_TILT_ANGLE_ASSIGN, assign, 8))
return false;
return true;
}
BOOL C_CanonVCC4PTZ::ZoomPositionRequest(DWORD *zoom)
{
BYTE request[20];
BYTE len = 20;
if(!RequestCommand(ZOOM_POSITION2_REQUEST, request, &len))
return false;
HexStringToDWORD((char *)request + 5, zoom, 4);
return true;
}
BOOL C_CanonVCC4PTZ::ZoomPositionAssign(DWORD zoom)
{
BYTE assign[20];
DWORDToHexString((char *)assign, zoom, 4);
if(!AssignCommand(ZOOM_POSITION2_ASSIGN, assign, 4))
return false;
return true;
}
BOOL C_CanonVCC4PTZ::ZoomMaxRequest(DWORD *zoom)
{
BYTE request[20];
BYTE len = 20;
if(!RequestCommand(ZOOM_MAX_REQUEST, request, &len))
return false;
HexStringToDWORD((char *)request + 5, zoom, 4);
return true;
}
BOOL C_CanonVCC4PTZ::HexStringToDWORD(char *str, DWORD *number, BYTE cnt)
{
int digit;
DWORD sum;
sum = 0;
for(int i=0; i<cnt; i++)
{
if(str[i] >= '0' && str[i] <='9')
digit = str[i] - '0';
else if(str[i] >= 'a' && str[i] <= 'f')
digit = str[i] - 'a' + 10;
else if(str[i] >= 'A' && str[i] <= 'F')
digit = str[i] - 'A' + 10;
else return false;
sum <<= 4;
sum += digit;
}
*number = sum;
return true;
}
BOOL C_CanonVCC4PTZ::DWORDToHexString(char *str, DWORD number, BYTE cnt)
{
int digit;
int i, j;
for(i=0, j=cnt-1; i< cnt; i++, j--)
{
digit = number % 16;
if(digit >= 0 && digit <= 9)
str[j] = digit + '0';
else
str[j] = digit - 10 + 'A';
number /= 16;
}
return true;
}
BOOL C_CanonVCC4PTZ::PanLeftSmartly(void)
{
DWORD zoom;
DWORD speed;
//if(!Command(HOST_CONTROL)) return false;
if(!ZoomPositionRequest(&zoom)) return false;
speed = (m_MaxPanSpeed - m_MinPanSpeed) * (m_MaxZoom - zoom) / (m_MaxZoom - m_MinZoom) + m_MinPanSpeed;
if(!PanSpeedAssign(speed)) return false;
if(!Command(PAN_LEFT_START)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::PanRightSmartly(void)
{
DWORD zoom;
DWORD speed;
//if(!Command(HOST_CONTROL)) return false;
if(!ZoomPositionRequest(&zoom)) return false;
speed = (m_MaxPanSpeed - m_MinPanSpeed) * (m_MaxZoom - zoom) / (m_MaxZoom - m_MinZoom) + m_MinPanSpeed;
if(!PanSpeedAssign(speed)) return false;
if(!Command(PAN_RIGHT_START)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::TiltUpSmartly(void)
{
DWORD zoom;
DWORD speed;
//if(!Command(HOST_CONTROL)) return false;
if(!ZoomPositionRequest(&zoom)) return false;
speed = (m_MaxTiltSpeed - m_MinTiltSpeed) * (m_MaxZoom - zoom) / (m_MaxZoom - m_MinZoom) + m_MinTiltSpeed;
if(!TiltSpeedAssign(speed)) return false;
if(!Command(TILT_UP_START)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::TiltDownSmartly(void)
{
DWORD zoom;
DWORD speed;
//if(!Command(HOST_CONTROL)) return false;
if(!ZoomPositionRequest(&zoom)) return false;
speed = (m_MaxTiltSpeed - m_MinTiltSpeed) * (m_MaxZoom - zoom) / (m_MaxZoom - m_MinZoom) + m_MinTiltSpeed;
if(!TiltSpeedAssign(speed)) return false;
if(!Command(TILT_DOWN_START)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::PanTiltStop(void)
{
if(!Command(PAN_TILT_STOP)) return false;
//if(!Command(LOCAL_CONTROL)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::ZoomIn(void)
{
//if(!Command(HOST_CONTROL)) return false;
if(!Command(ZOOM_TELT)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::ZoomOut(void)
{
//if(!Command(HOST_CONTROL)) return false;
if(!Command(ZOOM_WIDE)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::ZoomStop(void)
{
if(!Command(ZOOM_STOP)) return false;
//if(!Command(LOCAL_CONTROL)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::Home(void)
{
//if(!Command(HOST_CONTROL)) return false;
if(!Command(HOME_POSITION)) return false;
//if(!Command(LOCAL_CONTROL)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::IrisUp(void)
{
DWORD iris;
//if(!Command(EXPOSURE_MANUAL)) return false;
if(!IrisRequest(&iris)) return false;
if(iris >= IRIS_MAX)
return false;
iris++;
if(!IrisAssign(iris)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::IrisDown(void)
{
DWORD iris = IRIS_MAX;
//if(!Command(EXPOSURE_MANUAL)) return false;
if(!IrisRequest(&iris)) return false;
if(iris <= IRIS_MIN)
return false;
iris--;
if(!IrisAssign(iris)) return false;
return true;
}
BOOL C_CanonVCC4PTZ::AutoExposure(void)
{
if(!Command(EXPOSURE_AUTO)) return false;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -