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

📄 复件 pedometer.c

📁 一个Gesssensor 的driver
💻 C
📖 第 1 页 / 共 3 页
字号:
    nTagert[5] = '.';
    score_tmp = score_tmp%10   +'0';
    nTagert[6] = score_tmp;
    nTagert[7] = 0;
}
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 PedometerDispInit(void)
{
    unsigned int color_tmp;
    unsigned int tmpbuf[8];
    unsigned long score_tmp;
//------------------------------------------------------------------------------
//  以下为界面相关的初始化(测试用的简单)
//------------------------------------------------------------------------------
    color_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_BODY_HEIGHT_X,PEDOMETER_TEXT_BODY_HEIGHT_Y,  "HEIGHT:");
    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();
///////////////////////////////////////////////
	Xnumber=MXC6202DataOut.Bytes.XaccMSB;
	Xnumber=MXC6202DataOut.Bytes.XaccLSB+(Xnumber<<8);
	Ynumber=MXC6202DataOut.Bytes.YaccMSB;
	Ynumber=MXC6202DataOut.Bytes.YaccLSB+(Ynumber<<8);
#ifdef TEST_PEDOMETER_UI
	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  	
	PDisplayTime(TimeCounter);
	PDisplayStepCounter(StepCounter);
	PDisplayTotalConsume(TotalConsume);
	PDisplayDistance(Distance);
#endif 	

}

PEDOMETER_APP_CODE
void PedometerSettingDisplay(void)
{
    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)));

}    

PEDOMETER_APP_CODE
void PedometerSetting(void)
{
    unsigned int color_tmp;
    unsigned int tmpbuf[4];
    
    if(KeyFlag.bc.bKeyPressed == 0)
        return;
    KeyFlag.bc.bKeyPressed = 0;
    
    if (SystemInfo.bc.bHoldOn) {
        return;
    }
    switch(KeyVal){
        case KEY_VAL_PLAY_SHORT_UP:
            if(PedometerState == PEDOMETER_RUN)
            {
                PedometerState = PEDOMETER_PAUSE;
                PedometerFreqDown();
                PedometerTimerStop(PEDOMETER_TMR_CHANNEL);
				#ifdef TEST_PEDOMETER_UI
				PDisplayPauseRun(PEDOMETER_DISP_PAUSE);
				#endif 	
            }
            else if(PedometerState == PEDOMETER_STOP)
            {
                PedometerState = PEDOMETER_RUN;
                PedometerFreqUp();
                PedometerDispInit();
				#ifdef TEST_PEDOMETER_UI
				PDisplayPauseRun(PEDOMETER_DISP_RUN);
				#endif 	
                PedometerTimerSetTimer(PEDOMETER_TMR_CHANNEL, 2);//设置50ms的时间中断
                PedometerTimerStart(PEDOMETER_TMR_CHANNEL);
            }
            else
            {
                PedometerState = PEDOMETER_RUN;
                PedometerFreqUp();
                #ifdef TEST_PEDOMETER_UI
				PDisplayPauseRun(PEDOMETER_DISP_RUN);
                #endif 	
                PedometerTimerStart(PEDOMETER_TMR_CHANNEL);
            }
            break;
        case KEY_VAL_MENU_PRESS_START://退出回到主菜单
            PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_END,0,0,0/*,0,0,0*/);
            break;

        default:
            break;
    }
	PedometerSettingDisplay();        

}    

