增加翻腕亮屏功能,跌倒报警功能
authorp15692025051 <846603105@qq.com>
Wed, 17 May 2023 09:55:15 +0000 (17:55 +0800)
committerp15692025051 <846603105@qq.com>
Wed, 17 May 2023 09:55:15 +0000 (17:55 +0800)
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/callbackdeal.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/callbackdeal.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/tp_cst816.c
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/lcd.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py

index 790e16a..ad94f76 100644 (file)
@@ -299,6 +299,12 @@ void qpy_callback_deal_thread(void * args_in)
                     st_CallBack_TP *cb_msg = (st_CallBack_TP *)msg.msg;
                     mp_sched_schedule_ex(&cb_msg->callback,  mp_obj_new_int(cb_msg->state));
                                }
+                break;
+                case CALLBACK_TYPE_ID_Gsensor:
+                               {
+                    st_CallBack_Gsensor *cb_msg = (st_CallBack_TP *)msg.msg;
+                    mp_sched_schedule_ex(&cb_msg->callback,  mp_obj_new_int(cb_msg->state));
+                               }
                 break;
                        #if MICROPY_QPY_MODULE_BT
                                case CALLBACK_TYPE_ID_BT:
index 8931e08..5a60455 100644 (file)
@@ -64,6 +64,7 @@ enum {
        CALLBACK_TYPE_ID_HANDMIC_KEY,
 #endif
     CALLBACK_TYPE_ID_TP,
+    CALLBACK_TYPE_ID_Gsensor,
 #if MICROPY_QPY_MODULE_BT
        CALLBACK_TYPE_ID_BT,
 #endif
@@ -100,6 +101,11 @@ typedef struct{
     c_callback_t callback;
 }st_CallBack_TP;
 
+typedef struct{
+    uint8_t state;
+    c_callback_t callback;
+}st_CallBack_Gsensor;
+
 typedef struct{
     uint8_t pin_no;
     uint8_t edge;
index 459a943..a983f02 100644 (file)
@@ -37,7 +37,7 @@
 
 #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"
@@ -102,17 +102,30 @@ static bool           SL_SWAY_ENABLE           = 0;
 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)
 {
@@ -167,6 +180,56 @@ unsigned char SL_MCU_SLEEP_ALGO_FUNCTION(void);
 #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;
@@ -183,6 +246,7 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
        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
 
@@ -190,7 +254,7 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
        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;
        }
@@ -233,7 +297,7 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
     
            /*******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
@@ -250,6 +314,8 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
        }
        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);       
@@ -260,6 +326,19 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
                //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;
@@ -280,6 +359,11 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
                        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;
@@ -297,7 +381,7 @@ unsigned int  SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void)
 #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
@@ -334,7 +418,7 @@ signed char SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_INIT(void)
 {
        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******/    
@@ -415,6 +499,7 @@ unsigned char SL_MCU_SLEEP_ALGO_FUNCTION(void)
 
 
 
+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"
@@ -423,7 +508,7 @@ unsigned char SL_MCU_SLEEP_ALGO_FUNCTION(void)
 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;
 }
 
@@ -525,6 +610,7 @@ STATIC mp_obj_t mp_SC7A20_poll(mp_obj_t self_in)
 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);
 }
 //清空步数,建议隔天清空
@@ -540,6 +626,17 @@ STATIC mp_obj_t mp_SC7A20_get_x_y_z(mp_obj_t self_in)
     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);//
@@ -547,6 +644,7 @@ 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) },
@@ -555,6 +653,7 @@ STATIC const mp_rom_map_elem_t SC7A20_locals_dict_table[] = {
        { 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);
index 2762dad..3dee0e6 100644 (file)
@@ -199,12 +199,14 @@ TouchPointRefTypeDef TPR_Structure;
 
 #ifdef TP_STATE_DETECTION
 #define TP_CALLBACK_OP(tp_state)     do{                                                                                     \
-                                            st_CallBack_TP *tp_cb = malloc(sizeof(st_CallBack_TP));                    \
-                                           if(NULL != tp_cb && g_cst816->cb.cb != NULL) {                                                                \
-                                                   tp_cb->callback = g_cst816->cb;                                                             \
-                                                   tp_cb->state = tp_state;                                                            \
-                                                   qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_TP, tp_cb);          \
-                                               }                                                                                   \
+                                                                                       if(g_cst816->cb.cb != NULL){                                                                                                    \
+                                                                                               st_CallBack_TP *tp_cb = malloc(sizeof(st_CallBack_TP));                    \
+                                                                                               if(NULL != tp_cb ) {                                                                \
+                                                                                                       tp_cb->callback = g_cst816->cb;                                                             \
+                                                                                                       tp_cb->state = tp_state;                                                            \
+                                                                                                       qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_TP, tp_cb);          \
+                                                                                               }                                                                                                                                                               \
+                                                                                       }                                                                                                                         \
                                         }while(0)
 #endif
 
index 9afabe1..7044dfc 100644 (file)
@@ -230,7 +230,7 @@ power_on_label.align(lv.ALIGN.CENTER, 0, 0)
 power_on_label.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
 print("power_on_screen init...")
 lv.scr_load(power_on_screen)
-utime.sleep_ms(1000)
+utime.sleep_ms(200)
 print("power_on_screen end...")
-PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 1)
+PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 6, 10)
 PWM_backlight.open()
index b733c16..35c41c8 100644 (file)
@@ -600,6 +600,7 @@ class DeviceInfoManager(Abstract):
         print("DeviceInfoManager:1.1")
         self.gsensor.init()
         print("DeviceInfoManager:2")
+        self.gsensor.set_callback(self.gsensor_cb)
         self.hsensor = GH3018()
         self.hsensor.activate()
         self.hsensor.init()
@@ -681,6 +682,14 @@ class DeviceInfoManager(Abstract):
         # with open("/ext/static/storage_file/config.json","w",encoding="utf-8") as fd:
         #     ujson.dump(self.read_data,fd)
 
+    def gsensor_cb(self, para):
+        print("gsensor_cb:{}".format(para))
+        if para == 0: #跌倒报警
+            EventMesh.publish("load_screen", {"screen": "FIND"})
+        elif para == 1: #抬腕
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)
+        elif para == 2: #放手
+            EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
 
     def publish_event(self, *args, **kwargs):
         """
@@ -1664,8 +1673,9 @@ class LocationManager(Abstract):
     def location_thread(self):
         data = ""
         self.location_thread_flag = 1
-        try :
-            while True:
+        
+        while True:
+            try :
                 match_gga_data = []
                 match_gsv_data = []
 
@@ -1731,8 +1741,10 @@ class LocationManager(Abstract):
                             EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位    
                             break
                 utime.sleep_ms(1000)
-        except Exception as e:
-            print("location_thread:ERROR:{}".format(e))
+            except Exception as e:
+                print("location_thread:ERROR:{}\r\n{}".format(e,Exception))
+                #break
+                
         self.location_thread_flag = 0