|
|
|
@ -6,6 +6,7 @@
|
|
|
|
|
#include "SensorsProtocol.h"
|
|
|
|
|
#include "GPIOControl.h"
|
|
|
|
|
#include "PhoneDevice.h"
|
|
|
|
|
#include "time.h"
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
|
|
PtzController::PtzController(CPhoneDevice* pPhoneDevice) : m_pPhoneDevice(pPhoneDevice)
|
|
|
|
@ -33,6 +34,7 @@ void PtzController::AddCommand(uint8_t channel, int cmdidx, uint8_t bImageSize,
|
|
|
|
|
strcpy(cmd.serfile, serfile);
|
|
|
|
|
cmd.baud = baud;
|
|
|
|
|
cmd.addr = addr;
|
|
|
|
|
cmd.ts = time(NULL);
|
|
|
|
|
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
m_cmds.push_back(cmd);
|
|
|
|
@ -48,17 +50,20 @@ void PtzController::AddPhotoCommand(IDevice::PHOTO_INFO& photoInfo, const std::s
|
|
|
|
|
|
|
|
|
|
SERIAL_CMD cmdPreset = { 0 };
|
|
|
|
|
time_t ts = time(NULL);
|
|
|
|
|
|
|
|
|
|
#if 1
|
|
|
|
|
// if (photoInfo.preset != 0 && photoInfo.preset != 0xFF)
|
|
|
|
|
{
|
|
|
|
|
cmdPreset.ts = photoInfo.selfTestingTime;
|
|
|
|
|
cmdPreset.delayTime = photoInfo.closeDelayTime;
|
|
|
|
|
cmdPreset.channel = photoInfo.channel;
|
|
|
|
|
cmdPreset.channel = photoInfo.preset;
|
|
|
|
|
cmdPreset.cmdidx = OPEN_TOTAL;
|
|
|
|
|
cmdPreset.cmdidx = PHOTO_OPEN_POWER;
|
|
|
|
|
strcpy(cmdPreset.serfile, param.serfile);
|
|
|
|
|
cmdPreset.baud = param.baud;
|
|
|
|
|
cmdPreset.addr = param.addr;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
SERIAL_CMD cmd = { 0 };
|
|
|
|
|
cmd.ts = ts;
|
|
|
|
|
cmd.delayTime = photoInfo.closeDelayTime;
|
|
|
|
@ -79,10 +84,12 @@ void PtzController::AddPhotoCommand(IDevice::PHOTO_INFO& photoInfo, const std::s
|
|
|
|
|
// uint32_t baud;
|
|
|
|
|
// int addr;
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
#if 1
|
|
|
|
|
if (cmdPreset.cmdidx != 0)
|
|
|
|
|
{
|
|
|
|
|
m_cmds.push_back(cmdPreset);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
m_cmds.push_back(cmd);
|
|
|
|
|
m_locker.unlock();
|
|
|
|
|
|
|
|
|
@ -108,6 +115,7 @@ void PtzController::PtzProc()
|
|
|
|
|
PTZ_STATE ptz_state;
|
|
|
|
|
bool hasCmd = false;
|
|
|
|
|
int i=0;
|
|
|
|
|
char buffer[512];
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<PowerControl> powerCtrl;
|
|
|
|
|
time_t selfTestingStartTime = 0;
|
|
|
|
@ -116,6 +124,7 @@ void PtzController::PtzProc()
|
|
|
|
|
time_t PTZ_preset_wait_time = 0;
|
|
|
|
|
time_t close_delay_time = CAMERA_CLOSE_DELAYTIME;
|
|
|
|
|
time_t start_delay_time = 0;
|
|
|
|
|
time_t photo_move_preset_time = 0;
|
|
|
|
|
|
|
|
|
|
while(true)
|
|
|
|
|
{
|
|
|
|
@ -131,7 +140,7 @@ void PtzController::PtzProc()
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
for (auto it = m_cmds.begin(); it != m_cmds.end(); ++it)
|
|
|
|
|
{
|
|
|
|
|
if (state == PTZS_SELF_TESTING)
|
|
|
|
|
if ((state == PTZS_SELF_TESTING) || (PTZS_PHOTO_SELF_TESTING == state))
|
|
|
|
|
{
|
|
|
|
|
// find first non-taking-photo cmd
|
|
|
|
|
if (it->cmdidx != Take_Photo)
|
|
|
|
@ -154,9 +163,11 @@ void PtzController::PtzProc()
|
|
|
|
|
|
|
|
|
|
if (!hasCmd)
|
|
|
|
|
{
|
|
|
|
|
if (state == PTZS_SELF_TESTING)
|
|
|
|
|
if ((state == PTZS_SELF_TESTING) || (PTZS_PHOTO_SELF_TESTING == state))
|
|
|
|
|
{
|
|
|
|
|
time_t timeout = time(NULL) - selfTestingStartTime;
|
|
|
|
|
if(timeout < 0)
|
|
|
|
|
selfTestingStartTime = time(NULL);
|
|
|
|
|
if (timeout >= selfTestingWaitTime)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "超时(%d秒)未收到云台自检结束应答,状态改为空闲!", timeout);
|
|
|
|
@ -166,9 +177,9 @@ void PtzController::PtzProc()
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(timeout >= CAMERA_SELF_TEST_TIME)
|
|
|
|
|
//if(timeout >= CAMERA_SELF_TEST_TIME)
|
|
|
|
|
{
|
|
|
|
|
//XYLOG(XYLOG_SEVERITY_INFO, "开始查询云台自检状态!timeout=%d秒", timeout);
|
|
|
|
|
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)
|
|
|
|
@ -185,15 +196,47 @@ void PtzController::PtzProc()
|
|
|
|
|
m_sem.release();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if(time(NULL) - start_delay_time >= close_delay_time)
|
|
|
|
|
if(0 == start_delay_time)
|
|
|
|
|
{
|
|
|
|
|
;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机空闲时间超过%d秒!关闭摄像机!", close_delay_time);
|
|
|
|
|
if(time(NULL) - start_delay_time < 0)
|
|
|
|
|
{/* 防止等待关机期间,其他线程发生对时,改变了系统时间,导致长时间不会关摄像机电源*/
|
|
|
|
|
start_delay_time = time(NULL);
|
|
|
|
|
}
|
|
|
|
|
if(time(NULL) - start_delay_time >= close_delay_time)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机空闲时间超过%d秒!关闭摄像机!", close_delay_time);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_sem.release();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
start_delay_time = 0;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
start_delay_time = time(NULL);
|
|
|
|
|
switch (cmd.cmdidx)
|
|
|
|
|
{
|
|
|
|
|
case Take_Photo:
|
|
|
|
@ -206,7 +249,7 @@ void PtzController::PtzProc()
|
|
|
|
|
powerCtrl = std::make_shared<PlzCameraPowerCtrl>(0);
|
|
|
|
|
selfTestingStartTime = time(NULL);
|
|
|
|
|
selfTestingWaitTime = cmd.photoParams->mPhotoInfo.selfTestingTime;
|
|
|
|
|
state = PTZS_SELF_TESTING;
|
|
|
|
|
state = PTZS_PHOTO_SELF_TESTING;
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "1、收到拍照指令,摄像机从关机状态改为自检状态!");
|
|
|
|
|
|
|
|
|
|
m_locker.lock();
|
|
|
|
@ -216,38 +259,65 @@ void PtzController::PtzProc()
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "2、收到拍照指令,state=%d!", state);
|
|
|
|
|
if(cmd.photoParams->mPhotoInfo.scheduleTime == 0)
|
|
|
|
|
{
|
|
|
|
|
start_delay_time = time(NULL);
|
|
|
|
|
memset(buffer, 0, sizeof(buffer));
|
|
|
|
|
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localtime(&start_delay_time));
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "3、收到手动拍照指令,state=%d!%s", state, buffer);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机拍照前开始调用预置点!state=%d", state);
|
|
|
|
|
PTZ_preset_start_time = time(NULL);
|
|
|
|
|
PTZ_preset_wait_time = MOVE_PRESET_WAIT_TIME;
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机拍照前开始调用预置点%d!state=%d", cmd.preset, state);
|
|
|
|
|
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);
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机拍照前调用预置点%d,收到移动结束应答!移动时长=%d秒 state=%d", cmd.preset, 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);
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "摄像机拍照前调用预置点%d,摄像机在%d秒内未收到调用预置点结束应答!state=%d", cmd.preset, PTZ_preset_wait_time, state);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
|
|
|
photo_move_preset_time = time(NULL);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_pPhoneDevice->TakePhotoWithNetCamera(cmd.photoParams->mPhotoInfo, cmd.photoParams->mPath, cmd.photoParams->mOsds, powerCtrl);
|
|
|
|
|
state = PTZS_IDLE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case PHOTO_OPEN_POWER:
|
|
|
|
|
if (state == PTZS_POWER_OFF)
|
|
|
|
|
{
|
|
|
|
|
if (!powerCtrl)
|
|
|
|
|
{
|
|
|
|
|
powerCtrl = std::make_shared<PlzCameraPowerCtrl>(0);
|
|
|
|
|
selfTestingStartTime = time(NULL);
|
|
|
|
|
selfTestingWaitTime = 150;
|
|
|
|
|
state = PTZS_PHOTO_SELF_TESTING;
|
|
|
|
|
m_sem.release();
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到拍照指令开机,摄像机从关机状态改为自检状态!设置的自检等待时间%d秒", selfTestingWaitTime);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到拍照指令开机,摄像机处于state=%d!", state);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case OPEN_TOTAL:
|
|
|
|
|
if (state == PTZS_POWER_OFF)
|
|
|
|
@ -259,13 +329,17 @@ void PtzController::PtzProc()
|
|
|
|
|
selfTestingWaitTime = 150;
|
|
|
|
|
state = PTZS_SELF_TESTING;
|
|
|
|
|
m_sem.release();
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到开机指令,摄像机从关机状态改为自检状态!设置的自检等待时间%d秒", selfTestingWaitTime);
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到手动开机指令,摄像机从关机状态改为自检状态!设置的自检等待时间%d秒", selfTestingWaitTime);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到开机指令,摄像机处于state=%d!", state);
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到手动开机指令,摄像机处于state=%d!", state);
|
|
|
|
|
}
|
|
|
|
|
start_delay_time = time(NULL);
|
|
|
|
|
memset(buffer, 0, sizeof(buffer));
|
|
|
|
|
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localtime(&start_delay_time));
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到手动打开摄像机指令,刷新关机计时初始值,state=%d!%s", state, buffer);
|
|
|
|
|
break;
|
|
|
|
|
case CLOSE_TOTAL:
|
|
|
|
|
if (state == PTZS_POWER_OFF)
|
|
|
|
@ -273,6 +347,10 @@ void PtzController::PtzProc()
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到关机指令,摄像机本来就处于关机状态!");
|
|
|
|
|
// Do Nothing
|
|
|
|
|
}
|
|
|
|
|
else if(PTZS_PHOTO_SELF_TESTING == state)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "在拍照自检过程中收到关机指令,取消延时关机,转到自动关机处理!state=%d", state);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到关机指令,通知云台准备关机!state=%d", state);
|
|
|
|
@ -285,15 +363,22 @@ void PtzController::PtzProc()
|
|
|
|
|
state = PTZS_POWER_OFF;
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "关闭云台电源!state=%d", state);
|
|
|
|
|
}
|
|
|
|
|
start_delay_time = 0;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
CameraPhotoCmd(cmd.ts, cmd.channel, cmd.cmdidx, 0, cmd.preset, cmd.serfile, cmd.baud, cmd.addr);
|
|
|
|
|
|
|
|
|
|
start_delay_time = time(NULL);
|
|
|
|
|
memset(buffer, 0, sizeof(buffer));
|
|
|
|
|
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localtime(&start_delay_time));
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "收到手动控制摄像机指令,刷新关机计时初始值,state=%d!%s", state, buffer);
|
|
|
|
|
if(cmd.ts <= photo_move_preset_time)
|
|
|
|
|
{
|
|
|
|
|
XYLOG(XYLOG_SEVERITY_INFO, "丢弃拍照调预置点期间收到的控制云台指令,指令时间%ld, 拍照时间%ld!state=%d", cmd.ts, photo_move_preset_time, state);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
CameraPhotoCmd(cmd.ts, cmd.channel, cmd.cmdidx, 0, cmd.preset, cmd.serfile, cmd.baud, cmd.addr);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|