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

📄 pedometer.c

📁 一个Gesssensor 的driver
💻 C
📖 第 1 页 / 共 5 页
字号:
{
	if (PedometerState != PEDOMETER_STOP) //如果还在检测关闭定时器
	{
    	PedometerState = PEDOMETER_PAUSE;
    	PedometerFreqDown();
        PedometerTimerStop(PEDOMETER_TMR_CHANNEL);
        PedometerTimerStop(PEDOMETER_TMR_CHANNEL2);
        PedometerReadFlag = 0;
        PedometerKeyFlag = 0;
        PedometerKeyValue = KEY_VAL_NONE;
    }
	GsensorPowerOnDown(GS_POWERDOWN);//关闭传感器电源                    
    Fun2MsgArray[0] = MSG_FUNCTION2_NONE;//2006-2-10 15:35
    Fun2ModuleChange();
	MainMenuState = 0;
	DisplayFlag = DISP_MENU;
	PreDisplayFlag = DisplayFlag;
	PedometerExitSaveStepAndTime();
	LCD_Init(0);
    
}

PEDOMETER_APP_CODE
void PedometerTmrFunc(void *parg)
{
    PedometerReadFlag++;
    PedometerTimerReset(PEDOMETER_TMR_CHANNEL);
    PedometerTimerStart(PEDOMETER_TMR_CHANNEL);
    TimeInterCounter++;
    if(TimeInterCounter>999999)
    	TimeInterCounter=999999;
}

PEDOMETER_APP_CODE
void PedometerKeyDlyFunc(void *parg)
{
    PedometerKeyFlag++;
    PedometerTimerReset(PEDOMETER_TMR_CHANNEL2);
    PedometerTimerStart(PEDOMETER_TMR_CHANNEL2);
}



PEDOMETER_APP_CODE
void PedometerValueInit(void)
{
    unsigned int i,j;
    unsigned int tmpbuf[8];
    
    Sys2InitFlag.bc.bPedometerModuleInitEnable = 0;
    Sys2InitFlag.bc.bPedometerSysInitEnable = 0;

////////////////////////////////////////////////////////////////////////////进行相关初始化                    
	#ifdef TEST_PEDOMETER_UI
	Xnumber=0;
	Ynumber=0;
	#endif
	//BodyWeight=60;//这三个需要保存再取出来
	//BodyHeight=170;
	//TargertConsume=10000;
	StepCounter=0;
	TotalConsume=0;
	Distance=0;
	TimeCounter=0;
	TimeInterCounter=0;
	//ConsumeRate=0;//没有相关的计算
	//StepFreqency=0;//没有相关的计算
	TimeCounter=TimeInterCounter/20;
////////////////////////////////////////////////////////////////////////////                    
	GsensorPowerOnDown(GS_POWERON);                    
////////////////////////////////////////////////////////////////////////////                    
    PedometerTimerInit();
    //------2006-2-14 9:48
    read_creg(%timer0 , j);	    //10 * 1000 * 1us = 10ms
    srand( j );					//不知到干啥的先放在这里
    //-----------------
    PDisplayflag.word    = 0;
    PedometerKeyFlag     = 0;
    PedometerState       = PEDOMETER_STOP;
    PedometerTimerCfgFunc(PEDOMETER_TMR_CHANNEL, PedometerTmrFunc, 0);
    PedometerTimerCfgFunc(PEDOMETER_TMR_CHANNEL2, PedometerKeyDlyFunc, 0);
////////////////////////////////////////////////////////////////////////////    
}


