From e4e174a0833537bb60fe351363885437f87cd6b4 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 8 May 2025 13:04:39 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4gpio=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/GPIOControl.cpp | 26 ++++++++++++++++++++++---- app/src/main/cpp/GPIOControl.h | 2 ++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/app/src/main/cpp/GPIOControl.cpp b/app/src/main/cpp/GPIOControl.cpp index 4d1e9dcd..de85c330 100644 --- a/app/src/main/cpp/GPIOControl.cpp +++ b/app/src/main/cpp/GPIOControl.cpp @@ -23,6 +23,7 @@ #define IOT_PARAM_READ 0xAF std::mutex GpioControl::m_locker; +std::mutex GpioControl::m_gpioLocker; std::vector GpioControl::m_items; bool GpioControl::m_cameraPowerStatus = false; @@ -105,6 +106,7 @@ size_t GpioControl::turnOnImpl(const IOT_PARAM& param) #ifdef ENABLE_GPIO_TRACING GpioDebugLogger logger(param.cmd, param.value); #endif + m_gpioLocker.lock(); fd = open(GPIO_NODE_MP, O_RDONLY); if( fd > 0 ) { @@ -116,6 +118,7 @@ size_t GpioControl::turnOnImpl(const IOT_PARAM& param) XYLOG(XYLOG_SEVERITY_DEBUG, "setInt cmd=%d,value=%d,result=%d",param.cmd, param.value, param.result); #endif } + m_gpioLocker.unlock(); #ifdef _DEBUG ALOGI("PWR TurnOn cmd=%d,result=%d ref=%u\r\n",param.cmd, param.result, (uint32_t)references); #endif @@ -134,6 +137,7 @@ void GpioControl::setInt(int cmd, int value) #ifdef ENABLE_GPIO_TRACING GpioDebugLogger logger(cmd, value); #endif + m_gpioLocker.lock(); int fd = open(GPIO_NODE_MP, O_RDONLY); if (fd > 0) { @@ -145,6 +149,7 @@ void GpioControl::setInt(int cmd, int value) XYLOG(XYLOG_SEVERITY_DEBUG, "setInt cmd=%d,value=%d,result=%d",param.cmd, value, param.result); #endif } + m_gpioLocker.unlock(); } int GpioControl::getInt(int cmd) @@ -152,6 +157,7 @@ int GpioControl::getInt(int cmd) #ifdef ENABLE_GPIO_TRACING GpioDebugLogger logger(cmd); #endif + m_gpioLocker.lock(); int fd = open(GPIO_NODE_MP, O_RDONLY); // LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd); if( fd > 0 ) @@ -163,29 +169,34 @@ int GpioControl::getInt(int cmd) ALOGI("getInt cmd=%d,value=%d,result=%d",param.cmd, param.value, param.result); #endif close(fd); + m_gpioLocker.unlock(); return param.value; } + m_gpioLocker.unlock(); return -1; } void GpioControl::setLong(int cmd, long value) { - int fd = open(GPIO_NODE_MP, O_RDONLY); IOT_PARAM param; param.cmd = cmd; param.value2 = value; // LOGE("set_long fd=%d,cmd=%d,value2=%ld\r\n",fd, param.cmd, param.value2); + m_gpioLocker.lock(); + int fd = open(GPIO_NODE_MP, O_RDONLY); if( fd > 0 ) { ioctl(fd, IOT_PARAM_WRITE, ¶m); // LOGE("set_long22 cmd=%d,value2=%ld,result=%d\r\n",param.cmd, param.value2, param.result); close(fd); } + m_gpioLocker.unlock(); } long GpioControl::getLong(int cmd) { + m_gpioLocker.lock(); int fd = open(GPIO_NODE_MP, O_RDONLY); // LOGE("get_long fd=%d,cmd=%d\r\n",fd, cmd); if( fd > 0 ) @@ -195,32 +206,37 @@ long GpioControl::getLong(int cmd) ioctl(fd, IOT_PARAM_READ, ¶m); // LOGE("get_long22 cmd=%d,value2=%ld,result=%d\r\n",param.cmd, param.value2, param.result); close(fd); + m_gpioLocker.unlock(); return param.value2; } + m_gpioLocker.unlock(); return -1; } void GpioControl::setString(int cmd, const std::string& value) { IOT_PARAM param; - int fd = open(GPIO_NODE_MP, O_RDONLY); - int len = MAX_STRING_LEN < value.size() ? MAX_STRING_LEN : value.size(); - param.cmd = cmd; memset(param.str, 0, MAX_STRING_LEN); + int len = MAX_STRING_LEN < value.size() ? MAX_STRING_LEN : value.size(); memcpy(param.str, value.c_str(), len); // LOGE("set_string fd=%d,cmd=%d,str=%s\r\n",fd, param.cmd, param.str); + + m_gpioLocker.lock(); + int fd = open(GPIO_NODE_MP, O_RDONLY); if( fd > 0 ) { ioctl(fd, IOT_PARAM_WRITE, ¶m); // LOGE("set_string22 cmd=%d,str=%s,result=%d\r\n",param.cmd, param.str, param.result); close(fd); } + m_gpioLocker.unlock(); return; } std::string GpioControl::getString(int cmd) { + m_gpioLocker.lock(); int fd = open(GPIO_NODE_MP, O_RDONLY); // LOGE("get_string fd=%d,cmd=%d\r\n",fd, cmd); if( fd > 0 ) @@ -230,8 +246,10 @@ std::string GpioControl::getString(int cmd) ioctl(fd, IOT_PARAM_READ, ¶m); // LOGE("get_string22 cmd=%d,str=%s,result=%d\r\n",param.cmd, param.str, param.result); close(fd); + m_gpioLocker.unlock(); return std::string(param.str); } + m_gpioLocker.unlock(); return ""; } diff --git a/app/src/main/cpp/GPIOControl.h b/app/src/main/cpp/GPIOControl.h index 037e1a29..ceea8862 100644 --- a/app/src/main/cpp/GPIOControl.h +++ b/app/src/main/cpp/GPIOControl.h @@ -184,6 +184,8 @@ private: static std::vector m_items; static bool m_cameraPowerStatus; + static std::mutex m_gpioLocker; + protected: static size_t turnOnImpl(const IOT_PARAM& param); static size_t turnOffImpl(const IOT_PARAM& param);