云台控制逻辑优化

PtzNew
jxjajs 3 months ago
parent e6228f7dfa
commit 2b5916c9ce

@ -1554,6 +1554,7 @@ bool CPhoneDevice::TakePhotoWithNetCamera(IDevice::PHOTO_INFO& localPhotoInfo, c
// AutoEnv autoEnv(pThis->m_vm);
time_t ts = time(NULL);
uint32_t waitTime = localPhotoInfo.selfTestingTime;
#if 0
if(!GpioControl::GetSelftestStatus(waitTime))
{
m_isSelfTesting.store(true);
@ -1561,6 +1562,7 @@ bool CPhoneDevice::TakePhotoWithNetCamera(IDevice::PHOTO_INFO& localPhotoInfo, c
std::this_thread::sleep_for(std::chrono::milliseconds(waitTime));
m_isSelfTesting.store(false);
}
#endif
XYLOG(XYLOG_SEVERITY_DEBUG, "Ethernet Power ON");
@ -2069,11 +2071,13 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector<
}
else if (photoInfo.cameraType == CAM_TYPE_PLZ)
{
#if 0
XYLOG(XYLOG_SEVERITY_DEBUG, "PTZ PWR turned ON");
if(mPhotoInfo.scheduleTime == 0)
powerCtrlPtr = std::shared_ptr<PowerControl>(new PlzCameraPowerCtrl(mPhotoInfo.closeDelayTime));
else
powerCtrlPtr = std::shared_ptr<PowerControl>(new PlzCameraPowerCtrl(2));
#endif
}
res = true;

@ -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, "摄像机拍照前开始调用预置点%dstate=%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 拍照时间%ldstate=%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;
}
}
}

@ -21,12 +21,13 @@ enum PROC_PTZ_STATE
PTZS_SELF_TESTING = 2,
PTZS_MOVING = 3,
PTZS_TAKING_PHOTO = 4,
PTZS_PHOTO_SELF_TESTING = 5,
};
#define CAMERA_SELF_TEST_TIME 60 /* Camera self-test time (excluding PTZ self-test)*/
#define MOVE_PRESET_WAIT_TIME 20 /* Waiting for the maximum time for the PTZ to move to the preset position*/
#define CAMERA_CLOSE_DELAYTIME 480 /* Auto Power-Off Timer Setting After Manual Power-On (for Camera)*/
#define CAMERA_CLOSE_DELAYTIME 120 /* Auto Power-Off Timer Setting After Manual Power-On (for Camera)*/
#define PHOTO_OPEN_POWER 16000
class PtzPhotoParams
{
public:

@ -1511,7 +1511,7 @@ void CameraPhotoPortDataProcess(SIO_PARAM_SERIAL_DEF *curserial)
case 1: // 自检
if (0 == curserial->ptz_state.ptz_status)
sprintf(szbuf, "云台自检结束!");
else if (1 == curserial->ptz_state.ptz_status)
else if (0 < curserial->ptz_state.ptz_status)
sprintf(szbuf, "云台正在自检!");
else
sprintf(szbuf, "云台自检发生错误!");
@ -1520,9 +1520,9 @@ void CameraPhotoPortDataProcess(SIO_PARAM_SERIAL_DEF *curserial)
case 2: // 调用预置点
if (0 == curserial->ptz_state.ptz_status)
sprintf(szbuf, "调用预置位结束,云台处于所调预置位!");
else if (1 == curserial->ptz_state.ptz_status)
else if (0 < curserial->ptz_state.ptz_status)
sprintf(szbuf, "调用预置位,云台正在前往所调预置位位置!");
else if (2 == curserial->ptz_state.ptz_status)
else if (2 == (curserial->ptz_state.ptz_status & 0x0f))
sprintf(szbuf, "调用预置位时,机芯电源未打开!");
else
sprintf(szbuf, "调用预置位时,发生了错误,未正确执行!");
@ -1531,7 +1531,7 @@ void CameraPhotoPortDataProcess(SIO_PARAM_SERIAL_DEF *curserial)
case 3: // 一般状态
if (0 == curserial->ptz_state.ptz_status)
sprintf(szbuf, "云台处于静止状态!");
else if (1 == curserial->ptz_state.ptz_status)
else if (0 < curserial->ptz_state.ptz_status)
sprintf(szbuf, "云台正在运动!");
else
sprintf(szbuf, "云台发生错误!");

Loading…
Cancel
Save