PEDOMETER_APP_CODE
void NeedShowDotBitConver16To10Display(unsigned long ShowDotBit,unsigned long nSource,unsigned int *nTagert)//nTagert最好设置8成员个大小
{								//显示几位小数点,如果要显示小数点单位基本会已k显示: 1000.000kx,如果直接除1000能显示的位就会比较少
    unsigned long score_tmp;
    unsigned long DivNumber;
    unsigned int i;
    DivNumber=1;
    if(ShowDotBit>3)ShowDotBit=0;//限定作用
    if((ShowDotBit!=0)&&(ShowDotBit<=3))
    {
		for(i=0;i<(3-ShowDotBit);i++)
		{
			DivNumber=DivNumber*10;
		}
	}
    score_tmp = nSource/DivNumber;    
    nTagert[0] = score_tmp/100000+'0';
    if(nTagert[0]>'9')nTagert[0]='9';//防止溢出 
    score_tmp = score_tmp%100000;
    nTagert[1] = score_tmp/10000+'0';
    score_tmp = score_tmp%10000;
    nTagert[2] = score_tmp/1000 +'0';
    score_tmp = score_tmp%1000;
    nTagert[3] = score_tmp/100  +'0';
    score_tmp = score_tmp%100;
    nTagert[4] = score_tmp/10   +'0';
    nTagert[5]  = score_tmp%10   +'0';
    nTagert[6] = 0;
    nTagert[7] = 0;
    if(ShowDotBit>0)
    {//找小数点后的数往后挪
		for(i=0;i<(ShowDotBit+1);i++)
		{
			nTagert[7-i]=nTagert[7-i-1];	
		}
		nTagert[7-(ShowDotBit+1)]='.';
	}
}
PEDOMETER_APP_CODE
void Conver16To10Display(unsigned long nSource,unsigned int *nTagert)//nTagert最好设置8成员个大小
{
    unsigned long score_tmp;
    score_tmp = nSource;
    nTagert[0] = score_tmp/10000+'0';
    score_tmp = score_tmp%10000;
    nTagert[1] = score_tmp/1000 +'0';
    score_tmp = score_tmp%1000;
    nTagert[2] = score_tmp/100  +'0';
    score_tmp = score_tmp%100;
    nTagert[3] = score_tmp/10   +'0';
    score_tmp = score_tmp%10   +'0';
    nTagert[4] = score_tmp;
    nTagert[5] = 0;
}
PEDOMETER_APP_CODE
void CalculaterCaluliAndDistance(void)
{		//////////////////////////////////////////////////////////////////////////////////////////////计算行走路程
		Distance=BodyHeight*37/100;//身高步幅 37 -45%福尔摩斯发现身高脚长的比例是1:7,他根据这个来推断罪犯的身高的
		Distance=Distance*StepCounter;
		Distance=Distance/100;
		//////////////////////////////////////////////////////////////////////////////////////////////计算消耗的
		TotalConsume=Distance*BodyWeight;
		TotalConsume=TotalConsume+(TotalConsume*36)/1000;//能量(卡路里 Calories)= 1.036x合共走路距离(km)x 预设体重(kg)
		//////////////////////////////////////////////////////////////////////////////////////////////计算时间秒为单位
		TimeCounter=TimeInterCounter/20;
		//////////////////////////////////////////////////////////////////////////////////////////////计算消耗速度
		//ConsumeRate=TotalConsume/TimeCounter;
		//ConsumeRate=ConsumeRate*3600;
		//ConsumeRate=ConsumeRate/1000;//以千卡为单位
		//////////////////////////////////////////////////////////////////////////////////////////////计算步频
		//StepFreqency=(60*StepCounter)/TimeCounter;
		//////////////////////////////////////////////////////////////////////////////////////////////显示相关数据
}

