创建话题
新建一个module,并在其中创建一个topic,学习如何发布消息
新建module
执行下面两条命令,你会发现工程目录多出了/src/module/message_test和/src/robot/msg两个文件夹
./project.py new module message_test
./project.py new robot msg
创建配置文件
执行./project.py config
,在弹出窗口中进行配置后,点击Save并关闭。
- board:MiniPC
- system:Linux
- robot:msg
- device:无
- module:message_test
完善module
修改类名,添加构造函数和配置文件结构体
mod_message_test.cpp
#include "mod_message_test.hpp"
using namespace Module;
MessageTest::MessageTest(Param& param) : param_(param) {}
mod_message_test.hpp
#include <module.hpp>
namespace Module {
class MessageTest {
public:
struct Param {};
MessageTest(Param& param);
private:
Param& param_;
};
} // namespace Module
完善robot
修改类名,添加构造函数和配置文件结构体。添加MessageTest模块。
robot.hpp
#include "mod_message_test.hpp"
void robot_init();
namespace Robot {
class MSG {
public:
struct Param {
Module::MessageTest::Param msg_test;
};
Module::MessageTest msg_test_;
MSG(Param& param) : msg_test_(param.msg_test) {}
};
} // namespace Robot
编写配置文件,并在init_thread_fn中创建robot.
robot.cpp
#include "robot.hpp"
#include <system.hpp>
#include <thread.hpp>
using namespace Robot;
/* clang-format off */
MSG::Param param = {
.msg_test = {
}
};
/* clang-format on */
void robot_init() { System::Start<Robot::MSG, Robot::MSG::Param>(param); }
创建topic
在类MessageTest内创建数据结构体
struct Data {
float d1;
int d2;
char d3;
};
然后使用此结构体实例化一个topic模板
Message::Topic<Data> topic_;
在初始化列表里初始化此对象。话题名为test_topic
MessageTest::MessageTest(Param& param) : param_(param), topic_("test_topic") {}
开启一个线程,定时使data_.d2自加并发布消息
mod_message_test.cpp
#include "mod_message_test.hpp"
#include <thread.hpp>
using namespace Module;
MessageTest::MessageTest(Param& param) : param_(param), topic_("test_topic") {
auto pub_thread_fn = [](MessageTest* msg_test) {
while (1) {
msg_test->pub_data_.d2++;
msg_test->topic_.Publish(msg_test->pub_data_);
msg_test->pub_thread_.SleepUntil(1);
}
};
this->pub_thread_.Create(pub_thread_fn, this, "msg_test_pub_thread", 256,
System::Thread::MEDIUM)
}
mod_message_test.hpp
#include <module.hpp>
#include <thread.hpp>
#include "om.hpp"
namespace Module {
class MessageTest {
public:
struct Param {};
struct Data {
float d1;
int d2;
char d3;
};
MessageTest(Param& param);
private:
Param& param_;
Data pub_data_;
Message::Topic<Data> topic_;
System::Thread pub_thread_;
};
} // namespace Module