基于C語言的最優(yōu)HSM狀態(tài)機(jī)架構(gòu)實現(xiàn)
前言:
本框架實現(xiàn)的目的是在基于51單片機(jī)為控制芯片的產(chǎn)品內(nèi),因為51單片機(jī)的內(nèi)存和堆棧比較有限,此框架比較簡潔高效的。如果用于其他高性能的處理器內(nèi),可以考慮利用鏈表實現(xiàn),實現(xiàn)更自由的操作。
一、雙層狀態(tài)機(jī)框架
狀態(tài)機(jī)架構(gòu)
二、直接上代碼
頭文件如下:
作者:小魚兒飛丫飛
日期:2020-6-19
文件名:FSM層次狀態(tài)機(jī)頭文件
****************************************************************************/
#ifndef __HSM_H__
#define __HSM_H__
/****************************************************************************
頭文件
****************************************************************************/
#include "stdio.h"
/****************************************************************************
紅定義
****************************************************************************/
#define KEPP_STATE_CNT (5)
#define uint8_t unsigned char
/****************************************************************************
變量
****************************************************************************/
typedef void (*procedure) (void);//--函數(shù)指針
//--定義狀態(tài)
typedef enum _FATHER_STATES{
s_father_init =0,
s_father_keep,
s_father_done,
s_father_default,
}E_father_states;
E_father_states s_father_step;//--父類單個狀態(tài)內(nèi)部轉(zhuǎn)換步驟
typedef enum _CHILDER_STATES{
s_childer_init =0,
s_childer_keep,
s_childer_done,
s_childer_default,
}E_childer_states;
E_childer_states s_childer_step;//--子類單個狀態(tài)內(nèi)部轉(zhuǎn)換步驟
//--定義狀態(tài)成員函數(shù)
typedef struct __STATES_FUN{
procedure steps[4] ;//--函數(shù)指針數(shù)組
}S_state_fun;
S_state_fun father_state[2];//--超類集合
S_state_fun childer_state[8];//--子類集合
typedef enum {
e_static_state =0,
e_run_state ,
}E_hsm_father_state;
E_hsm_father_state hsm_current_father_state;//--當(dāng)前父狀態(tài)
E_hsm_father_state hsm_last_father_state;//-上一次父狀態(tài)
typedef enum {
e_set_state =0,
e_distribution_network_state ,
e_shut_down_state,
e_charge_state,
e_Normal_state,
e_dry_state,
e_besiege_state,
e_avoid_obstacles
}E_hsm_childer_state;
E_hsm_childer_state hsm_current_childer_state;//--當(dāng)前子狀態(tài)
E_hsm_childer_state hsm_last_childer_state;//--上一次子狀態(tài)
/****************************************************************************
函數(shù)
****************************************************************************/
//--子狀態(tài)是否允許跳轉(zhuǎn)
uint8_t Childer_State_Is_Allow_Jump(void);
//--子狀態(tài)是否要發(fā)生狀態(tài)轉(zhuǎn)換
uint8_t Is_Three_A_Childer_State_Transition(void);
//--子類狀態(tài)轉(zhuǎn)換
void Childer_State_Transition(E_hsm_childer_state temp);
//--子類更新上一次狀態(tài)
void Update_Childer_Last_State_Transition(void);
//--子類單個狀態(tài)內(nèi)部轉(zhuǎn)換
void Childer_Step_Transition(E_childer_states temp);
//--父狀態(tài)是否允許跳轉(zhuǎn)
uint8_t Father_State_Is_Allow_Jump(void);
//--父狀態(tài)是否要發(fā)生狀態(tài)轉(zhuǎn)換
uint8_t Is_Three_A_Father_State_Transition(void);
//--夫類狀態(tài)轉(zhuǎn)換
void Father_State_Transition(E_hsm_father_state temp);
//--父類更新上一次狀態(tài)
void Update_Father_Last_State_Transition(void);
//--夫類狀態(tài)內(nèi)部轉(zhuǎn)換
void Father_Step_Transition(E_father_states temp);
/*************************************************
* 靜止?fàn)顟B(tài)(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void F_Static_Init(void );
void F_Static_Keep(void);
void F_Satic_Done(void );
void F_Static_Default(void );
/*************************************************
* 運(yùn)行狀態(tài)(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void F_Run_Init(void);
void F_Run_Keep(void );
void F_Run_Done(void );
void F_Run_Default(void );
/*************************************************
* 設(shè)置狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Set_Init();
void C_Static_Set_Keep();
void C_Satic_Set_Done();
void C_Static_Set_Default();
/*************************************************
* 配網(wǎng)狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Distribution_Network_Init(void );
void C_Static_Distribution_Network_Keep(void );
void C_Satic_Distribution_Network_Done(void );
void C_Static_Distribution_Network_Default(void );
/*************************************************
* 待機(jī)狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Shut_Down_Init(void );
void C_Static_Shut_Down_Keep(void );
void C_Satic_Shut_Down_Done(void );
void C_Static_Shut_Down_Default(void );
/*************************************************
* 充電狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Charge_Init(void );
void C_Static_Charge_Keep(void );
void C_Satic_Charge_Done(void );
void C_Static_Charge_Default(void );
/*************************************************
* 正常狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Normal_Init(void );
void C_Run_Normal_Keep(void );
void C_Run_Normal_Done(void );
void C_Run_Normal_Default(void );
/*************************************************
* 干托狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Dry_Init(void );
void C_Run_Dry_Keep(void );
void C_Run_Dry_Done(void );
void C_Run_Dry_Default(void );
/*************************************************
* 受困狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Besiege_Init(void );
void C_Run_Besiege_Keep(void );
void C_Run_Besiege_Done(void);
void C_Run_Besiege_Default(void);
/*************************************************
* 避障狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Avoid_Obstacles_Init(void );
void C_Run_Avoid_Obstacles_Keep(void );
void C_Run_Avoid_Obstacles_Done(void );
void C_Run_Avoid_Obstacles_Default(void );
#endif
實現(xiàn)文件如下:
作者:小魚兒飛丫飛
日期:2020-6-19
文件名:FSM層次狀態(tài)機(jī)執(zhí)行文件
****************************************************************************/
/****************************************************************************
頭文件
****************************************************************************/
#include "hsm.h"
/****************************************************************************
紅定義
****************************************************************************/
/****************************************************************************
變量
****************************************************************************/
S_state_fun father_state[2] ={
{F_Static_Init,F_Static_Keep,F_Satic_Done,F_Static_Default},
{F_Run_Init,F_Run_Keep,F_Run_Done,F_Run_Default }
};//--超類/夫類
S_state_fun childer_state[8]={
{ C_Static_Set_Init,C_Static_Set_Keep,C_Satic_Set_Done,C_Static_Set_Default},
{C_Static_Distribution_Network_Init,C_Static_Distribution_Network_Keep,C_Satic_Distribution_Network_Done,C_Static_Distribution_Network_Default},
{C_Static_Shut_Down_Init,C_Static_Shut_Down_Keep,C_Satic_Shut_Down_Done,C_Static_Shut_Down_Default},
{C_Static_Charge_Init,C_Static_Charge_Keep,C_Satic_Charge_Done,C_Static_Charge_Default},
{ C_Run_Normal_Init,C_Run_Normal_Keep,C_Run_Normal_Done,C_Run_Normal_Default},
{ C_Run_Dry_Init,C_Run_Dry_Keep, C_Run_Dry_Done,C_Run_Dry_Default},
{ C_Run_Besiege_Init,C_Run_Besiege_Keep,C_Run_Besiege_Done, C_Run_Besiege_Default},
{C_Run_Avoid_Obstacles_Init,C_Run_Avoid_Obstacles_Keep,C_Run_Avoid_Obstacles_Done,C_Run_Avoid_Obstacles_Default}
};//--子類1
E_father_states s_father_step=s_father_init ; //--父類單個狀態(tài)內(nèi)部轉(zhuǎn)換步驟
E_childer_states s_childer_step = s_childer_init;
E_hsm_father_state hsm_current_father_state = e_static_state;//--父類初始化
E_hsm_father_state hsm_last_father_state = e_static_state ;
E_hsm_childer_state hsm_current_childer_state = e_set_state;//--子類初始化
E_hsm_childer_state hsm_last_childer_state = e_set_state;
/****************************************************************************
函數(shù)
狀態(tài)函數(shù)命名規(guī)則
例 : C_Static_Set_Init
C _ Static_ Set _ Init
C:子類 F:父類_依附的父類_子類本身名字_該子類狀態(tài)內(nèi)部階段
****************************************************************************/
int main(void)
{
int update_cnt = 10;
int run_cnt =1;
int cnt;
while(1)
{
if(update_cnt==80)
{
hsm_current_father_state =0;
hsm_current_childer_state = 0;
}
else if(update_cnt==70)
{
hsm_current_father_state =0;
hsm_current_childer_state = 1;
}
else if(update_cnt==60)
{
hsm_current_father_state =0;
hsm_current_childer_state = 2;
}
else if(update_cnt==50)
{
hsm_current_father_state =0;
hsm_current_childer_state = 3;
}
else if(update_cnt==40)
{
hsm_current_father_state =1;
hsm_current_childer_state = 4;
}
else if(update_cnt==30)
{
hsm_current_father_state =1;
hsm_current_childer_state = 5;
}
else if(update_cnt==20)
{
hsm_current_father_state =1;
hsm_current_childer_state = 6;
}
else if(update_cnt==10)
{
hsm_current_father_state =1;
hsm_current_childer_state = 7;
}
update_cnt--;
if(update_cnt==0)
{update_cnt =80;}
// printf("hsm_current_father_state:%d hsm_current_childer_state:%d\r\n",hsm_current_father_state,hsm_current_childer_state);
//=================================父類狀態(tài)機(jī)調(diào)度器=========================================
if(Father_State_Is_Allow_Jump())//--如果允許跳轉(zhuǎn)
father_state[hsm_current_father_state].steps[s_father_step]();//--父類狀態(tài)
else
father_state[hsm_last_father_state].steps[s_father_step]();//--父類狀態(tài)
//==========================================================================
}
return 0;
}
//--子狀態(tài)是否允許跳轉(zhuǎn)
uint8_t Childer_State_Is_Allow_Jump(void)
{
if(s_childer_step == s_childer_init)
return 1;
else
return 0;
}
//--子狀態(tài)是否要發(fā)生狀態(tài)轉(zhuǎn)換
uint8_t Is_Three_A_Childer_State_Transition(void)
{
if(hsm_last_childer_state == hsm_current_childer_state)
return 0;
else
return 1;
}
//--子類狀態(tài)轉(zhuǎn)換
void Childer_State_Transition(E_hsm_childer_state temp)
{
hsm_current_childer_state = temp;
}
//--子類更新上一次狀態(tài)
void Update_Childer_Last_State_Transition(void)
{
hsm_last_childer_state = hsm_current_childer_state;
}
//--子類單個狀態(tài)內(nèi)部轉(zhuǎn)換
void Childer_Step_Transition(E_childer_states temp)
{
s_childer_step = temp;
}
//--父狀態(tài)是否允許跳轉(zhuǎn)
uint8_t Father_State_Is_Allow_Jump(void)
{
if(s_father_step == s_father_init)
return 1;
else
return 0;
}
//--父狀態(tài)是否要發(fā)生狀態(tài)轉(zhuǎn)換
uint8_t Is_Three_A_Father_State_Transition(void)
{
if(hsm_last_father_state == hsm_current_father_state)
return 0;
else
return 1;
}
//--夫類狀態(tài)轉(zhuǎn)換
void Father_State_Transition(E_hsm_father_state temp)
{
hsm_current_father_state = temp;
}
//--父類更新上一次狀態(tài)
void Update_Father_Last_State_Transition(void)
{
hsm_last_father_state = hsm_current_father_state;
}
//--夫類狀態(tài)內(nèi)部轉(zhuǎn)換
void Father_Step_Transition(E_father_states temp)
{
s_father_step = temp;
}
/*************************************************
* 靜止?fàn)顟B(tài)(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void F_Static_Init(void)
{
Update_Father_Last_State_Transition();
//---------------------
//--代碼段
printf("===父類:靜止?fàn)顟B(tài)====進(jìn)入函數(shù)>>>>>>>>>>>>>>>>>>>>>\r\n");
//--------------------
Father_Step_Transition(s_father_keep);
}
void F_Static_Keep(void )
{
//---------------------
//--代碼段
// printf("===父類:靜止?fàn)顟B(tài)====保持函數(shù)--------------------\r\n");
//==========子類狀態(tài)機(jī)調(diào)度器======================
if(Childer_State_Is_Allow_Jump())//--如果允許跳轉(zhuǎn)
{
//--如果父類出現(xiàn)類跳轉(zhuǎn),子類已經(jīng)做好跳轉(zhuǎn)的準(zhǔn)備,但是父類還未做好跳轉(zhuǎn)的準(zhǔn)備,此時不執(zhí)行子類跳轉(zhuǎn)
if(Is_Three_A_Father_State_Transition())
{
Father_Step_Transition(s_father_done);
return;
}
else
Father_Step_Transition(s_father_keep);
childer_state[hsm_current_childer_state].steps[s_childer_step]();//--子類狀態(tài)
}
else
childer_state[hsm_last_childer_state].steps[s_childer_step]();//--子類狀態(tài)
//--------------------
}
void F_Satic_Done(void)
{
//---------------------
//--代碼段
printf("===父類:靜止?fàn)顟B(tài)====退出函數(shù)<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
//--------------------
//--內(nèi)部切換
Father_Step_Transition(s_father_init);
}
void F_Static_Default(void )
{
;
}
/*************************************************
* 運(yùn)行狀態(tài)(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void F_Run_Init(void )
{
Update_Father_Last_State_Transition();
//---------------------
//--代碼段
printf("===父類:運(yùn)行狀態(tài)====進(jìn)入函數(shù)>>>>>>>>>>>>>>>>>>>>>>>>>>\r\n");
//--------------------
Father_Step_Transition(s_father_keep);
}
void F_Run_Keep(void )
{
//---------------------
//--代碼段
//printf("===父類:運(yùn)行狀態(tài)====保持函數(shù)--------------------\r\n");
//==========子類狀態(tài)機(jī)調(diào)度器======================
if(Childer_State_Is_Allow_Jump())//--如果允許跳轉(zhuǎn)
{
//--如果父類出現(xiàn)類跳轉(zhuǎn),子類已經(jīng)做好跳轉(zhuǎn)的準(zhǔn)備,但是父類還未做好跳轉(zhuǎn)的準(zhǔn)備,此時不執(zhí)行子類跳轉(zhuǎn)
if(Is_Three_A_Father_State_Transition())
{
Father_Step_Transition(s_father_done);
return;
}
else
Father_Step_Transition(s_father_keep);
childer_state[hsm_current_childer_state].steps[s_childer_step]();//--子類狀態(tài)
}
else
childer_state[hsm_last_childer_state].steps[s_childer_step]();//--子類狀態(tài)
}
void F_Run_Done(void)
{
//---------------------
//--代碼段
printf("===父類:運(yùn)行狀態(tài)====退出函數(shù)<<<<<<<<<<<<<<<<<<<<<<\r\n");
//--------------------
//--內(nèi)部切換
Father_Step_Transition(s_father_init);
}
void F_Run_Default(void )
{
;
}
/*************************************************
* 設(shè)置狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Set_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:設(shè)置狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Static_Set_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:設(shè)置狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Satic_Set_Done(void )
{
//---------------------
//--代碼段
printf("===子類:設(shè)置狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Static_Set_Default(void)
{
;
}
/*************************************************
* 配網(wǎng)狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Distribution_Network_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:陪網(wǎng)狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Static_Distribution_Network_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:陪網(wǎng)狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Satic_Distribution_Network_Done(void )
{
//---------------------
//--代碼段
printf("===子類:陪網(wǎng)狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Static_Distribution_Network_Default(void )
{
;
}
/*************************************************
* 待機(jī)狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Shut_Down_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:待機(jī)狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Static_Shut_Down_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:待機(jī)狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Satic_Shut_Down_Done(void )
{
//---------------------
//--代碼段
printf("===子類:待機(jī)狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Static_Shut_Down_Default(void )
{
;
}
/*************************************************
* 充電狀態(tài)(子類)依附靜止(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Static_Charge_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:充電狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Static_Charge_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:充電狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Satic_Charge_Done(void )
{
//---------------------
//--代碼段
printf("===子類:充電狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Static_Charge_Default(void )
{
;
}
/*************************************************
* 正常狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Normal_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:正常狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Normal_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:正常狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Normal_Done(void)
{
//---------------------
//--代碼段
printf("===子類:正常狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Run_Normal_Default(void)
{
;
}
/*************************************************
* 干托狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Dry_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:干托狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Dry_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:干托狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Dry_Done(void )
{
//---------------------
//--代碼段
printf("===子類:干托狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Run_Dry_Default(void )
{
;
}
/*************************************************
* 受困狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Besiege_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:受困狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Besiege_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:受困狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Besiege_Done(void )
{
//---------------------
//--代碼段
printf("===子類:受困狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Run_Besiege_Default(void )
{
;
}
/*************************************************
* 避障狀態(tài)(子類)依附運(yùn)行(夫類)
* 進(jìn)入函數(shù)
* 保持函數(shù)
* 退出函數(shù)
* 錯誤函數(shù)
* *************************************************/
void C_Run_Avoid_Obstacles_Init(void )
{
Update_Childer_Last_State_Transition();
//---------------------
//--代碼段
printf("===子類:避障狀態(tài)====進(jìn)入函數(shù)>>>\r\n");
//--------------------
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Avoid_Obstacles_Keep(void )
{
//---------------------
//--代碼段
printf("===子類:避障狀態(tài)====保持函數(shù)\r\n");
//--------------------
if(Is_Three_A_Childer_State_Transition())
Childer_Step_Transition(s_childer_done);
else
Childer_Step_Transition(s_childer_keep);
}
void C_Run_Avoid_Obstacles_Done(void )
{
//---------------------
//--代碼段
printf("===子類:避障狀態(tài)====退出函數(shù)<<<\r\n");
//--------------------
//--內(nèi)部切換
Childer_Step_Transition(s_childer_init);
}
void C_Run_Avoid_Obstacles_Default(void )
{
;
}
三、運(yùn)行情況
版權(quán)歸原作者所有,如有轉(zhuǎn)載請聯(lián)系我,如有侵權(quán),請聯(lián)系刪除。???????????????? END ????????????????關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。