From 2b5916c9ce9e4ff02b4eb538026d01144d0c6d59 Mon Sep 17 00:00:00 2001 From: jxjajs Date: Fri, 28 Mar 2025 17:36:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=91=E5=8F=B0=E6=8E=A7=E5=88=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 4 + app/src/main/cpp/PtzController.cpp | 123 ++++++++++++++++++++++----- app/src/main/cpp/PtzController.h | 5 +- app/src/main/cpp/SensorsProtocol.cpp | 8 +- 4 files changed, 115 insertions(+), 25 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index b324f660..36c03458 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -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(new PlzCameraPowerCtrl(mPhotoInfo.closeDelayTime)); else powerCtrlPtr = std::shared_ptr(new PlzCameraPowerCtrl(2)); +#endif } res = true; diff --git a/app/src/main/cpp/PtzController.cpp b/app/src/main/cpp/PtzController.cpp index a64ce4e3..9a0a5c4d 100644 --- a/app/src/main/cpp/PtzController.cpp +++ b/app/src/main/cpp/PtzController.cpp @@ -6,6 +6,7 @@ #include "SensorsProtocol.h" #include "GPIOControl.h" #include "PhoneDevice.h" +#include "time.h" #include 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 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(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(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; } } - - } \ No newline at end of file diff --git a/app/src/main/cpp/PtzController.h b/app/src/main/cpp/PtzController.h index 6a4b3916..badd3ed6 100644 --- a/app/src/main/cpp/PtzController.h +++ b/app/src/main/cpp/PtzController.h @@ -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: diff --git a/app/src/main/cpp/SensorsProtocol.cpp b/app/src/main/cpp/SensorsProtocol.cpp index 90f76c8d..4cb4329f 100644 --- a/app/src/main/cpp/SensorsProtocol.cpp +++ b/app/src/main/cpp/SensorsProtocol.cpp @@ -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, "云台发生错误!");