226 lines
3.8 KiB
Markdown
226 lines
3.8 KiB
Markdown
# OneMessageCPP
|
||
|
||
本仓库为[OneMessage](https://github.com/Jiu-xiao/OneMessage.git)的C++封装,多数API在初始化时会动态申请内存。使用时请对照[OneMessage](https://github.com/Jiu-xiao/OneMessage.git)文档。
|
||
|
||
---
|
||
|
||
## USAGE
|
||
|
||
请参照[OneMessage](https://github.com/Jiu-xiao/OneMessage.git)中的 [Readme.md](https://github.com/Jiu-xiao/OneMessage/blob/master/README.md) 编写om_config.h文件。
|
||
|
||
## om_config.h
|
||
|
||
om_config.h中需要另外声明一个函数,如果在中断中调用此函数,应当返回true,否则返回false。在linux等平台可以直接返回false。
|
||
|
||
```c++
|
||
#include <stdbool.h>
|
||
static inline bool om_in_isr() {
|
||
...
|
||
}
|
||
```
|
||
|
||
## CMake
|
||
|
||
作为CMake子模块编译
|
||
|
||
CMakeList.txt
|
||
|
||
```CMake
|
||
# OneMessageCPP_directory 为OneMessageCPP所在目录
|
||
# om_config_file_directory 为om_config.h所在目录
|
||
|
||
add_subdirectory(OneMessageCPP_directory)
|
||
|
||
target_include_directories(
|
||
OneMessage
|
||
PUBLIC om_config_file_directory
|
||
...
|
||
)
|
||
```
|
||
|
||
## API
|
||
|
||
> `template <typename Data> class Topic`
|
||
|
||
构造函数:
|
||
|
||
Topic可以直接隐式类型转换为om_topic_t*
|
||
|
||
新创建一个Topic,cached为false代表不拷贝数据,只传递指针
|
||
|
||
```c++
|
||
Topic(const char *name, bool cached = false);
|
||
```
|
||
|
||
拷贝一个已有的topic,不允许重复创建同名topic。
|
||
|
||
```c++
|
||
Topic(om_topic_t *topic);
|
||
```
|
||
|
||
队列:
|
||
|
||
```c++
|
||
template <uint32_t Len>
|
||
class Queue{
|
||
Queue(topic_t* topic);
|
||
|
||
uint32_t Size();
|
||
|
||
bool Read(Data& buff);
|
||
|
||
bool Reads(Data* buff, uint32_t len);
|
||
|
||
bool Pop();
|
||
|
||
void Reset();
|
||
}
|
||
```
|
||
|
||
链接:
|
||
|
||
```c++
|
||
bool Link(Topic &source);
|
||
|
||
bool Link(om_topic_t *source);
|
||
|
||
bool Link(const char *source_name);
|
||
```
|
||
|
||
查找topic:
|
||
|
||
```c++
|
||
om_topic_t *Find(const char *name);
|
||
```
|
||
|
||
加锁:
|
||
|
||
```c++
|
||
bool Lock();
|
||
|
||
void Unlock();
|
||
```
|
||
|
||
高级过滤器:
|
||
|
||
```c++
|
||
void RangeDivide(Topic &topic, uint32_t length, uint32_t offset, uint32_t scope, uint32_t start, uint32_t num);
|
||
|
||
void ListDivide(Topic &topic, uint32_t length, uint32_t offset, uint32_t scope, void *temp);
|
||
|
||
void DecomposeDivide(Topic &topic, uint32_t length, uint32_t offset, uint32_t scope);
|
||
```
|
||
|
||
注册回调:
|
||
|
||
```c++
|
||
//Fun的类型应当为bool (*)(Data &, Arg)
|
||
|
||
template <typename Fun, typename Arg>
|
||
void RegisterFilter(Fun fun, Arg arg);
|
||
|
||
|
||
template <typename Fun, typename Arg>
|
||
void RegisterCallback(Fun fun, Arg arg);
|
||
```
|
||
|
||
发布:
|
||
|
||
```c++
|
||
bool Publish(Data &data, bool in_isr = om_in_isr());
|
||
```
|
||
|
||
打包数据:
|
||
|
||
```c++
|
||
bool PackData(RemoteData &data);
|
||
```
|
||
|
||
> `template <typename Data> class Subscriber`
|
||
|
||
构造:
|
||
|
||
构造时需要传入订阅的话题名,如果目标话题未创建,会等待timeout时间后返回。
|
||
|
||
```c++
|
||
Subscriber(const char *name uint32_t timeout = UINT32_MAX);
|
||
```
|
||
|
||
如果能够获取到对应话题,可以使用以下构造函数:
|
||
|
||
```c++
|
||
Subscriber(om_topic_t *topic);
|
||
|
||
Subscriber(Topic<Data> &topic);
|
||
```
|
||
|
||
是否创建成功:
|
||
|
||
```c++
|
||
bool Ready();
|
||
```
|
||
|
||
是否有新数据:
|
||
|
||
```c++
|
||
bool Available();
|
||
```
|
||
|
||
导出数据到绑定的变量:
|
||
|
||
```c++
|
||
bool DumpData(Data& buff, bool in_isr = om_in_isr());
|
||
```
|
||
|
||
> `class Remote`
|
||
|
||
能够解析打包的话题数据。
|
||
|
||
构造函数:
|
||
|
||
```c++
|
||
Remote(uint32_t buff_size, uint32_t topic_num);
|
||
```
|
||
|
||
添加可解析的话题:
|
||
|
||
```c++
|
||
void AddTopic(const char *topic_name);
|
||
|
||
void AddTopic(om_topic_t *topic);
|
||
```
|
||
|
||
解析数据:
|
||
|
||
```c++
|
||
bool PraseData(uint8_t *data, uint32_t size,, bool in_isr = om_in_isr());
|
||
```
|
||
|
||
> `class Event`
|
||
|
||
构造函数:
|
||
|
||
```c++
|
||
Event(const char *name);
|
||
|
||
Event(om_event_group_t *group);
|
||
```
|
||
|
||
查找事件组:
|
||
|
||
```c++
|
||
om_event_group_t *FindEvent(const char *name);
|
||
```
|
||
|
||
注册事件:
|
||
|
||
```c++
|
||
bool Register(uint32_t event, Status status, void (*callback)(uint32_t event, void *arg), void *arg);
|
||
```
|
||
|
||
激活事件:
|
||
|
||
```c++
|
||
bool Active(uint32_t event, bool in_isr = om_in_isr());
|
||
```
|