跳到主要内容

hooks模块

在控制系统特定的操作可触发对应的回调,可在插件实现对应的逻辑。
控制系统执行这些逻辑的时候就会自动执行插件的逻辑。例如pp2main等事件

使用例子:

/**
 * @brief 事件列表
 */
enum HookEventAPI{
    INVALID_EVENT,
    POINT_CHANGE,    ///< 点位增加删除修改事件回调
    PP_TO_MAIN,     ///< pp2main回调
    PP_TO_LINE,     ///< pp2line事件回调
    B_START_RUN,    ///< 开始运行事件回调
    B_PAUSE_RUN,    ///< 暂停运行事件回调
    E_STOP_RUN     ///< 急停事件回调
};

/**
 * @brief 指定hook回调的运行方式
 */
enum RunTypeAPI:short{
    SYNC_RUN, ///< 同步运行,会阻塞控制器对应的事件
    ASYNC_RUN_IN_THREAD_POOL, ///< 在普通线程池运行
    ASYNC_RUN_IN_RT_THREAD ///< 在rt线程运行
};


/**
 * @brief 测试pp2line带参数的hook
*/
void TestPP2LineHooks(){
    namespace xhooks = xcore_api::hooks;
    xhooks::HookDataAPI data;
    data.SetEvent(xhooks::PP_TO_LINE);
    auto func = [](const std::shared_ptr<const xhooks::HookArgsBaseAPI> p){
        LOG_INFO<<"this is pp2line callback:";
        const auto ptr = std::dynamic_pointer_cast<const xhooks::HookPPToLineArgsAPI>(p);
        if(ptr == nullptr){
            LOG_INFO<<"pp2line callback: nullptr";
        } else {
            LOG_INFO<<ptr->GetTaskName()<<" : "<<ptr->GetFileName()<<" : "<<ptr->GetFileLine();
        }
    };
    data.SetHook(func);
    int id = xhooks::RegisterHooksAPI(data);
    LOG_INFO<<"register pp2line hook id:"<<id;
}

在HMI使用printq指令,执行到该指令会在日志中打印四元数。用户可使用客户端插件在辅助编程中将该指令注入,即可方便使用新注册的指令。

hooks结果1

hooks结果2