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