C语言常用的注册手段----个人笔记

想法:

        有几个【动作单元】需要排列组合成一个【动作】。

        为了方便快速新建【动作】,可以新建一个结构体,结构体里面存放这些【动作单元】

        有一系列的【动作】需要排列,成为【动作组】。

        为了方便快速调整/新建【动作组】,可以新建一个结构体,结构体存放这些【动作】。

        【动作单元】*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
);

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值