增加云台控制时间精准控制

增加云台控制时间精准控制
ptz
jxjajs 3 months ago
parent 27e4b7400e
commit b56a56bb06

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

@ -14,7 +14,7 @@
#include <SemaphoreEx.h> #include <SemaphoreEx.h>
#include <Client/Device.h> #include <Client/Device.h>
enum PTZ_STATE enum PROC_PTZ_STATE
{ {
PTZS_POWER_OFF = 0, PTZS_POWER_OFF = 0,
PTZS_IDLE = 1, PTZS_IDLE = 1,
@ -23,6 +23,9 @@ enum PTZ_STATE
PTZS_TAKING_PHOTO = 4, PTZS_TAKING_PHOTO = 4,
}; };
#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*/
class PtzPhotoParams class PtzPhotoParams
{ {
public: public:

File diff suppressed because it is too large Load Diff

@ -27,6 +27,7 @@
#define IOT_PARAM_WRITE 0xAE #define IOT_PARAM_WRITE 0xAE
#define IOT_PARAM_READ 0xAF #define IOT_PARAM_READ 0xAF
#define MAX_FIELDS_NUM 20 /* BD_NMEA0183单组字符串数据内含数据最大数量*/
#define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/ #define MAX_SERIAL_DEV_NUM 25 /* 最大接串口传感器数量*/
#define MAX_SERIAL_PORT_NUM 5 #define MAX_SERIAL_PORT_NUM 5
#define MAX_DEV_VALUE_NUM 12 /* 一台装置最大的采样值数量*/ #define MAX_DEV_VALUE_NUM 12 /* 一台装置最大的采样值数量*/
@ -39,6 +40,7 @@
#define PELCO_D_PROTOCOL 6 /* 摄像机Pelco_D协议序号*/ #define PELCO_D_PROTOCOL 6 /* 摄像机Pelco_D协议序号*/
#define SERIALCAMERA_PROTOCOL 8 /* 串口摄像机协议序号*/ #define SERIALCAMERA_PROTOCOL 8 /* 串口摄像机协议序号*/
#define MUTIWEATHER_PROTOCOL 9 /*多合一气象*/ #define MUTIWEATHER_PROTOCOL 9 /*多合一气象*/
#define NMEA0183_PROTOCOL 10 /* 单一北斗NMEA0183标准协议*/
#define RESERVE2_PROTOCOL 17 /* 备用2协议序号*/ #define RESERVE2_PROTOCOL 17 /* 备用2协议序号*/
#define RESERVE4_PROTOCOL 19 /* 备用4协议序号*/ #define RESERVE4_PROTOCOL 19 /* 备用4协议序号*/
#define RESERVE5_PROTOCOL 20 /* 备用5协议序号*/ #define RESERVE5_PROTOCOL 20 /* 备用5协议序号*/
@ -106,10 +108,10 @@
#define D_OPEN_MODULE_POWER 0x0009000C /* 打开机芯电源(1 有效)*/ #define D_OPEN_MODULE_POWER 0x0009000C /* 打开机芯电源(1 有效)*/
/* 摄像机下发命令宏定义*/ /* 摄像机下发命令宏定义*/
#define Take_Photo 0 /* 拍照*/ #define TAKE_PHOTO 20000 /* 拍照*/
#define Stop_Baud 10000 /* 设置球机波特率*/ #define SET_BAUD 10000 /* 设置球机波特率*/
#define Stop_Cmd 10005 /* 取消或停止指令*/ #define STOP_CMD 10005 /* 取消或停止指令*/
#define Auto_Scan 10006 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/ #define AUTO_SCAN 10006 /* 自动扫描功能控制(1/0 打开/关闭该功能)*/
#define IRIS_CLOSE 10007 /* 光圈缩小(1 有效)*/ #define IRIS_CLOSE 10007 /* 光圈缩小(1 有效)*/
#define IRIS_OPEN 10008 /* 光圈放大(1 有效)*/ #define IRIS_OPEN 10008 /* 光圈放大(1 有效)*/
#define FOCUS_NEAR 10009 /* 近距离聚焦(1 有效)*/ #define FOCUS_NEAR 10009 /* 近距离聚焦(1 有效)*/
@ -124,8 +126,8 @@
#define SAVE_PRESETNO 10018 // 设置预置点 #define SAVE_PRESETNO 10018 // 设置预置点
#define OPEN_TOTAL 10019 /* 打开总电源(1 有效)*/ #define OPEN_TOTAL 10019 /* 打开总电源(1 有效)*/
#define OPEN_MODULE_POWER 10020 /* 打开机芯电源(1 有效)*/ #define OPEN_MODULE_POWER 10020 /* 打开机芯电源(1 有效)*/
#define CLOSE_TOTAL 10040 /* 关闭总电源*/ #define NOTIFY_PTZ_CLOSE 10021 // 通知云台关闭
#define QUERY_PTZ_STATE 10022 // 查询云台状态
#define SPEED_DOME_CAMERA 0 /* 球机摄像机*/ #define SPEED_DOME_CAMERA 0 /* 球机摄像机*/
#define SERIAL_CAMERA 2 /* 串口摄像机a*/ #define SERIAL_CAMERA 2 /* 串口摄像机a*/
@ -216,6 +218,48 @@ typedef struct
uint8_t Phase; /* 传感器所安装相别指拉力和倾角11表示A1....*/ uint8_t Phase; /* 传感器所安装相别指拉力和倾角11表示A1....*/
} SERIAL_PARAM; } SERIAL_PARAM;
// 云台状态数据
typedef struct
{
uint8_t ptz_process; /* 云台所处过程(1:自检状态;2:调用预置点;3:一般状态;)*/
uint8_t ptz_status; /* 云台当前状态值(0:停止;1:运动;2:机芯未上电;其他:其他错误*/
int presetno; /* 云台所处预置点值*/
float x_coordinate; /* 云台所处位置水平方向坐标*/
float y_coordinate; /* 云台所处位置垂直方向坐标*/
} PTZ_STATE;
/*
$--RMC IDRMC --
2 UTCtime hhmmss.ss UTC
3 status
V=
A=
4 lat ddmm.mmmmm 2
5 uLat N-S-
6 lon dddmm.mmmm
m
3
7 uLon E-W-西
8 spd
9 cog
10 date ddmmyy dd mm yy
11 mv
12 mvE E-W-西
13 mode [1]
14 navStatus V
NMEA 4.1
15 CS 16 $*$**/
// 北斗卫星数据
typedef struct
{
struct tm UTC_time; /* UTC时间*/
int ms_time; /* 毫秒*/
double lat; /* 纬度,原值(前 2 字符表示度,后面的字符表示分)转换后为° */
char uLat; /* 纬度方向N-北S-南*/
double lon; /* 经度,原值(前 3 字符表示度,后面的字符表示分)转换后为°*/
char uLon; /* 经度'E'-东,'W'-西*/
char status; /* 'A'=数据有效 其他字符表示数据无效*/
} BD_GNSS_DATA;
typedef struct typedef struct
{ {
int m_iRevStatus; /* */ int m_iRevStatus; /* */
@ -245,8 +289,18 @@ typedef struct
使*/ 使*/
PHOTO_DEF image; /* 临时存储图片数据*/ PHOTO_DEF image; /* 临时存储图片数据*/
int64_t FirstCmdTimeCnt; /* 串口读取数据起始时间*/ int64_t FirstCmdTimeCnt; /* 串口读取数据起始时间*/
PTZ_STATE ptz_state;
int sendptzstatecmd; // 查询命令次数控制
BD_GNSS_DATA bd_data;
} SIO_PARAM_SERIAL_DEF; } SIO_PARAM_SERIAL_DEF;
typedef const struct
{
//char *account; // 命令说明
char *cmd_name; // 命令名称
int (*recv_process)(SIO_PARAM_SERIAL_DEF *); /* urc数据处理*/
}BD_NMEA0183_PROC_FUNC;
//串口相关装置所有参数集中定义 //串口相关装置所有参数集中定义
typedef struct typedef struct
{ {
@ -474,6 +528,24 @@ int GM_IsCloseCamera(SIO_PARAM_SERIAL_DEF *pPortParam);
int GM_CameraSerialTimer(SIO_PARAM_SERIAL_DEF *pPortParam); int GM_CameraSerialTimer(SIO_PARAM_SERIAL_DEF *pPortParam);
int QueryPtzState(PTZ_STATE *ptz_state, int cmdidx, const char *serfile, unsigned int baud, int addr);
int Query_BDGNSS_Data(BD_GNSS_DATA *BD_data, int samptime, const char *serfile, unsigned int baud);
int GM_BdSerialTimer(SIO_PARAM_SERIAL_DEF *pPortParam);
void GM_BdSerialComRecv(SIO_PARAM_SERIAL_DEF *pPortParam);
void BdRecvData(SIO_PARAM_SERIAL_DEF *pPortParam, u_char *buf, int len);
unsigned char BDXorCheck(unsigned char *msg, int len);
void BD_NMEA0183_PortDataProcess(SIO_PARAM_SERIAL_DEF *curserial);
char** BD_NMEA0183_SplitString(char *str, int *total_fields);
int BD_get_BDRMC_data(SIO_PARAM_SERIAL_DEF *curserial);
#endif // __SENSOR_PROTOCOL_H__ #endif // __SENSOR_PROTOCOL_H__

Loading…
Cancel
Save