#include "helios_debug.h"
#define SC7A20_LOG(msg, ...) custom_log("SC7A20", msg, ##__VA_ARGS__)
-
+#include "callbackdeal.h"
#include "helios_timer.h"
#include "helios_extint.h"
static unsigned char SL_INT_TIME_CNT = 0;
#define SL_INT_TIME_TH 6 //per lsb is 0.5s
unsigned char sl_sleep_sys_hour;
+typedef enum
+{
+ Gsensor_FALL_DOWN,//跌倒
+ Gsensor_WRIST_UP,
+ Gsensor_WRIST_DOWN,
+ Gsensor_ERROR
+}Gsensor_STATE_E;
+typedef struct
+{
+ float x;
+ float y;
+ float z;
+}acc_g_data_t;
typedef struct _SC7A20_obj_t
{
mp_obj_base_t base;
uint8_t i2c_no;
uint8_t i2c_mode;
-
+ c_callback_t cb;
} SC7A20_obj_t;
-
+STATIC SC7A20_obj_t *g_SC7A20 = NULL;
unsigned char SL_SC7A20_I2c_Spi_Write(bool sl_spi_iic,unsigned char reg, unsigned char data)
{
#define ACC_1G_Z (8192+128)
#define ACC_MINUS1G_Z (8192-128)
+void Gsensor_CALLBACK_OP(uint8_t state)
+{
+
+ if(g_SC7A20->cb.cb != NULL)
+ {
+ st_CallBack_Gsensor *Gsensor_cb = malloc(sizeof(st_CallBack_Gsensor));
+ if(NULL != Gsensor_cb ) {
+ Gsensor_cb->callback = g_SC7A20->cb;
+ Gsensor_cb->state = state;
+ qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_Gsensor, Gsensor_cb);
+ }
+ }
+
+}
+#define FALL_DETECH_LOW_THRESHOLD 40
+#define FALL_COUNTER_THRESHOLD 6
+static uint16_t fall_counter = 0;
+uint8_t gsensor_sc7a20_fall_detect(acc_g_data_t * acc)
+{
+ double acc_square = (double)((acc->x) * (acc->x)) + (double)((acc->y) * (acc->y)) + (double)((acc->z) * (acc->z));
+
+ // if(MMIApi_IsOpenGsensorTestWin())
+ // {
+ // memcpy(&s_sc7a20_test_info, acc, sizeof(acc_g_data_t));
+ // }
+
+ if(acc_square < FALL_DETECH_LOW_THRESHOLD )
+ {
+ fall_counter++;
+ }
+ else
+ {
+ fall_counter = 0;
+ }
+
+ if(fall_counter >= FALL_COUNTER_THRESHOLD)
+ {
+ fall_counter = 0;
+
+ // #if defined(GPS_CHIP_AT6558R_DEBUG) && !defined(ZMAEE_APP)
+ // // if(get_motion_status() == 1)//有运动才发跌倒报警
+ // // _Gps_SendMessagetoClient(GPS_SOCKET_FALL_DOWN, 0);
+ // #endif
+
+ return 1;
+ }
+
+ return 0;
+}
+
static ST_GS_DATA_TYPE s_sc7a20_read_data[32] = {0};
signed short SC7A20_XYZ_Buf_tmp[3][32];
unsigned int SC7A20_XYZ_Buf_tmp_len =0;
unsigned char SC7A20_FIFO_NUM;
bool SC7A20_INT_STATUS;
unsigned int i ;
+ acc_g_data_t s_acc = {0};
//("SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO sl_init_status:%d\n",sl_init_status);
if((sl_init_status!=SL_SC7A20_VERSION_VALUE)&&(sl_init_status!=SL_SC7A20E_VERSION_VALUE)) return 0;//initial fail
SC7A20_INT_STATUS=SL_INT_STATUS_READ();
if((SC7A20_INT_STATUS==1)||(SL_STEP_TEMP!= SL_STEP))
{
- //if(SL_INT_TIME_CNT>=SL_INT_TIME_TH) SC7A20_ODR_SET(1);
+ if(SL_INT_TIME_CNT>=SL_INT_TIME_TH) SC7A20_ODR_SET(1);
SL_INT_TIME_CNT =0;
SL_STEP_TEMP =SL_STEP;
}
/*******get wrist value******/
SL_WRIST= SL_Watch_Wrist_Algo();
-
+
/*******get overturn value******/
SL_CLOCK_STATUS=SL_Get_Clock_Status(1);//open overturn monitor
if(SL_CLOCK_STATUS==1)//overturn success
}
else
{
+
+
//sc7a20 's data for heart rate algo
SC7A20_FIFO_NUM= SL_SC7A20_Read_FIFO();
SC7A20_FIFO_NUM= SL_SC7A20_GET_FIFO_Buf(&SC7A20_XYZ_Buf[0][0],&SC7A20_XYZ_Buf[1][0],&SC7A20_XYZ_Buf[2][0],0);
//SC7A20_ODR_SET(0);//data for 10Hz 0.5S=5'S data //for heart rate algo
SC7A20_ODR_SET(0);//data for 25Hz 0.5S=12-13'S data //for heart rate algo
}
+ //抬腕亮屏
+ /**Return: 2 备注说明:屏幕点亮后需要关闭*********/
+ /**Return: 1 备注说明:屏幕需要点亮***************/
+ /**Return: 0 备注说明:屏幕不需要点亮*************/
+ /**Return: -1 备注说明:未初始化或初始化失败*******/
+ if(SL_WRIST == 1)
+ {
+ Gsensor_CALLBACK_OP(Gsensor_WRIST_UP);
+ }else if(SL_WRIST == 2)
+ {
+ Gsensor_CALLBACK_OP(Gsensor_WRIST_DOWN);
+ }
+ SL_WRIST = 0;
//以下代码为了筹够25个数据给hsensor
if(SC7A20_XYZ_Buf_tmp_len+SC7A20_FIFO_NUM > 32)
SC7A20_FIFO_NUM = 32 - SC7A20_XYZ_Buf_tmp_len;
s_sc7a20_read_data[i].sXAxisVal = SC7A20_XYZ_Buf_tmp[0][i];
s_sc7a20_read_data[i].sYAxisVal = SC7A20_XYZ_Buf_tmp[1][i];
s_sc7a20_read_data[i].sZAxisVal = SC7A20_XYZ_Buf_tmp[2][i];
+ s_acc.x = (float)((SC7A20_XYZ_Buf[0][i]*9.8f)/((uint16_t)ACC_0G_X));
+ s_acc.y = (float)((SC7A20_XYZ_Buf[1][i]*9.8f)/((uint16_t)ACC_0G_Y));
+ s_acc.z = (float)((SC7A20_XYZ_Buf[2][i]*9.8f)/((uint16_t)ACC_0G_Z));
+ if(gsensor_sc7a20_fall_detect(&s_acc) == 1)
+ Gsensor_CALLBACK_OP(Gsensor_FALL_DOWN);
}
s_sc7a20_read_data_len = SC7A20_XYZ_Buf_tmp_len;
#if SL_Sensor_Algo_Release_Enable==0x00
if(SL_SLEEP_CNT>39)//1min
#else
- if(SL_SLEEP_CNT>30)//1min
+ if(SL_SLEEP_CNT>60)//1min
#endif
{
#if SL_Sensor_Algo_Release_Enable==0
{
unsigned char fifo_status =0;
unsigned char sl_person_para[4] ={178,60,26,1};
- unsigned char Turn_Wrist_Para[2]={1,3};//refer pdf
+ unsigned char Turn_Wrist_Para[3]={1,5,1};//refer pdf
unsigned char s_pedo_th_set[5] = {20,9,0,40,50};
unsigned char s_pedo_int_set[3] = {3,2,1} ;
/*****if use spi mode please config first******/
+STATIC mp_obj_t mp_SC7A20_register_usr_cb(mp_obj_t self_in, mp_obj_t callback);
//#include "goodix_spo2.h"
//#include "gh3011_example.h"
STATIC mp_obj_t mp_activate_SC7A20(mp_obj_t self_in)
{
SC7A20_obj_t *self = MP_OBJ_TO_PTR(self_in);
-
+ g_SC7A20 = self;
return mp_const_none;
}
STATIC mp_obj_t mp_SC7A20_get_step(mp_obj_t self_in)
{
//SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO();
+ //Gsensor_CALLBACK_OP(2);
return mp_obj_new_int(SL_STEP);
}
//清空步数,建议隔天清空
mp_obj_t coordinate_list[3] = {mp_obj_new_int((int)(x*100)), mp_obj_new_int((int)(y*100)), mp_obj_new_int((int)(z*100)),};
return mp_obj_new_list(3, coordinate_list);
}
+STATIC mp_obj_t mp_SC7A20_register_usr_cb(mp_obj_t self_in, mp_obj_t callback)
+{
+ SC7A20_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (!self) nlr_raise(
+ mp_obj_new_exception_msg(
+ &mp_type_RuntimeError, MP_ERROR_TEXT("SC7A20 instance needs to be created before callback is called!")));
+
+ mp_sched_schedule_callback_register(&self->cb, callback);
+
+ return mp_obj_new_int(0);
+}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_init_SC7A20_obj, mp_SC7A20_init);//初始化
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_deinit_SC7A20_obj, mp_SC7A20_deinit);//
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_activate_SC7A20_obj, mp_activate_SC7A20);//
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_SC7A20_get_step_obj, mp_SC7A20_get_step);//
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_SC7A20_reset_step_obj, mp_SC7A20_reset_step);//
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_SC7A20_get_x_y_z_obj, mp_SC7A20_get_x_y_z);//
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(mp_SC7A206_register_usr_cb_obj, mp_SC7A20_register_usr_cb);
STATIC const mp_rom_map_elem_t SC7A20_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mp_init_SC7A20_obj) },
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mp_deinit_SC7A20_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_step), MP_ROM_PTR(&mp_SC7A20_get_step_obj) },
{ MP_ROM_QSTR(MP_QSTR_reset_step), MP_ROM_PTR(&mp_SC7A20_reset_step_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_x_y_z), MP_ROM_PTR(&mp_SC7A20_get_x_y_z_obj) },
+ { MP_ROM_QSTR(MP_QSTR_set_callback), MP_ROM_PTR(&mp_SC7A206_register_usr_cb_obj) },
};
STATIC MP_DEFINE_CONST_DICT(SC7A20_locals_dict, SC7A20_locals_dict_table);