diff --git a/app/src/main/cpp/GPIOControl.cpp b/app/src/main/cpp/GPIOControl.cpp index b09c10bc..a398ad2c 100644 --- a/app/src/main/cpp/GPIOControl.cpp +++ b/app/src/main/cpp/GPIOControl.cpp @@ -359,7 +359,7 @@ bool GpioControl::GetCamerastatus() bool GpioControl::GetSelftestStatus(time_t wait_time) { - int cmd; + int cmd = 0; #ifdef USING_N938 cmd = CMD_SET_PIC1_POWER; #endif @@ -379,6 +379,28 @@ bool GpioControl::GetSelftestStatus(time_t wait_time) } +time_t GpioControl::GetSelfTestRemain(time_t wait_time) +{ + int cmd = 0; +#ifdef USING_N938 + cmd = CMD_SET_PIC1_POWER; +#endif +#ifdef USING_PLZ + cmd = CMD_SET_PTZ_PWR_ENABLE; +#endif + time_t now = time(NULL); + std::vector::iterator it; + for (it = m_items.begin(); it != m_items.end(); ++it) + { + if (it->cmd == cmd && it->openTime!=0 && (now - it->openTime <= wait_time)) + { + time_t remaintime =wait_time - (now - it->openTime); + return remaintime;//自检完成 + } + } + return 0; +} + void GpioControl::PowerControlThreadProc() { time_t ts = 0; diff --git a/app/src/main/cpp/GPIOControl.h b/app/src/main/cpp/GPIOControl.h index 72735849..a9c0e2eb 100644 --- a/app/src/main/cpp/GPIOControl.h +++ b/app/src/main/cpp/GPIOControl.h @@ -183,6 +183,7 @@ public: static bool SetCamerastatus(int cmd, bool status); static bool GetCamerastatus(); static bool GetSelftestStatus(time_t wait_time); + static time_t GetSelfTestRemain(time_t wait_time); static void PowerControlThreadProc(); diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index abb9cf7a..db99fe91 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -494,8 +494,6 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa m_signalLevel = 0; m_signalLevelUpdateTime = time(NULL); mBuildTime = 0; - m_cameraStatus = false; - m_sensorsStatus = false; m_lastTime = 0; m_shouldStopWaiting = false; m_collecting = false; @@ -1527,8 +1525,10 @@ bool CPhoneDevice::TakePhotoWithNetCamera(IDevice::PHOTO_INFO& localPhotoInfo, c uint32_t waitTime = localPhotoInfo.selfTestingTime; if(!GpioControl::GetSelftestStatus(waitTime)) { + m_isSelfTesting.store(true); waitTime = (waitTime != 0) ? (waitTime * 1024) : 10240; std::this_thread::sleep_for(std::chrono::milliseconds(waitTime)); + m_isSelfTesting.store(false); } XYLOG(XYLOG_SEVERITY_DEBUG, "Ethernet Power ON"); @@ -1950,9 +1950,12 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< uint32_t waitTime = localPhotoInfo.selfTestingTime; if(!GpioControl::GetSelftestStatus(waitTime)) { - XYLOG(XYLOG_SEVERITY_INFO, "Camera is SeltTesting, selfTestingtime=%u", waitTime); - waitTime = (waitTime != 0) ? (waitTime * 1024) : 10240; - std::this_thread::sleep_for(std::chrono::milliseconds(waitTime)); + pThis->m_isSelfTesting.store(true); + time_t remaintime = GpioControl::GetSelfTestRemain(waitTime); + XYLOG(XYLOG_SEVERITY_INFO, "Camera is SeltTesting,remaining selfTestingtime=%u", remaintime); + remaintime = (remaintime != 0) ? (remaintime * 1024) : 10240; + std::this_thread::sleep_for(std::chrono::milliseconds(remaintime)); + pThis->m_isSelfTesting.store(false); XYLOG(XYLOG_SEVERITY_INFO, "Camera SeltTesting is over"); } @@ -2054,25 +2057,20 @@ bool CPhoneDevice::OpenPTZSensors(uint32_t sec) { uint64_t wid = RequestWakelock(0); unsigned long long time_now = GetMicroTimeStamp(); - { - std::lock_guard lock(m_cameraLocker); - if(time_now < localDelayTime-1000) - { - m_sensorsStatus = true; - m_cameraStatus = true; - OpenSensors(MAIN_POWER_OPEN); - OpenSensors(CAMERA_SENSOR_OPEN); - }else if (!m_cameraStatus && !m_sensorsStatus) - { - m_sensorsStatus = true; - OpenSensors(MAIN_POWER_OPEN); - OpenSensors(CAMERA_SENSOR_OPEN); - } + OpenSensors(MAIN_POWER_OPEN); + OpenSensors(CAMERA_SENSOR_OPEN); + + if (m_isSelfTesting.load() || (GpioControl::GetCamerastatus() && GpioControl::GetSelftestStatus(sec))) + { + ReleaseWakelock(wid); + return true; } - if(m_sensorsStatus && !m_cameraStatus) + + if(GpioControl::GetCamerastatus() && !GpioControl::GetSelftestStatus(sec)) { + m_isSelfTesting.store(true); XYLOG(XYLOG_SEVERITY_INFO, "Camera is SeltTesting, selfTestingtime=%u", sec); auto start = std::chrono::steady_clock::now(); while (std::chrono::steady_clock::now() - start < std::chrono::seconds(sec)) @@ -2081,62 +2079,45 @@ bool CPhoneDevice::OpenPTZSensors(uint32_t sec) { CloseSensors(CAMERA_SENSOR_OPEN, 0); CloseSensors(MAIN_POWER_OPEN, 0); - m_cameraStatus = false; - m_sensorsStatus = false; m_shouldStopWaiting.store(false); + m_isSelfTesting.store(false); ReleaseWakelock(wid); return false; } std::this_thread::sleep_for(std::chrono::milliseconds(200)); } + m_isSelfTesting.store(false); + m_shouldStopWaiting.store(false); + unsigned long long time_over = GetMicroTimeStamp(); + XYLOG(XYLOG_SEVERITY_INFO, "Camera SeltTesting is over, selfTestingtime=%u", (time_over - time_now)/1000); } -// if(m_sensorsStatus && !m_cameraStatus) -// std::this_thread::sleep_for(std::chrono::seconds(sec)); - - { - std::lock_guard lock(m_cameraLocker); -// std::unique_lock lock(m_cameraLocker); - if (!m_cameraStatus && m_sensorsStatus) - { - m_cameraStatus = true; - unsigned long long time_over = GetMicroTimeStamp(); - XYLOG(XYLOG_SEVERITY_INFO, "Camera SeltTesting is over, selfTestingtime=%u", (time_over - time_now)/1000); - } - } ReleaseWakelock(wid); + return true; - return m_cameraStatus; } bool CPhoneDevice::ClosePTZSensors(uint32_t delayedCloseTime) { - localDelayTime = GetMicroTimeStamp() + delayedCloseTime*1000; - - if(m_sensorsStatus && !m_cameraStatus) + if(m_isSelfTesting.load()) { - localDelayTime = GetMicroTimeStamp(); m_shouldStopWaiting.store(true); - } - else + }else { - std::lock_guard lock(m_cameraLocker); -// std::unique_lock lock(m_cameraLocker); CloseSensors(CAMERA_SENSOR_OPEN, delayedCloseTime); CloseSensors(MAIN_POWER_OPEN, delayedCloseTime); - m_cameraStatus = false; - m_sensorsStatus = false; } + return true; } -bool CPhoneDevice::GetPTZSensorsStatus() +bool CPhoneDevice::GetPTZSensorsStatus(time_t waittime) { - return m_sensorsStatus; + return GpioControl::GetSelftestStatus(waittime); } bool CPhoneDevice::GetCameraStatus() { - return m_cameraStatus; + return GpioControl::GetCamerastatus(); } bool CPhoneDevice::CloseCamera() @@ -3959,7 +3940,7 @@ void CPhoneDevice::ConvertDngToPng(const std::string& dngPath, const std::string void CPhoneDevice::CameraCtrl(unsigned short waitTime, unsigned short delayTime, unsigned char channel, int cmdidx, unsigned char preset, const char *serfile, unsigned int baud, int addr) { - if(!(m_sensorsStatus && !m_cameraStatus) && GpioControl::GetCamerastatus()) { + if(GpioControl::GetSelftestStatus(waitTime) && GpioControl::GetCamerastatus()) { CPhoneDevice *pThis = this; string serfileStr(serfile); std::thread ctrlThread([pThis, waitTime, delayTime, cmdidx, channel, preset, serfileStr, baud, diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index 7dd50f0d..a1476058 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -237,7 +237,7 @@ public: virtual bool CloseSensors(int sensortype, uint32_t delayedCloseTime); virtual bool OpenPTZSensors(uint32_t sec); virtual bool ClosePTZSensors(uint32_t delayedCloseTime); - virtual bool GetPTZSensorsStatus(); + virtual bool GetPTZSensorsStatus(time_t waittime); virtual bool GetCameraStatus(); virtual void CameraCtrl(unsigned short waitTime, unsigned short delayTime, unsigned char channel, int cmdidx, unsigned char presetno, const char *serfile, unsigned int baud, int addr); virtual int GetSerialPhoto(int devno, D_IMAGE_DEF *photo); @@ -406,10 +406,9 @@ protected: std::string m_simcard; mutable std::mutex m_cameraLocker; - bool m_cameraStatus; - bool m_sensorsStatus; time_t m_lastTime; std::atomic m_shouldStopWaiting; + std::atomic m_isSelfTesting{false}; IDevice::ICE_TAIL m_tempData; mutable std::mutex m_dataLocker;