PEDOMETER_APP_CODE
void PedometerDispInit(void)
{
    unsigned int tmpbuf[8];
    unsigned long score_tmp;
//------------------------------------------------------------------------------
//  以下为界面相关的初始化(测试用的简单)
//------------------------------------------------------------------------------
    pcolor_tmp = LCD_GetColor();
    LCD_SetColor(0xFFFF);
#ifndef TEST_PEDOMETER_UI
    DisplayPicture(0, 0, PEDOMETER_BACK_XSIZE, PEDOMETER_BACK_YSIZE, NFA_PEDOMETER_BACK);
    DisplayPicture(PLAY_BATT_X, PLAY_BATT_Y, PLAY_BATT_XSIZE, PLAY_BATT_YSIZE, NFA_PLAY_BATT + (unsigned long)(PLAY_BATT_XSIZE*PLAY_BATT_YSIZE*2*(BatteryLevel)));
#endif 	

#ifdef TEST_PEDOMETER_UI
    LCD_NFDispStringAt(PEDOMETER_TEXT_BODY_WEIGHT_X,PEDOMETER_TEXT_BODY_WEIGHT_Y, "WEIGHT:");   
    LCD_NFDispStringAt(PEDOMETER_TEXT_STEP_SIZE_X,PEDOMETER_TEXT_STEP_SIZE_Y,  "STEP_SIZE:");
    LCD_NFDispStringAt(PEDOMETER_TEXT_STEP_X,PEDOMETER_TEXT_STEP_Y,  "STEP:");
    LCD_NFDispStringAt(PEDOMETER_TEXT_XNUMBER_X,PEDOMETER_TEXT_XNUMBER_Y,  "X:");
    LCD_NFDispStringAt(PEDOMETER_TEXT_YNUMBER_X,PEDOMETER_TEXT_YNUMBER_Y,  "Y:");

    LCD_NFDispStringAt(PEDOMETER_TEXT_DISTANCE_X,PEDOMETER_TEXT_DISTANCE_Y,  "DISTANCE:");
    LCD_NFDispStringAt(PEDOMETER_TEXT_CONSUME_X,PEDOMETER_TEXT_CONSUME_Y,  "CONSUME:");
    LCD_NFDispStringAt(PEDOMETER_TEXT_TIMER_X,PEDOMETER_TEXT_TIMER_Y,  "TIMER:");
    LCD_NFDispStringAt(PEDOMETER_TEXT_CONSUMEPHOUR_X,PEDOMETER_TEXT_CONSUMEPHOUR_Y,  "CONSUME/H:");
    LCD_NFDispStringAt(PEDOMETER_TEXT_STEPPMINUTE_X,PEDOMETER_TEXT_STEPPMINUTE_Y,  "STEPF/M:");
#endif 	
	GetAcceleration();
///////////////////////////////////////////////
#ifdef TEST_PEDOMETER_UI
	Xnumber=MXC6202DataOut.Bytes.XaccMSB;
	Xnumber=MXC6202DataOut.Bytes.XaccLSB+(Xnumber<<8);
	Ynumber=MXC6202DataOut.Bytes.YaccMSB;
	Ynumber=MXC6202DataOut.Bytes.YaccLSB+(Ynumber<<8);
	PDisplayBodyWeight(BodyWeight);
	PDisplayBodyHeight(BodyHeight);
	PDisplayStepCounter(StepCounter);
	PDisplayTotalConsume(TotalConsume);
	PDisplayDistance(Distance);
	PDisplayTimeCounter(TimeCounter);
	PDisplayConsumeRate(ConsumeRate);
	PDisplayStepFreqency(StepFreqency);
	PDisplayXnumber(Xnumber);
	PDisplayYnumber(Ynumber);
	PDisplayPauseRun(PEDOMETER_DISP_PAUSE);
#else  	
	CalculaterCaluliAndDistance();
	PDisplayTime(TimeCounter);
	PDisplayStepCounter(StepCounter);
	PDisplayTotalConsume(TotalConsume);
	PDisplayDistance(Distance);
	PDisplayConsumeBar(TotalConsume,TargertConsume);	
#endif 	

}

