//
// Created by Ht on 2022/1/15.
//


#ifndef INC_0_LIBDEVCPP_QFLOWCONTROLLER_H
#define INC_0_LIBDEVCPP_QFLOWCONTROLLER_H

/**
 * 流量控制器：
 *         用于限定特定函数中的指令发送间隔，可作为静态控制、动态控制、按类型设定流量间隔时间。
 *         ：：
 *          例如：蓝牙mesh网关，限定wifi指令向网关下发控制指令的最小时间间隔：
 *              （1）Controller中可以快速发起回调函数调用指令，但相邻两个回调函数执行的间隔不低于指定间隔。
 *              （2）可用于保护对串口的最终writeData指令的执行时间间隔
 *
 */

#include <jebase/config.h>
#include <qlibc/httplib.h>
#include <qlibc/DateUtils.hpp>

namespace qlibc {

    using QFlowHandler = std::function<void(void)>;

    class JE_API QFlowController {
    protected:
        httplib::RThreadPool pool_;
        unsigned long gap_;
        std::list<QFlowHandler> qued_;
        std::mutex    m_;
        unsigned long last_access_ = 0;
        QFlowHandler* clearPool = nullptr;
        bool        wait_:1;

    public:
        explicit  QFlowController(httplib::RThreadPool pool, int gap);

        virtual ~QFlowController();

        void updateTimeGap(int gap);

        void call(const QFlowHandler& handler);
    };


}


#endif //INC_0_LIBDEVCPP_QFLOWCONTROLLER_H
