2 #include <ossia/network/sockets/udp_socket.hpp>
4 #include <boost/asio/ip/basic_resolver.hpp>
5 #include <boost/asio/ip/udp.hpp>
9 #include <AvndProcesses/AddressTools.hpp>
16 halp_meta(name,
"Teleplot")
17 halp_meta(author,
"ossia team")
18 halp_meta(category,
"Monitoring")
19 halp_meta(description,
"Forwards a set of device explorer messages to ")
20 halp_meta(c_name,
"avnd_teleplot")
21 halp_meta(uuid,
"e1d5b9a0-4df9-4281-87a6-9f427dfb6e31")
24 boost::asio::io_context* io_context{};
29 struct : halp::lineedit<
"Host",
"">
31 void update(
Teleplot&
self) {
self.update(); }
41 std::pair<std::string, uint16_t> resolve_ip(
const std::string& host)
45 std::string m_queryPort;
46 auto m_queryHost = host;
47 auto port_idx = m_queryHost.find_last_of(
':');
48 if(port_idx != std::string::npos)
50 m_queryPort = m_queryHost.substr(port_idx + 1);
51 m_queryHost = m_queryHost.substr(0, port_idx);
56 boost::asio::io_context io_service;
57 boost::asio::ip::udp::resolver resolver(io_service);
58 boost::asio::ip::udp::resolver::query query(m_queryHost, m_queryPort);
59 boost::asio::ip::udp::resolver::iterator iter = resolver.resolve(query);
61 auto addr = iter->endpoint().address().to_string();
63 return {addr, std::stoi(m_queryPort)};
65 catch(
const std::exception& e)
76 for(
auto& [param, cb] : params)
78 param->remove_callback(cb);
91 auto [ip, port] = resolve_ip(inputs.host.value);
92 if(!ip.empty() && port > 1)
94 socket = std::make_shared<ossia::net::udp_send_socket>(
95 ossia::net::send_socket_configuration{{.host = ip, .port = port}},
102 for(
auto nodes : this->roots)
104 if(
auto p = nodes->get_parameter(); p && !params.contains(p))
106 auto it = p->add_callback(
107 [p, socket = socket](
const ossia::value& v) { push(*socket, *p, v); });
108 params.emplace(p, it);
115 ossia::net::udp_send_socket& socket,
const ossia::net::parameter_base& param,
116 const ossia::value& v)
118 using clk = std::chrono::system_clock;
120 thread_local fmt::memory_buffer buf;
126 const std::string& addr;
127 int64_t t = std::chrono::duration_cast<std::chrono::milliseconds>(
128 clk::now().time_since_epoch())
131 void operator()(ossia::impulse v)
133 fmt::format_to(fmt::appender(buf),
"{}:{}:1\n", addr, t);
135 void operator()(
int v)
137 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v);
139 void operator()(
float v)
141 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v);
143 void operator()(std::string v)
145 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v);
147 void operator()(
bool v)
149 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v ? 1 : 0);
151 void operator()(ossia::vec2f v)
154 fmt::appender(buf),
"{}.x:{}:{}\n{}.y:{}:{}\n", addr, t, v[0], addr, t,
157 void operator()(ossia::vec3f v)
160 fmt::appender(buf),
"{}.x:{}:{}\n{}.y:{}:{}\n{}.z:{}:{}\n", addr, t, v[0],
161 addr, t, v[1], addr, t, v[2]);
163 void operator()(ossia::vec4f v)
166 fmt::appender(buf),
"{}.x:{}:{}\n{}.y:{}:{}\n{}.z:{}:{}\n{}.w:{}:{}\n", addr,
167 t, v[0], addr, t, v[1], addr, t, v[2], addr, t, v[3]);
169 void operator()(
const std::vector<ossia::value>& v)
176 fmt::appender(buf),
"{}[{}]:{}:{}\n", addr, i, t,
177 ossia::convert<double>(val));
181 void operator()(
const ossia::value_map_type& v)
183 for(
auto& [k, val] : v)
187 fmt::appender(buf),
"{}[{}]:{}:{}\n", addr, k, t,
188 ossia::convert<double>(val));
191 void operator()() { }
193 } vis{.addr = param.get_node().osc_address()};
196 socket.write(buf.begin(), buf.size());
203 socket = std::make_shared<ossia::net::udp_send_socket>(
204 ossia::net::send_socket_configuration{{.host =
"127.0.0.1", .port = 47269}},
214 for(
auto nodes : this->roots)
216 if(
auto p = nodes->get_parameter(); p && !params.contains(p))
218 auto it = p->add_callback(
219 [p, socket = socket](
const ossia::value& v) { push(*socket, *p, v); });
220 params.emplace(p, it);
225 for(
auto it = params.begin(); it != params.end();)
227 if(!ossia::contains(this->roots, &(it->first)->get_node()))
229 it->first->remove_callback(it->second);
230 it = params.erase(it);
239 boost::container::flat_map<
240 ossia::net::parameter_base*,
241 ossia::callback_container<ossia::value_callback>::iterator>
243 std::shared_ptr<ossia::net::udp_send_socket> socket;