PEDOMETER_APP_CODE
void PedometerSettingDisplay(void)
{
	unsigned long tempDistance;
	unsigned long tempConsume;
	unsigned long tempTime;
    unsigned int tmpbuf[8];
    unsigned int i;
    unsigned int Hour;
    unsigned int Minute;
    unsigned int Second;
	if(PDisplayflag.bit.bMenuinital)
	{
		PDisplayflag.bit.bMenuinital=0;
		PDisplayflag.bit.bInSetMode=1;		
    	AdjustTempWeight=BodyWeight;
    	AdjustTempBodyHeight=BodyHeight;
    	AdjustTempConsume=TargertConsume;
		AdjustPosition = 0;    
        DisplayPicture(0, 0, PEDOMETERSET_BACK_XSIZE, PEDOMETERSET_BACK_YSIZE, NFA_PEDOMETERSET_BACK);
    
    	//pcolor_tmp = LCD_GetColor();
        //LCD_SetColor(0x00);//黑色
        DisplayMenuStr(PEDOMETER_SET_TITLE_X,PEDOMETER_SET_TITLE_Y, 120, 16, LCD_TEXTALIGN_CENTER, NFA_PEDOMETER_RECORD_SETTING);
        DisplayMenuStr(PEDOMETER_SET_WEIGHT_X, PEDOMETER_SET_WEIGHT_Y , 60+40, 16, LCD_TEXTALIGN_LEFT, NFA_PEDOMETER_WEIGHT);
        DisplayMenuStr(PEDOMETER_SET_HIGHT_X, PEDOMETER_SET_HIGHT_Y , 60+40, 16, LCD_TEXTALIGN_LEFT, NFA_PEDOMETER_STEP_SIZE);
        DisplayMenuStr(PEDOMETER_SET_CONSUME_X, PEDOMETER_SET_CONSUME_Y, 60+40, 16, LCD_TEXTALIGN_LEFT, NFA_PEDOMETER_CONSUME);
    	//LCD_SetColor(pcolor_tmp);
    	PDisplayBodyWeight(AdjustTempWeight);
    	PDisplayBodyHeight(AdjustTempBodyHeight);
    	PDisplayTargetConsume(AdjustTempConsume);
	}
	if(PDisplayflag.bit.bBatt==1)
	{
		PDisplayflag.bit.bBatt=0;
        DisplayPicture(PLAY_BATT_X, PLAY_BATT_Y, PLAY_BATT_XSIZE, PLAY_BATT_YSIZE, NFA_PLAY_BATT + (unsigned long)(PLAY_BATT_XSIZE*PLAY_BATT_YSIZE*2*(BatteryLevel)));
	}
	if(PDisplayflag.bit.bAdjustWeight)
	{
		PDisplayflag.bit.bAdjustWeight=0;
    	PDisplayBodyWeight(AdjustTempWeight);
	}
	if(PDisplayflag.bit.bAdjustBodyHeight)
	{
		PDisplayflag.bit.bAdjustBodyHeight=0;
    	PDisplayBodyHeight(AdjustTempBodyHeight);
	}
	if(PDisplayflag.bit.bAdjustConsume)
	{
		PDisplayflag.bit.bAdjustConsume=0;
    	PDisplayTargetConsume(AdjustTempConsume);
	}
	if(PDisplayflag.bit.bAdjustPosition)
	{
		PDisplayflag.bit.bAdjustPosition=0;
    	PDisplayAdjustPosition(AdjustPosition);
	}
	if(PDisplayflag.bit.bPRecordDisplayinital)
	{
		PDisplayflag.bit.bPRecordDisplayinital=0;
		PDisplayflag.bit.bInRecordMode=1;
		PDisplayflag.bit.bPRecordDisplay=1;
		AdjustPosition = 0;//用于指示显示那一组    
        //DisplayPicture(0, 0, PEDOMETER_RECORD_BACK_XSIZE, PEDOMETER_RECORD_BACK_YSIZE, NFA_PEDOMETER_RECORD_BACK);
        //DisplayPicture(PLAY_BATT_X, PLAY_BATT_Y, PLAY_BATT_XSIZE, PLAY_BATT_YSIZE, NFA_PLAY_BATT + (unsigned long)(PLAY_BATT_XSIZE*PLAY_BATT_YSIZE*2*(BatteryLevel)));

	}
	if(PDisplayflag.bit.bPRecordDisplay)
	{
		PDisplayflag.bit.bPRecordDisplay=0;
        DisplayPicture(0, 0, PEDOMETER_RECORD_BACK_XSIZE, PEDOMETER_RECORD_BACK_YSIZE, NFA_PEDOMETER_RECORD_BACK);
        DisplayPicture(PLAY_BATT_X, PLAY_BATT_Y, PLAY_BATT_XSIZE, PLAY_BATT_YSIZE, NFA_PLAY_BATT + (unsigned long)(PLAY_BATT_XSIZE*PLAY_BATT_YSIZE*2*(BatteryLevel)));
        DisplayMenuStr(PEDOMETER_SET_TITLE_X,PEDOMETER_SET_TITLE_Y, 120, 16, LCD_TEXTALIGN_CENTER, NFA_PEDOMETER_RECORD+(AdjustPosition+1)*BytesPerMenu);
		//////////////////////////////////////////////////////////////////////////////////////////////计算行走路程
		tempDistance=BodyHeight*37/100;//身高步幅 37 -45%福尔摩斯发现身高脚长的比例是1:7,他根据这个来推断罪犯的身高的
		tempDistance=tempDistance*PedometerStepRecord[AdjustPosition];
		tempDistance=tempDistance/100;
		//////////////////////////////////////////////////////////////////////////////////////////////计算消耗的
		tempConsume=tempDistance*BodyWeight;
		tempConsume=tempConsume+(tempConsume*36)/1000;//能量(卡路里 Calories)= 1.036x合共走路距离(km)x 预设体重(kg)
		//////////////////////////////////////////////////////////////////////////////////////////////计算行走路程
		//DIV10Conver16To10Display(tempDistance,tmpbuf);
		NeedShowDotBitConver16To10Display(2,tempDistance,tmpbuf);//nTagert最好设置8成员个大小

		for(i=0;i<7;i++)
			tmpbuf[i]=tmpbuf[i]-'0';
		tmpbuf[4]=10;//显示'.'
    	for(i=1;i<7;i++)
    	{
    		DisplayPicture(51+((i-1)*(MIDDLENUMBER_XSIZE)), 38, MIDDLENUMBER_XSIZE, MIDDLENUMBER_YSIZE, NFA_MIDDLENUMBER_BASS+tmpbuf[i]*MIDDLENUMBER_XSIZE*MIDDLENUMBER_YSIZE*2);
    		//                                                    每个数值的宽度                                                                                      数字图片的地址  
    	}
		//////////////////////////////////////////////////////////////////////////////////////////////计算消耗的
    	//DIV100Conver16To10Display(tempConsume,tmpbuf);
		NeedShowDotBitConver16To10Display(1,tempConsume,tmpbuf);//nTagert最好设置8成员个大小
    	for(i=0;i<7;i++)
    		tmpbuf[i]=tmpbuf[i]-'0';
    	tmpbuf[5]=10;//显示'.'
        for(i=1;i<7;i++)
        {
        	DisplayPicture(51+((i-1)*(MIDDLENUMBER_XSIZE)), 68, MIDDLENUMBER_XSIZE, MIDDLENUMBER_YSIZE, NFA_MIDDLENUMBER_BASS+tmpbuf[i]*MIDDLENUMBER_XSIZE*MIDDLENUMBER_YSIZE*2);
        	//                                                    每个数值的宽度                                                                                      数字图片的地址  
        }
		//////////////////////////////////////////////////////////////////////////////////////////////计算消耗的
    	tempTime=PedometerTimeRecord[AdjustPosition];
    	PConverTimeTodispaly(tempTime,tmpbuf);
        for(i=0;i<8;i++)
        {
			DisplayPicture(51+((i)*(MIDDLENUMBER_XSIZE)), 98, MIDDLENUMBER_XSIZE, MIDDLENUMBER_YSIZE, NFA_MIDDLENUMBER_BASS+tmpbuf[i]*MIDDLENUMBER_XSIZE*MIDDLENUMBER_YSIZE*2);
        	//                                                    每个数值的宽度+2                                                                                       数字图片的地址  
        }
	}
	if(PDisplayflag.bit.bPInStartSwitchintal)
	{
		PDisplayflag.bit.bPInStartSwitchintal=0;
		PDisplayflag.bit.bPInStartSwitchMode=1;
		PDisplayflag.bit.bPInStartSwitchDisplay=1;		
		AdjustPosition = 0;    
        DisplayPicture(0, 0, PEDOMETER_START_BACK_XSIZE, PEDOMETER_START_BACK_YSIZE, NFA_PEDOMETER_START_BACK);
	}
	if(PDisplayflag.bit.bPInStartSwitchDisplay)
	{
		PDisplayflag.bit.bPInStartSwitchDisplay=0;
    	pcolor_tmp = LCD_GetColor();
		if(AdjustPosition==0)
    		LCD_SetColor(0xF800);
		else 		
	    	LCD_SetColor(0xFFFF);
    	LCD_NFDispStringAt(31+20,36+4, "START NEW");   
		if(AdjustPosition==1)
    		LCD_SetColor(0xF800);
		else 		
	    	LCD_SetColor(0xFFFF);
    	LCD_NFDispStringAt(31+22,52+4,  "CONTINUE");
		if(AdjustPosition==2)
    		LCD_SetColor(0xF800);
		else 		
	    	LCD_SetColor(0xFFFF);
    	LCD_NFDispStringAt(31+10,68+4,  "CLEAR RECORD");
		if(AdjustPosition==3)
    		LCD_SetColor(0xF800);
		else 		
	    	LCD_SetColor(0xFFFF);

⌨️ 快捷键说明

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