RMUL2025/lib/one-message/README.md

226 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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*
新创建一个Topiccached为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());
```