1 /*
2 * Copyright (c) 2022-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
16 #include "dcamera_hdf_demo.h"
17 #include <cstdio>
18 #include <getopt.h>
19
20 #include "distributed_hardware_log.h"
21
22 namespace OHOS {
23 namespace DistributedHardware {
24
Usage(FILE * fp)25 static void Usage(FILE* fp)
26 {
27 fprintf(fp,
28 "Options:\n"
29 "-h | --help Print this message\n"
30 "-o | --offline stream offline test\n"
31 "-c | --capture capture one picture\n"
32 "-w | --set WB Set white balance Cloudy\n"
33 "-v | --video capture Video of 10s\n"
34 "-a | --Set AE Set Auto exposure\n"
35 "-e | --Set Metadeta Set Metadata\n"
36 "-f | --Set Flashlight Set flashlight ON 5s OFF\n"
37 "-q | --quit stop preview and quit this app\n");
38 }
39
40 const static struct option LONG_OPTIONS[] = {
41 {"help", no_argument, nullptr, 'h'}, {"capture", no_argument, nullptr, 'c'},
42 {"WB", no_argument, nullptr, 'w'}, {"video", no_argument, nullptr, 'v'},
43 {"quit", no_argument, nullptr, 'q'}, {"AE", no_argument, nullptr, 'a'},
44 {"OL", no_argument, nullptr, 'o'}, {"flashlight", no_argument, nullptr, 'f'},
45 {0, 0, 0, 0}
46 };
47
PutMenuAndGetChr(void)48 static int PutMenuAndGetChr(void)
49 {
50 constexpr uint32_t inputCount = 50;
51 int c = 0;
52 char strs[inputCount];
53
54 Usage(stdout);
55 DHLOGI("pls input command(input -q exit this app)");
56 fgets(strs, inputCount, stdin);
57
58 for (uint32_t i = 0; i < inputCount; i++) {
59 if (strs[i] != '-') {
60 c = strs[i];
61 break;
62 }
63 }
64
65 return c;
66 }
67
PreviewOn(int mode,const std::shared_ptr<DcameraHdfDemo> & mainDemo)68 static RetCode PreviewOn(int mode, const std::shared_ptr<DcameraHdfDemo>& mainDemo)
69 {
70 RetCode rc = RC_OK;
71 DHLOGI("main test: PreviewOn enter");
72
73 rc = mainDemo->StartPreviewStream();
74 if (rc != RC_OK) {
75 DHLOGE("main test: PreviewOn StartPreviewStream error");
76 return RC_ERROR;
77 }
78 DHLOGI("main test: StartPreviewStream enter");
79 if (mode == 0) {
80 rc = mainDemo->StartCaptureStream();
81 if (rc != RC_OK) {
82 DHLOGE("main test: PreviewOn StartCaptureStream error");
83 return RC_ERROR;
84 }
85 DHLOGI("main test: StartCaptureStream enter");
86 } else {
87 rc = mainDemo->StartVideoStream();
88 if (rc != RC_OK) {
89 DHLOGE("main test: PreviewOn StartVideoStream error");
90 return RC_ERROR;
91 }
92 DHLOGI("main test: StartVideoStream enter");
93 }
94 rc = mainDemo->CreateStream();
95 if (rc != RC_OK) {
96 DHLOGE("main test: CreateStream error");
97 return RC_ERROR;
98 }
99 rc = mainDemo->CaptureON(STREAM_ID_PREVIEW, CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW);
100 if (rc != RC_OK) {
101 DHLOGE("main test: PreviewOn mainDemo->CaptureON() preview error");
102 return RC_ERROR;
103 }
104
105 DHLOGI("main test: PreviewOn exit");
106 return RC_OK;
107 }
108
PreviewOff(const std::shared_ptr<DcameraHdfDemo> & mainDemo)109 static void PreviewOff(const std::shared_ptr<DcameraHdfDemo>& mainDemo)
110 {
111 DHLOGI("main test: PreviewOff enter");
112
113 mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW);
114 mainDemo->ReleaseAllStream();
115
116 DHLOGI("main test: PreviewOff exit");
117 }
118
FlashLightTest(const std::shared_ptr<DcameraHdfDemo> & mainDemo)119 static void FlashLightTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo)
120 {
121 constexpr size_t delayTime = 5;
122
123 PreviewOff(mainDemo);
124 mainDemo->ReleaseCameraDevice();
125 sleep(1);
126 mainDemo->FlashlightOnOff(true);
127 sleep(delayTime);
128 mainDemo->FlashlightOnOff(false);
129 mainDemo->InitCameraDevice();
130 PreviewOn(0, mainDemo);
131 }
132
OfflineTest(const std::shared_ptr<DcameraHdfDemo> & mainDemo)133 static void OfflineTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo)
134 {
135 RetCode rc = RC_OK;
136 constexpr uint32_t delayTime = 5;
137 PreviewOff(mainDemo);
138
139 mainDemo->StartDualStreams(STREAM_ID_CAPTURE);
140 mainDemo->CaptureOnDualStreams(STREAM_ID_CAPTURE);
141 sleep(1);
142
143 rc = mainDemo->StreamOffline(STREAM_ID_CAPTURE);
144 if (rc != RC_OK) {
145 DHLOGE("main test: mainDemo->StreamOffline error");
146 }
147
148 sleep(delayTime);
149 mainDemo->InitCameraDevice();
150 rc = PreviewOn(0, mainDemo);
151 if (rc != RC_OK) {
152 DHLOGE("main test: PreviewOn() error");
153 }
154 }
155
CaptureTest(const std::shared_ptr<DcameraHdfDemo> & mainDemo)156 static void CaptureTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo)
157 {
158 RetCode rc = RC_OK;
159 constexpr size_t delayTime = 5;
160
161 rc = mainDemo->CaptureON(STREAM_ID_CAPTURE, CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT);
162 if (rc != RC_OK) {
163 DHLOGE("main test: mainDemo->CaptureON() capture error");
164 return;
165 }
166
167 sleep(delayTime);
168 rc = mainDemo->CaptureOff(CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT);
169 if (rc != RC_OK) {
170 DHLOGE("main test: mainDemo->CaptureOff() capture error");
171 return;
172 }
173 DHLOGI("main test: CaptureON success");
174 }
175
VideoTest(const std::shared_ptr<DcameraHdfDemo> & mainDemo)176 static void VideoTest(const std::shared_ptr<DcameraHdfDemo>& mainDemo)
177 {
178 RetCode rc = RC_OK;
179 constexpr size_t delayTime = 5;
180
181 PreviewOff(mainDemo);
182 mainDemo->StartDualStreams(STREAM_ID_VIDEO);
183 mainDemo->CaptureOnDualStreams(STREAM_ID_VIDEO);
184
185 sleep(delayTime);
186 mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW);
187 mainDemo->CaptureOff(CAPTURE_ID_VIDEO, CAPTURE_VIDEO);
188 mainDemo->ReleaseAllStream();
189
190 rc = PreviewOn(0, mainDemo);
191 if (rc != RC_OK) {
192 DHLOGE("main test: video PreviewOn() error please -q exit demo");
193 }
194 }
195
SetAwb(const std::shared_ptr<DcameraHdfDemo> & mainDemo,int & awb)196 static void SetAwb(const std::shared_ptr<DcameraHdfDemo>& mainDemo, int& awb)
197 {
198 if (awb) {
199 mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_INCANDESCENT);
200 } else {
201 mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_OFF);
202 }
203 awb = !awb;
204 }
205
ManuList(const std::shared_ptr<DcameraHdfDemo> & mainDemo,const int argc,char ** argv)206 static void ManuList(const std::shared_ptr<DcameraHdfDemo>& mainDemo, const int argc, char** argv)
207 {
208 int idx, c;
209 int awb = 1;
210 const char *shortOptions = "h:cwvaeqof:";
211 c = getopt_long(argc, argv, shortOptions, LONG_OPTIONS, &idx);
212 while (1) {
213 switch (c) {
214 case 'h':
215 c = PutMenuAndGetChr();
216 break;
217 case 'f':
218 FlashLightTest(mainDemo);
219 c = PutMenuAndGetChr();
220 break;
221 case 'o':
222 OfflineTest(mainDemo);
223 c = PutMenuAndGetChr();
224 break;
225 case 'c':
226 CaptureTest(mainDemo);
227 c = PutMenuAndGetChr();
228 break;
229 case 'w':
230 SetAwb(mainDemo, awb);
231 c = PutMenuAndGetChr();
232 break;
233 case 'a':
234 mainDemo->SetAeExpo();
235 c = PutMenuAndGetChr();
236 break;
237 case 'e':
238 mainDemo->SetMetadata();
239 c = PutMenuAndGetChr();
240 break;
241 case 'v':
242 VideoTest(mainDemo);
243 c = PutMenuAndGetChr();
244 break;
245 case 'q':
246 PreviewOff(mainDemo);
247 mainDemo->QuitDemo();
248 return;
249 default:
250 DHLOGE("main test: command error please retry input command");
251 c = PutMenuAndGetChr();
252 break;
253 }
254 }
255 }
256
main(int argc,char ** argv)257 int main(int argc, char** argv)
258 {
259 RetCode rc = RC_OK;
260 std::cout << "dcamera hdi start" << std::endl;
261 auto mainDemo = std::make_shared<DcameraHdfDemo>();
262 rc = mainDemo->InitSensors();
263 if (rc == RC_ERROR) {
264 DHLOGE("main test: mainDemo->InitSensors() error");
265 return -1;
266 }
267 std::cout << "dcamera InitSensors success" << std::endl;
268 rc = mainDemo->InitCameraDevice();
269 if (rc == RC_ERROR) {
270 DHLOGE("main test: mainDemo->InitCameraDevice() error");
271 return -1;
272 }
273 std::cout << "dcamera InitCameraDevice success" << std::endl;
274 mainDemo->SetEnableResult();
275
276 rc = PreviewOn(0, mainDemo);
277 if (rc != RC_OK) {
278 DHLOGE("main test: PreviewOn() error demo exit");
279 return -1;
280 }
281 std::cout << "dcamera PreviewOn success" << std::endl;
282 std::cout << "dcamera ManuList start" << std::endl;
283 ManuList(mainDemo, argc, argv);
284 std::cout << "dcamera hdi end" << std::endl;
285 return RC_OK;
286 }
287 }
288 } // namespace OHOS::DistributedHardware
289
main(int argc,char ** argv)290 int main(int argc, char** argv)
291 {
292 OHOS::DistributedHardware::main(argc, argv);
293
294 return 0;
295 }