1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "ohos_camera_demo_3a.h" 17094332d3Sopenharmony_ci#include <cstdio> 18094332d3Sopenharmony_ci#include <getopt.h> 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_cinamespace OHOS::Camera { 21094332d3Sopenharmony_cistatic void Usage(FILE* fp) 22094332d3Sopenharmony_ci{ 23094332d3Sopenharmony_ci fprintf(fp, 24094332d3Sopenharmony_ci "Options:\n" 25094332d3Sopenharmony_ci "-h | --help Print this message\n" 26094332d3Sopenharmony_ci "-c | --capture capture one picture\n" 27094332d3Sopenharmony_ci "-e | --auto exposure Auto Exposure\n" 28094332d3Sopenharmony_ci "-f | --auto focus Auto Focus\n" 29094332d3Sopenharmony_ci "-w | --auto white balance Auto White Balance\n" 30094332d3Sopenharmony_ci "-g | --exposure lock Auto Exposure Lock\n" 31094332d3Sopenharmony_ci "-i | --white balance lock Auto White Balance Lock\n" 32094332d3Sopenharmony_ci "-v | --white balance lock Video test\n" 33094332d3Sopenharmony_ci "-q | --quit stop preview and quit this app\n"); 34094332d3Sopenharmony_ci} 35094332d3Sopenharmony_ci 36094332d3Sopenharmony_ciconst static struct option LONG_OPTIONS[] = { 37094332d3Sopenharmony_ci {"help", no_argument, nullptr, 'h'}, {"capture", no_argument, nullptr, 'c'}, 38094332d3Sopenharmony_ci {"ae", no_argument, nullptr, 'e'}, {"af", no_argument, nullptr, 'f'}, 39094332d3Sopenharmony_ci {"awb", no_argument, nullptr, 'w'}, {"ael", no_argument, nullptr, 'g'}, 40094332d3Sopenharmony_ci {"awbl", no_argument, nullptr, 'i'}, {"video", no_argument, nullptr, 'v'}, 41094332d3Sopenharmony_ci {nullptr, 0, nullptr, 0} 42094332d3Sopenharmony_ci}; 43094332d3Sopenharmony_ci 44094332d3Sopenharmony_cistatic int PutMenuAndGetChr(void) 45094332d3Sopenharmony_ci{ 46094332d3Sopenharmony_ci constexpr uint32_t inputCount = 50; 47094332d3Sopenharmony_ci int c = 0; 48094332d3Sopenharmony_ci char strs[inputCount]; 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_ci Usage(stdout); 51094332d3Sopenharmony_ci CAMERA_LOGD("pls input command(input -q exit this app)\n"); 52094332d3Sopenharmony_ci fgets(strs, inputCount, stdin); 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_ci for (int i = 0; i < inputCount; i++) { 55094332d3Sopenharmony_ci if (strs[i] != '-') { 56094332d3Sopenharmony_ci c = strs[i]; 57094332d3Sopenharmony_ci break; 58094332d3Sopenharmony_ci } 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci 61094332d3Sopenharmony_ci return c; 62094332d3Sopenharmony_ci} 63094332d3Sopenharmony_ci 64094332d3Sopenharmony_cistatic RetCode PreviewOn(int mode, const std::shared_ptr<OhosCameraDemo>& mainDemo) 65094332d3Sopenharmony_ci{ 66094332d3Sopenharmony_ci RetCode rc = RC_OK; 67094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOn enter"); 68094332d3Sopenharmony_ci 69094332d3Sopenharmony_ci rc = mainDemo->StartPreviewStream(); 70094332d3Sopenharmony_ci if (rc != RC_OK) { 71094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn StartPreviewStream error"); 72094332d3Sopenharmony_ci return RC_ERROR; 73094332d3Sopenharmony_ci } 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_ci if (mode == 0) { 76094332d3Sopenharmony_ci rc = mainDemo->StartCaptureStream(); 77094332d3Sopenharmony_ci if (rc != RC_OK) { 78094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn StartCaptureStream error"); 79094332d3Sopenharmony_ci return RC_ERROR; 80094332d3Sopenharmony_ci } 81094332d3Sopenharmony_ci } else { 82094332d3Sopenharmony_ci rc = mainDemo->StartVideoStream(); 83094332d3Sopenharmony_ci if (rc != RC_OK) { 84094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn StartVideoStream error"); 85094332d3Sopenharmony_ci return RC_ERROR; 86094332d3Sopenharmony_ci } 87094332d3Sopenharmony_ci } 88094332d3Sopenharmony_ci 89094332d3Sopenharmony_ci rc = mainDemo->CaptureON(STREAM_ID_PREVIEW, CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 90094332d3Sopenharmony_ci if (rc != RC_OK) { 91094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn mainDemo->CaptureON() preview error"); 92094332d3Sopenharmony_ci return RC_ERROR; 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci 95094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOn exit"); 96094332d3Sopenharmony_ci return RC_OK; 97094332d3Sopenharmony_ci} 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_cistatic void PreviewOff(const std::shared_ptr<OhosCameraDemo>& mainDemo) 100094332d3Sopenharmony_ci{ 101094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOff enter"); 102094332d3Sopenharmony_ci 103094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 104094332d3Sopenharmony_ci mainDemo->ReleaseAllStream(); 105094332d3Sopenharmony_ci 106094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOff exit"); 107094332d3Sopenharmony_ci} 108094332d3Sopenharmony_ci 109094332d3Sopenharmony_cistatic void CaptureTest(const std::shared_ptr<OhosCameraDemo>& mainDemo) 110094332d3Sopenharmony_ci{ 111094332d3Sopenharmony_ci RetCode rc = RC_OK; 112094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 113094332d3Sopenharmony_ci 114094332d3Sopenharmony_ci rc = mainDemo->CaptureON(STREAM_ID_CAPTURE, CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT); 115094332d3Sopenharmony_ci if (rc != RC_OK) { 116094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->CaptureON() capture error"); 117094332d3Sopenharmony_ci return; 118094332d3Sopenharmony_ci } 119094332d3Sopenharmony_ci 120094332d3Sopenharmony_ci sleep(delayTime); 121094332d3Sopenharmony_ci rc = mainDemo->CaptureOff(CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT); 122094332d3Sopenharmony_ci if (rc != RC_OK) { 123094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->CaptureOff() capture error"); 124094332d3Sopenharmony_ci return; 125094332d3Sopenharmony_ci } 126094332d3Sopenharmony_ci} 127094332d3Sopenharmony_ci 128094332d3Sopenharmony_cistatic void VideoTest(const std::shared_ptr<OhosCameraDemo>& mainDemo) 129094332d3Sopenharmony_ci{ 130094332d3Sopenharmony_ci RetCode rc = RC_OK; 131094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ci PreviewOff(mainDemo); 134094332d3Sopenharmony_ci mainDemo->StartDualStreams(STREAM_ID_VIDEO); 135094332d3Sopenharmony_ci mainDemo->CaptureOnDualStreams(STREAM_ID_VIDEO); 136094332d3Sopenharmony_ci 137094332d3Sopenharmony_ci sleep(delayTime); 138094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 139094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_VIDEO, CAPTURE_VIDEO); 140094332d3Sopenharmony_ci mainDemo->ReleaseAllStream(); 141094332d3Sopenharmony_ci 142094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 143094332d3Sopenharmony_ci if (rc != RC_OK) { 144094332d3Sopenharmony_ci CAMERA_LOGE("main test: video PreviewOn() error please -q exit demo"); 145094332d3Sopenharmony_ci } 146094332d3Sopenharmony_ci} 147094332d3Sopenharmony_ci 148094332d3Sopenharmony_cistatic void ManuList(const std::shared_ptr<OhosCameraDemo>& mainDemo, 149094332d3Sopenharmony_ci const int argc, char** argv) 150094332d3Sopenharmony_ci{ 151094332d3Sopenharmony_ci int idx, c; 152094332d3Sopenharmony_ci const char *shortOptions = "h:cewgi:"; 153094332d3Sopenharmony_ci c = getopt_long(argc, argv, shortOptions, LONG_OPTIONS, &idx); 154094332d3Sopenharmony_ci while (1) { 155094332d3Sopenharmony_ci switch (c) { 156094332d3Sopenharmony_ci case 'h': 157094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 158094332d3Sopenharmony_ci break; 159094332d3Sopenharmony_ci case 'c': 160094332d3Sopenharmony_ci CaptureTest(mainDemo); 161094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 162094332d3Sopenharmony_ci break; 163094332d3Sopenharmony_ci case 'e': 164094332d3Sopenharmony_ci mainDemo->SetAeAuto(); 165094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 166094332d3Sopenharmony_ci break; 167094332d3Sopenharmony_ci case 'f': 168094332d3Sopenharmony_ci mainDemo->SetAfAuto(); 169094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 170094332d3Sopenharmony_ci break; 171094332d3Sopenharmony_ci case 'w': 172094332d3Sopenharmony_ci mainDemo->SetAwbMode(); 173094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 174094332d3Sopenharmony_ci break; 175094332d3Sopenharmony_ci case 'g': 176094332d3Sopenharmony_ci mainDemo->SetAELock(); 177094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 178094332d3Sopenharmony_ci break; 179094332d3Sopenharmony_ci case 'i': 180094332d3Sopenharmony_ci mainDemo->SetAWBLock(); 181094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 182094332d3Sopenharmony_ci break; 183094332d3Sopenharmony_ci case 'v': 184094332d3Sopenharmony_ci VideoTest(mainDemo); 185094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 186094332d3Sopenharmony_ci break; 187094332d3Sopenharmony_ci case 'q': 188094332d3Sopenharmony_ci PreviewOff(mainDemo); 189094332d3Sopenharmony_ci mainDemo->QuitDemo(); 190094332d3Sopenharmony_ci return; 191094332d3Sopenharmony_ci default: 192094332d3Sopenharmony_ci CAMERA_LOGE("main test: command error please retry input command"); 193094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 194094332d3Sopenharmony_ci break; 195094332d3Sopenharmony_ci } 196094332d3Sopenharmony_ci } 197094332d3Sopenharmony_ci} 198094332d3Sopenharmony_ci 199094332d3Sopenharmony_ciint main(int argc, char** argv) 200094332d3Sopenharmony_ci{ 201094332d3Sopenharmony_ci RetCode rc = RC_OK; 202094332d3Sopenharmony_ci 203094332d3Sopenharmony_ci auto mainDemo = std::make_shared<OhosCameraDemo>(); 204094332d3Sopenharmony_ci rc = mainDemo->InitSensors(); 205094332d3Sopenharmony_ci if (rc == RC_ERROR) { 206094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->InitSensors() error"); 207094332d3Sopenharmony_ci return -1; 208094332d3Sopenharmony_ci } 209094332d3Sopenharmony_ci rc = mainDemo->InitCameraDevice(); 210094332d3Sopenharmony_ci if (rc == RC_ERROR) { 211094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->InitCameraDevice() error"); 212094332d3Sopenharmony_ci return -1; 213094332d3Sopenharmony_ci } 214094332d3Sopenharmony_ci mainDemo->SetEnableResult(); 215094332d3Sopenharmony_ci 216094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 217094332d3Sopenharmony_ci if (rc != RC_OK) { 218094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn() error demo exit"); 219094332d3Sopenharmony_ci return -1; 220094332d3Sopenharmony_ci } 221094332d3Sopenharmony_ci 222094332d3Sopenharmony_ci ManuList(mainDemo, argc, argv); 223094332d3Sopenharmony_ci 224094332d3Sopenharmony_ci return RC_OK; 225094332d3Sopenharmony_ci} 226094332d3Sopenharmony_ci} // namespace Camera 227094332d3Sopenharmony_ci 228094332d3Sopenharmony_ciint main(int argc, char** argv) 229094332d3Sopenharmony_ci{ 230094332d3Sopenharmony_ci OHOS::Camera::main(argc, argv); 231094332d3Sopenharmony_ci 232094332d3Sopenharmony_ci return 0; 233094332d3Sopenharmony_ci} 234