创建话题

新建一个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