1 /*
2 * Copyright (c) 2023-2023 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 #include "mode/time_lapse_photo_session_napi.h"
16 #include "camera_napi_param_parser.h"
17 #include <uv.h>
18 #include "napi/native_node_api.h"
19
20 using namespace std;
21
22 namespace {
23 template<typename T>
Unwrap(napi_env env,napi_value jsObject)24 T* Unwrap(napi_env env, napi_value jsObject)
25 {
26 void *result;
27 napi_unwrap(env, jsObject, &result);
28 return reinterpret_cast<T*>(result);
29 }
30 }
31
32 namespace OHOS {
33 namespace CameraStandard {
34 thread_local napi_ref TimeLapsePhotoSessionNapi::sConstructor_{nullptr};
35 thread_local napi_ref TryAEInfoNapi::sConstructor_{nullptr};
36
37 const unordered_map<string, TimeLapseRecordState> TimeLapseRecordStateMap = {
38 {"IDLE", TimeLapseRecordState::IDLE },
39 {"RECORDING", TimeLapseRecordState::RECORDING },
40 };
41
42 const unordered_map<string, TimeLapsePreviewType> TimeLapsePreviewTypeMap = {
43 {"DARK", TimeLapsePreviewType::DARK},
44 {"LIGHT", TimeLapsePreviewType::LIGHT},
45 };
46
TryAEInfoNapi()47 TryAEInfoNapi::TryAEInfoNapi() {}
48
~TryAEInfoNapi()49 TryAEInfoNapi::~TryAEInfoNapi()
50 {
51 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
52 if (tryAEInfo_) {
53 tryAEInfo_ = nullptr;
54 }
55 }
56
Init(napi_env env,napi_value exports)57 napi_value TryAEInfoNapi::Init(napi_env env, napi_value exports)
58 {
59 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
60 napi_status status;
61 napi_value ctorObj;
62 int32_t refCount = 1;
63
64 napi_property_descriptor try_ae_info_properties[] = {
65 DECLARE_NAPI_GETTER("isTryAEDone", IsTryAEDone),
66 DECLARE_NAPI_GETTER("isTryAEHintNeeded", IsTryAEHintNeeded),
67 DECLARE_NAPI_GETTER("previewType", GetPreviewType),
68 DECLARE_NAPI_GETTER("captureInterval", GetCaptureInterval),
69 };
70
71 status = napi_define_class(env, TRY_AE_INFO_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
72 Constructor, nullptr,
73 sizeof(try_ae_info_properties) / sizeof(try_ae_info_properties[PARAM0]),
74 try_ae_info_properties, &ctorObj);
75 if (status == napi_ok) {
76 if (napi_create_reference(env, ctorObj, refCount, &sConstructor_) == napi_ok) {
77 CHECK_ERROR_RETURN_RET(napi_set_named_property(env, exports, TRY_AE_INFO_NAPI_CLASS_NAME, ctorObj) ==
78 napi_ok, exports);
79 }
80 }
81 MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
82 return nullptr;
83 }
84
NewInstance(napi_env env)85 napi_value TryAEInfoNapi::NewInstance(napi_env env)
86 {
87 CAMERA_NAPI_VALUE result = nullptr;
88 CAMERA_NAPI_VALUE constructor;
89 CHECK_EXECUTE(napi_get_reference_value(env, sConstructor_, &constructor) == napi_ok,
90 napi_new_instance(env, constructor, 0, nullptr, &result));
91 return result;
92 }
93
IsTryAEDone(napi_env env,napi_callback_info info)94 napi_value TryAEInfoNapi::IsTryAEDone(napi_env env, napi_callback_info info)
95 {
96 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
97 napi_status status;
98 napi_value thisVar;
99 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
100 TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
101 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
102 "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
103 auto value = obj->tryAEInfo_->isTryAEDone;
104 napi_value result;
105 napi_get_boolean(env, value, &result);
106 return result;
107 }
108
IsTryAEHintNeeded(napi_env env,napi_callback_info info)109 napi_value TryAEInfoNapi::IsTryAEHintNeeded(napi_env env, napi_callback_info info)
110 {
111 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
112 napi_status status;
113 napi_value thisVar;
114 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
115 TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
116 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
117 "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
118 auto value = obj->tryAEInfo_->isTryAEHintNeeded;
119 napi_value result;
120 napi_get_boolean(env, value, &result);
121 return result;
122 }
123
GetPreviewType(napi_env env,napi_callback_info info)124 napi_value TryAEInfoNapi::GetPreviewType(napi_env env, napi_callback_info info)
125 {
126 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
127 napi_status status;
128 napi_value thisVar;
129 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
130 TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
131 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
132 "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
133 auto value = obj->tryAEInfo_->previewType;
134 napi_value result;
135 napi_create_int32(env, static_cast<int32_t>(value), &result);
136 return result;
137 }
138
GetCaptureInterval(napi_env env,napi_callback_info info)139 napi_value TryAEInfoNapi::GetCaptureInterval(napi_env env, napi_callback_info info)
140 {
141 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
142 napi_status status;
143 napi_value thisVar;
144 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
145 TryAEInfoNapi* obj = Unwrap<TryAEInfoNapi>(env, thisVar);
146 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr || obj->tryAEInfo_ == nullptr, nullptr,
147 "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
148 auto value = obj->tryAEInfo_->captureInterval;
149 napi_value result;
150 napi_create_int32(env, value, &result);
151 return result;
152 }
153
Constructor(napi_env env,napi_callback_info info)154 napi_value TryAEInfoNapi::Constructor(napi_env env, napi_callback_info info)
155 {
156 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
157 napi_status status;
158 napi_value thisVar;
159 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
160
161 if (status == napi_ok && thisVar != nullptr) {
162 auto obj = std::make_unique<TryAEInfoNapi>();
163 status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
164 Destructor, nullptr, nullptr);
165 if (status == napi_ok) {
166 (void)obj.release();
167 return thisVar;
168 } else {
169 MEDIA_ERR_LOG("Failure wrapping js to native napi");
170 }
171 }
172 MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
173 return nullptr;
174 }
175
Destructor(napi_env env,void * nativeObject,void * finalize)176 void TryAEInfoNapi::Destructor(napi_env env, void* nativeObject, void* finalize)
177 {
178 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
179 TryAEInfoNapi* obj = reinterpret_cast<TryAEInfoNapi*>(nativeObject);
180 if (obj != nullptr) {
181 delete obj;
182 }
183 }
184
TimeLapsePhotoSessionNapi()185 TimeLapsePhotoSessionNapi::TimeLapsePhotoSessionNapi() {}
186
~TimeLapsePhotoSessionNapi()187 TimeLapsePhotoSessionNapi::~TimeLapsePhotoSessionNapi()
188 {
189 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
190 if (timeLapsePhotoSession_) {
191 timeLapsePhotoSession_ = nullptr;
192 }
193 }
194
195 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::time_lapse_photo_props = {
196 // TimeLapsePhotoSession properties
197 DECLARE_NAPI_FUNCTION("on", On),
198 DECLARE_NAPI_FUNCTION("off", Off),
199 DECLARE_NAPI_FUNCTION("isTryAENeeded", IsTryAENeeded),
200 DECLARE_NAPI_FUNCTION("startTryAE", StartTryAE),
201 DECLARE_NAPI_FUNCTION("stopTryAE", StopTryAE),
202 DECLARE_NAPI_FUNCTION("getSupportedTimeLapseIntervalRange", GetSupportedTimeLapseIntervalRange),
203 DECLARE_NAPI_FUNCTION("getTimeLapseInterval", GetTimeLapseInterval),
204 DECLARE_NAPI_FUNCTION("setTimeLapseInterval", SetTimeLapseInterval),
205 DECLARE_NAPI_FUNCTION("setTimeLapseRecordState", SetTimeLapseRecordState),
206 DECLARE_NAPI_FUNCTION("setTimeLapsePreviewType", SetTimeLapsePreviewType),
207 };
208
209 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::manual_exposure_props = {
210 // ManualExposure properties
211 DECLARE_NAPI_FUNCTION("getExposure", GetExposure),
212 DECLARE_NAPI_FUNCTION("setExposure", SetExposure),
213 DECLARE_NAPI_FUNCTION("getSupportedExposureRange", GetSupportedExposureRange),
214 DECLARE_NAPI_FUNCTION("getSupportedMeteringModes", GetSupportedMeteringModes),
215 DECLARE_NAPI_FUNCTION("isExposureMeteringModeSupported", IsExposureMeteringModeSupported),
216 DECLARE_NAPI_FUNCTION("getExposureMeteringMode", GetExposureMeteringMode),
217 DECLARE_NAPI_FUNCTION("setExposureMeteringMode", SetExposureMeteringMode),
218 };
219
220 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::manual_iso_props = {
221 // ManualIso properties
222 DECLARE_NAPI_FUNCTION("getIso", GetIso),
223 DECLARE_NAPI_FUNCTION("setIso", SetIso),
224 DECLARE_NAPI_FUNCTION("isManualIsoSupported", IsManualIsoSupported),
225 DECLARE_NAPI_FUNCTION("getIsoRange", GetIsoRange),
226 };
227
228 const vector<napi_property_descriptor> TimeLapsePhotoSessionNapi::white_balance_props = {
229 // WhiteBalance properties.
230 DECLARE_NAPI_FUNCTION("isWhiteBalanceModeSupported", IsWhiteBalanceModeSupported),
231 DECLARE_NAPI_FUNCTION("getWhiteBalanceRange", GetWhiteBalanceRange),
232 DECLARE_NAPI_FUNCTION("getWhiteBalanceMode", GetWhiteBalanceMode),
233 DECLARE_NAPI_FUNCTION("setWhiteBalanceMode", SetWhiteBalanceMode),
234 DECLARE_NAPI_FUNCTION("getWhiteBalance", GetWhiteBalance),
235 DECLARE_NAPI_FUNCTION("setWhiteBalance", SetWhiteBalance),
236 };
237
Init(napi_env env,napi_value exports)238 napi_value TimeLapsePhotoSessionNapi::Init(napi_env env, napi_value exports)
239 {
240 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
241 napi_status status;
242 napi_value ctorObj;
243 int32_t refCount = 1;
244 vector<vector<napi_property_descriptor>> descriptors = {
245 camera_process_props,
246 flash_props,
247 auto_exposure_props,
248 focus_props,
249 zoom_props,
250 color_effect_props,
251 manual_focus_props,
252 time_lapse_photo_props,
253 manual_exposure_props,
254 manual_iso_props,
255 white_balance_props,
256 };
257 vector<napi_property_descriptor> properties = CameraNapiUtils::GetPropertyDescriptor(descriptors);
258 status = napi_define_class(env, TIME_LAPSE_PHOTO_SESSION_NAPI_CLASS_NAME, NAPI_AUTO_LENGTH,
259 Constructor, nullptr,
260 properties.size(),
261 properties.data(), &ctorObj);
262 if (status == napi_ok) {
263 if (napi_create_reference(env, ctorObj, refCount, &sConstructor_) == napi_ok) {
264 CHECK_ERROR_RETURN_RET(napi_set_named_property(env, exports, TIME_LAPSE_PHOTO_SESSION_NAPI_CLASS_NAME,
265 ctorObj) == napi_ok, exports);
266 }
267 }
268 MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
269 return nullptr;
270 }
271
CreateCameraSession(napi_env env)272 napi_value TimeLapsePhotoSessionNapi::CreateCameraSession(napi_env env)
273 {
274 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
275 CAMERA_SYNC_TRACE;
276 napi_status status;
277 napi_value result = nullptr;
278 napi_value constructor;
279 status = napi_get_reference_value(env, sConstructor_, &constructor);
280 if (status == napi_ok) {
281 sCameraSession_ = CameraManager::GetInstance()->CreateCaptureSession(SceneMode::TIMELAPSE_PHOTO);
282 if (sCameraSession_ == nullptr) {
283 MEDIA_ERR_LOG("Failed to create Profession session instance");
284 napi_get_undefined(env, &result);
285 return result;
286 }
287 status = napi_new_instance(env, constructor, 0, nullptr, &result);
288 sCameraSession_ = nullptr;
289 if (status == napi_ok && result != nullptr) {
290 MEDIA_DEBUG_LOG("success to create Profession session napi instance");
291 return result;
292 } else {
293 MEDIA_ERR_LOG("Failed to create Profession session napi instance");
294 }
295 }
296 MEDIA_ERR_LOG("Failed to create Profession session napi instance last");
297 napi_get_undefined(env, &result);
298 return result;
299 }
300
On(napi_env env,napi_callback_info info)301 napi_value TimeLapsePhotoSessionNapi::On(napi_env env, napi_callback_info info)
302 {
303 return ListenerTemplate<CameraSessionNapi>::On(env, info);
304 }
305
Off(napi_env env,napi_callback_info info)306 napi_value TimeLapsePhotoSessionNapi::Off(napi_env env, napi_callback_info info)
307 {
308 return ListenerTemplate<CameraSessionNapi>::Off(env, info);
309 }
310
IsTryAENeeded(napi_env env,napi_callback_info info)311 napi_value TimeLapsePhotoSessionNapi::IsTryAENeeded(napi_env env, napi_callback_info info)
312 {
313 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
314 napi_status status;
315 napi_value thisVar;
316 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
317 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
318 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
319 bool needed;
320 int32_t ret = obj->timeLapsePhotoSession_->IsTryAENeeded(needed);
321 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
322 "%{public}s: IsTryAENeeded() Failed", __FUNCTION__);
323 napi_value result;
324 CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, ret, &result) != napi_ok,
325 "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
326 return result;
327 }
328
StartTryAE(napi_env env,napi_callback_info info)329 napi_value TimeLapsePhotoSessionNapi::StartTryAE(napi_env env, napi_callback_info info)
330 {
331 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
332 napi_status status;
333 napi_value thisVar;
334 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
335 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
336 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
337 obj->timeLapsePhotoSession_->LockForControl();
338 int32_t ret = obj->timeLapsePhotoSession_->StartTryAE();
339 obj->timeLapsePhotoSession_->UnlockForControl();
340 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
341 "%{public}s: StartTryAE() Failed", __FUNCTION__);
342 napi_value result;
343 napi_get_undefined(env, &result);
344 return result;
345 }
346
StopTryAE(napi_env env,napi_callback_info info)347 napi_value TimeLapsePhotoSessionNapi::StopTryAE(napi_env env, napi_callback_info info)
348 {
349 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
350 napi_status status;
351 napi_value thisVar;
352 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
353 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
354 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
355 obj->timeLapsePhotoSession_->LockForControl();
356 int32_t ret = obj->timeLapsePhotoSession_->StopTryAE();
357 obj->timeLapsePhotoSession_->UnlockForControl();
358 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
359 "%{public}s: StopTryAE() Failed", __FUNCTION__);
360 napi_value result;
361 napi_get_undefined(env, &result);
362 return result;
363 }
364
GetSupportedTimeLapseIntervalRange(napi_env env,napi_callback_info info)365 napi_value TimeLapsePhotoSessionNapi::GetSupportedTimeLapseIntervalRange(napi_env env, napi_callback_info info)
366 {
367 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
368 napi_status status;
369 napi_value thisVar;
370 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
371 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
372 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
373 vector<int32_t> range;
374 int32_t ret = obj->timeLapsePhotoSession_->GetSupportedTimeLapseIntervalRange(range);
375 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
376 "%{public}s: GetSupportedTimeLapseIntervalRange() Failed", __FUNCTION__);
377 napi_value result;
378 if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
379 napi_value value;
380 for (uint32_t i = 0; i < range.size(); i++) {
381 napi_create_int32(env, range[i], &value);
382 napi_set_element(env, result, i, value);
383 }
384 } else {
385 MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
386 }
387 return result;
388 }
389
GetTimeLapseInterval(napi_env env,napi_callback_info info)390 napi_value TimeLapsePhotoSessionNapi::GetTimeLapseInterval(napi_env env, napi_callback_info info)
391 {
392 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
393 napi_status status;
394 napi_value thisVar;
395 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
396 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
397 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
398 int32_t interval;
399 int32_t ret = obj->timeLapsePhotoSession_->GetTimeLapseInterval(interval);
400 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
401 "%{public}s: GetTimeLapseInterval() Failed", __FUNCTION__);
402 napi_value result;
403 CHECK_ERROR_PRINT_LOG(napi_create_int32(env, interval, &result) != napi_ok,
404 "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
405 return result;
406 }
407
SetTimeLapseInterval(napi_env env,napi_callback_info info)408 napi_value TimeLapsePhotoSessionNapi::SetTimeLapseInterval(napi_env env, napi_callback_info info)
409 {
410 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
411 TimeLapsePhotoSessionNapi* obj;
412 int32_t interval;
413 CameraNapiParamParser parser(env, info, obj, interval);
414 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
415 "%{public}s: Read Params Error", __FUNCTION__);
416 MEDIA_DEBUG_LOG("interval = %{public}d", interval);
417 obj->timeLapsePhotoSession_->LockForControl();
418 int32_t ret = obj->timeLapsePhotoSession_->SetTimeLapseInterval(interval);
419 obj->timeLapsePhotoSession_->UnlockForControl();
420 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
421 "%{public}s: SetTimeLapseInterval() Failed", __FUNCTION__);
422 napi_value result;
423 napi_get_undefined(env, &result);
424 return result;
425 }
426
SetTimeLapseRecordState(napi_env env,napi_callback_info info)427 napi_value TimeLapsePhotoSessionNapi::SetTimeLapseRecordState(napi_env env, napi_callback_info info)
428 {
429 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
430 TimeLapsePhotoSessionNapi* obj;
431 int32_t state;
432 CameraNapiParamParser parser(env, info, obj, state);
433 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
434 "%{public}s: Read Params Error", __FUNCTION__);
435 MEDIA_DEBUG_LOG("state = %{public}d", state);
436 obj->timeLapsePhotoSession_->LockForControl();
437 int32_t ret = obj->timeLapsePhotoSession_->SetTimeLapseRecordState(static_cast<TimeLapseRecordState>(state));
438 obj->timeLapsePhotoSession_->UnlockForControl();
439 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
440 "%{public}s: SetTimeLapseRecordState() Failed", __FUNCTION__);
441 napi_value result;
442 napi_get_undefined(env, &result);
443 return result;
444 }
445
SetTimeLapsePreviewType(napi_env env,napi_callback_info info)446 napi_value TimeLapsePhotoSessionNapi::SetTimeLapsePreviewType(napi_env env, napi_callback_info info)
447 {
448 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
449 TimeLapsePhotoSessionNapi* obj;
450 int32_t type;
451 CameraNapiParamParser parser(env, info, obj, type);
452 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
453 "%{public}s: Read Params Error", __FUNCTION__);
454 MEDIA_DEBUG_LOG("type = %{public}d", type);
455 obj->timeLapsePhotoSession_->LockForControl();
456 int32_t ret = obj->timeLapsePhotoSession_->SetTimeLapsePreviewType(static_cast<TimeLapsePreviewType>(type));
457 obj->timeLapsePhotoSession_->UnlockForControl();
458 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
459 "%{public}s: SetTimeLapsePreviewType() Failed", __FUNCTION__);
460 napi_value result;
461 napi_get_undefined(env, &result);
462 return result;
463 }
464
465 // ManualExposure
GetExposure(napi_env env,napi_callback_info info)466 napi_value TimeLapsePhotoSessionNapi::GetExposure(napi_env env, napi_callback_info info)
467 {
468 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
469 napi_status status;
470 napi_value thisVar;
471 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
472 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
473 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr,
474 "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
475 uint32_t exposure;
476 int32_t ret = obj->timeLapsePhotoSession_->GetExposure(exposure);
477 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
478 "%{public}s: getExposure() Failed", __FUNCTION__);
479 napi_value result;
480 CHECK_ERROR_PRINT_LOG(napi_create_uint32(env, exposure, &result) != napi_ok,
481 "%{public}s: Napi Create Double Failed", __FUNCTION__);
482 return result;
483 }
484
SetExposure(napi_env env,napi_callback_info info)485 napi_value TimeLapsePhotoSessionNapi::SetExposure(napi_env env, napi_callback_info info)
486 {
487 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
488 TimeLapsePhotoSessionNapi* obj;
489 uint32_t exposure;
490 CameraNapiParamParser parser(env, info, obj, exposure);
491 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
492 nullptr, "%{public}s: Read Params Error", __FUNCTION__);
493 MEDIA_DEBUG_LOG("exposure = %{public}d", exposure);
494 obj->timeLapsePhotoSession_->LockForControl();
495 int32_t ret = obj->timeLapsePhotoSession_->SetExposure(exposure);
496 obj->timeLapsePhotoSession_->UnlockForControl();
497 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
498 "%{public}s: setExposure() Failed", __FUNCTION__);
499 napi_value result;
500 napi_get_undefined(env, &result);
501 return result;
502 }
503
GetSupportedExposureRange(napi_env env,napi_callback_info info)504 napi_value TimeLapsePhotoSessionNapi::GetSupportedExposureRange(napi_env env, napi_callback_info info)
505 {
506 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
507 napi_status status;
508 napi_value thisVar;
509 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
510 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
511 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
512 vector<uint32_t> range;
513 int32_t ret = obj->timeLapsePhotoSession_->GetSupportedExposureRange(range);
514 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
515 "%{public}s: getSupportedExposureRange() Failed", __FUNCTION__);
516 napi_value result;
517 if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
518 napi_value value;
519 for (uint32_t i = 0; i < range.size(); i++) {
520 napi_create_uint32(env, range[i], &value);
521 napi_set_element(env, result, i, value);
522 }
523 } else {
524 MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
525 }
526 return result;
527 }
528
GetSupportedMeteringModes(napi_env env,napi_callback_info info)529 napi_value TimeLapsePhotoSessionNapi::GetSupportedMeteringModes(napi_env env, napi_callback_info info)
530 {
531 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
532 napi_status status;
533 napi_value thisVar;
534 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
535 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
536 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr,
537 "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
538 vector<MeteringMode> modes;
539 int32_t ret = obj->timeLapsePhotoSession_->GetSupportedMeteringModes(modes);
540 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
541 "%{public}s: GetSupportedMeteringModes() Failed", __FUNCTION__);
542 napi_value result;
543 if (napi_create_array_with_length(env, modes.size(), &result) == napi_ok) {
544 napi_value value;
545 for (uint32_t i = 0; i < modes.size(); i++) {
546 napi_create_int32(env, modes[i], &value);
547 napi_set_element(env, result, i, value);
548 }
549 } else {
550 MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
551 }
552 return result;
553 }
554
IsExposureMeteringModeSupported(napi_env env,napi_callback_info info)555 napi_value TimeLapsePhotoSessionNapi::IsExposureMeteringModeSupported(napi_env env, napi_callback_info info)
556 {
557 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
558 TimeLapsePhotoSessionNapi* obj;
559 int32_t mode;
560 CameraNapiParamParser parser(env, info, obj, mode);
561 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
562 nullptr, "%{public}s: Read Params Error", __FUNCTION__);
563 bool supported;
564 int32_t ret = obj->timeLapsePhotoSession_->IsExposureMeteringModeSupported(
565 static_cast<MeteringMode>(mode), supported);
566 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
567 "%{public}s: IsExposureMeteringModeSupported() Failed", __FUNCTION__);
568 napi_value result;
569 CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, supported, &result) != napi_ok,
570 "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
571 return result;
572 }
573
GetExposureMeteringMode(napi_env env,napi_callback_info info)574 napi_value TimeLapsePhotoSessionNapi::GetExposureMeteringMode(napi_env env, napi_callback_info info)
575 {
576 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
577 TimeLapsePhotoSessionNapi* obj;
578 CameraNapiParamParser parser(env, info, obj);
579 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
580 "%{public}s: Read Params Error", __FUNCTION__);
581 MeteringMode mode;
582 int32_t ret = obj->timeLapsePhotoSession_->GetExposureMeteringMode(mode);
583 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
584 "%{public}s: GetExposureMeteringMode() Failed", __FUNCTION__);
585 napi_value result;
586 CHECK_ERROR_PRINT_LOG(napi_create_int32(env, static_cast<int32_t>(mode), &result) != napi_ok,
587 "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
588 return result;
589 }
590
SetExposureMeteringMode(napi_env env,napi_callback_info info)591 napi_value TimeLapsePhotoSessionNapi::SetExposureMeteringMode(napi_env env, napi_callback_info info)
592 {
593 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
594 TimeLapsePhotoSessionNapi* obj;
595 int32_t mode;
596 CameraNapiParamParser parser(env, info, obj, mode);
597 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
598 nullptr, "%{public}s: Read Params Error", __FUNCTION__);
599 MEDIA_DEBUG_LOG("mode = %{public}d", mode);
600 obj->timeLapsePhotoSession_->LockForControl();
601 int32_t ret = obj->timeLapsePhotoSession_->SetExposureMeteringMode(static_cast<MeteringMode>(mode));
602 obj->timeLapsePhotoSession_->UnlockForControl();
603 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
604 "%{public}s: SetExposureMeteringMode() Failed", __FUNCTION__);
605 napi_value result;
606 napi_get_undefined(env, &result);
607 return result;
608 }
609
610 // ManualIso
GetIso(napi_env env,napi_callback_info info)611 napi_value TimeLapsePhotoSessionNapi::GetIso(napi_env env, napi_callback_info info)
612 {
613 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
614 napi_status status;
615 napi_value thisVar;
616 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
617 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
618 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr,
619 nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
620 int32_t iso;
621 int32_t ret = obj->timeLapsePhotoSession_->GetIso(iso);
622 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
623 "%{public}s: getIso() Failed", __FUNCTION__);
624 napi_value result;
625 CHECK_ERROR_PRINT_LOG(napi_create_int32(env, iso, &result) != napi_ok,
626 "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
627 return result;
628 }
629
SetIso(napi_env env,napi_callback_info info)630 napi_value TimeLapsePhotoSessionNapi::SetIso(napi_env env, napi_callback_info info)
631 {
632 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
633 TimeLapsePhotoSessionNapi* obj;
634 int32_t iso;
635 CameraNapiParamParser parser(env, info, obj, iso);
636 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"),
637 nullptr, "%{public}s: Read Params Error", __FUNCTION__);
638 MEDIA_DEBUG_LOG("iso = %{public}d", iso);
639 obj->timeLapsePhotoSession_->LockForControl();
640 int32_t ret = obj->timeLapsePhotoSession_->SetIso(iso);
641 obj->timeLapsePhotoSession_->UnlockForControl();
642 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr, "%{public}s: setIso() Failed", __FUNCTION__);
643 napi_value result;
644 napi_get_undefined(env, &result);
645 return result;
646 }
647
IsManualIsoSupported(napi_env env,napi_callback_info info)648 napi_value TimeLapsePhotoSessionNapi::IsManualIsoSupported(napi_env env, napi_callback_info info)
649 {
650 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
651 napi_status status;
652 napi_value thisVar;
653 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
654 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
655 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
656 bool supported;
657 int32_t ret = obj->timeLapsePhotoSession_->IsManualIsoSupported(supported);
658 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
659 "%{public}s: isManualIsoSupported() Failed", __FUNCTION__);
660 napi_value result;
661 CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, supported, &result) != napi_ok,
662 "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
663 return result;
664 }
665
GetIsoRange(napi_env env,napi_callback_info info)666 napi_value TimeLapsePhotoSessionNapi::GetIsoRange(napi_env env, napi_callback_info info)
667 {
668 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
669 napi_status status;
670 napi_value thisVar;
671 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
672 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
673 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
674 vector<int32_t> range;
675 int32_t ret = obj->timeLapsePhotoSession_->GetIsoRange(range);
676 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
677 "%{public}s: getIsoRange() Failed", __FUNCTION__);
678 napi_value result;
679 if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
680 napi_value value;
681 for (uint32_t i = 0; i < range.size(); i++) {
682 napi_create_int32(env, range[i], &value);
683 napi_set_element(env, result, i, value);
684 }
685 } else {
686 MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
687 }
688 return result;
689 }
690
691 // WhiteBalance
IsWhiteBalanceModeSupported(napi_env env,napi_callback_info info)692 napi_value TimeLapsePhotoSessionNapi::IsWhiteBalanceModeSupported(napi_env env, napi_callback_info info)
693 {
694 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
695 size_t argc;
696 napi_value argv[1];
697 napi_value thisVar;
698 CAMERA_NAPI_GET_JS_ARGS(env, info, argc, argv, thisVar);
699 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
700 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
701 int32_t mode;
702 napi_get_value_int32(env, argv[0], &mode);
703 bool supported;
704 int32_t ret = obj->timeLapsePhotoSession_->IsWhiteBalanceModeSupported(
705 static_cast<WhiteBalanceMode>(mode), supported);
706 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
707 "%{public}s: isWhiteBalanceModeSupported() Failed", __FUNCTION__);
708 napi_value result;
709 CHECK_ERROR_PRINT_LOG(napi_get_boolean(env, supported, &result) != napi_ok,
710 "%{public}s: Napi Get Boolean Failed", __FUNCTION__);
711 return result;
712 }
713
GetWhiteBalanceRange(napi_env env,napi_callback_info info)714 napi_value TimeLapsePhotoSessionNapi::GetWhiteBalanceRange(napi_env env, napi_callback_info info)
715 {
716 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
717 napi_status status;
718 napi_value thisVar;
719 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
720 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
721 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
722 vector<int32_t> range;
723 int32_t ret = obj->timeLapsePhotoSession_->GetWhiteBalanceRange(range);
724 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
725 "%{public}s: getWhiteBalanceRange() Failed", __FUNCTION__);
726 napi_value result;
727 if (napi_create_array_with_length(env, range.size(), &result) == napi_ok) {
728 napi_value value;
729 for (uint32_t i = 0; i < range.size(); i++) {
730 napi_create_int32(env, range[i], &value);
731 napi_set_element(env, result, i, value);
732 }
733 } else {
734 MEDIA_ERR_LOG("%{public}s: Napi Create Array With Length Failed", __FUNCTION__);
735 }
736 return result;
737 }
738
GetWhiteBalanceMode(napi_env env,napi_callback_info info)739 napi_value TimeLapsePhotoSessionNapi::GetWhiteBalanceMode(napi_env env, napi_callback_info info)
740 {
741 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
742 napi_status status;
743 napi_value thisVar;
744 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
745 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
746 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
747 WhiteBalanceMode mode;
748 int32_t ret = obj->timeLapsePhotoSession_->GetWhiteBalanceMode(mode);
749 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
750 "%{public}s: getWhiteBalanceMode() Failed", __FUNCTION__);
751 napi_value result;
752 CHECK_ERROR_PRINT_LOG(napi_create_int32(env, static_cast<int32_t>(mode), &result) != napi_ok,
753 "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
754 return result;
755 }
756
SetWhiteBalanceMode(napi_env env,napi_callback_info info)757 napi_value TimeLapsePhotoSessionNapi::SetWhiteBalanceMode(napi_env env, napi_callback_info info)
758 {
759 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
760 TimeLapsePhotoSessionNapi* obj;
761 int32_t mode;
762 CameraNapiParamParser parser(env, info, obj, mode);
763 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
764 "%{public}s: Read Params Error", __FUNCTION__);
765 MEDIA_DEBUG_LOG("mode = %{public}d", mode);
766 obj->timeLapsePhotoSession_->LockForControl();
767 int32_t ret = obj->timeLapsePhotoSession_->SetWhiteBalanceMode(static_cast<WhiteBalanceMode>(mode));
768 obj->timeLapsePhotoSession_->UnlockForControl();
769 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
770 "%{public}s: setWhiteBalanceMode() Failed", __FUNCTION__);
771 napi_value result;
772 napi_get_undefined(env, &result);
773 return result;
774 }
775
GetWhiteBalance(napi_env env,napi_callback_info info)776 napi_value TimeLapsePhotoSessionNapi::GetWhiteBalance(napi_env env, napi_callback_info info)
777 {
778 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
779 napi_status status;
780 napi_value thisVar;
781 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
782 TimeLapsePhotoSessionNapi* obj = Unwrap<TimeLapsePhotoSessionNapi>(env, thisVar);
783 CHECK_ERROR_RETURN_RET_LOG(obj == nullptr, nullptr, "%{public}s: Unwrap Napi Object Failed", __FUNCTION__);
784 int32_t balance;
785 int32_t ret = obj->timeLapsePhotoSession_->GetWhiteBalance(balance);
786 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
787 "%{public}s: getWhiteBalance() Failed", __FUNCTION__);
788 napi_value result;
789 CHECK_ERROR_PRINT_LOG(napi_create_int32(env, balance, &result) != napi_ok,
790 "%{public}s: Napi Create Int32 Failed", __FUNCTION__);
791 return result;
792 }
793
SetWhiteBalance(napi_env env,napi_callback_info info)794 napi_value TimeLapsePhotoSessionNapi::SetWhiteBalance(napi_env env, napi_callback_info info)
795 {
796 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
797 TimeLapsePhotoSessionNapi* obj;
798 int32_t balance;
799 CameraNapiParamParser parser(env, info, obj, balance);
800 CHECK_ERROR_RETURN_RET_LOG(!parser.AssertStatus(INVALID_ARGUMENT, "Invalid argument!"), nullptr,
801 "%{public}s: Read Params Error", __FUNCTION__);
802 MEDIA_DEBUG_LOG("balance = %{public}d", balance);
803 obj->timeLapsePhotoSession_->LockForControl();
804 int32_t ret = obj->timeLapsePhotoSession_->SetWhiteBalance(balance);
805 obj->timeLapsePhotoSession_->UnlockForControl();
806 CHECK_ERROR_RETURN_RET_LOG(ret != CameraErrorCode::SUCCESS, nullptr,
807 "%{public}s: setWhiteBalance() Failed", __FUNCTION__);
808 napi_value result;
809 napi_get_undefined(env, &result);
810 return result;
811 }
812
Constructor(napi_env env,napi_callback_info info)813 napi_value TimeLapsePhotoSessionNapi::Constructor(napi_env env, napi_callback_info info)
814 {
815 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
816 napi_status status;
817 napi_value thisVar;
818 CAMERA_NAPI_GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
819
820 if (status == napi_ok && thisVar != nullptr) {
821 auto obj = std::make_unique<TimeLapsePhotoSessionNapi>();
822 obj->timeLapsePhotoSession_ = static_cast<TimeLapsePhotoSession*>(sCameraSession_.GetRefPtr());
823 obj->cameraSession_ = obj->timeLapsePhotoSession_;
824 CHECK_ERROR_RETURN_RET_LOG(obj->timeLapsePhotoSession_ == nullptr, nullptr,
825 "%{public}s: timeLapsePhotoSession_ is nullptr", __FUNCTION__);
826 status = napi_wrap(env, thisVar, reinterpret_cast<void*>(obj.get()),
827 Destructor, nullptr, nullptr);
828 if (status == napi_ok) {
829 (void)obj.release();
830 return thisVar;
831 } else {
832 MEDIA_ERR_LOG("Failure wrapping js to native napi");
833 }
834 }
835 MEDIA_ERR_LOG("%{public}s: Failed", __FUNCTION__);
836 return nullptr;
837 }
838
Destructor(napi_env env,void * nativeObject,void * finalize)839 void TimeLapsePhotoSessionNapi::Destructor(napi_env env, void* nativeObject, void* finalize)
840 {
841 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
842 TimeLapsePhotoSessionNapi* obj = reinterpret_cast<TimeLapsePhotoSessionNapi*>(nativeObject);
843 if (obj != nullptr) {
844 delete obj;
845 }
846 }
847
RegisterIsoInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)848 void TimeLapsePhotoSessionNapi::RegisterIsoInfoCallbackListener(const std::string& eventName, napi_env env,
849 napi_value callback, const vector<napi_value>& args, bool isOnce)
850 {
851 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
852 if (isoInfoCallback_ == nullptr) {
853 isoInfoCallback_ = make_shared<IsoInfoCallbackListener>(env);
854 timeLapsePhotoSession_->SetIsoInfoCallback(isoInfoCallback_);
855 }
856 isoInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
857 }
858
UnregisterIsoInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)859 void TimeLapsePhotoSessionNapi::UnregisterIsoInfoCallbackListener(const std::string& eventName, napi_env env,
860 napi_value callback, const vector<napi_value>& args)
861 {
862 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
863 if (isoInfoCallback_ == nullptr) {
864 MEDIA_ERR_LOG("isoInfoCallback is null");
865 } else {
866 isoInfoCallback_->RemoveCallbackRef(eventName, callback);
867 }
868 }
869
RegisterExposureInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)870 void TimeLapsePhotoSessionNapi::RegisterExposureInfoCallbackListener(const std::string& eventName, napi_env env,
871 napi_value callback, const vector<napi_value>& args, bool isOnce)
872 {
873 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
874 if (exposureInfoCallback_ == nullptr) {
875 exposureInfoCallback_ = make_shared<ExposureInfoCallbackListener>(env);
876 timeLapsePhotoSession_->SetExposureInfoCallback(exposureInfoCallback_);
877 }
878 exposureInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
879 }
880
UnregisterExposureInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)881 void TimeLapsePhotoSessionNapi::UnregisterExposureInfoCallbackListener(const std::string& eventName, napi_env env,
882 napi_value callback, const vector<napi_value>& args)
883 {
884 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
885 if (exposureInfoCallback_ == nullptr) {
886 MEDIA_ERR_LOG("exposureInfoCallback is null");
887 } else {
888 exposureInfoCallback_->RemoveCallbackRef(eventName, callback);
889 }
890 }
891
RegisterLuminationInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)892 void TimeLapsePhotoSessionNapi::RegisterLuminationInfoCallbackListener(const std::string& eventName, napi_env env,
893 napi_value callback, const vector<napi_value>& args, bool isOnce)
894 {
895 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
896 if (luminationInfoCallback_ == nullptr) {
897 ExposureHintMode mode = EXPOSURE_HINT_MODE_ON;
898 timeLapsePhotoSession_->LockForControl();
899 timeLapsePhotoSession_->SetExposureHintMode(mode);
900 timeLapsePhotoSession_->UnlockForControl();
901 MEDIA_INFO_LOG("TimeLapsePhotoSessionNapi SetExposureHintMode exposureHint = %{public}d", mode);
902 luminationInfoCallback_ = make_shared<LuminationInfoCallbackListener>(env);
903 timeLapsePhotoSession_->SetLuminationInfoCallback(luminationInfoCallback_);
904 }
905 luminationInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
906 }
907
UnregisterLuminationInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)908 void TimeLapsePhotoSessionNapi::UnregisterLuminationInfoCallbackListener(const std::string& eventName, napi_env env,
909 napi_value callback, const vector<napi_value>& args)
910 {
911 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
912 if (luminationInfoCallback_ == nullptr) {
913 MEDIA_ERR_LOG("luminationInfoCallback is null");
914 } else {
915 ExposureHintMode mode = EXPOSURE_HINT_MODE_OFF;
916 timeLapsePhotoSession_->LockForControl();
917 timeLapsePhotoSession_->SetExposureHintMode(mode);
918 timeLapsePhotoSession_->UnlockForControl();
919 MEDIA_INFO_LOG("TimeLapsePhotoSessionNapi SetExposureHintMode exposureHint = %{public}d!", mode);
920 luminationInfoCallback_->RemoveCallbackRef(eventName, callback);
921 }
922 }
923
RegisterTryAEInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args,bool isOnce)924 void TimeLapsePhotoSessionNapi::RegisterTryAEInfoCallbackListener(const std::string& eventName, napi_env env,
925 napi_value callback, const vector<napi_value>& args, bool isOnce)
926 {
927 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
928 if (tryAEInfoCallback_ == nullptr) {
929 tryAEInfoCallback_ = make_shared<TryAEInfoCallbackListener>(env);
930 timeLapsePhotoSession_->SetTryAEInfoCallback(tryAEInfoCallback_);
931 }
932 tryAEInfoCallback_->SaveCallbackReference(eventName, callback, isOnce);
933 }
934
UnregisterTryAEInfoCallbackListener(const std::string & eventName,napi_env env,napi_value callback,const vector<napi_value> & args)935 void TimeLapsePhotoSessionNapi::UnregisterTryAEInfoCallbackListener(const std::string& eventName, napi_env env,
936 napi_value callback, const vector<napi_value>& args)
937 {
938 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
939 if (tryAEInfoCallback_ == nullptr) {
940 MEDIA_ERR_LOG("tryAEInfoCallback is null");
941 } else {
942 tryAEInfoCallback_->RemoveCallbackRef(eventName, callback);
943 }
944 }
945
OnTryAEInfoChanged(TryAEInfo info)946 void TryAEInfoCallbackListener::OnTryAEInfoChanged(TryAEInfo info)
947 {
948 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
949 OnTryAEInfoChangedCallbackAsync(info);
950 }
951
OnTryAEInfoChangedCallback(TryAEInfo info) const952 void TryAEInfoCallbackListener::OnTryAEInfoChangedCallback(TryAEInfo info) const
953 {
954 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
955 napi_value result[ARGS_TWO] = { nullptr, nullptr };
956 napi_value retVal;
957
958 napi_get_undefined(env_, &result[PARAM0]);
959 result[PARAM1] = TryAEInfoNapi::NewInstance(env_);
960 TryAEInfoNapi *obj = Unwrap<TryAEInfoNapi>(env_, result[PARAM1]);
961 if (obj) {
962 obj->tryAEInfo_ = make_unique<TryAEInfo>(info);
963 } else {
964 MEDIA_ERR_LOG("%{public}s: Enter, TryAEInfoNapi* is nullptr", __FUNCTION__);
965 }
966 ExecuteCallbackNapiPara callbackPara { .recv = nullptr, .argc = ARGS_TWO, .argv = result, .result = &retVal };
967 ExecuteCallback("tryAEInfoChange", callbackPara);
968 }
969
OnTryAEInfoChangedCallbackAsync(TryAEInfo info) const970 void TryAEInfoCallbackListener::OnTryAEInfoChangedCallbackAsync(TryAEInfo info) const
971 {
972 MEDIA_DEBUG_LOG("%{public}s: Enter", __FUNCTION__);
973 auto callback = make_unique<TryAEInfoChangedCallback>(info, shared_from_this());
974 TryAEInfoChangedCallback *event = callback.get();
975 auto task = [event]() {
976 TryAEInfoChangedCallback* callback = reinterpret_cast<TryAEInfoChangedCallback *>(event);
977 if (callback) {
978 auto listener = callback->listener_.lock();
979 CHECK_EXECUTE(listener != nullptr, listener->OnTryAEInfoChangedCallback(callback->info_));
980 delete callback;
981 }
982 };
983 if (napi_ok != napi_send_event(env_, task, napi_eprio_immediate)) {
984 MEDIA_ERR_LOG("failed to execute work");
985 } else {
986 (void)callback.release();
987 }
988 }
989
990 }
991 }