|
|
|
@ -103,13 +103,17 @@ void PtzController::ExitAndWait()
|
|
|
|
|
|
|
|
|
|
void PtzController::PtzProc()
|
|
|
|
|
{
|
|
|
|
|
PTZ_STATE state = PTZS_POWER_OFF;
|
|
|
|
|
PROC_PTZ_STATE state = PTZS_POWER_OFF;
|
|
|
|
|
SERIAL_CMD cmd;
|
|
|
|
|
PTZ_STATE ptz_state;
|
|
|
|
|
bool hasCmd = false;
|
|
|
|
|
int i=0;
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<PowerControl> powerCtrl;
|
|
|
|
|
time_t selfTestingStartTime = 0;
|
|
|
|
|
time_t selfTestingWaitTime = 0;
|
|
|
|
|
time_t PTZ_preset_start_time=0;
|
|
|
|
|
time_t PTZ_preset_wait_time=0;
|
|
|
|
|
|
|
|
|
|
while(true)
|
|
|
|
|
{
|
|
|
|
@ -153,10 +157,28 @@ void PtzController::PtzProc()
|
|
|
|
|
time_t timeout = time(NULL) - selfTestingStartTime;
|
|
|
|
|
if (timeout >= selfTestingWaitTime)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "超时(%d秒)未收到云台自检结束应答,状态改为空闲!", timeout);
|
|
|
|
|
state = PTZS_IDLE;
|
|
|
|
|
m_sem.release();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(timeout >= CAMERA_SELF_TEST_TIME)
|
|
|
|
|
{
|
|
|
|
|
//XYLOG(XYLOG_SEVERITY_INFO, "开始查询云台自检状态!timeout=%d秒", timeout);
|
|
|
|
|
if(0 == QueryPtzState(&ptz_state, QUERY_PTZ_STATE, cmd.serfile, cmd.baud, cmd.addr))
|
|
|
|
|
{
|
|
|
|
|
if(0 == ptz_state.ptz_status)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到云台自检结束应答,状态改为空闲!timeout=%d秒", timeout);
|
|
|
|
|
state = PTZS_IDLE;
|
|
|
|
|
m_sem.release();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
|
|
|
|
m_sem.release();
|
|
|
|
|
continue;
|
|
|
|
@ -178,6 +200,7 @@ void PtzController::PtzProc()
|
|
|
|
|
selfTestingStartTime = time(NULL);
|
|
|
|
|
selfTestingWaitTime = cmd.photoParams->mPhotoInfo.selfTestingTime;
|
|
|
|
|
state = PTZS_SELF_TESTING;
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "1、收到拍照指令,摄像机从关机状态改为自检状态!");
|
|
|
|
|
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
m_cmds.insert(m_cmds.begin(), cmd);
|
|
|
|
@ -186,12 +209,33 @@ void PtzController::PtzProc()
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "2、收到拍照指令,state=%d!", state);
|
|
|
|
|
|
|
|
|
|
state = PTZS_TAKING_PHOTO;
|
|
|
|
|
if (cmd.preset != 0 && cmd.preset != 0xFF)
|
|
|
|
|
{
|
|
|
|
|
CameraPhotoCmd(0, cmd.channel, MOVE_PRESETNO, 0, cmd.preset, cmd.serfile, cmd.baud, cmd.addr);
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10 * 1000));
|
|
|
|
|
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机拍照前开始调用预置点!state=%d", state);
|
|
|
|
|
PTZ_preset_start_time = time(NULL);
|
|
|
|
|
PTZ_preset_wait_time = MOVE_PRESET_WAIT_TIME;
|
|
|
|
|
for(;;)
|
|
|
|
|
{
|
|
|
|
|
if(0 == QueryPtzState(&ptz_state, QUERY_PTZ_STATE, cmd.serfile, cmd.baud, cmd.addr))
|
|
|
|
|
{
|
|
|
|
|
if(0 == ptz_state.ptz_status)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机拍照前调用预置点,收到移动结束应答!移动时长=%d秒 state=%d", time(NULL)-PTZ_preset_start_time, state);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(time(NULL) - PTZ_preset_start_time >= PTZ_preset_wait_time)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机拍照前调用预置点,摄像机在%d秒内未收到调用预置点结束应答!state=%d", PTZ_preset_wait_time, state);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_pPhoneDevice->TakePhotoWithNetCamera(cmd.photoParams->mPhotoInfo, cmd.photoParams->mPath, cmd.photoParams->mOsds, powerCtrl);
|
|
|
|
|
state = PTZS_IDLE;
|
|
|
|
@ -203,22 +247,36 @@ void PtzController::PtzProc()
|
|
|
|
|
{
|
|
|
|
|
if (!powerCtrl)
|
|
|
|
|
{
|
|
|
|
|
powerCtrl = std::make_shared<PlzCameraPowerCtrl>(cmd.delayTime);
|
|
|
|
|
powerCtrl = std::make_shared<PlzCameraPowerCtrl>(150);
|
|
|
|
|
selfTestingStartTime = time(NULL);
|
|
|
|
|
selfTestingWaitTime = cmd.ts;
|
|
|
|
|
selfTestingWaitTime = 150;
|
|
|
|
|
state = PTZS_SELF_TESTING;
|
|
|
|
|
m_sem.release();
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到开机指令,摄像机从关机状态改为自检状态!设置的自检等待时间%d秒", selfTestingWaitTime);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到开机指令,摄像机处于state=%d!", state);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case CLOSE_TOTAL:
|
|
|
|
|
if (state == PTZS_POWER_OFF)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到关机指令,摄像机本来就处于关机状态!");
|
|
|
|
|
// Do Nothing
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到关机指令,通知云台准备关机!state=%d", state);
|
|
|
|
|
for(i=0; i<3; i++)
|
|
|
|
|
{
|
|
|
|
|
if(0 == QueryPtzState(&ptz_state, NOTIFY_PTZ_CLOSE, cmd.serfile, cmd.baud, cmd.addr))
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
powerCtrl.reset();
|
|
|
|
|
state = PTZS_POWER_OFF;
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "关闭云台电源!state=%d", state);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|