1 #include "shakeshake.h"
2 #include "drv_acc_gyro_inv_mpu6050.h"
3 #include "drv_acc_gyro_qst_qmi8610.h"
4 #include <stdio.h>
5 #include <stdlib.h>
6 
7 #define SHAKE_Z_THRESHOLD 5000
8 #define SHAKE_Y_THRESHOLD 4000
9 
10 MENU_COVER_TYP shakeshake_cover = {MENU_COVER_NONE};
11 MENU_TASK_TYP  shakeshake_tasks = {shakeshake_init, shakeshake_uninit};
12 MENU_TYP shakeshake = {"shakeshake", &shakeshake_cover, &shakeshake_tasks, NULL,
13                        NULL};
14 
15 static aos_task_t shakeshake_task_handle;
16 
17 char       showstr[10] = "0";
18 short      ax          = 0, ay, az;
19 short      ay_pre = 0, az_pre = 0;
20 short      y_change = 0, z_change = 0;
21 short      rand_value = 0;
22 static int running    = 1;
23 
shakeshake_init(void)24 int shakeshake_init(void)
25 {
26     if (g_haasboard_is_k1c) {
27         FisImu_init();
28         LOGI(EDU_TAG, "FisImu_init done\n");
29     } else {
30         MPU_Init();
31         LOGI(EDU_TAG, "MPU_Init done\n");
32     }
33 
34     OLED_Clear();
35     OLED_Icon_Draw(50, 0, &icon_shakeshake_32_32_v2, 1);
36     OLED_Show_String(32, 40, "Shake me !", 16, 1);
37     OLED_Icon_Draw(2, 24, &icon_skip_left, 0);
38     OLED_Icon_Draw(122, 24, &icon_skip_right, 0);
39     OLED_Refresh_GRAM();
40 
41     aos_task_new_ext(&shakeshake_task_handle, "shakeshake_task", shakeshake_task, NULL, 1024, AOS_DEFAULT_APP_PRI);
42     LOGI(EDU_TAG, "aos_task_new shakeshake_task\n");
43     return 0;
44 }
45 
shakeshake_task()46 void shakeshake_task()
47 {
48     float acc[3];
49     while (running) {
50         if (g_haasboard_is_k1c) {
51             FisImu_read_acc_xyz(acc);
52             ay = (short)(acc[0] * 1000);
53             az = (short)(acc[2] * 1000);
54         } else {
55             MPU_Get_Accelerometer(&ax, &ay, &az);
56         }
57 
58         y_change = (ay >= ay_pre) ? (ay - ay_pre) : (ay_pre - ay);
59         z_change = (az >= az_pre) ? (az - az_pre) : (az_pre - az);
60 
61         if ((y_change > SHAKE_Y_THRESHOLD) && (z_change > SHAKE_Z_THRESHOLD)) {
62             rand_value = rand() % 100;
63             itoa(rand_value, showstr, 10);
64 
65             OLED_Clear();
66             OLED_Icon_Draw(50, 0, &icon_shakeshake_32_32_v2, 1);
67             OLED_Show_String(54, 36, showstr, 24, 1);
68             OLED_Icon_Draw(2, 24, &icon_skip_left, 0);
69             OLED_Icon_Draw(122, 24, &icon_skip_right, 0);
70             OLED_Refresh_GRAM();
71         }
72 
73         az_pre = az;
74         ay_pre = ay;
75         aos_msleep(50);
76     }
77 
78     running = 1;
79 }
80 
shakeshake_uninit(void)81 int shakeshake_uninit(void)
82 {
83     running = 0;
84 
85     while (!running) {
86         aos_msleep(50);
87     }
88 
89     if (g_haasboard_is_k1c) {
90         FisImu_deinit();
91     } else {
92         MPU_Deinit();
93     }
94 
95     aos_task_delete(&shakeshake_task_handle);
96     LOGI(EDU_TAG, "aos_task_delete shakeshake_task\n");
97     return 0;
98 }
99