Go2Py/deploy/dds_bridge/include/unitree/robot/future/request_future.hpp

83 lines
1.7 KiB
C++
Raw Normal View History

2024-01-04 03:45:40 +08:00
#ifndef __UT_DDS_ROBOT_REQUEST_FUTURE_HPP__
#define __UT_DDS_ROBOT_REQUEST_FUTURE_HPP__
#include <unitree/common/lock/lock.hpp>
#include <unitree/robot/internal/internal.hpp>
namespace unitree
{
namespace robot
{
class RequestFutureQueue;
using RequestFutureQueuePtr = std::shared_ptr<RequestFutureQueue>;
/*
* @brief
* @class: RequestFuture
*/
class RequestFuture : public std::enable_shared_from_this<RequestFuture>
{
public:
enum
{
DEFER = 0,
READY = 1
};
explicit RequestFuture();
explicit RequestFuture(int64_t requestId);
~RequestFuture();
void SetRequestId(int64_t requestId);
int64_t GetRequestId() const;
bool SetQueue(const std::shared_ptr<RequestFutureQueue>& futureQueuePtr);
const ResponsePtr& GetResponse(int64_t microsec);
public:
void Ready(const ResponsePtr& requestPtr);
private:
bool IsDeferred();
bool IsReady();
private:
int32_t mState;
int64_t mRequestId;
ResponsePtr mResponsePtr;
common::MutexCond mMutexCond;
RequestFutureQueuePtr mFutureQueuePtr;
};
using RequestFuturePtr = std::shared_ptr<RequestFuture>;
/*
* @brief
* @class: RequestFutureQueue
*/
class RequestFutureQueue
{
public:
using iterator = std::unordered_map<int64_t,RequestFuturePtr>::iterator;
using const_iterator = std::unordered_map<int64_t,RequestFuturePtr>::const_iterator;
RequestFutureQueue();
~RequestFutureQueue();
RequestFuturePtr Get(int64_t requestId);
bool Put(int64_t requestId, const RequestFuturePtr& futurePtr);
void Remove(int64_t requestId);
size_t Size();
private:
common::Mutex mMutex;
std::unordered_map<int64_t,RequestFuturePtr> mFutureMap;
};
}
}
#endif//__UT_DDS_ROBOT_REQUEST_FUTURE_HPP__