1 /*
2 * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
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 <stdio.h>
17 #include <stdlib.h>
18 #include <memory.h>
19 #include <hi_time.h>
20 #include <hi_watchdog.h>
21 #include "iot_errno.h"
22 #include "iot_gpio.h"
23 #include "ssd1306_oled.h"
24 #include "app_demo_i2c_oled.h"
25 #include "iot_gpio_ex.h"
26 #include "app_demo_gl5537_1.h"
27 #include "app_demo_multi_sample.h"
28
29 #define DELAY_TIMES_100 100
30 #define DELAY_TIMES_5 5
31
32 #define PWM_FRQ_50 50
33 #define PWM_FRQ_10 10
34 #define PWM_FRQ_100 100
35 #define PWM_FRQ_20 20
36
37 #define TICK_COUNT_MAX 255
38 #define PAIR_2 2
39
40 GlobalStatusType globalStaType = {0};
41
42 /* Set key status */
SetKeyStatus(HiColorfulLightMode setSta)43 unsigned char SetKeyStatus(HiColorfulLightMode setSta)
44 {
45 globalStaType.g_currentMode = setSta;
46 return globalStaType.g_currentMode;
47 }
48 /* Set key status */
SetKeyType(HiColorfulLightMode setSta)49 unsigned char SetKeyType(HiColorfulLightMode setSta)
50 {
51 globalStaType.g_currentType = setSta;
52 return globalStaType.g_currentType;
53 }
54
55 /* GetKeyStatus */
GetKeyStatus(GlobalStatuDef staDef)56 unsigned char GetKeyStatus(GlobalStatuDef staDef)
57 {
58 unsigned char status = 0;
59 switch (staDef) {
60 case MENU_SELECT:
61 status = globalStaType.g_menuSelect;
62 break;
63 case MENU_MODE:
64 status = globalStaType.g_menuMode;
65 break;
66 case CURRENT_MODE:
67 status = globalStaType.g_currentMode;
68 break;
69 case CURRENT_TYPE:
70 status = globalStaType.g_currentType;
71 break;
72 case KEY_DOWN_FLAG:
73 status = globalStaType.g_keyDownFlag;
74 break;
75 case OC_BEEP_STATUS:
76 status = globalStaType.g_ocBeepStatus;
77 break;
78 case SOMEONE_WALKING:
79 status = globalStaType.g_someoneWalkingFlag;
80 break;
81 default:
82 break;
83 }
84 return status;
85 }
86
87 /* factory test HiSpark board */
HisparkBoardTest(IotGpioValue value)88 void HisparkBoardTest(IotGpioValue value)
89 {
90 IoSetFunc(HI_GPIO_9, 0); // GPIO9
91 IoTGpioSetDir(HI_GPIO_9, IOT_GPIO_DIR_OUT); // GPIO9
92 IoTGpioSetOutputVal(HI_GPIO_9, value); // GPIO9
93 }
94 /* gpio init */
GpioControl(unsigned int gpio, unsigned int id, IotGpioDir dir, IotGpioValue gpioVal, unsigned char val)95 void GpioControl(unsigned int gpio, unsigned int id, IotGpioDir dir, IotGpioValue gpioVal,
96 unsigned char val)
97 {
98 IoSetFunc(gpio, val);
99 IoTGpioSetDir(id, dir);
100 IoTGpioSetOutputVal(id, gpioVal);
101 }
102 /* pwm init */
PwmInit(unsigned int id, unsigned char val, unsigned int port)103 void PwmInit(unsigned int id, unsigned char val, unsigned int port)
104 {
105 IoSetFunc(id, val); /* PWM0 OUT */
106 IoTPwmInit(port);
107 }
108 /* gpio key init */
HiSwitchInit(unsigned int id, unsigned char val, unsigned int idx, IotGpioDir dir, IotIoPull pval)109 void HiSwitchInit(unsigned int id, unsigned char val,
110 unsigned int idx, IotGpioDir dir, IotIoPull pval)
111 {
112 IoSetFunc(id, val);
113 IoTGpioSetDir(idx, dir);
114 IoSetPull(id, pval);
115 }
116
117 /*
118 * VCC:5V
119 * blue: gpio12 yellow
120 * green: gpio11 green
121 * red: gpio10 red
122 * switch :
123 * gpio7 switch1
124 * gpio5 switch2
125 */
126
TestGpioInit(void)127 void TestGpioInit(void)
128 {
129 // switch2,GPIO5,GPIO8,0
130 HiSwitchInit(HI_GPIO_5, 0, HI_GPIO_5, IOT_GPIO_DIR_IN, IOT_IO_PULL_UP);
131 // switch2,GPIO5,GPIO8,0
132 HiSwitchInit(HI_GPIO_8, 0, HI_GPIO_8, IOT_GPIO_DIR_IN, IOT_IO_PULL_UP);
133
134 PwmInit(HI_GPIO_10, HI_PWM_OUT, HI_PWM1); // GPIO10 PWM port1,5
135 PwmInit(HI_GPIO_11, HI_PWM_OUT, HI_PWM2); // GPIO11 PWM port2,5
136 PwmInit(HI_GPIO_12, HI_PWM_OUT, HI_PWM3); // GPIO12 PWM port3,5
137 }
138
139 /* 所有pwm的占空比为1,所有灯熄灭 */
AllLightOut(void)140 void AllLightOut(void)
141 {
142 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
143 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
144 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
145 }
146
147 /*
148 * 三色灯控制模式:每按一下类型S1按键,在绿灯亮、黄灯亮、红灯亮,三个状态之间切换
149 * mode:1.control mode
150 * type:1.red on,2.yellow on,3.green on,RED_ON = 1,YELLOW_ON,GREEN_ON,
151 */
ControlModeSample(void)152 void ControlModeSample(void)
153 {
154 unsigned char currentType = 0;
155 unsigned char currentMode = 0;
156
157 currentMode = GetKeyStatus(CURRENT_MODE);
158 currentType = GetKeyStatus(CURRENT_TYPE);
159 while (1) {
160 switch (GetKeyStatus(CURRENT_TYPE)) {
161 case RED_ON:
162 IoTPwmStart(HI_PWM1, PWM_DUTY, PWM_SMALL_DUTY); /* 1 */
163 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
164 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
165 break;
166 case YELLOW_ON:
167 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
168 IoTPwmStart(HI_PWM2, PWM_DUTY, PWM_SMALL_DUTY); /* 2 */
169 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
170 break;
171 case GREEN_ON:
172 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
173 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
174 IoTPwmStart(HI_PWM3, PWM_DUTY, PWM_SMALL_DUTY); /* 3 */
175 break;
176 default:
177 break;
178 }
179
180 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
181 AllLightOut();
182 break;
183 }
184 hi_sleep(SLEEP_1_MS);
185 }
186 }
187
188 /* 中断检测函数,每10ms检测一次 */
DelayAndCheckKeyInterrupt(unsigned int delayTime)189 unsigned char DelayAndCheckKeyInterrupt(unsigned int delayTime)
190 {
191 unsigned int cycleCount = delayTime / DELAY_10_MS;
192 unsigned char currentType = 0;
193 unsigned char currentMode = 0;
194
195 currentMode = GetKeyStatus(CURRENT_MODE);
196 currentType = GetKeyStatus(CURRENT_TYPE);
197
198 for (unsigned int i = 0; i < cycleCount; i++) {
199 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
200 return KEY_DOWN_INTERRUPT;
201 }
202 hi_udelay(DELAY_5_MS); // 10ms
203 hi_sleep(SLEEP_1_MS);
204 }
205 return HI_NULL;
206 }
207
208 /* 红、黄、绿每1秒轮流亮 */
CycleForOneSecond(void)209 void CycleForOneSecond(void)
210 {
211 while (1) {
212 IoTPwmStart(HI_PWM1, PWM_DUTY, PWM_SMALL_DUTY); /* 1 */
213 if (DelayAndCheckKeyInterrupt(DELAY_1_S) == KEY_DOWN_INTERRUPT) {
214 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
215 break;
216 }
217
218 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
219 IoTPwmStart(HI_PWM2, PWM_DUTY, PWM_SMALL_DUTY); /* 2 */
220
221 if (DelayAndCheckKeyInterrupt(DELAY_1_S) == KEY_DOWN_INTERRUPT) {
222 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
223 break;
224 }
225
226 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
227 IoTPwmStart(HI_PWM3, PWM_DUTY, PWM_SMALL_DUTY); /* 3 */
228
229 if (DelayAndCheckKeyInterrupt(DELAY_1_S) == KEY_DOWN_INTERRUPT) {
230 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
231 break;
232 }
233 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
234 hi_sleep(SLEEP_1_MS);
235 }
236 }
237
238 /* 红、黄、绿每0.5秒轮流亮 */
CycleForHalfSecond(void)239 void CycleForHalfSecond(void)
240 {
241 while (1) {
242 IoTPwmStart(HI_PWM1, PWM_DUTY, PWM_SMALL_DUTY); /* 1 */
243 if (DelayAndCheckKeyInterrupt(DELAY_500_MS) == KEY_DOWN_INTERRUPT) {
244 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
245 break;
246 }
247 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
248 IoTPwmStart(HI_PWM2, PWM_DUTY, PWM_SMALL_DUTY); /* 2 */
249
250 if (DelayAndCheckKeyInterrupt(DELAY_500_MS) == KEY_DOWN_INTERRUPT) {
251 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
252 break;
253 }
254
255 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
256 IoTPwmStart(HI_PWM3, PWM_DUTY, PWM_SMALL_DUTY); /* 3 */
257
258 if (DelayAndCheckKeyInterrupt(DELAY_500_MS) == KEY_DOWN_INTERRUPT) {
259 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
260 break;
261 }
262 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
263 hi_sleep(SLEEP_1_MS);
264 }
265 }
266
267 /* 红、黄、绿每0.25秒轮流亮 */
CycleForQuarterSecond(void)268 void CycleForQuarterSecond(void)
269 {
270 while (1) {
271 IoTPwmStart(HI_PWM1, PWM_DUTY, PWM_SMALL_DUTY); /* 1 */
272
273 if (DelayAndCheckKeyInterrupt(DELAY_250_MS) == KEY_DOWN_INTERRUPT) {
274 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
275 break;
276 }
277
278 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1 */
279 IoTPwmStart(HI_PWM2, PWM_DUTY, PWM_SMALL_DUTY); /* 2 */
280
281 if (DelayAndCheckKeyInterrupt(DELAY_250_MS) == KEY_DOWN_INTERRUPT) {
282 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
283 break;
284 }
285
286 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2 */
287 IoTPwmStart(HI_PWM3, PWM_DUTY, PWM_SMALL_DUTY); /* 3 */
288
289 if (DelayAndCheckKeyInterrupt(DELAY_250_MS) == KEY_DOWN_INTERRUPT) {
290 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
291 break;
292 }
293 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3 */
294 hi_sleep(SLEEP_1_MS);
295 }
296 }
297
298 /*
299 * mode:2.Colorful light
300 * type:1.period by 1s,2.period by 0.5s,3.period by 0.25s
301 * 模式2:炫彩模式,每按一下S2,不同的炫彩类型,
302 * 类型1:红、黄、绿三色灯每隔1秒轮流亮
303 * 类型2:红、黄、绿每0.5秒轮流亮
304 * 类型3:红、黄、绿每0.25秒轮流亮。
305 */
306
ColorfulLightSample(void)307 void ColorfulLightSample(void)
308 {
309 unsigned char currentType = 0;
310 unsigned char currentMode = 0;
311
312 currentMode = GetKeyStatus(CURRENT_MODE);
313 currentType = GetKeyStatus(CURRENT_TYPE);
314
315 while (1) {
316 switch (GetKeyStatus(CURRENT_TYPE)) {
317 case CYCLE_FOR_ONE_SECOND:
318 CycleForOneSecond();
319 break;
320 case CYCLE_FOR_HALF_SECOND:
321 CycleForHalfSecond();
322 break;
323 case CYCLE_FOR_QUARTER_SECOND:
324 CycleForQuarterSecond();
325 break;
326 default:
327 break;
328 }
329
330 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
331 break;
332 }
333 hi_sleep(SLEEP_1_MS);
334 }
335 }
336
337 /* 红色由暗到最亮 */
RedLightDarkToBright(void)338 void RedLightDarkToBright(void)
339 {
340 unsigned char currentType = 0;
341 unsigned char currentMode = 0;
342
343 currentMode = GetKeyStatus(CURRENT_MODE);
344 currentType = GetKeyStatus(CURRENT_TYPE);
345 AllLightOut();
346 while (1) {
347 for (unsigned int i = 1; i < DELAY_TIMES_100; i++) { /* 计算延时100次 */
348 IoTPwmStart(HI_PWM1, i, PWM_SMALL_DUTY); /* 1 */
349 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
350 return NULL;
351 }
352 hi_sleep((SLEEP_6_S - i + 1) / SLEEP_30_MS); /* 1 */
353 }
354 }
355 }
356
357 /* 绿灯由暗到最亮 */
GreenLightDarkToBright(void)358 void GreenLightDarkToBright(void)
359 {
360 unsigned char currentType = 0;
361 unsigned char currentMode = 0;
362
363 currentMode = GetKeyStatus(CURRENT_MODE);
364 currentType = GetKeyStatus(CURRENT_TYPE);
365 AllLightOut();
366 while (1) {
367 for (hi_s32 i = 1; i < DELAY_TIMES_100; i++) { /* 计算延时100次 */
368 IoTPwmStart(HI_PWM2, i, PWM_SMALL_DUTY); /* PWM0 */
369 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
370 return NULL;
371 }
372 hi_sleep((SLEEP_6_S - i + 1) / SLEEP_30_MS); /* 1 */
373 }
374 }
375 }
376
377 /* 蓝灯由暗到最亮 */
BlueLightDarkToBright(void)378 void BlueLightDarkToBright(void)
379 {
380 unsigned char currentType = 0;
381 unsigned char currentMode = 0;
382
383 currentMode = GetKeyStatus(CURRENT_MODE);
384 currentType = GetKeyStatus(CURRENT_TYPE);
385 AllLightOut();
386 while (1) {
387 for (int i = 1; i < DELAY_TIMES_100; i++) { /* 计算延时100次 */
388 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
389 return NULL;
390 }
391 IoTPwmStart(HI_PWM3, i, PWM_SMALL_DUTY); /* PWM3 */
392
393 hi_sleep((SLEEP_6_S - i + 1) / SLEEP_30_MS); /* 1 */
394 }
395 }
396 }
397
398 /* 紫色灯由暗到最亮 */
PurpleLightDarkToBright(void)399 void PurpleLightDarkToBright(void)
400 {
401 unsigned char currentType = 0;
402 unsigned char currentMode = 0;
403
404 currentMode = GetKeyStatus(CURRENT_MODE);
405 currentType = GetKeyStatus(CURRENT_TYPE);
406 AllLightOut();
407 while (1) {
408 for (int i = 0; i < DELAY_TIMES_5; i++) { /* 计算延时5次 */
409 IoTPwmStart(HI_PWM1, PWM_FRQ_50 + (i * PWM_FRQ_10), PWM_SMALL_DUTY); /* 1 */
410 IoTPwmStart(HI_PWM2, i, PWM_SMALL_DUTY); /* 2 */
411 IoTPwmStart(HI_PWM3, PWM_FRQ_50 + (i * PWM_FRQ_10), PWM_SMALL_DUTY); /* 3 */
412 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
413 return NULL;
414 }
415 hi_sleep(SLEEP_50_MS);
416 }
417 }
418 }
419
420 /* 白灯由暗到全亮。 */
AllLightDarkToBright(void)421 void AllLightDarkToBright(void)
422 {
423 unsigned char currentType = 0;
424 unsigned char currentMode = 0;
425
426 currentMode = GetKeyStatus(CURRENT_MODE);
427 currentType = GetKeyStatus(CURRENT_TYPE);
428 AllLightOut();
429 while (1) {
430 for (int i = 1; i < DELAY_TIMES_100; i++) { /* 计算延时100次 */
431 IoTPwmStart(HI_PWM1, i, PWM_SMALL_DUTY); /* 1 */
432 IoTPwmStart(HI_PWM2, i, PWM_SMALL_DUTY); /* 2 */
433 IoTPwmStart(HI_PWM3, i, PWM_SMALL_DUTY); /* 3 */
434 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
435 return NULL;
436 }
437 hi_sleep((SLEEP_6_S - i + 1) / SLEEP_30_MS); /* 1 */
438 }
439 }
440 }
441
442 /*
443 * mode:3.pwm control
444 * type:1.red,2.yellow,3.green,4.purple,5.all
445 * 模式3:PWM无极调光模式,每按一下S2,不同的调光类型
446 * 类型1:红色由暗到最亮
447 * 类型2:黄灯由暗到最亮
448 * 类型3:绿灯由暗到最亮
449 * 类型4:紫色由暗到最亮
450 * 类型5:由暗到全亮。
451 */
452
PwmControlSample(void)453 void PwmControlSample(void)
454 {
455 unsigned char currentType = 0;
456 unsigned char currentMode = 0;
457
458 currentMode = GetKeyStatus(CURRENT_MODE);
459 currentType = GetKeyStatus(CURRENT_TYPE);
460 printf("PwmControlSample\n");
461 AllLightOut();
462 while (1) {
463 switch (GetKeyStatus(CURRENT_TYPE)) {
464 case PWM_CONTROL_RED:
465 RedLightDarkToBright();
466 break;
467 case PWM_CONTROL_YELLOW:
468 RedLightDarkToBright();
469 break;
470 case PWM_CONTROL_GREEN:
471 RedLightDarkToBright();
472 break;
473 case PWM_CONTROL_PURPLE:
474 RedLightDarkToBright();
475 break;
476 case PWM_CONTROL_ALL:
477 AllLightDarkToBright();
478 break;
479 default:
480 break;
481 }
482
483 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
484 break;
485 }
486 hi_sleep(SLEEP_20_MS);
487 }
488 }
489
490 /* 用按键控制白灯的亮度 */
BrightnessControlSample(void)491 void BrightnessControlSample(void)
492 {
493 unsigned char currentType = 0;
494 unsigned char currentMode = 0;
495
496 currentMode = GetKeyStatus(CURRENT_MODE);
497 currentType = GetKeyStatus(CURRENT_TYPE);
498 AllLightOut();
499 while (1) {
500 switch (GetKeyStatus(CURRENT_TYPE)) {
501 case BRIGHTNESS_LOW:
502 IoTPwmStart(HI_PWM1, PWM_FRQ_20, PWM_SMALL_DUTY); /* 1, 20 */
503 IoTPwmStart(HI_PWM2, PWM_FRQ_20, PWM_SMALL_DUTY); /* 2, 20 */
504 IoTPwmStart(HI_PWM3, PWM_FRQ_20, PWM_SMALL_DUTY); /* 3, 20 */
505 break;
506 case BRIGHTNESS_MIDDLE:
507 IoTPwmStart(HI_PWM1, PWM_FRQ_50, PWM_SMALL_DUTY); /* 1, 20 */
508 IoTPwmStart(HI_PWM2, PWM_FRQ_50, PWM_SMALL_DUTY); /* 2, 20 */
509 IoTPwmStart(HI_PWM3, PWM_FRQ_50, PWM_SMALL_DUTY); /* 3, 20 */
510 break;
511 case BRIGHTNESS_HIGH:
512 IoTPwmStart(HI_PWM1, PWM_FRQ_100, PWM_SMALL_DUTY); /* 1, 20 */
513 IoTPwmStart(HI_PWM2, PWM_FRQ_100, PWM_SMALL_DUTY); /* 2, 20 */
514 IoTPwmStart(HI_PWM3, PWM_FRQ_100, PWM_SMALL_DUTY); /* 3, 20 */
515 break;
516 default:
517 break;
518 }
519
520 if ((currentMode != GetKeyStatus(CURRENT_MODE)) || (currentType != GetKeyStatus(CURRENT_TYPE))) {
521 break;
522 }
523 hi_sleep(SLEEP_10_MS);
524 }
525 }
526
527 /*
528 * mode:5.Human detect
529 * 模式5:人体红外检测模式(设置一个好看的灯亮度),有人靠近灯亮,无人在检测区域灯灭
530 */
HumanDetectSample(void)531 void HumanDetectSample(void)
532 {
533 unsigned char currentMode = 0;
534 unsigned char someoneWalking = 0;
535
536 currentMode = GetKeyStatus(CURRENT_MODE);
537 someoneWalking = GetKeyStatus(SOMEONE_WALKING);
538 printf("HumanDetectSample start\n");
539 IoSetFunc(HI_GPIO_7, 0); // gpio7
540 IoTGpioSetDir(HI_GPIO_7, IOT_GPIO_DIR_IN); // gpio7
541 IotGpioValue gpio_val = IOT_GPIO_VALUE1;
542
543 while (1) {
544 /* use adc channel_0 */
545 /* use gpio7 */
546 IoTGpioGetInputVal(HI_GPIO_7, &gpio_val); // gpio7
547
548 if (gpio_val == IOT_GPIO_VALUE1) {
549 someoneWalking = OLED_FLAG_ON;
550 } else {
551 someoneWalking = OLED_FLAG_OFF;
552 }
553 if (someoneWalking == OLED_FLAG_ON) {
554 IoTPwmStart(HI_PWM1, PWM_FRQ_50, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
555 IoTPwmStart(HI_PWM2, PWM_FRQ_50, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
556 IoTPwmStart(HI_PWM3, PWM_FRQ_50, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
557 } else if (someoneWalking == OLED_FLAG_OFF) {
558 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
559 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
560 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
561 }
562 if (currentMode != GetKeyStatus(CURRENT_MODE)) {
563 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
564 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
565 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
566 break;
567 }
568 hi_sleep(SLEEP_1_MS);
569 }
570 }
571
572 /*
573 * mode:6.Light detect
574 * 模式6:光敏检测模式,无光灯亮,有光灯灭
575 */
LightDetectSample(void)576 void LightDetectSample(void)
577 {
578 unsigned char currentMode = 0;
579 unsigned char withLigh = 0;
580
581 currentMode = GetKeyStatus(CURRENT_MODE);
582 while (1) {
583 withLigh = GetLightStatus();
584 if (withLigh == OLED_FLAG_ON) {
585 IoTPwmStart(HI_PWM1, PWM_FRQ_50, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
586 IoTPwmStart(HI_PWM2, PWM_FRQ_50, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
587 IoTPwmStart(HI_PWM3, PWM_FRQ_50, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
588 } else if (withLigh == OLED_FLAG_OFF) {
589 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
590 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
591 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
592 }
593 if (currentMode != GetKeyStatus(CURRENT_MODE)) {
594 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
595 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
596 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
597 break;
598 }
599 hi_sleep(SLEEP_1_MS);
600 }
601 }
602
603 /*
604 * mode:7.Union detect
605 * 模式7:人体红外+光敏联合检测模式。
606 * 无人有光照 => 灯不亮
607 * 无人无光照 => 灯不亮
608 * 有人有光照 => 灯不亮
609 * 有人无光照 => 灯亮
610 * g_withLightFlag = OLED_FLAG_ON:无光照(黑夜),OLED_FLAG_OFF有光照(白天)
611 * g_someoneWalkingFlag = OLED_FLAG_ON(有人),OLED_FLAG_OFF(无人)
612 */
UnionDetectSample(void)613 void UnionDetectSample(void)
614 {
615 unsigned char currentMode = 0;
616 unsigned char withLigh = 0;
617 unsigned char someoneWalking = 0;
618
619 currentMode = GetKeyStatus(CURRENT_MODE);
620 someoneWalking = GetKeyStatus(SOMEONE_WALKING);
621 IoSetFunc(HI_GPIO_7, 0); // gpio7
622 IoTGpioSetDir(HI_GPIO_7, IOT_GPIO_DIR_IN); // gpio7
623 IotGpioValue gpio_val = IOT_GPIO_VALUE1;
624
625 while (1) {
626 IoTGpioGetInputVal(HI_GPIO_7, &gpio_val); // gpio7
627 if (gpio_val == IOT_GPIO_VALUE1) {
628 someoneWalking = OLED_FLAG_ON;
629 } else {
630 someoneWalking = OLED_FLAG_OFF;
631 }
632 withLigh = GetLightStatus();
633 if (((someoneWalking == OLED_FLAG_ON) && (withLigh == OLED_FLAG_OFF)) ||
634 (someoneWalking == OLED_FLAG_OFF)) {
635 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
636 IoTPwmStart(HI_PWM2, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
637 IoTPwmStart(HI_PWM3, PWM_LOW_DUTY, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
638 } else if ((withLigh == OLED_FLAG_ON) && (someoneWalking == OLED_FLAG_ON)) {
639 IoTPwmStart(HI_PWM1, PWM_FRQ_50, PWM_SMALL_DUTY); /* 1,占空比百分之50 */
640 IoTPwmStart(HI_PWM2, PWM_FRQ_50, PWM_SMALL_DUTY); /* 2,占空比百分之50 */
641 IoTPwmStart(HI_PWM3, PWM_FRQ_50, PWM_SMALL_DUTY); /* 3,占空比百分之50 */
642 }
643 if (currentMode != GetKeyStatus(CURRENT_MODE)) {
644 IoTPwmStart(HI_PWM1, PWM_LOW_DUTY, PWM_SMALL_DUTY);
645 break;
646 }
647 hi_sleep(SLEEP_1_MS);
648 }
649 }
650
651 /*
652 * mode:8.Return
653 * 模式8:返回主界面
654 */
ReturnMainEnumSample(void)655 void ReturnMainEnumSample(void)
656 {
657 unsigned char currentType = 0;
658 unsigned char currentMode = 0;
659
660 currentMode = GetKeyStatus(CURRENT_MODE);
661 currentType = GetKeyStatus(CURRENT_TYPE);
662
663 while (1) {
664 switch (GetKeyStatus(CURRENT_TYPE)) {
665 case KEY_UP:
666 break;
667 case KEY_DOWN:
668 return;
669 default:
670 break;
671 }
672
673 if (currentMode != GetKeyStatus(CURRENT_MODE)) {
674 break;
675 }
676 task_msleep(SLEEP_1_MS);
677 }
678 }
Gpio9LedLightFunc(void)679 void Gpio9LedLightFunc(void)
680 {
681 globalStaType.g_gpio9Tick++;
682 if (globalStaType.g_gpio9Tick % PAIR_2 == 0) { /* tick 时间 对2 求余, 余数为0则打开LED灯,否则关闭LED灯,即不断闪烁 */
683 printf("led off\r\n");
684 HisparkBoardTest(IOT_GPIO_VALUE1);
685 } else {
686 printf("led on\r\n");
687 HisparkBoardTest(IOT_GPIO_VALUE1);
688 }
689 }
690
OledShowMenuSelect(void)691 void OledShowMenuSelect(void)
692 {
693 unsigned char currentMode = 0;
694
695 switch (GetKeyStatus(MENU_SELECT)) {
696 case COLORFUL_LIGHT_MENU:
697 if (GetKeyStatus(CURRENT_MODE) >= MAX_COLORFUL_LIGHT_MODE) {
698 currentMode = SetKeyStatus(CONTROL_MODE);
699 }
700 break;
701 case TRAFFIC_LIGHT_MENU:
702 if (GetKeyStatus(CURRENT_MODE) >= MAX_TRAFFIC_LIGHT_MODE) {
703 currentMode = SetKeyStatus(CONTROL_MODE);
704 }
705 break;
706 case ENVIRONMENT_MENU:
707 if (GetKeyStatus(CURRENT_MODE) >= MAX_ENVIRONMENT_MODE) {
708 currentMode = SetKeyStatus(CONTROL_MODE);
709 }
710 break;
711 case NFC_TEST_MENU:
712 if (GetKeyStatus(CURRENT_MODE) >= MAX_NFC_TAG_MODE) {
713 currentMode = SetKeyStatus(CONTROL_MODE);
714 }
715 break;
716 default:
717 break;
718 }
719 }
720
721 /*
722 * 按键7每按下一次,就会产生中断并调用该函数
723 * 用来调整类型
724 */
GpioKey1IsrFuncMode(void)725 void GpioKey1IsrFuncMode(void)
726 {
727 unsigned char currentType = 0;
728 unsigned int currentGpio5Tick = hi_get_tick();
729 unsigned int tickInterval = currentGpio5Tick - globalStaType.g_gpio5Tick;
730 if (tickInterval < KEY_INTERRUPT_PROTECT_TIME) {
731 return HI_NULL;
732 }
733 globalStaType.g_gpio5Tick = currentGpio5Tick;
734 globalStaType.g_keyDownFlag = KEY_GPIO_5;
735 printf("gpio key 1 down\r\n");
736 if (GetKeyStatus(MENU_MODE) == MAIN_FUNCTION_SELECT_MODE) {
737 printf("gpio key 1 menu select\r\n");
738 globalStaType.g_menuSelect++;
739 if (globalStaType.g_menuSelect >= MAX_FUNCTION_DEMO_NUM) {
740 globalStaType.g_menuSelect = COLORFUL_LIGHT_MENU;
741 }
742 return HI_ERR_SUCCESS;
743 }
744
745 if (GetKeyStatus(MENU_MODE) == SUB_MODE_SELECT_MODE) {
746 printf("gpio key 1 current mode\r\n");
747 globalStaType.g_currentMode++;
748 if (globalStaType.g_currentMode > TRAFFIC_RETURN_MODE) {
749 globalStaType.g_currentMode = 0;
750 }
751 currentType = SetKeyType(CONTROL_MODE);
752 OledShowTrafficLightMenuSelect();
753 }
754 }
755
OledShowColorfulLightMenuSelect(void)756 void OledShowColorfulLightMenuSelect(void)
757 {
758 unsigned char currentType = 0;
759 switch (GetKeyStatus(CURRENT_MODE)) {
760 case CONTROL_MODE:
761 if (GetKeyStatus(CURRENT_TYPE) > MAX_CONTROL_MODE_TYPE) {
762 currentType = SetKeyType(RED_ON);
763 }
764 break;
765 case COLORFUL_LIGHT_MODE:
766 if (GetKeyStatus(CURRENT_TYPE) > MAX_COLORFUL_LIGHT_TYPE) {
767 currentType = SetKeyType(CYCLE_FOR_ONE_SECOND);
768 }
769 break;
770 case PWM_CONTROL_MODE:
771 if (GetKeyStatus(CURRENT_TYPE) > MAX_PWM_CONTROL_TYPE) {
772 currentType = SetKeyType(PWM_CONTROL_RED);
773 }
774 break;
775 case BRIGHTNESS_MODE:
776 if (GetKeyStatus(CURRENT_TYPE) > MAX_BRIGHTNESS_TYPE) {
777 currentType = SetKeyType(BRIGHTNESS_LOW);
778 }
779 break;
780 case HUMAN_DETECT_MODE:
781 case LIGHT_DETECT_MODE:
782 case UNION_DETECT_MODE:
783 case RETURN_MODE:
784 if (GetKeyStatus(CURRENT_TYPE) > RETURN_TYPE_MODE) {
785 currentType = SetKeyType(KEY_UP);
786 }
787 break;
788 default:
789 break;
790 }
791 }
OledShowTrafficLightMenuSelect(void)792 void OledShowTrafficLightMenuSelect(void)
793 {
794 unsigned char currentType = 0;
795 switch (GetKeyStatus(CURRENT_MODE)) {
796 case TRAFFIC_CONTROL_MODE:
797 if (GetKeyStatus(CURRENT_TYPE) >= MAX_TRAFFIC_CONTROL_TYPE) {
798 currentType = SetKeyType(TRAFFIC_NORMAL_TYPE);
799 }
800 break;
801 case TRAFFIC_AUTO_MODE:
802 if (GetKeyStatus(CURRENT_TYPE) > MAX_TRAFFIC_AUTO_TYPE) {
803 currentType = SetKeyType(TRAFFIC_NORMAL_TYPE);
804 }
805 break;
806 case TRAFFIC_HUMAN_MODE:
807 if (GetKeyStatus(CURRENT_TYPE) > MAX_TRAFFIC_HUMAN_TYPE) {
808 currentType = SetKeyType(TRAFFIC_NORMAL_TYPE);
809 }
810 break;
811 case TRAFFIC_RETURN_MODE:
812 if (GetKeyStatus(CURRENT_TYPE) > RETURN_TYPE_MODE) {
813 currentType = SetKeyType(KEY_UP);
814 }
815 break;
816 default:
817 break;
818 }
819 }
820 /*
821 * 按键7每按下一次,就会产生中断并调用该函数
822 * 用来调整类型
823 */
GpioKey2IsrFuncType(void)824 void GpioKey2IsrFuncType(void)
825 {
826 /* 按键防抖 */
827 unsigned int currentGpio7Tick = hi_get_tick();
828 unsigned int tickInterval = currentGpio7Tick - globalStaType.g_gpio7Tick;
829
830 if (tickInterval < KEY_INTERRUPT_PROTECT_TIME) {
831 return HI_NULL;
832 }
833 globalStaType.g_gpio7Tick = currentGpio7Tick;
834 globalStaType.g_keyDownFlag = KEY_GPIO_7;
835 printf("gpio key 2 down %d\r\n", globalStaType.g_currentType);
836 globalStaType.g_currentType++;
837 OledShowTrafficLightMenuSelect();
838 }
839
Gpio8Interrupt(const char *param)840 void Gpio8Interrupt(const char *param)
841 {
842 hi_unref_param(param);
843 unsigned int currentGpio8Tick = hi_get_tick();
844 unsigned int tickInterval = currentGpio8Tick - globalStaType.g_gpio8Tick;
845 printf("gpio8 interrupt \r\n");
846
847 if (tickInterval < KEY_INTERRUPT_PROTECT_TIME) {
848 printf("gpio8 interrupt return\r\n");
849 return HI_NULL;
850 }
851 globalStaType.g_gpio8CurrentType++;
852 if (globalStaType.g_gpio8CurrentType % PAIR_2 == 0) { /* tick 时间 对2 求余, 余数为0则打开蜂鸣器响,否则关闭L蜂鸣器 */
853 globalStaType.g_ocBeepStatus = BEEP_OFF;
854 } else {
855 globalStaType.g_ocBeepStatus = BEEP_ON;
856 }
857 if (globalStaType.g_gpio8CurrentType >= TICK_COUNT_MAX) { /* 避免越界,清零 */
858 globalStaType.g_gpio8CurrentType = 0;
859 }
860 }
861
862 /*
863 * S2(gpio5)是模式按键,S1(gpio7)是类型按键。
864 * 1、三色灯控制模式:每按一下类型S1按键,在绿灯亮、黄灯亮、红灯亮,三个状态之间切换
865 * 2、炫彩模式,每按一下S2,不同的炫彩类型
866 * 3、PWM无极调光模式,每按一下S2,不同的调光类型
867 * 4、人体红外检测模式(设置一个好看的灯亮度)
868 * 5、光敏检测模式
869 * 6、人体红外+光敏联合检测模式。
870 * 7、返回模式
871 * 创建两个按键中断,按键响应后会调用对应的回调函数
872 */
AppMultiSampleDemo(void)873 void AppMultiSampleDemo(void)
874 {
875 unsigned int ret = 0;
876 hi_gpio_init();
877 globalStaType.g_gpio5Tick = hi_get_tick();
878
879 globalStaType.g_menuSelect = TRAFFIC_LIGHT_MENU;
880 globalStaType.g_menuMode = SUB_MODE_SELECT_MODE;
881
882 ret = IoTGpioRegisterIsrFunc(HI_GPIO_5, IOT_INT_TYPE_EDGE,
883 IOT_GPIO_EDGE_FALL_LEVEL_LOW, GetGpio5Voltage, NULL); /* 5 */
884 if (ret == IOT_SUCCESS) {
885 printf(" register gpio 5\r\n");
886 }
887 globalStaType.g_gpio8Tick = hi_get_tick();
888 ret = IoTGpioRegisterIsrFunc(HI_GPIO_8, IOT_INT_TYPE_EDGE,
889 IOT_GPIO_EDGE_FALL_LEVEL_LOW, Gpio8Interrupt, NULL); /* 8 */
890 if (ret == IOT_SUCCESS) {
891 printf(" register gpio8\r\n");
892 }
893 }