1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 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 "dcamera_hdf_demo.h" 17094332d3Sopenharmony_ci#include <cstdio> 18094332d3Sopenharmony_ci#include <getopt.h> 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_ci#include "distributed_hardware_log.h" 21094332d3Sopenharmony_ci 22094332d3Sopenharmony_cinamespace OHOS { 23094332d3Sopenharmony_cinamespace DistributedHardware { 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cistatic void Usage(FILE* fp) 26094332d3Sopenharmony_ci{ 27094332d3Sopenharmony_ci fprintf(fp, 28094332d3Sopenharmony_ci "Options:\n" 29094332d3Sopenharmony_ci "-h | --help Print this message\n" 30094332d3Sopenharmony_ci "-o | --offline stream offline test\n" 31094332d3Sopenharmony_ci "-c | --capture capture one picture\n" 32094332d3Sopenharmony_ci "-w | --set WB Set white balance Cloudy\n" 33094332d3Sopenharmony_ci "-v | --video capture Video of 10s\n" 34094332d3Sopenharmony_ci "-a | --Set AE Set Auto exposure\n" 35094332d3Sopenharmony_ci "-e | --Set Metadeta Set Metadata\n" 36094332d3Sopenharmony_ci "-f | --Set Flashlight Set flashlight ON 5s OFF\n" 37094332d3Sopenharmony_ci "-q | --quit stop preview and quit this app\n"); 38094332d3Sopenharmony_ci} 39094332d3Sopenharmony_ci 40094332d3Sopenharmony_ciconst static struct option LONG_OPTIONS[] = { 41094332d3Sopenharmony_ci {"help", no_argument, nullptr, 'h'}, {"capture", no_argument, nullptr, 'c'}, 42094332d3Sopenharmony_ci {"WB", no_argument, nullptr, 'w'}, {"video", no_argument, nullptr, 'v'}, 43094332d3Sopenharmony_ci {"quit", no_argument, nullptr, 'q'}, {"AE", no_argument, nullptr, 'a'}, 44094332d3Sopenharmony_ci {"OL", no_argument, nullptr, 'o'}, {"flashlight", no_argument, nullptr, 'f'}, 45094332d3Sopenharmony_ci {0, 0, 0, 0} 46094332d3Sopenharmony_ci}; 47094332d3Sopenharmony_ci 48094332d3Sopenharmony_cistatic int PutMenuAndGetChr(void) 49094332d3Sopenharmony_ci{ 50094332d3Sopenharmony_ci constexpr uint32_t inputCount = 50; 51094332d3Sopenharmony_ci int c = 0; 52094332d3Sopenharmony_ci char strs[inputCount]; 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_ci Usage(stdout); 55094332d3Sopenharmony_ci DHLOGI("pls input command(input -q exit this app)"); 56094332d3Sopenharmony_ci fgets(strs, inputCount, stdin); 57094332d3Sopenharmony_ci 58094332d3Sopenharmony_ci for (uint32_t i = 0; i < inputCount; i++) { 59094332d3Sopenharmony_ci if (strs[i] != '-') { 60094332d3Sopenharmony_ci c = strs[i]; 61094332d3Sopenharmony_ci break; 62094332d3Sopenharmony_ci } 63094332d3Sopenharmony_ci } 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_ci return c; 66094332d3Sopenharmony_ci} 67094332d3Sopenharmony_ci 68094332d3Sopenharmony_cistatic RetCode PreviewOn(int mode, const std::shared_ptr<DcameraHdfDemo>& mainDemo) 69094332d3Sopenharmony_ci{ 70094332d3Sopenharmony_ci RetCode rc = RC_OK; 71094332d3Sopenharmony_ci DHLOGI("main test: PreviewOn enter"); 72094332d3Sopenharmony_ci 73094332d3Sopenharmony_ci rc = mainDemo->StartPreviewStream(); 74094332d3Sopenharmony_ci if (rc != RC_OK) { 75094332d3Sopenharmony_ci DHLOGE("main test: PreviewOn StartPreviewStream error"); 76094332d3Sopenharmony_ci return RC_ERROR; 77094332d3Sopenharmony_ci } 78094332d3Sopenharmony_ci DHLOGI("main test: StartPreviewStream enter"); 79094332d3Sopenharmony_ci if (mode == 0) { 80094332d3Sopenharmony_ci rc = mainDemo->StartCaptureStream(); 81094332d3Sopenharmony_ci if (rc != RC_OK) { 82094332d3Sopenharmony_ci DHLOGE("main test: PreviewOn StartCaptureStream error"); 83094332d3Sopenharmony_ci return RC_ERROR; 84094332d3Sopenharmony_ci } 85094332d3Sopenharmony_ci DHLOGI("main test: StartCaptureStream enter"); 86094332d3Sopenharmony_ci } else { 87094332d3Sopenharmony_ci rc = mainDemo->StartVideoStream(); 88094332d3Sopenharmony_ci if (rc != RC_OK) { 89094332d3Sopenharmony_ci DHLOGE("main test: PreviewOn StartVideoStream error"); 90094332d3Sopenharmony_ci return RC_ERROR; 91094332d3Sopenharmony_ci } 92094332d3Sopenharmony_ci DHLOGI("main test: StartVideoStream enter"); 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci rc = mainDemo->CreateStream(); 95094332d3Sopenharmony_ci if (rc != RC_OK) { 96094332d3Sopenharmony_ci DHLOGE("main test: CreateStream error"); 97094332d3Sopenharmony_ci return RC_ERROR; 98094332d3Sopenharmony_ci } 99094332d3Sopenharmony_ci rc = mainDemo->CaptureON(STREAM_ID_PREVIEW, CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 100094332d3Sopenharmony_ci if (rc != RC_OK) { 101094332d3Sopenharmony_ci DHLOGE("main test: PreviewOn mainDemo->CaptureON() preview error"); 102094332d3Sopenharmony_ci return RC_ERROR; 103094332d3Sopenharmony_ci } 104094332d3Sopenharmony_ci 105094332d3Sopenharmony_ci DHLOGI("main test: PreviewOn exit"); 106094332d3Sopenharmony_ci return RC_OK; 107094332d3Sopenharmony_ci} 108094332d3Sopenharmony_ci 109094332d3Sopenharmony_cistatic void PreviewOff(const std::shared_ptr<DcameraHdfDemo>& mainDemo) 110094332d3Sopenharmony_ci{ 111094332d3Sopenharmony_ci DHLOGI("main test: PreviewOff enter"); 112094332d3Sopenharmony_ci 113094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 114094332d3Sopenharmony_ci mainDemo->ReleaseAllStream(); 115094332d3Sopenharmony_ci 116094332d3Sopenharmony_ci DHLOGI("main test: PreviewOff exit"); 117094332d3Sopenharmony_ci} 118094332d3Sopenharmony_ci 119094332d3Sopenharmony_cistatic void FlashLightTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo) 120094332d3Sopenharmony_ci{ 121094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 122094332d3Sopenharmony_ci 123094332d3Sopenharmony_ci PreviewOff(mainDemo); 124094332d3Sopenharmony_ci mainDemo->ReleaseCameraDevice(); 125094332d3Sopenharmony_ci sleep(1); 126094332d3Sopenharmony_ci mainDemo->FlashlightOnOff(true); 127094332d3Sopenharmony_ci sleep(delayTime); 128094332d3Sopenharmony_ci mainDemo->FlashlightOnOff(false); 129094332d3Sopenharmony_ci mainDemo->InitCameraDevice(); 130094332d3Sopenharmony_ci PreviewOn(0, mainDemo); 131094332d3Sopenharmony_ci} 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_cistatic void OfflineTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo) 134094332d3Sopenharmony_ci{ 135094332d3Sopenharmony_ci RetCode rc = RC_OK; 136094332d3Sopenharmony_ci constexpr uint32_t delayTime = 5; 137094332d3Sopenharmony_ci PreviewOff(mainDemo); 138094332d3Sopenharmony_ci 139094332d3Sopenharmony_ci mainDemo->StartDualStreams(STREAM_ID_CAPTURE); 140094332d3Sopenharmony_ci mainDemo->CaptureOnDualStreams(STREAM_ID_CAPTURE); 141094332d3Sopenharmony_ci sleep(1); 142094332d3Sopenharmony_ci 143094332d3Sopenharmony_ci rc = mainDemo->StreamOffline(STREAM_ID_CAPTURE); 144094332d3Sopenharmony_ci if (rc != RC_OK) { 145094332d3Sopenharmony_ci DHLOGE("main test: mainDemo->StreamOffline error"); 146094332d3Sopenharmony_ci } 147094332d3Sopenharmony_ci 148094332d3Sopenharmony_ci sleep(delayTime); 149094332d3Sopenharmony_ci mainDemo->InitCameraDevice(); 150094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 151094332d3Sopenharmony_ci if (rc != RC_OK) { 152094332d3Sopenharmony_ci DHLOGE("main test: PreviewOn() error"); 153094332d3Sopenharmony_ci } 154094332d3Sopenharmony_ci} 155094332d3Sopenharmony_ci 156094332d3Sopenharmony_cistatic void CaptureTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo) 157094332d3Sopenharmony_ci{ 158094332d3Sopenharmony_ci RetCode rc = RC_OK; 159094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 160094332d3Sopenharmony_ci 161094332d3Sopenharmony_ci rc = mainDemo->CaptureON(STREAM_ID_CAPTURE, CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT); 162094332d3Sopenharmony_ci if (rc != RC_OK) { 163094332d3Sopenharmony_ci DHLOGE("main test: mainDemo->CaptureON() capture error"); 164094332d3Sopenharmony_ci return; 165094332d3Sopenharmony_ci } 166094332d3Sopenharmony_ci 167094332d3Sopenharmony_ci sleep(delayTime); 168094332d3Sopenharmony_ci rc = mainDemo->CaptureOff(CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT); 169094332d3Sopenharmony_ci if (rc != RC_OK) { 170094332d3Sopenharmony_ci DHLOGE("main test: mainDemo->CaptureOff() capture error"); 171094332d3Sopenharmony_ci return; 172094332d3Sopenharmony_ci } 173094332d3Sopenharmony_ci DHLOGI("main test: CaptureON success"); 174094332d3Sopenharmony_ci} 175094332d3Sopenharmony_ci 176094332d3Sopenharmony_cistatic void VideoTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo) 177094332d3Sopenharmony_ci{ 178094332d3Sopenharmony_ci RetCode rc = RC_OK; 179094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 180094332d3Sopenharmony_ci 181094332d3Sopenharmony_ci PreviewOff(mainDemo); 182094332d3Sopenharmony_ci mainDemo->StartDualStreams(STREAM_ID_VIDEO); 183094332d3Sopenharmony_ci mainDemo->CaptureOnDualStreams(STREAM_ID_VIDEO); 184094332d3Sopenharmony_ci 185094332d3Sopenharmony_ci sleep(delayTime); 186094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 187094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_VIDEO, CAPTURE_VIDEO); 188094332d3Sopenharmony_ci mainDemo->ReleaseAllStream(); 189094332d3Sopenharmony_ci 190094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 191094332d3Sopenharmony_ci if (rc != RC_OK) { 192094332d3Sopenharmony_ci DHLOGE("main test: video PreviewOn() error please -q exit demo"); 193094332d3Sopenharmony_ci } 194094332d3Sopenharmony_ci} 195094332d3Sopenharmony_ci 196094332d3Sopenharmony_cistatic void SetAwb(const std::shared_ptr<DcameraHdfDemo>& mainDemo, int& awb) 197094332d3Sopenharmony_ci{ 198094332d3Sopenharmony_ci if (awb) { 199094332d3Sopenharmony_ci mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_INCANDESCENT); 200094332d3Sopenharmony_ci } else { 201094332d3Sopenharmony_ci mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_OFF); 202094332d3Sopenharmony_ci } 203094332d3Sopenharmony_ci awb = !awb; 204094332d3Sopenharmony_ci} 205094332d3Sopenharmony_ci 206094332d3Sopenharmony_cistatic void ManuList(const std::shared_ptr<DcameraHdfDemo>& mainDemo, const int argc, char** argv) 207094332d3Sopenharmony_ci{ 208094332d3Sopenharmony_ci int idx, c; 209094332d3Sopenharmony_ci int awb = 1; 210094332d3Sopenharmony_ci const char *shortOptions = "h:cwvaeqof:"; 211094332d3Sopenharmony_ci c = getopt_long(argc, argv, shortOptions, LONG_OPTIONS, &idx); 212094332d3Sopenharmony_ci while (1) { 213094332d3Sopenharmony_ci switch (c) { 214094332d3Sopenharmony_ci case 'h': 215094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 216094332d3Sopenharmony_ci break; 217094332d3Sopenharmony_ci case 'f': 218094332d3Sopenharmony_ci FlashLightTest(mainDemo); 219094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 220094332d3Sopenharmony_ci break; 221094332d3Sopenharmony_ci case 'o': 222094332d3Sopenharmony_ci OfflineTest(mainDemo); 223094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 224094332d3Sopenharmony_ci break; 225094332d3Sopenharmony_ci case 'c': 226094332d3Sopenharmony_ci CaptureTest(mainDemo); 227094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 228094332d3Sopenharmony_ci break; 229094332d3Sopenharmony_ci case 'w': 230094332d3Sopenharmony_ci SetAwb(mainDemo, awb); 231094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 232094332d3Sopenharmony_ci break; 233094332d3Sopenharmony_ci case 'a': 234094332d3Sopenharmony_ci mainDemo->SetAeExpo(); 235094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 236094332d3Sopenharmony_ci break; 237094332d3Sopenharmony_ci case 'e': 238094332d3Sopenharmony_ci mainDemo->SetMetadata(); 239094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 240094332d3Sopenharmony_ci break; 241094332d3Sopenharmony_ci case 'v': 242094332d3Sopenharmony_ci VideoTest(mainDemo); 243094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 244094332d3Sopenharmony_ci break; 245094332d3Sopenharmony_ci case 'q': 246094332d3Sopenharmony_ci PreviewOff(mainDemo); 247094332d3Sopenharmony_ci mainDemo->QuitDemo(); 248094332d3Sopenharmony_ci return; 249094332d3Sopenharmony_ci default: 250094332d3Sopenharmony_ci DHLOGE("main test: command error please retry input command"); 251094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 252094332d3Sopenharmony_ci break; 253094332d3Sopenharmony_ci } 254094332d3Sopenharmony_ci } 255094332d3Sopenharmony_ci} 256094332d3Sopenharmony_ci 257094332d3Sopenharmony_ciint main(int argc, char** argv) 258094332d3Sopenharmony_ci{ 259094332d3Sopenharmony_ci RetCode rc = RC_OK; 260094332d3Sopenharmony_ci std::cout << "dcamera hdi start" << std::endl; 261094332d3Sopenharmony_ci auto mainDemo = std::make_shared<DcameraHdfDemo>(); 262094332d3Sopenharmony_ci rc = mainDemo->InitSensors(); 263094332d3Sopenharmony_ci if (rc == RC_ERROR) { 264094332d3Sopenharmony_ci DHLOGE("main test: mainDemo->InitSensors() error"); 265094332d3Sopenharmony_ci return -1; 266094332d3Sopenharmony_ci } 267094332d3Sopenharmony_ci std::cout << "dcamera InitSensors success" << std::endl; 268094332d3Sopenharmony_ci rc = mainDemo->InitCameraDevice(); 269094332d3Sopenharmony_ci if (rc == RC_ERROR) { 270094332d3Sopenharmony_ci DHLOGE("main test: mainDemo->InitCameraDevice() error"); 271094332d3Sopenharmony_ci return -1; 272094332d3Sopenharmony_ci } 273094332d3Sopenharmony_ci std::cout << "dcamera InitCameraDevice success" << std::endl; 274094332d3Sopenharmony_ci mainDemo->SetEnableResult(); 275094332d3Sopenharmony_ci 276094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 277094332d3Sopenharmony_ci if (rc != RC_OK) { 278094332d3Sopenharmony_ci DHLOGE("main test: PreviewOn() error demo exit"); 279094332d3Sopenharmony_ci return -1; 280094332d3Sopenharmony_ci } 281094332d3Sopenharmony_ci std::cout << "dcamera PreviewOn success" << std::endl; 282094332d3Sopenharmony_ci std::cout << "dcamera ManuList start" << std::endl; 283094332d3Sopenharmony_ci ManuList(mainDemo, argc, argv); 284094332d3Sopenharmony_ci std::cout << "dcamera hdi end" << std::endl; 285094332d3Sopenharmony_ci return RC_OK; 286094332d3Sopenharmony_ci} 287094332d3Sopenharmony_ci} 288094332d3Sopenharmony_ci} // namespace OHOS::DistributedHardware 289094332d3Sopenharmony_ci 290094332d3Sopenharmony_ciint main(int argc, char** argv) 291094332d3Sopenharmony_ci{ 292094332d3Sopenharmony_ci OHOS::DistributedHardware::main(argc, argv); 293094332d3Sopenharmony_ci 294094332d3Sopenharmony_ci return 0; 295094332d3Sopenharmony_ci}