PEDOMETER_APP_CODE
void PedometerProcess(void)
{
    unsigned int imask_tmp;
    unsigned int color_tmp;
    unsigned int KeyValue;
    unsigned int KeyState;   
    unsigned int tmpbuf[8];
    
    if(PedometerState != PEDOMETER_RUN){
        if(KeyFlag.bc.bKeyPressed)
            KeyFlag.bc.bKeyPressed = 0;
        return;
        
        if (SystemInfo.bc.bHoldOn) {
            return;
        }
    }
    if(PedometerReadFlag != 0){
        read_creg(%imask, imask_tmp);
        bitclear_creg(%imask, 15);
        PedometerReadFlag = 0;
        write_creg(%imask, imask_tmp);        
		//GetAcceleration();		
		StepLoops();
//////////////////////////////////////////////////////////////////////////////////////////////读取相关数值
		Xnumber=MXC6202DataOut.Bytes.XaccMSB;
		Xnumber=MXC6202DataOut.Bytes.XaccLSB+(Xnumber<<8);
		Ynumber=MXC6202DataOut.Bytes.YaccMSB;
		Ynumber=MXC6202DataOut.Bytes.YaccLSB+(Ynumber<<8);
//////////////////////////////////////////////////////////////////////////////////////////////计算行走路程
		Distance=BodyHeight-100;
		Distance=Distance*StepCounter;
		Distance=Distance/100;
//////////////////////////////////////////////////////////////////////////////////////////////计算消耗的
		TotalConsume=Distance*BodyWeight;
		TotalConsume=TotalConsume+(TotalConsume/1000)*36;
//////////////////////////////////////////////////////////////////////////////////////////////计算时间秒为单位
		TimeCounter=TimeInterCounter/20;
//////////////////////////////////////////////////////////////////////////////////////////////计算消耗速度
		ConsumeRate=TotalConsume/TimeCounter;
		ConsumeRate=ConsumeRate*3600;
		ConsumeRate=ConsumeRate/1000;//以千卡为单位
//////////////////////////////////////////////////////////////////////////////////////////////计算步频
		StepFreqency=(60*StepCounter)/TimeCounter;
//////////////////////////////////////////////////////////////////////////////////////////////显示相关数据
#ifdef TEST_PEDOMETER_UI
		PDisplayXnumber(Xnumber);	
		PDisplayYnumber(Ynumber);	
//////////////////////////////////////////////////////////////////////////////////////////////
		PDisplayStepCounter(StepCounter);
		PDisplayBodyWeight(BodyWeight);
		PDisplayBodyHeight(BodyHeight);
//////////////////////////////////////////////////////////////////////////////////////////////
		PDisplayDistance(Distance);
		PDisplayTotalConsume(TotalConsume);
		if(TimeInterCounter%20==0)
			PDisplayTimeCounter(TimeCounter);
		PDisplayConsumeRate(ConsumeRate);
		PDisplayStepFreqency(StepFreqency);
#else 
//////////////////////////////////////////////////////////////////////////////////////////////
		if(TimeInterCounter%20==0)
		{//一秒钟刷新一次
			PDisplayTime(TimeCounter);
			PDisplayStepCounter(StepCounter);
			PDisplayTotalConsume(TotalConsume);//已千卡为单位
			PDisplayDistance(Distance);
		}
#endif 	
//////////////////////////////////////////////////////////////////////////////////////////////
    }
    
    if(KeyFlag.bc.bKeyPressed == 0)
        return;
    else 
    	KeyFlag.bc.bKeyPressed = 0;
    switch(KeyVal)
    {
        case KEY_VAL_PLAY_SHORT_UP:
            if(PedometerState != PEDOMETER_RUN)
            {
                PedometerState = PEDOMETER_RUN;
                PedometerFreqUp();
				#ifdef TEST_PEDOMETER_UI
				PDisplayXnumber(Xnumber);	
				PDisplayPauseRun(PEDOMETER_DISP_RUN);
				#endif 	
                PedometerTimerSetTimer(PEDOMETER_TMR_CHANNEL, 2);//根据 等级来设定时间
                PedometerTimerStart(PEDOMETER_TMR_CHANNEL);
                PedometerTimerReset(PEDOMETER_TMR_CHANNEL2);
                PedometerTimerStart(PEDOMETER_TMR_CHANNEL2);
            }else
            {
                PedometerState = PEDOMETER_PAUSE;
                PedometerFreqDown();
                PedometerTimerStop(PEDOMETER_TMR_CHANNEL);
                PedometerTimerStop(PEDOMETER_TMR_CHANNEL2);
                PedometerKeyFlag = 0;
                PedometerKeyValue = KEY_VAL_NONE;
				#ifdef TEST_PEDOMETER_UI
				PDisplayXnumber(Xnumber);	
				PDisplayPauseRun(PEDOMETER_DISP_PAUSE);
				#endif 	
            }
            break;            
        case KEY_VAL_MENU_PRESS_START://退出Pedometer
            	PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_END,0,0,0/*,0,0,0*/);
            break;
      	default:
            break;        
    }
    if(PedometerKeyFlag != 0){
        read_creg(%imask, imask_tmp);
        bitclear_creg(%imask, 15);
        PedometerKeyFlag = 0;
        write_creg(%imask, imask_tmp);
    }
}

