diff --git a/app/src/main/cpp/GPIOControl.cpp b/app/src/main/cpp/GPIOControl.cpp index e156be1f..35efa7d4 100644 --- a/app/src/main/cpp/GPIOControl.cpp +++ b/app/src/main/cpp/GPIOControl.cpp @@ -23,10 +23,7 @@ #define IOT_PARAM_READ 0xAF std::mutex GpioControl::m_locker; -CSemaphore GpioControl::m_semaphore; std::vector GpioControl::m_items; -std::thread GpioControl::m_thread; -bool GpioControl::m_exitSignal = false; bool GpioControl::m_cameraPowerStatus = false; size_t GpioControl::turnOnImpl(const IOT_PARAM& param) @@ -56,7 +53,7 @@ size_t GpioControl::turnOnImpl(const IOT_PARAM& param) if (it == m_items.end()) { oldRef = 0; - ITEM item = {param.cmd, references, 0, 0, now}; + ITEM item = {param.cmd, references, now}; m_items.push_back(item); SetCamerastatus(param.cmd, true); } @@ -231,14 +228,15 @@ size_t GpioControl::TurnOffImmediately(int cmd) { if (it->cmd == cmd) { - ref = it->references; - it->closeCmds++; - it->closeTime = ts; + if (it->references > 0) + { + it->references = 0; + setInt(it->cmd, 0); + } break; } } m_locker.unlock(); - m_semaphore.release(); #ifdef _DEBUG ALOGI("PWR TurnOffNow cmd=%d ref=%u", cmd, (uint32_t)ref); #endif @@ -254,22 +252,34 @@ size_t GpioControl::TurnOff(int cmd, uint32_t delayedCloseTime/* = 0*/) } size_t ref = 0; std::vector::iterator it; + + if (delayedCloseTime > 0) + { + std::shared_ptr powerCtrl = std::make_shared(cmd); + std::thread th([delayedCloseTime, powerCtrl]() mutable { + std::this_thread::sleep_for(std::chrono::seconds(delayedCloseTime)); + powerCtrl.reset(); + }); + th.detach(); + } + m_locker.lock(); for (it = m_items.begin(); it != m_items.end(); ++it) { if (it->cmd == cmd) { - ref = it->references; - it->closeCmds++; - if (ts > it->closeTime) + if (it->references > 0) { - it->closeTime = ts; + it->references--; + if (it->references == 0) + { + setInt(it->cmd, 0); + } } break; } } m_locker.unlock(); - m_semaphore.release(); #ifdef _DEBUG ALOGI("PWR TurnOff cmd=%d ref=%u", cmd, (uint32_t)ref); #endif @@ -285,6 +295,17 @@ size_t GpioControl::TurnOff(const std::vector& cmds, uint32_t delayedCloseT } std::vector::iterator it; std::vector::const_reverse_iterator itCmd; + + if (delayedCloseTime > 0) + { + std::shared_ptr powerCtrl = std::make_shared(cmds); + std::thread th([delayedCloseTime, powerCtrl]() mutable { + std::this_thread::sleep_for(std::chrono::seconds(delayedCloseTime)); + powerCtrl.reset(); + }); + th.detach(); + } + m_locker.lock(); // turnOnImpl(param); for (itCmd = cmds.crbegin(); itCmd != cmds.crend(); ++itCmd) @@ -293,25 +314,39 @@ size_t GpioControl::TurnOff(const std::vector& cmds, uint32_t delayedCloseT { if (it->cmd == *itCmd) { - it->closeCmds++; - if (ts > it->closeTime) + if (it->references > 0) { - it->closeTime = ts; + it->references--; + if (it->references == 0) + { + setInt(it->cmd, 0); + } } break; } } } m_locker.unlock(); - m_semaphore.release(); return 0; } size_t GpioControl::TurnOff(const std::vector >& cmds) { - time_t ts = time(NULL); - time_t ts2; + for (auto itCmd = cmds.cbegin(); itCmd != cmds.end(); ++itCmd) + { + if (itCmd->second > 0) + { + uint32_t delayedCloseTime = itCmd->second; + std::shared_ptr powerCtrl = std::make_shared(itCmd->first); + std::thread th([delayedCloseTime, powerCtrl]() mutable { + std::this_thread::sleep_for(std::chrono::seconds(delayedCloseTime)); + powerCtrl.reset(); + }); + th.detach(); + } + } + std::vector::iterator it; std::vector >::const_iterator itCmd; m_locker.lock(); @@ -321,14 +356,12 @@ size_t GpioControl::TurnOff(const std::vector >& cmds) { if (it->cmd == itCmd->first) { - - it->closeCmds++; - if (itCmd->second != 0) + if (it->references > 0) { - ts2 = itCmd->second + ts; - if (ts2 > it->closeTime) + it->references--; + if (it->references == 0) { - it->closeTime = ts2; + setInt(it->cmd, 0); } } break; @@ -336,7 +369,6 @@ size_t GpioControl::TurnOff(const std::vector >& cmds) } } m_locker.unlock(); - m_semaphore.release(); return 0; } @@ -373,7 +405,7 @@ bool GpioControl::GetSelftestStatus(time_t wait_time) 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)) + if (it->cmd == cmd && it->references > 0 && it->openTime!=0 && (now - it->openTime >= wait_time)) { return true;//自检完成 } @@ -395,128 +427,13 @@ time_t GpioControl::GetSelfTestRemain(time_t wait_time) 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)) + if (it->cmd == cmd && it->references > 0) { - time_t remaintime =wait_time - (now - it->openTime); + time_t remaintime = (now - it->openTime); + remaintime = (wait_time > remaintime) ? (wait_time - remaintime) : 0; return remaintime;//自检完成 } } return 0; } -void GpioControl::PowerControlThreadProc() -{ - time_t ts = 0; - std::vector::iterator it; - std::vector items; - time_t minDelayTime = 0; - time_t delayTime = 0; - int fd = -1; - int res = -1; - m_cameraPowerStatus = 0; - - while(1) - { - // Check if there is close cmd - ts = time(NULL); - - minDelayTime = std::numeric_limits::max(); - - m_locker.lock(); - for (it = m_items.begin(); it != m_items.end(); ++it) - { - if (it->references == 0 && it->closeCmds == 0 && it->closeTime == 0) - { -#ifdef _DEBUG - ALOGI("PWR THREAD cmd=%d ref=%u closeCmds=%u", it->cmd, (uint32_t)it->references, (uint32_t)it->closeCmds); -#endif - continue; - } - - if (it->closeCmds > 0) - { - if (it->references <= it->closeCmds) - { - it->references = 0; - } - else - { - it->references -= it->closeCmds; - if(it->references < 0) - it->references = 0; - } - it->closeCmds = 0; - } - - if (it->references == 0) - { - // Should turn off the power - if ((it->closeTime == 0) || (it->closeTime <= ts)) - { - // close it directly - setInt(it->cmd, 0); - it->closeTime = 0; - it->openTime = 0; -#ifdef _DEBUG - ALOGI("PWR THREAD DO TurnOff cmd=%d", it->cmd); -#endif - SetCamerastatus(it->cmd, false); - } - else - { - // Check Time - delayTime = ts - it->closeTime; - if (delayTime < minDelayTime) - { - minDelayTime = delayTime; - } - } - } -#ifdef _DEBUG - ALOGI("PWR THREAD cmd=%d ref=%u closeCmds=%u", it->cmd, (uint32_t)it->references, (uint32_t)it->closeCmds); -#endif - } - m_locker.unlock(); - - if (minDelayTime < std::numeric_limits::max()) - { - m_semaphore.try_acquire_for(std::chrono::seconds(1)); - } - else - { - m_semaphore.acquire(); - } - - if (m_exitSignal) - { - break; - } - } -} - -bool GpioControl::Startup() -{ - if (m_thread.joinable()) - { - return true; - } - // if (m_thread.) - m_exitSignal = false; - m_thread = std::thread(PowerControlThreadProc); -#ifdef _DEBUG - pthread_t nativeHandle = m_thread.native_handle(); - pthread_setname_np(nativeHandle, "gpioclose"); -#endif - return true; -} - -void GpioControl::Stop() -{ - // Notify - m_exitSignal = true; - m_semaphore.release(); - m_thread.detach(); -} - - - diff --git a/app/src/main/cpp/GPIOControl.h b/app/src/main/cpp/GPIOControl.h index 8059395f..841281a8 100644 --- a/app/src/main/cpp/GPIOControl.h +++ b/app/src/main/cpp/GPIOControl.h @@ -160,17 +160,12 @@ public: { int cmd; size_t references; - size_t closeCmds; - time_t closeTime; time_t openTime; }; private: static std::mutex m_locker; - static CSemaphore m_semaphore; static std::vector m_items; - static bool m_exitSignal; - static std::thread m_thread; static bool m_cameraPowerStatus; protected: @@ -191,11 +186,6 @@ public: static bool GetSelftestStatus(time_t wait_time); static time_t GetSelfTestRemain(time_t wait_time); - static void PowerControlThreadProc(); - - static bool Startup(); - static void Stop(); - public: static void setInt(int cmd, int value); static int getInt(int cmd); @@ -445,6 +435,12 @@ public: m_cmds.resize(1, cmd1); TurnOn(); } + PowerControl(const std::vector& cmds) : m_delayCloseTime(0) + { + m_cmds = cmds; + TurnOn(); + } + PowerControl(int cmd1, uint32_t closeDelayTime) : m_delayCloseTime(closeDelayTime) { m_cmds.resize(1, cmd1); @@ -521,7 +517,7 @@ public: GpioControl::TurnOff(m_cmds, m_delayCloseTime); #ifdef OUTPUT_DBG_INFO std::string status = GetStatus(); - XYLOG(XYLOG_SEVERITY_INFO, "PWR After TurnOff %s", status.c_str()); + XYLOG(XYLOG_SEVERITY_INFO, "PWR After TurnOff %s, DelayCloseTime=%u", status.c_str(), m_delayCloseTime); #endif } diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 1a36b3df..fa5e9555 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -509,8 +509,6 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa RegisterHandlerForSignal(SIGUSR2); - GpioControl::Startup(); - LoadNetworkInfo(); m_vm = vm; @@ -605,8 +603,6 @@ CPhoneDevice::~CPhoneDevice() delete m_network; m_network = NULL; } - - GpioControl::Stop(); } void CPhoneDevice::SetListener(IListener* listener)