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

173 lines
4.1 KiB

3 days ago
/*
* bsp_FSM.c
*
* Created on: Aug 2, 2024
* Author: akeguo
*/
#include <FSM.h>
#include "bsp_hardware_hash_table.h"
#include "MSP/msp_MK32.h"
void GF_Dispatch();
//Manual=0,
// Auto,
// Abnormal,
// SetLaneChangeDistance,
// SetBackwardsDistance,
// LaneChangeMode,
// Forwards,
// Backwards,
// TurnLeft,
// TurnRight
ACTION_MAP_t actionMap[] =
{
{ Manual, Manual_State_Entry, Manual_State_Do, Manual_State_Exit },
{ Auto, Auto_State_Entry, Auto_State_Do, Auto_State_Exit },
{ SetLaneChangeDistance, LaneChangeDistance_Setting_State_Entry, LaneChangeDistance_Setting_State_Do, LaneChangeDistance_Setting_State_Exit },
{ SetBackwardsDistance, BackWardsDistance_Setting_State_Entry, BackWardsDistance_Setting_State_Do, BackWardsDistance_Setting_State_Exit },
{ Forwards, Forwards_State_Entry, Forwards_State_Do, Forwards_State_Exit },
{ Backwards, Backwards_State_Entry, Backwards_State_Do, Backwards_State_Exit },
{ TurnLeft, TurnLeft_State_Entry, TurnLeft_State_Do, TurnLeft_State_Exit },
{ TurnRight, TurnRight_State_Entry, TurnRight_State_Do, TurnRight_State_Exit },
};
EVENT_MAP_t eventMap[] =
{
{ EVENT_Manual, Manual, Manual },
{ EVENT_Auto, Auto, Auto },
{ EVENT_Abnormal, Abnormal, Abnormal },
{ EVENT_SetLaneChangeDistance, SetLaneChangeDistance, SetLaneChangeDistance },
{ EVENT_SetBackwardsDistance, SetBackwardsDistance, SetBackwardsDistance },
{ EVENT_LaneChangeMode, LaneChangeMode, LaneChangeMode },
{ EVENT_Forwards, Forwards, Forwards },
{ EVENT_Backwards, Backwards, Backwards },
{ EVENT_TurnLeft, TurnLeft, TurnLeft },
{ EVENT_TurnRight, TurnRight, TurnRight },
{ EVENT_MAP_END, 0, 0 }, };
FSM_t RobotFSM; //定义状态机
void fsm_init(FSM_t *pFsm, EVENT_MAP_t *pEventMap, ACTION_MAP_t *pActionMap)
{
//pFsm->stCurState = 0;
pFsm->stCurState = EVENT_Abnormal;
pFsm->stNextState = EVENT_MAP_END;
pFsm->pEventMap = pEventMap;
pFsm->pActionMap = pActionMap;
}
void fsm_state_transfer(FSM_t *pFsm, EVENT_t stEventID)
{
char i = 0;
for (i = 0; pFsm->pEventMap[i].stEventID < EVENT_MAP_END; i++)
{
if (stEventID == pFsm->pEventMap[i].stEventID) //MAKE SURE THIS STATE EXISTS
{
if (pFsm->stCurState != stEventID)
{
pFsm->stNextState = stEventID; //pFsm->pEventMap[i].stNextState;
} else
{
pFsm->stNextState = EVENT_MAP_END; //pFsm->pEventMap[i].stNextState;
}
return;
}
}
}
void action_perfrom(FSM_t *pFsm)
{
if (EVENT_MAP_END != pFsm->stNextState)
{
pFsm->pActionMap[pFsm->stCurState].ExitAct();
pFsm->pActionMap[pFsm->stNextState].EnterAct();
pFsm->stCurState = pFsm->stNextState;
pFsm->stNextState = EVENT_MAP_END;
} else
{
pFsm->pActionMap[pFsm->stCurState].RunningAct();
}
}
void Fsm_Init()
{
fsm_init(&RobotFSM, eventMap, actionMap); //注册状态机
GF_BSP_Interrupt_Add_CallBack(
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, GF_Dispatch);
}
bool IsAbnormal = false;
int GF_Dispacher_Counter = 0;
void GF_Dispatch()
{
if(GV.DH_CAN.Work_Start==1)
{
fsm_state_transfer(&RobotFSM, EVENT_Auto);
}else
{
// fsm_state_transfer(&RobotFSM, EVENT_Manual);
if (GV.DH_CAN.Swing_Right == 1)
{
GV.SwingMotor.Target_Position -= 100;
} else if (GV.DH_CAN.Swing_Left == 1)
{
GV.SwingMotor.Target_Position += 100;
}
if (GV.DH_CAN.Mode_Selection == 9) //换道距离设定
{
fsm_state_transfer(&RobotFSM, EVENT_SetLaneChangeDistance);
} else if (GV.DH_CAN.Mode_Selection == 10) //后退距离设定
{
fsm_state_transfer(&RobotFSM, EVENT_SetBackwardsDistance);
}
//前进
if (GV.DH_CAN.Move_Forward == 1)
{
fsm_state_transfer(&RobotFSM, EVENT_Forwards);
} else if (GV.DH_CAN.Move_Backward == 1) //后退左转右转
{
fsm_state_transfer(&RobotFSM, EVENT_Backwards);
} else if (GV.DH_CAN.Move_Turn_Left == 1)
{
fsm_state_transfer(&RobotFSM, EVENT_TurnLeft); //左转
} else if (GV.DH_CAN.Move_Turn_Right == 1)//右转
{
fsm_state_transfer(&RobotFSM, EVENT_TurnRight);
}
}
#if 0
if (IsAbnornalStatus == 1)
{
IsAbnormal = true;
//进入异常状态;
fsm_state_transfer(&RobotFSM, EVENT_Abnormal);
} else
{
//退出异常状态
IsAbnormal = false;
}
#endif 0
//}
action_perfrom(&RobotFSM);
}