想法:
有几个【动作单元】需要排列组合成一个【动作】。
为了方便快速新建【动作】,可以新建一个结构体,结构体里面存放这些【动作单元】
有一系列的【动作】需要排列,成为【动作组】。
为了方便快速调整/新建【动作组】,可以新建一个结构体,结构体存放这些【动作】。
【动作单元】*n = 【动作】 【动作】*n = 【动作组】
实现:
【动作单元】我们将需要执行的动作和当前执行到的步骤做成结构体
// 动作单元: 动作结构体 存储动作单元以及动作单元完成step
struct SAction_Struct {
volatile uint8_t step;
uint8_t (*ActionFunc)(void);
};
typedef struct SAction_Struct Action_Struct;
typedef Action_Struct *PAction_Struct;
为了快速组合【动作单元】为【动作】,我们再建立一个结构体
enum{
START,
EXECING,
EXECOVER
};
// 动作
struct ActionParm{
PActionUint_Struct gActionUintList;
uint16_t listSize;
uint16_t curExecIndex;
uint8_t enable;
uint8_t execFlag;
};
typedef struct ActionParm ActionParm_STRUCT;
typedef ActionParm_STRUCT *PActionParm_STRUCT;
// 将动作单元注册进来 成为动作
#define ACTION_FUNC_EXPORT(name, actionUint...) \
ActionUint_Struct gActionUintList##name[] = \
{ \
actionUint \
}; \
ActionParm_STRUCT name = { \
gActionUintList##name, \
sizeof(gActionUintList##name)/sizeof(ActionUint_Struct), \
0, \
0, \
START \
};
然后我们就可以通过 ACTION_FUNC_EXPORT 注册【动作单元】成为一个【动作】了。
ACTION_FUNC_EXPORT(gClear1111,
{0,funcA},
{0,funcB},
{0,funcC},
{0,funcA},
);
ACTION_FUNC_EXPORT(gClear22222,
{0,funcC},
{0,funcA},
{0,funcB},
{0,funcB},
);
接下来我们要将 gClear11111,gClear22222两个【动作】,或者更多【动作】组合成一个【动作组】。
// 将 动作 注册进来 成为 动作组
struct SMultActionsParm{
PActionParm_STRUCT *gMultActionsList;
uint16_t listSize;
uint16_t curExecIndex;
uint8_t enable;
};
typedef struct SMultActionsParm MultActionsParm;
typedef MultActionsParm *PMultActionsParm;
// 将动作组 注册进来 自动轮询
#define MULTACTION_FUNC_EXPORT(name, pActionName...) \
PActionParm_STRUCT gMultActionsList##name[] = \
{ \
pActionName \
}; \
MultActionsParm name = { \
gMultActionsList##name, \
sizeof(gMultActionsList##name)/sizeof(ActionParm_STRUCT), \
0, \
0 \
};
下面我们就可以定义一个【动作组】包含下面几个动作
MULTACTION_FUNC_EXPORT(gAutoDetectFunc,
&gClear11111,
&gClear22222,
&gClear11111,
&gClear22222,
&gClear11111,
&gClear22222
);