/* Includes ------------------------------------------------------------------*/ #include "ALLinclude.h" typedefStructStateSystem SysRegister ={ .State_system =stateIdel, .StateMenu = StateMenu_1, }; void SendCmd(TypedefID_T CmdData) { TypedefID_T CmdRegister = CmdData; xQueueSend(at_CmdMsg,&CmdRegister,portMAX_DELAY); } void SendCmdFromISR(TypedefID_T CmdData) { TypedefID_T CmdRegister = CmdData; xQueueSendFromISR(at_CmdMsg,&CmdRegister,NULL); } void SysRegisterInit(void) { SysRegister.State_system =stateIdel; SysRegister.StateMenu = StateMenu_1; } void StartTask(void *pvParamters) { BaseType_t Err = 0; TypedefID_T ECmdIDRegister; uint32_t TaskTimer =0; static uint8_t counter100ms=0; const TickType_t xTicksToWait = pdMS_TO_TICKS( 100UL ); SetMotorTimes(StateMenu_1); MotorStart; for(;;) { Err = xQueueReceive(at_CmdMsg, &ECmdIDRegister, xTicksToWait ); /* Err = pdTRUE,recreive success. */ if(Err == pdTRUE) { //printf("ECmdIDRegister = %d\r\n",ECmdIDRegister); switch(ECmdIDRegister) { case(eCmd10ms): { TaskTimer++; if(TaskTimer % 10 ==0) { SendCmd(eCmd100ms); } if(TaskTimer % 100 ==0) { SendCmd(eCmd1000ms); } // MotorControl(); // if(HAL_GetTick() - ) } break; case(eCmd100ms): { } break; case(eCmd1000ms): { size_t free_start = xPortGetFreeHeapSize(); // gif_play(Loading_map,sizeof(Loading_map)); // gif_play(&Loading_map[0],sizeof(Loading_map)); // Flash_Test_DMA(); // SetGifPlay(0x0000,8); size_t used = free_start - xPortGetFreeHeapSize(); } break; case(eCmdPressureOverload): { SendCmd(eCmdMotorPause); } break; case(eCmdMotorPause): { } break; case eCmdKeyONOFFlongPress: { SysRegister.State_system == stateIdel;//长按关机 } break; case eCmdKeyONOFFShortPress: { uint32_t data_ = HAL_GetTick(); SysRegister.CurrentButtonPressTime=HAL_GetTick() - SysRegister.LastButtonPressTick; SysRegister.LastButtonPressTick = HAL_GetTick();//更新按键时基 //短按:模式切换、暂停、恢复 if(SysRegister.State_system == Brushing && SysRegister.CurrentButtonPressTime>5000){ SysRegister.State_system = Paused; //刷牙中,间隔大于5S ,暂停 // } else if(SysRegister.State_system == Brushing && SysRegister.CurrentButtonPressTime<5000){ if(SysRegister.StateMenu < StateMenu_4){ //刷牙中,间隔小于5S ,模式切换 SysRegister.StateMenu ++; }else{ SysRegister.StateMenu = StateMenu_1; } } else if(SysRegister.State_system == Paused && SysRegister.CurrentButtonPressTime>5000){ SysRegister.State_system = Brushing; //暂停,间隔大于5S,继续刷牙 } else if(SysRegister.State_system == Paused && SysRegister.CurrentButtonPressTime>5000){ SysRegister.State_system = Brushing; //间隔小于5S,继续刷牙,并切换到下一个模式 if(SysRegister.StateMenu < StateMenu_4){ SysRegister.StateMenu ++; }else{ SysRegister.StateMenu = StateMenu_1; } } else if(SysRegister.State_system == stateIdel){ SysRegister.State_system=Brushing; } SysRegister.TickStart = HAL_GetTick(); } break; #if 0 case eCmdKeyModelongPress: { SysRegister.Timer =SysTimerReload; } break; case eCmdKeyModeShortPress: { } break; #endif case eCmdMotorEnable: { } break; case eCmdMotorDisable: { } break; case eCmdMotorON: { } break; case eCmdMotorOFF: { // StopMotor(); } break; case eCmdLCDBlack: LCD_Clear(BLACK); break; case eCmdLCDRed: LCD_Clear(RED); break; case eCmdLCDBlue: LCD_Clear(GBLUE); break; default:break; } } vTaskDelay(2); } } // 设定当前模式的时间周期 void SetMotorTimes(typedefStateMotor mode) { switch (mode) { case StateMenu_1: SysRegister.motorRunTime = 100; // 运行100ms SysRegister.motorStopTime = 40; // 停止40ms SysRegister.motorPauseTime = 180; // 30秒后暂停180ms SysRegister.cycleTime = 100+40; // 每循环一次是330ms SysRegister.totalRunTime = 180000; // 运行3分钟 SysRegister.Period = 160; // 运行3分钟 SysRegister.Duty = 20; // 运行3分钟 break; case StateMenu_2: SysRegister.motorRunTime = 10000; // 第一次运行10秒 SysRegister.motorStopTime = 160; // 停止160ms SysRegister.motorPauseTime = 160; // 每40秒暂停160ms SysRegister.cycleTime = 40000+160; // 每个周期是40000+160 ms SysRegister.totalRunTime = 180000; // 运行3分钟 SysRegister.Period = 160; // 运行3分钟 SysRegister.Duty = 25; // 运行3分钟 break; case StateMenu_3: SysRegister.motorRunTime = 30000; // 运行30秒 SysRegister.motorStopTime = 160; // 停止160ms SysRegister.motorPauseTime = 160; // 每次暂停160ms SysRegister.cycleTime = 30000+160; // 每个周期是30160ms SysRegister.totalRunTime = 120000; // 运行2分钟 SysRegister.Period = 160; // 运行3分钟 SysRegister.Duty = 25; // 运行3分钟 break; case StateMenu_4: SysRegister.motorRunTime = 30000; // 运行30秒 SysRegister.motorStopTime = 160; // 停止160ms SysRegister.motorPauseTime = 160; // 每次暂停160ms SysRegister.cycleTime = 30000+160; // 每个周期是30160ms SysRegister.totalRunTime = 180000; // 运行3分钟 SysRegister.Period = 160; // 运行3分钟 SysRegister.Duty = 50; // 运行3分钟 break; default: break; } SysRegister.modeStartTime = HAL_GetTick(); // 记录模式开始时间 } // 模式控制逻辑 void MotorControl(void) { uint32_t currentTick = HAL_GetTick(); // 获取系统运行时间 (ms) // 检查系统状态,如果是暂停状态,直接停止电机 if (SysRegister.State_system != Brushing) { MotorStop; return; } // 判断当前模式是否已经结束 if ((currentTick - SysRegister.modeStartTime) >= SysRegister.totalRunTime) { SysRegister.State_system = stateIdel; // 完成后回到空闲状态 MotorStop; return; } // 执行不同模式下的时间控制逻辑 switch (SysRegister.StateMenu) { case StateMenu_1: { // 每330ms循环一次,运行100ms,停止40ms,30秒后暂停180ms if((currentTick - SysRegister.modeStartTime) % (30000 + SysRegister.motorPauseTime) > 30000){ MotorStop; } else if ((currentTick - SysRegister.modeStartTime) % SysRegister.cycleTime < SysRegister.motorRunTime) { MotorStart; // 运行电机 } else if ((currentTick - SysRegister.modeStartTime) % SysRegister.cycleTime < (SysRegister.motorRunTime + SysRegister.motorStopTime)) { MotorStop; // 停止电机 }else { // 继续下一个周期 MotorStop; } } break; case StateMenu_2: { // 运行10秒,暂停160ms,之后每40秒暂停160ms if ((currentTick - SysRegister.modeStartTime) < SysRegister.motorRunTime) { MotorStart; // 运行电机 } else if ((currentTick - SysRegister.modeStartTime) < (SysRegister.motorRunTime + SysRegister.motorStopTime)) { MotorStop; // 停止电机 } else if ((currentTick - SysRegister.modeStartTime) % SysRegister.cycleTime < SysRegister.motorPauseTime) { // 每40秒暂停160ms MotorStop; } else { MotorStart; // 恢复电机运行 } } break; case StateMenu_3: case StateMenu_4: { // 每30秒运行,暂停160ms if ((currentTick - SysRegister.modeStartTime) % SysRegister.cycleTime < SysRegister.motorRunTime) { MotorStart; // 运行电机 } else if ((currentTick - SysRegister.modeStartTime) % SysRegister.cycleTime < (SysRegister.motorRunTime + SysRegister.motorStopTime)) { MotorStop; // 停止电机 } else { MotorStop; // 暂停160ms } } break; default: break; } } /************************ (C) COPYRIGHT ZZY *****END OF FILE******************/