#include "my_xMotion.h"
#include "lv_drv_conf.h"
#if USE_MY_XMOTION
-
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ACC_0G_X 4096//8192 //4096
#define ACC_0G_Y 4096//8192
#define ACC_0G_Z 4096//8192
-#define FALL_DETECH_LOW_THRESHOLD 7//MMI_FALL_DETECT_THRESHOLD_DEFAULT // 35//8
-#define FALL_COUNTER_THRESHOLD 6//MMI_FALL_COUNTER_THRESHOLD_DEFAULT //7 //4
+#define FALL_DETECH_LOW_THRESHOLD MMI_FALL_DETECT_THRESHOLD_DEFAULT // 35
+#define FALL_COUNTER_THRESHOLD MMI_FALL_COUNTER_THRESHOLD_DEFAULT //7
typedef struct
{
float x;
float y;
float z;
}acc_g_data_t;
-
-double distance(acc_g_data_t * acc_1,acc_g_data_t * acc_2)
-{
- double d;
- d=(acc_1->x - acc_2->x)*(acc_1->x-acc_2->x)+(acc_1->y - acc_2->y)*(acc_1->y - acc_2->y)+(acc_1->z - acc_2->z)*(acc_1->z - acc_2->z);
- return d/100;
-}
-
-
static uint16_t fall_counter = 0;
-uint8_t gsensor_sc7a20_fall_detect(acc_g_data_t * acc_1,acc_g_data_t * acc_2)
-{
- double acc_square = (double)((acc_1->x) * (acc_1->x)) + (double)((acc_1->y) * (acc_1->y)) + (double)((acc_1->z) * (acc_1->z));
-
+#if fall_detect_debug
+extern int count_13 ;
+extern int count_14 ;
+extern int count_15 ;
+extern int count_16 ;
+
+extern int count_10 ;
+extern int count_9 ;
+extern int count_8 ;
+extern int count_7 ;
+#endif
+int fall_detect_count = 0;
+uint8_t gsensor_sc7a20_fall_detect(acc_g_data_t * acc)
+{
+ double acc_square_t = (double)((acc->x) * (acc->x)) + (double)((acc->y) * (acc->y)) + (double)((acc->z) * (acc->z));
+ double acc_square = sqrt(acc_square_t);
// if(MMIApi_IsOpenGsensorTestWin())
// {
// memcpy(&s_sc7a20_test_info, acc, sizeof(acc_g_data_t));
// }
- //cplog_printf("acc_square:%f,%f,%f,%f\n",acc_square,acc->x,acc->y,acc->z);
- //printf("gsensor_sc7a20_fall_detect:%f",acc_square);
-
- #if 0
- char info_buf [64]={0};
- sprintf(info_buf,"%f",acc_square);
- char txt_str[64]={0};
- sprintf(txt_str,"C:/gsensor_sc7a20_fall_detect.txt");
-
- uint32_t info_size = sizeof(info_buf);
- {
- lv_fs_file_t file_p;
- lv_fs_res_t res;
- uint32_t bytes_write = 0;
-
- res = lv_fs_open(&file_p,txt_str, LV_FS_MODE_WR | LV_FS_MODE_APPEND);
- if(LV_FS_RES_OK != res)
- {
- printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
- lv_fs_close(&file_p);
- return false;
- }
- printf("[@CHENG_DEBUG][%s][%d]:\n", __FUNCTION__, __LINE__);
- res = lv_fs_write(&file_p, info_buf, info_size, &bytes_write);
- lv_fs_close(&file_p);
- if(LV_FS_RES_OK != res)
- {
- printf("[@CHENG_DEBUG][%s][%d]: errno=%d\n", __FUNCTION__, __LINE__, res);
- return false;
- }
- printf("[@CHENG_DEBUG][%s][%d]: file_size=%d,write_size=%d\n", __FUNCTION__, __LINE__, info_size, bytes_write);
-
- //return true;
- }
- #endif
- if(acc_square < FALL_DETECH_LOW_THRESHOLD )// && acc_square > FALL_DETECH_LOW_THRESHOLD-10 )
+
+#if fall_detect_debug
+ if(acc_square<8)
+ count_7++;
+ else if(acc_square>8 && acc_square<9)
+ count_8++;
+ else if(acc_square>9 && acc_square<10)
+ count_9++;
+ else if(acc_square>10 && acc_square<11)
+ count_10++;
+ else if(acc_square>13 && acc_square<14)
+ count_13++;
+ else if(acc_square>14 && acc_square<15)
+ count_14++;
+ else if(acc_square>15 && acc_square<16)
+ count_15++;
+ else if(acc_square>16)
+ count_16++;
+#endif
+ fall_detect_count++ ;
+ //cplog_printf("acc_square:% 12f,acc_square_t:% 12f,x:% 12f,y:% 12f,z:% 12f\n",
+ // acc_square,acc_square_t,acc->x,acc->y,acc->z);
+ //cplog_printf("acc_square:% 12f,count_13:% 4d,count_10:% 4d\n",
+ // acc_square,count_13,count_10);
+
+ if(acc_square < FALL_DETECH_LOW_THRESHOLD )//7)//
{
fall_counter++;
}
- else
+ if(fall_detect_count >= 32*3)
{
+ fall_detect_count = 0;
fall_counter = 0;
}
- //double fall_d=distance(&acc_1,&acc_2);
- if(fall_counter >= FALL_COUNTER_THRESHOLD)
+ if(fall_counter >= FALL_COUNTER_THRESHOLD) //10)//
{
fall_counter = 0;
{
uint16_t MsgId;
lv_driver_msg_xmotion_t * pOsMsg;
- acc_g_data_t s_acc_1 = {0};
- acc_g_data_t s_acc_2 = {0};
+ acc_g_data_t s_acc = {0};
#if XMOTION_TIMER_DEBUG
UINT32 T1, T2;
#endif
// s_acc.x = (float)((Gsensor_x[i]*9.8f)/((uint16_t)ACC_0G_X));
// s_acc.y = (float)((Gsensor_y[i]*9.8f)/((uint16_t)ACC_0G_Y));
// s_acc.z = (float)((Gsensor_z[i]*9.8f)/((uint16_t)ACC_0G_Z));
-
- s_acc_1.x = ((float)Gsensor_x[i]/100);
- s_acc_1.y = ((float)Gsensor_y[i]/100);
- s_acc_1.z = ((float)Gsensor_z[i]/100);
-
- s_acc_2.x = ((float)Gsensor_x[i]/100);
- s_acc_2.y = ((float)Gsensor_y[i]/100);
- s_acc_2.z = ((float)Gsensor_z[i]/100);
-
- if(gsensor_sc7a20_fall_detect(&s_acc_1,&s_acc_2) == 1)//跌倒报警
+ s_acc.x = ((float)Gsensor_x[i]/100);
+ s_acc.y = ((float)Gsensor_y[i]/100);
+ s_acc.z = ((float)Gsensor_z[i]/100);
+ //cplog_printf("x:%d,y:%d,z:%d!!!\n",Gsensor_x[i],Gsensor_y[i],Gsensor_z[i]);
+ if(gsensor_sc7a20_fall_detect(&s_acc) == 1)//跌倒报警
{
//cplog_printf("mmi_gsensor_sensor_fall_alarm x:%d,y:%d,z:%d!!!\n",Gsensor_x[i],Gsensor_y[i],Gsensor_z[i]);
mmi_gsensor_sensor_fall_alarm();
- break;
}
- //cplog_printf("x:%d,y:%d,z:%d!!!\n",Gsensor_x[i],Gsensor_y[i],Gsensor_z[i]);
+
}
-
#if USE_HX3918
hx3918_set_gsen_fifo(Gsensor_x,Gsensor_y,Gsensor_z,Gsensor_xyz_len);
#endif