PEDOMETER_APP_CODE
void PedometerModule(void)
{
    unsigned int color_tmp;
    unsigned int temp;
    
    if (DisplayFlag == DISP_PEDOMETER) {
        if (SystemInfo.bc.bBackLightOffStart) {
            bitclear_creg(%imask,5);
            SystemInfo.bc.bBackLightOffStart = 0;
            LcdBackLightOff();
            bitset_creg(%imask,5);
        }
        
        if (SystemInfo.bc.bDisplayRecovery) {
            SystemInfo.bc.bDisplayRecovery = 0;
            //恢复显示图片(重新解码)
            PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_INIT,0,0,0/*,0,0,0*/);
        }
        
        if (SystemInfo.bc.bHoldOn && PedometerState == PEDOMETER_RUN){//2007-1-10 
            PedometerState = PEDOMETER_PAUSE;                   
        }
        
        if (SystemInfo.bc.bBackLightOnStart == 0) 
        {
            
            switch(Fun2MsgArray[1])
            {        
                case MSG_FUNCTION2_PEDOMETER_INIT:
                    //LCD_Init();
                    if (Sys1InitFlag.word == 0xffff)
                    {
                        SysCpuSetFreq(24);
                        SysTimer0Set(24,25000);//SysTimer0Set(24,10000);
                    }
                    if (Sys2InitFlag.bc.bPedometerModuleInitEnable) //须对Pedometer模块进行相关初始化
                    {
                        PedometerValueInit();
                    }
                    PedometerDispInit();
                    PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_STOP,0,0,0/*,0,0,0*/);                    
                    break;
                case MSG_FUNCTION2_PEDOMETER_STOP:
                case MSG_FUNCTION2_PEDOMETER_PAUSE:
                    PedometerSetting();//没有开始前,进行相关设置
                    //PedometerProcess();
                    if(PedometerState == PEDOMETER_RUN)
                    {
                        PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_RUN,0,0,0/*,0,0,0*/);
                    }
                    break;
                case MSG_FUNCTION2_PEDOMETER_RUN:
                    //SystemInfo.bit.bBklightOffEn = 0;
                    PedometerProcess();
                    if(PedometerState != PEDOMETER_RUN)
                    {
                    	PostFun2Message(MSG_FUNCTION2_PEDOMETER,MSG_FUNCTION2_PEDOMETER_PAUSE,0,0,0/*,0,0,0*/);
                    }
                    break;
                case MSG_FUNCTION2_PEDOMETER_END:
                    PedometerExit();
                    break;
                default:
                    break;
            }
        }        
        if (SystemInfo.bc.bHoldDisplay) 
        {
            bitclear_creg(%imask,5);
            SystemInfo.bc.bHoldDisplay = 0;
            bitset_creg(%imask,5);
            PreDisplayFlag = DisplayFlag;
            DisplayFlag = DISP_HOLD;
            MusicSetFreq51();
            LCD_Init(0);
            DisplayPicture(0, 0, LCD_MAX_XSIZE, LCD_MAX_YSIZE, NFA_SYSTEM_LOCK + SystemInfo.bc.bHoldOn * PicPerPage);
            MusicSetFreq51Return();
        }        
        if (SystemInfo.bc.bBackLightOnStart) 
        {
            bitclear_creg(%imask,5);
            SystemInfo.bc.bBackLightOnStart = 0;
            LcdBackLightOn();
            KeyReset();
            bitset_creg(%imask,5);
        }
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////                 
PEDOMETER_APP_CODE
void PedometerFreqUp(void)
{
    MusicSetFreq51();
    bitclear_creg(%imask,5);
    SystemInfo.bc.bBackLightOffEn = 1;
    SystemInfo.bc.bSysIdleEn = 0;
    bitset_creg(%imask,5);
}

