|
|
/* 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******************/
|