# 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 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 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 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 void RegisterFilter(Fun fun, Arg arg); template void RegisterCallback(Fun fun, Arg arg); ``` 发布: ```c++ bool Publish(Data &data, bool in_isr = om_in_isr()); ``` 打包数据: ```c++ bool PackData(RemoteData &data); ``` > `template class Subscriber` 构造: 构造时需要传入订阅的话题名,如果目标话题未创建,会等待timeout时间后返回。 ```c++ Subscriber(const char *name uint32_t timeout = UINT32_MAX); ``` 如果能够获取到对应话题,可以使用以下构造函数: ```c++ Subscriber(om_topic_t *topic); Subscriber(Topic &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()); ```