From 7493f4c22ff8f10757ada6c37b47b64e971e6ad2 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Thu, 13 Jun 2024 11:30:38 +0800 Subject: [PATCH] Add CameraHal. --- hal/abstract/IHalCpp.cpp | 16 ++++++++ hal/include/IHalCpp.h | 7 ++++ hal/src/CameraHal.cpp | 82 ++++++++++++++++++++++++++++++++++++++++ hal/src/CameraHal.h | 52 +++++++++++++++++++++++++ hal/src/HalCpp.cpp | 2 +- 5 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 hal/src/CameraHal.cpp create mode 100644 hal/src/CameraHal.h diff --git a/hal/abstract/IHalCpp.cpp b/hal/abstract/IHalCpp.cpp index 766bcdc..734f563 100644 --- a/hal/abstract/IHalCpp.cpp +++ b/hal/abstract/IHalCpp.cpp @@ -66,6 +66,7 @@ void VCameraHalMonitor::ReportEvent(const CameraReportEvent &event) } camera_task_param::camera_task_param(const CameraTaskType &cameraTask) : mCameraTask(cameraTask) { + mVideoRecordingTimeMs = DEFAULT_VIDEO_RECORDING_TIME_MS; } void VCameraHal::SetCameraMonitor(std::shared_ptr &monitor) { @@ -76,6 +77,21 @@ StatusCode VCameraHal::StartSingleTask(const CameraTaskParam ¶m) LogWarning("STATUS_CODE_VIRTUAL_FUNCTION.\n"); return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } +StatusCode VCameraHal::StopTask(void) +{ + LogWarning("STATUS_CODE_VIRTUAL_FUNCTION.\n"); + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +StatusCode VCameraHal::SetAudioStreamCallback(AudioStreamCallback callback) +{ + LogWarning("STATUS_CODE_VIRTUAL_FUNCTION.\n"); + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +StatusCode VCameraHal::SetVideoStreamCallback(VideoStreamCallback callback) +{ + LogWarning("STATUS_CODE_VIRTUAL_FUNCTION.\n"); + return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} void VSdCardHalMonitor::ReportEvent(const SdCardHalStatus &status) { LogWarning("STATUS_CODE_VIRTUAL_FUNCTION.\n"); diff --git a/hal/include/IHalCpp.h b/hal/include/IHalCpp.h index 42e421b..1a9902f 100644 --- a/hal/include/IHalCpp.h +++ b/hal/include/IHalCpp.h @@ -112,12 +112,16 @@ public: public: T mData; }; +constexpr int DEFAULT_VIDEO_RECORDING_TIME_MS = 10 * 1000; typedef struct camera_task_param { camera_task_param(const CameraTaskType &cameraTask); const CameraTaskType mCameraTask; + unsigned int mVideoRecordingTimeMs; std::shared_ptr mCtx; } CameraTaskParam; +using AudioStreamCallback = void (*)(const void *, const int); +using VideoStreamCallback = void (*)(const void *, const int); class VCameraHal { public: @@ -125,6 +129,9 @@ public: virtual ~VCameraHal() = default; virtual void SetCameraMonitor(std::shared_ptr &monitor); virtual StatusCode StartSingleTask(const CameraTaskParam ¶m); + virtual StatusCode StopTask(void); + virtual StatusCode SetAudioStreamCallback(AudioStreamCallback callback); + virtual StatusCode SetVideoStreamCallback(VideoStreamCallback callback); }; class VSdCardHalMonitor { diff --git a/hal/src/CameraHal.cpp b/hal/src/CameraHal.cpp new file mode 100644 index 0000000..7f4fefd --- /dev/null +++ b/hal/src/CameraHal.cpp @@ -0,0 +1,82 @@ +/* + * 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 "CameraHal.h" +#include "ILog.h" +CameraHal::CameraHal() + : mTaskRuning(false), mMediaRecordingTimeMs(NO_MEDIA_RECORDING), mAudioStreamCallback(nullptr), + mVideoStreamCallback(nullptr) +{ +} +void CameraHal::Init(void) +{ +} +void CameraHal::UnInit(void) +{ + mTaskRuning = false; + mCv.notify_one(); +} +StatusCode CameraHal::StartSingleTask(const CameraTaskParam ¶m) +{ + mMediaRecordingTimeMs = param.mVideoRecordingTimeMs; + auto taskTimerThread = [=](std::shared_ptr media) { + LogInfo("StartSingleTask start.\n"); + media->TaskTimer(); + }; + std::shared_ptr media = std::dynamic_pointer_cast(shared_from_this()); + mTaskTimerThread = std::thread(taskTimerThread, media); + return CreateStatusCode(STATUS_CODE_OK); +} +StatusCode CameraHal::StopTask(void) +{ + mTaskRuning = false; + mCv.notify_one(); + return CreateStatusCode(STATUS_CODE_OK); +} +StatusCode CameraHal::SetAudioStreamCallback(AudioStreamCallback callback) +{ + mAudioStreamCallback = callback; + return CreateStatusCode(STATUS_CODE_OK); +} +StatusCode CameraHal::SetVideoStreamCallback(VideoStreamCallback callback) +{ + mVideoStreamCallback = callback; + return CreateStatusCode(STATUS_CODE_OK); +} +void CameraHal::GetAudioStream(const void *stream, const unsigned int &length) +{ + if (mTaskRuning && nullptr != mAudioStreamCallback) { + mAudioStreamCallback(stream, length); + } +} +void CameraHal::GetVideoStream(const void *stream, const unsigned int &length) +{ + if (mTaskRuning && nullptr != mVideoStreamCallback) { + mVideoStreamCallback(stream, length); + } +} +void CameraHal::TaskTimer(void) +{ + mTaskRuning = true; + while (mTaskRuning) { + std::unique_lock lock(mMutex); + mCv.wait_for(lock, std::chrono::milliseconds(mMediaRecordingTimeMs), [&] { + return !mTaskRuning; + }); + /** + * @brief If the recording time is over, you need to stop the recording timer here. + */ + mTaskRuning = false; + } +} \ No newline at end of file diff --git a/hal/src/CameraHal.h b/hal/src/CameraHal.h new file mode 100644 index 0000000..e01f2ac --- /dev/null +++ b/hal/src/CameraHal.h @@ -0,0 +1,52 @@ +/* + * 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 CAMERA_HAL_H +#define CAMERA_HAL_H +#include "IHalCpp.h" +#include +#include +#include +constexpr unsigned int NO_MEDIA_RECORDING = -1; +class CameraHal : public VCameraHal, public std::enable_shared_from_this +{ +public: + CameraHal(); + virtual ~CameraHal() = default; + virtual void Init(void); + virtual void UnInit(void); + +protected: + StatusCode StartSingleTask(const CameraTaskParam ¶m) override; + StatusCode StopTask(void) override; + StatusCode SetAudioStreamCallback(AudioStreamCallback callback) override; + StatusCode SetVideoStreamCallback(VideoStreamCallback callback) override; + +protected: + void GetAudioStream(const void *stream, const unsigned int &length); + void GetVideoStream(const void *stream, const unsigned int &length); + +private: + void TaskTimer(void); + +private: + std::mutex mMutex; + std::condition_variable mCv; + bool mTaskRuning; + std::thread mTaskTimerThread; + unsigned int mMediaRecordingTimeMs; + AudioStreamCallback mAudioStreamCallback; + VideoStreamCallback mVideoStreamCallback; +}; +#endif \ No newline at end of file diff --git a/hal/src/HalCpp.cpp b/hal/src/HalCpp.cpp index b9875e3..7bf1534 100644 --- a/hal/src/HalCpp.cpp +++ b/hal/src/HalCpp.cpp @@ -57,7 +57,7 @@ StatusCode HalCpp::GetSdCardHal(std::shared_ptr &sdCard) } StatusCode HalCpp::GetAllLeds(std::map> &allLeds) { - LogInfo("GetAllLeds\n"); + LogInfo("GetAllLeds, size = %d\n", mLeds.size()); for (auto &led : mLeds) { std::shared_ptr ledControl = std::dynamic_pointer_cast(led); if (nullptr == ledControl) {