⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g_sensor.c

📁 mtk 3D动力传感器驱动源码
💻 C
字号:
#include "kal_release.h"
#include "custom_config.h"
#include "gpio_sw.h"
#include "drv_comm.h"

#ifdef G_SENSOR_SUPPORT
#include "g_sensor.h"
#include "gpt_sw.h"
#include "intrCtrl.h"
#include "eint.h"
#include "MMA7455L_Init.h"
#include "MMA7455L_Turn.h"
#include "MMA7455L_Flip.h"

extern const unsigned char G_SENSOR_NO;

#define G_SENSOR_SAMPLE_PERIOD_FOR_TRUN 5 //50ms
#define G_SENSOR_SAMPLE_PERIOD_FOR_FLIP 1 //50ms

#define X_THRESHOLD	10  //15
#define Y_THRESHOLD	20  //30

#define G_SENSOR_DEBUG 0

GSensorStruct g_sensor_data;
kal_bool g_sensort_tap_inited = KAL_FALSE;
kal_bool g_sensor_sample_inited = KAL_FALSE;
kal_bool accelerometer_state_2 = LEVEL_HIGH;//LEVEL_LOW;
VUINT8 vt_int_count = 0;
kal_bool g_sensor_power(kal_bool enable)
{
    if(enable)
   {      
      //motion_sensor_custom_fp->ms_power_up();
      g_sensor_sample(KAL_TRUE);
   }   
   else   
   {     
    // motion_sensor_custom_fp->ms_power_down();
     g_sensor_sample(KAL_FALSE);
     //motion_sensor_reset();
   }  
   return KAL_TRUE;
}

void g_sensor_conf_sample_period(kal_uint32 period) 
{
    g_sensor_data.sample_period=(kal_uint8)period;
} 

void g_sensor_conf_sense_func(G_SENSOR_SENSE_FUNC       func) 
{
    g_sensor_data.sense_func=func;
} 

void g_sensor_conf_get_report_func(G_SENSOR_GET_REPORT_FUNC     func) 
{
    g_sensor_data.get_report_func=func;
} 

void g_sensor_sample_cb(void *para)
{
    kal_uint8 report_value = 0;
    g_sensor_data.sense_func();
    report_value = g_sensor_data.get_report_func();
    if (0 != report_value)
    {
        //g_sensor_data.cb_func(motion_sensor_data.para);
        g_sensor_data.cb_func(&report_value);
    }
    
    GPTI_StartItem(g_sensor_data.gpt_handle,
        g_sensor_data.sample_period,
        g_sensor_sample_cb,
        NULL); 
} 

void g_sensor_sample(kal_bool enable)
{
    if(enable)/*ON*/
    {
    	 if(KAL_FALSE == g_sensor_sample_inited)
    	 {
    	 	g_sensor_sample_inited = KAL_TRUE;
		GPTI_GetHandle(&g_sensor_data.gpt_handle); 
    	 }
		 
        GPTI_StartItem(g_sensor_data.gpt_handle,
            g_sensor_data.sample_period,
            g_sensor_sample_cb,
            NULL);      
    }  
    else/*OFF*/
    {
        GPTI_StopItem(g_sensor_data.gpt_handle);      
    }   
}   

void g_sensor_cb_registration(G_SENSOR_DATA_FUNC cb_fun, void *para)
{
    g_sensor_data.cb_func=cb_fun;
    g_sensor_data.para=para;
}   

/*
void g_sensor_stop_sample(void)
{
    //Flip_Sense();
    GPTI_StopItem(g_sensor_data.gpt_handle);
} 
*/

void g_sensor_reset(void)   
{
    return;
}

kal_bool g_sensor_status = KAL_TRUE;

kal_uint8 g_sensor_tap_gpt_handle;

void g_sensor_tap_func(void *para)
{
	if(vt_int_count == 2)
	{
		g_sensor_data.cb_func(NULL);
	}
	vt_int_count = 0;
	g_sensor_status = KAL_TRUE;

	GPTI_StopItem(g_sensor_tap_gpt_handle);
}


void g_sensor_eint_hisr(void)
{
	VINT16 X_G_SENSOR = 0;
	VINT16 Y_G_SENSOR = 0;
	VINT16 Z_G_SENSOR = 0;
    kal_uint32 savedMask;

	 MMA745x_Read_RawData(&X_G_SENSOR, &Y_G_SENSOR, &Z_G_SENSOR);
	
#if 	G_SENSOR_DEBUG
	 kal_prompt_trace(MOD_SOC, "x = %d y = %d z = %d",X_G_SENSOR, Y_G_SENSOR, Z_G_SENSOR);
#endif
	Tap_Clear_Interrupt();
#if 0
	if(abs(X_G_SENSOR)   > X_THRESHOLD || abs(Y_G_SENSOR) > Y_THRESHOLD)
		return;
#endif
    savedMask = SaveAndSetIRQMask();

	if(g_sensor_status)
	{
	//IRQMask(IRQ_GPT_CODE);   
		//GPTI_GetHandle(&g_sensor_tap_gpt_handle); 
		GPTI_StartItem(g_sensor_tap_gpt_handle,
	            100,
	            g_sensor_tap_func,
	            NULL);     
		g_sensor_status = KAL_FALSE;
	//IRQUnmask(IRQ_GPT_CODE);
	}
	//g_sensor_data.cb_func(NULL);

	//callback function 
    vt_int_count++;
    if(vt_int_count>=10)
        vt_int_count = 0;
    //
    RestoreIRQMask(savedMask);

    
}  

VUINT8 Tap_get_INT_count(void)
{
    return vt_int_count;
}

void Tap_set_INT_count(VUINT8 value)
{
    vt_int_count = 0;
}
void g_sensor_int_enable(kal_bool enable)
{
    if(enable==KAL_TRUE)   
        EINT_UnMask(G_SENSOR_NO);
    else
        EINT_Mask(G_SENSOR_NO);
}   

void g_sensor_init_turn(void)
{
    MMA7455L_Startup();
    
    g_sensor_conf_sample_period(G_SENSOR_SAMPLE_PERIOD_FOR_TRUN);
    g_sensor_conf_sense_func(Turn_Sense);
    g_sensor_conf_get_report_func(Turn_Get_report);
}

void g_sensor_init_flip(void)
{
    MMA7455L_Startup();
    
    g_sensor_conf_sample_period(G_SENSOR_SAMPLE_PERIOD_FOR_FLIP);
    g_sensor_conf_sense_func(Flip_Sense);
    g_sensor_conf_get_report_func(Flip_Get_Report);
}

void g_sensor_init_tap(void)
{
	extern kal_int32 EINT_SW_Debounce_Modify(kal_uint8 eintno, kal_uint8 debounce_time);     
	Tap_Init_MMA7455L();
	if(!g_sensort_tap_inited)
	{
		EINT_SW_Debounce_Modify(G_SENSOR_NO, 10);
		EINT_Mask(G_SENSOR_NO);
		EINT_Registration(G_SENSOR_NO, KAL_TRUE, 
			accelerometer_state_2,g_sensor_eint_hisr, KAL_TRUE);  
		g_sensort_tap_inited =  KAL_TRUE;

		GPTI_GetHandle(&g_sensor_tap_gpt_handle); 
	}
	g_sensor_int_enable(KAL_TRUE);
}

//MMA745x_Test_IIC_Read_and_Write

#endif /* G_SENSOR_SUPPORT */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -