From ef0a94eb5592c535942a03c73cc47ab4b05e49fd Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Fri, 26 Apr 2024 19:24:03 +0800 Subject: [PATCH] Add:SD card hal code. --- build/cmake/toolchain/linux.toolchain.cmake | 6 +- hal/CMakeLists.txt | 2 + hal/abstract/IHalCpp.cpp | 7 ++ hal/include/IHalCpp.h | 23 ++++++ hal/src/HalCpp.cpp | 20 ++++- hal/src/HalCpp.h | 4 + hal/src/HalMakePtr.cpp | 7 ++ hal/src/HalMakePtr.h | 1 + hal/src/SdCardHal.cpp | 88 +++++++++++++++++++++ hal/src/SdCardHal.h | 32 ++++++++ 10 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 hal/src/SdCardHal.cpp create mode 100644 hal/src/SdCardHal.h diff --git a/build/cmake/toolchain/linux.toolchain.cmake b/build/cmake/toolchain/linux.toolchain.cmake index 82c6dab..16d0c27 100755 --- a/build/cmake/toolchain/linux.toolchain.cmake +++ b/build/cmake/toolchain/linux.toolchain.cmake @@ -72,4 +72,8 @@ set(APP_MANAGER_DEVICE_IP "localhost") # set(APP_MANAGER_DEVICE_IP "192.168.1.29") set(APP_MANAGER_HTTP_SERVER_PORT "8080") set(APP_MANAGER_TCP_SERVER_PORT "9876") -# ------------ build AppManager end ------------ # \ No newline at end of file +# ------------ build AppManager end ------------ # + +# ------------ build sd card ------------ # +# set(SD_CARD_DEV "dev/test") +# ------------ build sd card end ------------ # \ No newline at end of file diff --git a/hal/CMakeLists.txt b/hal/CMakeLists.txt index 5169b8a..bb9499b 100644 --- a/hal/CMakeLists.txt +++ b/hal/CMakeLists.txt @@ -16,6 +16,8 @@ include_directories( # ${EXTERNAL_SOURCE_PATH}/curl/curl-8.1.2/build/lib # ) +add_definitions(-DSD_CARD_DEV=\"${SD_CARD_DEV}\") + aux_source_directory(./abstract ABSTRACT_SRC_FILES) aux_source_directory(./src IMPL_SRC_FILES) diff --git a/hal/abstract/IHalCpp.cpp b/hal/abstract/IHalCpp.cpp index e2de904..0665dfd 100644 --- a/hal/abstract/IHalCpp.cpp +++ b/hal/abstract/IHalCpp.cpp @@ -44,6 +44,9 @@ void VCameraHal::SetCameraMonitor(std::shared_ptr &monitor) { LogWarning("STATUS_CODE_VIRTUAL_FUNCTION.\n"); } +void VSdCardHalMonitor::ReportEvent(const SdCardHalStatus &status) +{ +} std::shared_ptr &IHalCpp::GetInstance(std::shared_ptr *impl) { static auto instance = std::make_shared(); @@ -82,4 +85,8 @@ StatusCode IHalCpp::GetCameraHal(std::map &sdCard) +{ + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } \ No newline at end of file diff --git a/hal/include/IHalCpp.h b/hal/include/IHalCpp.h index dd28855..67cb03c 100644 --- a/hal/include/IHalCpp.h +++ b/hal/include/IHalCpp.h @@ -36,6 +36,15 @@ enum class CameraEvent PICTIRUE_AND_VIDEO, END }; +enum class SdCardHalStatus +{ + MOUNTED = 0, + UNMOUNTED, + INSERTED, + PULL_OUT, + ERROR, + END +}; typedef struct camera_report_event { camera_report_event(const std::string &fileName, const std::string &filePath, const CameraEvent &eventType, @@ -90,6 +99,19 @@ public: virtual ~VCameraHal() = default; virtual void SetCameraMonitor(std::shared_ptr &monitor); }; +class VSdCardHalMonitor +{ +public: + VSdCardHalMonitor() = default; + virtual ~VSdCardHalMonitor() = default; + virtual void ReportEvent(const SdCardHalStatus &status); +}; +class VSdCardHal +{ +public: + VSdCardHal() = default; + virtual ~VSdCardHal() = default; +}; class IHalCpp { public: @@ -102,5 +124,6 @@ public: virtual StatusCode GetAllKeys(std::map> &allKeys); virtual StatusCode GetWifiHal(std::shared_ptr &wifi); virtual StatusCode GetCameraHal(std::map> &allCameras); + virtual StatusCode GetSdCardHal(std::shared_ptr &sdCard); }; #endif diff --git a/hal/src/HalCpp.cpp b/hal/src/HalCpp.cpp index 252d766..51651a8 100644 --- a/hal/src/HalCpp.cpp +++ b/hal/src/HalCpp.cpp @@ -15,18 +15,36 @@ #include "HalCpp.h" #include "HalMakePtr.h" #include "ILog.h" +#include "SdCardHal.h" StatusCode HalCpp::Init(void) { LogInfo("HalCpp::Init\n"); + HalMakePtr::GetInstance()->CreateWifiHal(mWifiHal); + HalMakePtr::GetInstance()->CreateSdCardHal(mSdCardHal); + std::shared_ptr sdCardImpl = std::dynamic_pointer_cast(mSdCardHal); + if (nullptr != sdCardImpl) { + sdCardImpl->Init(); + } return CreateStatusCode(STATUS_CODE_OK); } StatusCode HalCpp::UnInit(void) { LogInfo("HalCpp::UnInit\n"); + std::shared_ptr sdCardImpl = std::dynamic_pointer_cast(mSdCardHal); + if (nullptr != sdCardImpl) { + sdCardImpl->UnInit(); + } + mWifiHal.reset(); + mSdCardHal.reset(); return CreateStatusCode(STATUS_CODE_OK); } StatusCode HalCpp::GetWifiHal(std::shared_ptr &wifi) { - HalMakePtr::GetInstance()->CreateWifiHal(wifi); + wifi = mWifiHal; + return CreateStatusCode(STATUS_CODE_OK); +} +StatusCode HalCpp::GetSdCardHal(std::shared_ptr &sdCard) +{ + sdCard = mSdCardHal; return CreateStatusCode(STATUS_CODE_OK); } diff --git a/hal/src/HalCpp.h b/hal/src/HalCpp.h index 701ddae..b15e213 100644 --- a/hal/src/HalCpp.h +++ b/hal/src/HalCpp.h @@ -15,6 +15,7 @@ #ifndef HALCPP_H #define HALCPP_H #include "IHalCpp.h" +#include class HalCpp : public IHalCpp { public: @@ -23,8 +24,11 @@ public: StatusCode Init(void) override; StatusCode UnInit(void) override; StatusCode GetWifiHal(std::shared_ptr &wifi) override; + StatusCode GetSdCardHal(std::shared_ptr &sdCard) override; private: std::vector> mLedHals; + std::shared_ptr mWifiHal; + std::shared_ptr mSdCardHal; }; #endif \ No newline at end of file diff --git a/hal/src/HalMakePtr.cpp b/hal/src/HalMakePtr.cpp index 1a424cf..42b6e93 100644 --- a/hal/src/HalMakePtr.cpp +++ b/hal/src/HalMakePtr.cpp @@ -16,6 +16,7 @@ #include "Hal.h" #include "HalCpp.h" #include "ILog.h" +#include "SdCardHal.h" #include "WifiHal.h" StatusCode CreateHalModule(void) { @@ -85,4 +86,10 @@ StatusCode HalMakePtr::CreateCameraHal(std::shared_ptr &impl) { LogWarning("CreateCameraHal.\n"); return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +StatusCode HalMakePtr::CreateSdCardHal(std::shared_ptr &impl) +{ + LogWarning("CreateSdCardHal.\n"); + impl = std::make_shared(); + return CreateStatusCode(STATUS_CODE_OK); } \ No newline at end of file diff --git a/hal/src/HalMakePtr.h b/hal/src/HalMakePtr.h index b880c5d..ac73f0c 100644 --- a/hal/src/HalMakePtr.h +++ b/hal/src/HalMakePtr.h @@ -36,5 +36,6 @@ public: virtual StatusCode CreateHalSharePtr(std::shared_ptr &impl); virtual StatusCode CreateWifiHal(std::shared_ptr &impl); virtual StatusCode CreateCameraHal(std::shared_ptr &impl); + virtual StatusCode CreateSdCardHal(std::shared_ptr &impl); }; #endif \ No newline at end of file diff --git a/hal/src/SdCardHal.cpp b/hal/src/SdCardHal.cpp new file mode 100644 index 0000000..1cf64e7 --- /dev/null +++ b/hal/src/SdCardHal.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2023 Fancy Code. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "SdCardHal.h" +#include "ILog.h" +#include "LinuxApi.h" +#include +#include +#include +#include +#include +#include +#include +#include +SdCardHal::SdCardHal() +{ + mThreadRuning = false; +} +void SdCardHal::Init(void) +{ + auto detectThread = [](std::shared_ptr sdCardHal) { + LogInfo("sdCardHal DevDetectingThread started.\n"); + sdCardHal->DevDetectingThread(); + }; + mDevDetectingThread = std::thread(detectThread, shared_from_this()); +} +void SdCardHal::UnInit(void) +{ + mThreadRuning = false; + if (mDevDetectingThread.joinable()) { + mDevDetectingThread.join(); + } +} +void SdCardHal::DevDetectingThread(void) +{ + constexpr int SLEEP_TIME_MS = 100; + SdCardHalStatus status = SdCardHalStatus::END; + int fd = -1; + const char *dev = "/dev/mmcblk0"; + mThreadRuning = true; + while (mThreadRuning) { + fd = open(dev, O_RDONLY); + if (fd < 0) { + LogInfo("sdCardHal: %s open failed.\n", dev); + if (SdCardHalStatus::PULL_OUT != status) { + status = SdCardHalStatus::PULL_OUT; + // TODO: pull out + } + goto CONTINUE; + } + struct stat sdStat; + if (fstat(fd, &sdStat) < 0) { + LogInfo("sdCardHal: %s fstat failed.\n", dev); + if (SdCardHalStatus::ERROR != status) { + status = SdCardHalStatus::ERROR; + // TODO: error + } + goto CONTINUE; + } + if (!S_ISBLK(sdStat.st_mode)) { + LogInfo("sdCardHal: %s is not block device.\n", dev); + if (SdCardHalStatus::PULL_OUT != status) { + status = SdCardHalStatus::PULL_OUT; + // TODO: pull out + } + } + else { + LogInfo("sdCardHal: %s is inserted.\n", dev); + if (SdCardHalStatus::INSERTED != status) { + status = SdCardHalStatus::INSERTED; + // TODO: inserted + } + } + CONTINUE: + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS)); + } +} \ No newline at end of file diff --git a/hal/src/SdCardHal.h b/hal/src/SdCardHal.h new file mode 100644 index 0000000..c85c25f --- /dev/null +++ b/hal/src/SdCardHal.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 Fancy Code. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef SD_CARD_HAL_H +#define SD_CARD_HAL_H +#include "IHalCpp.h" +#include +class SdCardHal : public VSdCardHal, public std::enable_shared_from_this +{ +public: + SdCardHal(); + virtual ~SdCardHal() = default; + void Init(void); + void UnInit(void); + void DevDetectingThread(void); + +private: + bool mThreadRuning; + std::thread mDevDetectingThread; +}; +#endif \ No newline at end of file