PEDOMETER_APP_CODE
void PedometerFreqDown(void)
{
    bitclear_creg(%imask,5);
    SystemInfo.bc.bBackLightOffEn = 0;
    LightOffCounter = 0;
    if ((Sys1InitFlag.word == 0xffff) || ((Sys1InitFlag.bc.bMusicModuleInitEnable == 0) && (MusicPlayInfo.PlayState != MUSIC_DECODE_PLAY))) {
        SystemInfo.bc.bSysIdleEn = 1;
        SysIdleCounter = 0;
    }
    bitset_creg(%imask,5);
    MusicSetFreq51Return();
}

#ifdef TEST_PEDOMETER_UI
PEDOMETER_APP_CODE
void PDisplayPauseRun(bool PedometerPauseRun)
{
    unsigned int color_tmp;

	color_tmp = LCD_GetColor();
	LCD_SetColor(PEDOMETER_BACK_CLOLOR);
	LCD_FillRect(PEDOMETER_DISP_STATE_X, PEDOMETER_DISP_STATE_Y, PEDOMETER_DISP_STATE_X+PEDOMETER_DISP_STATE_XSIZE, PEDOMETER_DISP_STATE_Y+PEDOMETER_DISP_STATE_YSIZE);
	LCD_SetColor(0xF800);
	if(PedometerPauseRun==PEDOMETER_DISP_RUN)
		LCD_NFDispStringAt(PEDOMETER_DISP_STATE_X, PEDOMETER_DISP_STATE_Y, "RUN");  
	else
		LCD_NFDispStringAt(PEDOMETER_DISP_STATE_X, PEDOMETER_DISP_STATE_Y, "PAUSE");  	
	LCD_SetColor(color_tmp);
}
PEDOMETER_APP_CODE
void PDisplayXnumber(unsigned long Xnumber)
{	
    unsigned int color_tmp;
    unsigned int tmpbuf[8];
	
	color_tmp = LCD_GetColor();
	Conver16To10Display(Xnumber,tmpbuf);
    LCD_SetColor(PEDOMETER_BACK_CLOLOR);
    LCD_FillRect(PEDOMETER_NUMBER_XNUMBER_X, PEDOMETER_NUMBER_XNUMBER_Y, PEDOMETER_NUMBER_XNUMBER_X+50, PEDOMETER_NUMBER_XNUMBER_Y+16);
    LCD_SetColor(0xFFFF);
    LCD_NFDispStringAt(PEDOMETER_NUMBER_XNUMBER_X, PEDOMETER_NUMBER_XNUMBER_Y, tmpbuf);
	LCD_SetColor(color_tmp);
}    
PEDOMETER_APP_CODE
void PDisplayYnumber(unsigned long Ynumber)
{	
    unsigned int color_tmp;
    unsigned int tmpbuf[8];
	
	color_tmp = LCD_GetColor();
	Conver16To10Display(Ynumber,tmpbuf);
    LCD_SetColor(PEDOMETER_BACK_CLOLOR);
    LCD_FillRect(PEDOMETER_NUMBER_YNUMBER_X, PEDOMETER_NUMBER_YNUMBER_Y, PEDOMETER_NUMBER_YNUMBER_X+50, PEDOMETER_NUMBER_YNUMBER_Y+16);
    LCD_SetColor(0xFFFF);
    LCD_NFDispStringAt(PEDOMETER_NUMBER_YNUMBER_X, PEDOMETER_NUMBER_YNUMBER_Y, tmpbuf);
	LCD_SetColor(color_tmp);
}    
PEDOMETER_APP_CODE
void PDisplayBodyWeight(unsigned long BodyWeight)
{	
    unsigned int color_tmp;
    unsigned int tmpbuf[8];
	
	color_tmp = LCD_GetColor();
	Conver16To10Display(BodyWeight,tmpbuf);
    LCD_SetColor(PEDOMETER_BACK_CLOLOR);
    LCD_FillRect(PEDOMETER_NUMBER_BODY_WEIGHT_X, PEDOMETER_NUMBER_BODY_WEIGHT_Y, PEDOMETER_NUMBER_BODY_WEIGHT_X+50, PEDOMETER_NUMBER_BODY_WEIGHT_Y+16);

⌨️ 快捷键说明

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