You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

309 lines
9.3 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* 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停止40ms30秒后暂停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******************/