From 61df3be654231e9a62d1e63b7caec4e43035be7b Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Mon, 6 May 2024 14:43:47 +0800 Subject: [PATCH] Improve:wifi hal init ap mode. --- hal/abstract/IHalCpp.cpp | 4 ++ hal/include/IHalCpp.h | 1 + hal/src/WifiHal.cpp | 19 ++++++++ hal/src/WifiHal.h | 8 +++- middleware/AppManager/src/AppManager.cpp | 58 ++++++++++++++++++------ middleware/AppManager/src/AppManager.h | 5 ++ 6 files changed, 80 insertions(+), 15 deletions(-) diff --git a/hal/abstract/IHalCpp.cpp b/hal/abstract/IHalCpp.cpp index 44e0d39..cbae51c 100644 --- a/hal/abstract/IHalCpp.cpp +++ b/hal/abstract/IHalCpp.cpp @@ -36,6 +36,10 @@ StatusCode VWifiHal::OpenApMode(void) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } +StatusCode VWifiHal::CloseApMode(void) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} void VCameraHalMonitor::ReportEvent(const CameraReportEvent &event) { } diff --git a/hal/include/IHalCpp.h b/hal/include/IHalCpp.h index ce1fd70..f7f27c4 100644 --- a/hal/include/IHalCpp.h +++ b/hal/include/IHalCpp.h @@ -74,6 +74,7 @@ public: VWifiHal() = default; virtual ~VWifiHal() = default; virtual StatusCode OpenApMode(void); + virtual StatusCode CloseApMode(void); }; class VCameraHalMonitor { diff --git a/hal/src/WifiHal.cpp b/hal/src/WifiHal.cpp index 235a9df..d2ab691 100644 --- a/hal/src/WifiHal.cpp +++ b/hal/src/WifiHal.cpp @@ -20,12 +20,16 @@ #include #include #include +WifiHal::WifiHal() : mInitRunning(false) +{ +} StatusCode WifiHal::OpenApMode(void) { LogInfo("OpenApMode. \n"); constexpr int SLEEP_TIME_MS = 5; constexpr int WAITING_TIME_MS = 1000 * 10; unsigned int sleepingTime_ms = 0; + mInitRunning = true; while (CheckWlan0IfExist() == false) { std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS)); sleepingTime_ms += SLEEP_TIME_MS; @@ -33,6 +37,10 @@ StatusCode WifiHal::OpenApMode(void) LogError("wlan0 not found. \n"); return CreateStatusCode(STATUS_CODE_NOT_OK); } + if (false == mInitRunning) { + LogError("Open ap mode stop. \n"); + return CreateStatusCode(STATUS_CODE_NOT_OK); + } } LogInfo("wlan0 ok. \n"); fx_system("ifconfig wlan0 192.168.169.1 netmask 255.255.255.0"); @@ -41,6 +49,17 @@ StatusCode WifiHal::OpenApMode(void) fx_system("udhcpd -f /etc/udhcpd.conf &"); return CreateStatusCode(STATUS_CODE_OK); } +StatusCode WifiHal::CloseApMode(void) +{ + mInitRunning = false; + return CreateStatusCode(STATUS_CODE_OK); +} +void WifiHal::Init(void) +{ +} +void WifiHal::UnInit(void) +{ +} bool WifiHal::CheckWlan0IfExist(void) { DIR *dir; diff --git a/hal/src/WifiHal.h b/hal/src/WifiHal.h index 4183c41..b251150 100644 --- a/hal/src/WifiHal.h +++ b/hal/src/WifiHal.h @@ -18,11 +18,17 @@ class WifiHal : public VWifiHal { public: - WifiHal() = default; + WifiHal(); virtual ~WifiHal() = default; StatusCode OpenApMode(void) override; + StatusCode CloseApMode(void) override; + void Init(void); + void UnInit(void); private: bool CheckWlan0IfExist(void); + +private: + bool mInitRunning; }; #endif \ No newline at end of file diff --git a/middleware/AppManager/src/AppManager.cpp b/middleware/AppManager/src/AppManager.cpp index 508dc0c..c4a8ad6 100644 --- a/middleware/AppManager/src/AppManager.cpp +++ b/middleware/AppManager/src/AppManager.cpp @@ -19,28 +19,34 @@ #include "ILog.h" #include "TcpModule.h" #include "WebServer.h" -AppManager::AppManager() +AppManager::AppManager() : mTcpServer(nullptr), mInitRuning(false) { - mTcpServer = nullptr; } const StatusCode AppManager::Init(const AppParam ¶m) { - std::shared_ptr wifi; - IHalCpp::GetInstance()->GetWifiHal(wifi); - if (!wifi) { - LogError("Get wifi hal failed.\n"); - return CreateStatusCode(STATUS_CODE_NOT_OK); - } - wifi->OpenApMode(); - std::shared_ptr protocolHandle; - AppManagerMakePtr::GetInstance()->CreateProtocolHandle(protocolHandle); - IAppProtocolHandle::GetInstance(&protocolHandle); - HttpServerStart(param); - TcpServerStart(param); + auto initThread = [](std::shared_ptr appManager, const AppParam param) { + LogInfo("WifiApModeInit started.\n"); + appManager->WifiApModeInit(param); + }; + mInitThread = std::thread(initThread, shared_from_this(), param); return CreateStatusCode(STATUS_CODE_OK); } const StatusCode AppManager::UnInit(void) { + if (true == mInitRuning) { + std::shared_ptr wifi; + IHalCpp::GetInstance()->GetWifiHal(wifi); + if (!wifi) { + LogWarning("Get wifi hal failed.\n"); + goto GOAHEAD; + } + wifi->CloseApMode(); + } +GOAHEAD: + mInitRuning = false; + if (mInitThread.joinable()) { + mInitThread.join(); + } HttpServerStop(); TcpServerStop(); std::shared_ptr protocolHandle = std::make_shared(); @@ -156,4 +162,28 @@ void AppManager::TcpServerStop(void) if (nullptr != mTcpServer) { FreeTcpServer(mTcpServer); } +} +void AppManager::WifiApModeInit(const AppParam ¶m) +{ + mInitRuning = true; + std::shared_ptr wifi; + IHalCpp::GetInstance()->GetWifiHal(wifi); + if (!wifi) { + LogError("Get wifi hal failed.\n"); + return; + } + /** + * @brief This interface depends on hardware and may block. It is necessary to ensure that hardware interface + * blocking does not cause the main thread to block. + */ + wifi->OpenApMode(); + if (false == mInitRuning) { + LogWarning("AppManager init stop.\n"); + return; + } + std::shared_ptr protocolHandle; + AppManagerMakePtr::GetInstance()->CreateProtocolHandle(protocolHandle); + IAppProtocolHandle::GetInstance(&protocolHandle); + HttpServerStart(param); + TcpServerStart(param); } \ No newline at end of file diff --git a/middleware/AppManager/src/AppManager.h b/middleware/AppManager/src/AppManager.h index 308a08d..25e044e 100644 --- a/middleware/AppManager/src/AppManager.h +++ b/middleware/AppManager/src/AppManager.h @@ -41,12 +41,17 @@ private: void TcpServerStart(const AppParam ¶m); void TcpServerStop(void); +private: + void WifiApModeInit(const AppParam ¶m); + private: std::thread mHttpSever; std::shared_ptr mProtocolHandle; void *mTcpServer; std::shared_ptr mAppMonitor; std::map> mAppClients; + bool mInitRuning; + std::thread mInitThread; }; #endif