@@ -23,7 +23,7 @@ using cdw::multibody::Visualizer;
2323 constexpr std::string_view CMD_##name = #name
2424
2525CANDLEWICK_RUNTIME_DEFINE_COMMAND (send_models);
26- CANDLEWICK_RUNTIME_DEFINE_COMMAND (send_state );
26+ CANDLEWICK_RUNTIME_DEFINE_COMMAND (state_update );
2727CANDLEWICK_RUNTIME_DEFINE_COMMAND (send_cam_pose);
2828CANDLEWICK_RUNTIME_DEFINE_COMMAND (clean);
2929
@@ -32,13 +32,16 @@ using RowMat4d = Eigen::Matrix<pin::context::Scalar, 4, 4, Eigen::RowMajor>;
3232struct ApplicationContext {
3333 pin::Model model;
3434 pin::GeometryModel visual_model;
35+ pin::GeometryModel collision_model;
3536 zmq::context_t ctx{};
3637 zmq::socket_t sync_sock{ctx, zmq::socket_type::rep};
3738 zmq::socket_t state_sock{ctx, zmq::socket_type::sub};
3839};
3940
4041// / Handle first incoming message.
41- bool handle_first_message (zmq::socket_ref sock, ApplicationContext &app_ctx) {
42+ bool handle_first_message (ApplicationContext &app_ctx) {
43+ zmq::socket_t &sock = app_ctx.sync_sock ;
44+
4245 while (true ) {
4346 std::array<zmq::message_t , 2 > msgs;
4447
@@ -70,17 +73,35 @@ bool handle_first_message(zmq::socket_ref sock, ApplicationContext &app_ctx) {
7073 return false ;
7174}
7275
76+ void pull_socket_router (Visualizer &viz, std::span<zmq::message_t , 2 > msgs,
77+ zmq::socket_ref sync_sock) {
78+ auto header = msgs[0 ].to_string_view ();
79+ if (header == CMD_send_cam_pose) {
80+ auto oh = get_handle_from_zmq_msg (std::move (msgs[1 ]));
81+ msgpack::object obj = oh.get ();
82+ ArrayMessage M_msg = obj.as <ArrayMessage>();
83+ auto M = get_eigen_view_from_spec<RowMat4d>(M_msg);
84+ viz.setCameraPose (M);
85+ sync_sock.send (zmq::str_buffer (" ok" ));
86+ } else if (header == CMD_clean) {
87+ viz.clean ();
88+ sync_sock.send (zmq::str_buffer (" ok" ));
89+ }
90+ }
91+
7392void run_main_loop (Visualizer &viz, ApplicationContext &app_ctx) {
7493
7594 while (!viz.shouldExit ()) {
7695 std::array<zmq::message_t , 2 > msgs;
96+
97+ // route subscriber socket
7798 auto rec = zmq::recv_multipart_n (app_ctx.state_sock , msgs.begin (), 2 ,
7899 zmq::recv_flags::dontwait);
79100
80101 if (rec) {
81102 // route through message headers
82103 auto header = msgs[0 ].to_string_view ();
83- if (header == CMD_send_state ) {
104+ if (header == CMD_state_update ) {
84105 auto oh = get_handle_from_zmq_msg (std::move (msgs[1 ]));
85106 msgpack::object obj = oh.get ();
86107 std::tuple<ArrayMessage, std::optional<ArrayMessage>> arrays;
@@ -96,21 +117,11 @@ void run_main_loop(Visualizer &viz, ApplicationContext &app_ctx) {
96117 }
97118 }
98119
120+ // route synchronous socket
99121 rec = zmq::recv_multipart_n (app_ctx.sync_sock , msgs.begin (), 2 ,
100122 zmq::recv_flags::dontwait);
101123 if (rec) {
102- auto header = msgs[0 ].to_string_view ();
103- if (header == CMD_send_cam_pose) {
104- auto oh = get_handle_from_zmq_msg (std::move (msgs[1 ]));
105- msgpack::object obj = oh.get ();
106- ArrayMessage M_msg = obj.as <ArrayMessage>();
107- auto M = get_eigen_view_from_spec<RowMat4d>(M_msg);
108- viz.setCameraPose (M);
109- app_ctx.sync_sock .send (zmq::str_buffer (" ok" ));
110- } else if (header == CMD_clean) {
111- viz.clean ();
112- app_ctx.sync_sock .send (zmq::str_buffer (" ok" ));
113- }
124+ pull_socket_router (viz, msgs, app_ctx.sync_sock );
114125 }
115126
116127 viz.display ();
@@ -138,7 +149,7 @@ int main(int argc, char **argv) {
138149 zmq::socket_t &state_sock = app_ctx.state_sock ;
139150 sync_sock.bind (std::format (" tcp://{:s}:{:d}" , hostname, port));
140151 state_sock.bind (std::format (" tcp://{:s}:{:d}" , hostname, port + 2 ));
141- state_sock.set (zmq::sockopt::subscribe, CMD_send_state );
152+ state_sock.set (zmq::sockopt::subscribe, CMD_state_update );
142153
143154 std::string endpoint;
144155 endpoint = sync_sock.get (zmq::sockopt::last_endpoint);
@@ -147,7 +158,7 @@ int main(int argc, char **argv) {
147158 SDL_Log (" ZMQ endpoint (state): %s" , endpoint.c_str ());
148159
149160 // Handle first message
150- bool loaded_models = handle_first_message (sync_sock, app_ctx);
161+ bool loaded_models = handle_first_message (app_ctx);
151162 if (!loaded_models)
152163 return 1 ;
153164
0 commit comments