1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef CAMERA_INPUT_NAPI_H_ 17 #define CAMERA_INPUT_NAPI_H_ 18 19 #include <atomic> 20 #include <cstdint> 21 #include <mutex> 22 #include <uv.h> 23 24 #include "camera_napi_event_emitter.h" 25 #include "camera_napi_utils.h" 26 #include "camera_napi_worker_queue_keeper.h" 27 #include "input/camera_input.h" 28 #include "input/camera_manager.h" 29 #include "listener_base.h" 30 31 namespace OHOS { 32 namespace CameraStandard { 33 static const char CAMERA_INPUT_NAPI_CLASS_NAME[] = "CameraInput"; 34 35 struct CameraInputAsyncContext; 36 37 class ErrorCallbackListener : public ErrorCallback, 38 public ListenerBase, 39 public std::enable_shared_from_this<ErrorCallbackListener> { 40 public: ErrorCallbackListener(napi_env env)41 ErrorCallbackListener(napi_env env) : ListenerBase(env) {} 42 ~ErrorCallbackListener() = default; 43 void OnError(const int32_t errorType, const int32_t errorMsg) const override; 44 45 private: 46 void OnErrorCallback(const int32_t errorType, const int32_t errorMsg) const; 47 void OnErrorCallbackAsync(const int32_t errorType, const int32_t errorMsg) const; 48 }; 49 50 struct ErrorCallbackInfo { 51 int32_t errorType_; 52 int32_t errorMsg_; 53 weak_ptr<const ErrorCallbackListener> listener_; ErrorCallbackInfoErrorCallbackInfo54 ErrorCallbackInfo(int32_t errorType, int32_t errorMsg, shared_ptr<const ErrorCallbackListener> listener) 55 : errorType_(errorType), errorMsg_(errorMsg), listener_(listener) {} 56 }; 57 58 class OcclusionDetectCallbackListener : public CameraOcclusionDetectCallback, 59 public ListenerBase, 60 public std::enable_shared_from_this<OcclusionDetectCallbackListener> { 61 public: OcclusionDetectCallbackListener(napi_env env)62 OcclusionDetectCallbackListener(napi_env env) : ListenerBase(env) {} 63 ~OcclusionDetectCallbackListener() = default; 64 void OnCameraOcclusionDetected(const uint8_t isCameraOcclusion, 65 const uint8_t isCameraLensDirty) const override; 66 67 private: 68 void OnCameraOcclusionDetectedCallback(const uint8_t isCameraOcclusion, 69 const uint8_t isCameraLensDirty) const; 70 void OnCameraOcclusionDetectedCallbackAsync(const uint8_t isCameraOcclusion, 71 const uint8_t isCameraLensDirty) const; 72 }; 73 74 struct CameraOcclusionDetectResult { 75 uint8_t isCameraOccluded_; 76 uint8_t isCameraLensDirty_; 77 weak_ptr<const OcclusionDetectCallbackListener> listener_; CameraOcclusionDetectResultCameraOcclusionDetectResult78 CameraOcclusionDetectResult(uint8_t isCameraOccluded, uint8_t isCameraLensDirty, 79 shared_ptr<const OcclusionDetectCallbackListener> listener) 80 : isCameraOccluded_(isCameraOccluded), isCameraLensDirty_(isCameraLensDirty), listener_(listener) {} 81 }; 82 83 class CameraInputNapi : public CameraNapiEventEmitter<CameraInputNapi> { 84 public: 85 static napi_value Init(napi_env env, napi_value exports); 86 static napi_value CreateCameraInput(napi_env env, sptr<CameraInput> cameraInput); 87 CameraInputNapi(); 88 ~CameraInputNapi() override; 89 90 static void NapiCreateInt32Logs( 91 napi_env env, int32_t contextMode, std::unique_ptr<JSAsyncContextOutput>& jsContext); 92 static void NapiCreateDoubleLogs( 93 napi_env env, double contextMode, std::unique_ptr<JSAsyncContextOutput>& jsContext); 94 95 static napi_value Open(napi_env env, napi_callback_info info); 96 static napi_value Close(napi_env env, napi_callback_info info); 97 static napi_value closeDelayed(napi_env env, napi_callback_info info); 98 static napi_value Release(napi_env env, napi_callback_info info); 99 static napi_value On(napi_env env, napi_callback_info info); 100 static napi_value Off(napi_env env, napi_callback_info info); 101 static napi_value Once(napi_env env, napi_callback_info info); 102 static napi_value UsedAsPosition(napi_env env, napi_callback_info info); 103 static napi_value ControlAuxiliary(napi_env env, napi_callback_info info); 104 105 const EmitterFunctions& GetEmitterFunctions() override; 106 107 sptr<CameraInput> GetCameraInput(); 108 sptr<CameraInput> cameraInput_; 109 110 private: 111 static void CameraInputNapiDestructor(napi_env env, void* nativeObject, void* finalize_hint); 112 static napi_value CameraInputNapiConstructor(napi_env env, napi_callback_info info); 113 114 void RegisterErrorCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 115 const std::vector<napi_value>& args, bool isOnce); 116 void UnregisterErrorCallbackListener( 117 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 118 void RegisterOcclusionDetectCallbackListener(const std::string& eventName, napi_env env, napi_value callback, 119 const std::vector<napi_value>& args, bool isOnce); 120 void UnregisterOcclusionDetectCallbackListener( 121 const std::string& eventName, napi_env env, napi_value callback, const std::vector<napi_value>& args); 122 static void OpenCameraAsync(uv_work_t* work); 123 static void UvWorkAsyncCompleted(uv_work_t* work, int status); 124 napi_env env_; 125 std::string cameraId_; 126 shared_ptr<ErrorCallbackListener> errorCallback_; 127 shared_ptr<OcclusionDetectCallbackListener> occlusionDetectCallback_; 128 129 static thread_local napi_ref sConstructor_; 130 static thread_local std::string sCameraId_; 131 static thread_local sptr<CameraInput> sCameraInput_; 132 static thread_local uint32_t cameraInputTaskId; 133 }; 134 135 struct CameraInputAsyncContext : public AsyncContext { CameraInputAsyncContextCameraInputAsyncContext136 CameraInputAsyncContext(std::string funcName, int32_t taskId) : AsyncContext(funcName, taskId) {}; 137 CameraInputNapi* objectInfo = nullptr; 138 bool isEnableSecCam = false; 139 int32_t delayTime = 0 ; 140 uint64_t secureCameraSeqId = 0L; 141 int32_t cameraConcurrentType = -1; 142 napi_env env = nullptr; 143 }; 144 } // namespace CameraStandard 145 } // namespace OHOS 146 #endif /* CAMERA_INPUT_NAPI_H_ */ 147