Example #1
0
static void acc_work_func(struct work_struct *work)
{

	struct acc_context *cxt = NULL;
	//int out_size;
	//hwm_sensor_data sensor_data;
	int x,y,z,status;
	int64_t  nt;
	struct timespec time; 
	int err;	

	cxt  = acc_context_obj;
	
	if(NULL == cxt->acc_data.get_data)
	{
		ACC_LOG("acc driver not register data path\n");
	}

	time.tv_sec = time.tv_nsec = 0;    
	time = get_monotonic_coarse(); 
	nt = time.tv_sec*1000000000LL+time.tv_nsec;
	
	err = cxt->acc_data.get_data(&x,&y,&z,&status);

	if(err)
	{
		ACC_ERR("get acc data fails!!\n" );
		goto acc_loop;
	}
	else
	{
		{	
			if( 0 == x && 0==y 
						&& 0 == z)
			{
				    goto acc_loop;
			}

			cxt->drv_data.acc_data.values[0] = x+cxt->cali_sw[0];
			cxt->drv_data.acc_data.values[1] = y+cxt->cali_sw[1];
			cxt->drv_data.acc_data.values[2] = z+cxt->cali_sw[2];
			cxt->drv_data.acc_data.status = status;
			cxt->drv_data.acc_data.time = nt;
					
		}			
	 }
    
	if(true ==  cxt->is_first_data_after_enable)
	{
		cxt->is_first_data_after_enable = false;
		//filter -1 value
	    if(ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[0] ||
		   	     ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[1] ||
		   	     ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[2])
	    {
	        ACC_LOG(" read invalid data \n");
	       	goto acc_loop;
			
	    }
	}
	//report data to input device
	//printk("new acc work run....\n");
	//ACC_LOG("acc data[%d,%d,%d]  \n" ,cxt->drv_data.acc_data.values[0],
	//cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2]);

	acc_data_report(cxt->drv_data.acc_data.values[0],
		cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2],
		cxt->drv_data.acc_data.status);

	acc_loop:
	if(true == cxt->is_polling_run)
	{
		  mod_timer(&cxt->timer, jiffies + atomic_read(&cxt->delay)/(1000/HZ)); 
	}
}
Example #2
0
static void acc_work_func(struct work_struct *work)
{
	struct acc_context *cxt = NULL;
	int x, y, z, status;
	int64_t pre_ns, cur_ns;
	int64_t delay_ms;
	int err;

	cxt = acc_context_obj;
	delay_ms = atomic_read(&cxt->delay);

	if (NULL == cxt->acc_data.get_data) {
		ACC_ERR("acc driver not register data path\n");
		return;
	}

	cur_ns = getCurNS();

	err = cxt->acc_data.get_data(&x, &y, &z, &status);

	if (err) {
		ACC_ERR("get acc data fails!!\n");
		goto acc_loop;
	} else {
			if (0 == x && 0 == y && 0 == z)
				goto acc_loop;

			cxt->drv_data.acc_data.values[0] = x;
			cxt->drv_data.acc_data.values[1] = y;
			cxt->drv_data.acc_data.values[2] = z;
			cxt->drv_data.acc_data.status = status;
			pre_ns = cxt->drv_data.acc_data.time;
			cxt->drv_data.acc_data.time = cur_ns;
	}

	if (true == cxt->is_first_data_after_enable) {
		pre_ns = cur_ns;
		cxt->is_first_data_after_enable = false;
		/* filter -1 value */
		if (ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[0] ||
		    ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[1] ||
		    ACC_INVALID_VALUE == cxt->drv_data.acc_data.values[2]) {
			ACC_LOG(" read invalid data\n");
			goto acc_loop;

		}
	}
	/* report data to input device */
	/* printk("new acc work run....\n"); */
	/* ACC_LOG("acc data[%d,%d,%d]\n" ,cxt->drv_data.acc_data.values[0], */
	/* cxt->drv_data.acc_data.values[1],cxt->drv_data.acc_data.values[2]); */

	while ((cur_ns - pre_ns) >= delay_ms*1800000LL) {
		pre_ns += delay_ms*1000000LL;
		acc_data_report(cxt->drv_data.acc_data.values[0],
			cxt->drv_data.acc_data.values[1], cxt->drv_data.acc_data.values[2],
			cxt->drv_data.acc_data.status, pre_ns);
	}

	acc_data_report(cxt->drv_data.acc_data.values[0],
			cxt->drv_data.acc_data.values[1], cxt->drv_data.acc_data.values[2],
			cxt->drv_data.acc_data.status, cxt->drv_data.acc_data.time);

 acc_loop:
	if (true == cxt->is_polling_run)
		startTimer(&cxt->hrTimer, atomic_read(&cxt->delay), false);
}