#pragma once
#include <stdint.h>
#include <string.h>
#include <rtthread.h>
namespace rtthread {
template<typename T, uint32_t queue_sz>
class Mail {
public:
Mail(const char *name = "")
{
rt_mb_init(&mID, name, mPool, queue_sz, RT_IPC_FLAG_FIFO);
}
~Mail()
{
rt_mb_detach(&mID);
}
bool put(T *mptr, int32_t millisec = 0)
{
rt_int32_t tick;
if (millisec < 0)
tick = -1;
else
tick = rt_tick_from_millisecond(millisec);
return rt_mb_send_wait(&mID, (rt_uint32_t)mptr, tick) == RT_EOK;
}
T* get(int32_t millisec = -1)
{
T *t = NULL;
rt_int32_t tick;
if (millisec < 0)
tick = -1;
else
tick = rt_tick_from_millisecond(millisec);
rt_mb_recv(&mID, &t, tick);
return t;
}
private:
struct rt_mailbox mID;
T* mPool[queue_sz];
};
}