1 /*
2  * Copyright (c) 2021 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 #include "ohos_camera_demo_3a.h"
17 #include <cstdio>
18 #include <getopt.h>
19 
20 namespace OHOS::Camera {
Usage(FILE * fp)21 static void Usage(FILE* fp)
22 {
23     fprintf(fp,
24             "Options:\n"
25             "-h | --help                Print this message\n"
26             "-c | --capture             capture one picture\n"
27             "-e | --auto exposure       Auto Exposure\n"
28             "-f | --auto focus          Auto Focus\n"
29             "-w | --auto white balance  Auto White Balance\n"
30             "-g | --exposure lock       Auto Exposure Lock\n"
31             "-i | --white balance lock  Auto White Balance Lock\n"
32             "-v | --white balance lock  Video test\n"
33             "-q | --quit                stop preview and quit this app\n");
34 }
35 
36 const static struct option LONG_OPTIONS[] = {
37     {"help", no_argument, nullptr, 'h'}, {"capture", no_argument, nullptr, 'c'},
38     {"ae", no_argument, nullptr, 'e'}, {"af", no_argument, nullptr, 'f'},
39     {"awb", no_argument, nullptr, 'w'}, {"ael", no_argument, nullptr, 'g'},
40     {"awbl", no_argument, nullptr, 'i'}, {"video", no_argument, nullptr, 'v'},
41     {nullptr, 0, nullptr, 0}
42 };
43 
PutMenuAndGetChr(void)44 static int PutMenuAndGetChr(void)
45 {
46     constexpr uint32_t inputCount = 50;
47     int c = 0;
48     char strs[inputCount];
49 
50     Usage(stdout);
51     CAMERA_LOGD("pls input command(input -q exit this app)\n");
52     fgets(strs, inputCount, stdin);
53 
54     for (int i = 0; i < inputCount; i++) {
55         if (strs[i] != '-') {
56             c = strs[i];
57             break;
58         }
59     }
60 
61     return c;
62 }
63 
PreviewOn(int mode,const std::shared_ptr<OhosCameraDemo> & mainDemo)64 static RetCode PreviewOn(int mode, const std::shared_ptr<OhosCameraDemo>& mainDemo)
65 {
66     RetCode rc = RC_OK;
67     CAMERA_LOGD("main test: PreviewOn enter");
68 
69     rc = mainDemo->StartPreviewStream();
70     if (rc != RC_OK) {
71         CAMERA_LOGE("main test: PreviewOn StartPreviewStream error");
72         return RC_ERROR;
73     }
74 
75     if (mode == 0) {
76         rc = mainDemo->StartCaptureStream();
77         if (rc != RC_OK) {
78             CAMERA_LOGE("main test: PreviewOn StartCaptureStream error");
79             return RC_ERROR;
80         }
81     } else {
82         rc = mainDemo->StartVideoStream();
83         if (rc != RC_OK) {
84             CAMERA_LOGE("main test: PreviewOn StartVideoStream error");
85             return RC_ERROR;
86         }
87     }
88 
89     rc = mainDemo->CaptureON(STREAM_ID_PREVIEW, CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW);
90     if (rc != RC_OK) {
91         CAMERA_LOGE("main test: PreviewOn mainDemo->CaptureON() preview error");
92         return RC_ERROR;
93     }
94 
95     CAMERA_LOGD("main test: PreviewOn exit");
96     return RC_OK;
97 }
98 
PreviewOff(const std::shared_ptr<OhosCameraDemo> & mainDemo)99 static void PreviewOff(const std::shared_ptr<OhosCameraDemo>& mainDemo)
100 {
101     CAMERA_LOGD("main test: PreviewOff enter");
102 
103     mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW);
104     mainDemo->ReleaseAllStream();
105 
106     CAMERA_LOGD("main test: PreviewOff exit");
107 }
108 
CaptureTest(const std::shared_ptr<OhosCameraDemo> & mainDemo)109 static void CaptureTest(const std::shared_ptr<OhosCameraDemo>& mainDemo)
110 {
111     RetCode rc = RC_OK;
112     constexpr size_t delayTime = 5;
113 
114     rc = mainDemo->CaptureON(STREAM_ID_CAPTURE, CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT);
115     if (rc != RC_OK) {
116         CAMERA_LOGE("main test: mainDemo->CaptureON() capture error");
117         return;
118     }
119 
120     sleep(delayTime);
121     rc = mainDemo->CaptureOff(CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT);
122     if (rc != RC_OK) {
123         CAMERA_LOGE("main test: mainDemo->CaptureOff() capture error");
124         return;
125     }
126 }
127 
VideoTest(const std::shared_ptr<OhosCameraDemo> & mainDemo)128 static void VideoTest(const std::shared_ptr<OhosCameraDemo>& mainDemo)
129 {
130     RetCode rc = RC_OK;
131     constexpr size_t delayTime = 5;
132 
133     PreviewOff(mainDemo);
134     mainDemo->StartDualStreams(STREAM_ID_VIDEO);
135     mainDemo->CaptureOnDualStreams(STREAM_ID_VIDEO);
136 
137     sleep(delayTime);
138     mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW);
139     mainDemo->CaptureOff(CAPTURE_ID_VIDEO, CAPTURE_VIDEO);
140     mainDemo->ReleaseAllStream();
141 
142     rc = PreviewOn(0, mainDemo);
143     if (rc != RC_OK) {
144         CAMERA_LOGE("main test: video PreviewOn() error please -q exit demo");
145     }
146 }
147 
ManuList(const std::shared_ptr<OhosCameraDemo> & mainDemo,const int argc,char ** argv)148 static void ManuList(const std::shared_ptr<OhosCameraDemo>& mainDemo,
149     const int argc, char** argv)
150 {
151     int idx, c;
152     const char *shortOptions = "h:cewgi:";
153     c = getopt_long(argc, argv, shortOptions, LONG_OPTIONS, &idx);
154     while (1) {
155         switch (c) {
156             case 'h':
157                 c = PutMenuAndGetChr();
158                 break;
159             case 'c':
160                 CaptureTest(mainDemo);
161                 c = PutMenuAndGetChr();
162                 break;
163             case 'e':
164                 mainDemo->SetAeAuto();
165                 c = PutMenuAndGetChr();
166                 break;
167             case 'f':
168                 mainDemo->SetAfAuto();
169                 c = PutMenuAndGetChr();
170                 break;
171             case 'w':
172                 mainDemo->SetAwbMode();
173                 c = PutMenuAndGetChr();
174                 break;
175             case 'g':
176                 mainDemo->SetAELock();
177                 c = PutMenuAndGetChr();
178                 break;
179             case 'i':
180                 mainDemo->SetAWBLock();
181                 c = PutMenuAndGetChr();
182                 break;
183             case 'v':
184                 VideoTest(mainDemo);
185                 c = PutMenuAndGetChr();
186                 break;
187             case 'q':
188                 PreviewOff(mainDemo);
189                 mainDemo->QuitDemo();
190                 return;
191             default:
192                 CAMERA_LOGE("main test: command error please retry input command");
193                 c = PutMenuAndGetChr();
194                 break;
195         }
196     }
197 }
198 
main(int argc,char ** argv)199 int main(int argc, char** argv)
200 {
201     RetCode rc = RC_OK;
202 
203     auto mainDemo = std::make_shared<OhosCameraDemo>();
204     rc = mainDemo->InitSensors();
205     if (rc == RC_ERROR) {
206         CAMERA_LOGE("main test: mainDemo->InitSensors() error");
207         return -1;
208     }
209     rc = mainDemo->InitCameraDevice();
210     if (rc == RC_ERROR) {
211         CAMERA_LOGE("main test: mainDemo->InitCameraDevice() error");
212         return -1;
213     }
214     mainDemo->SetEnableResult();
215 
216     rc = PreviewOn(0, mainDemo);
217     if (rc != RC_OK) {
218         CAMERA_LOGE("main test: PreviewOn() error demo exit");
219         return -1;
220     }
221 
222     ManuList(mainDemo, argc, argv);
223 
224     return RC_OK;
225 }
226 } // namespace Camera
227 
main(int argc,char ** argv)228 int main(int argc, char** argv)
229 {
230     OHOS::Camera::main(argc, argv);
231 
232     return 0;
233 }
234