17 halp_meta(name,
"Teleplot")
18 halp_meta(author,
"ossia team")
19 halp_meta(category,
"Monitoring")
20 halp_meta(description,
"Forwards a set of device explorer messages to ")
21 halp_meta(c_name,
"avnd_teleplot")
22 halp_meta(manual_url,
"https://ossia.io/score-docs/processes/teleplot.html")
23 halp_meta(uuid,
"e1d5b9a0-4df9-4281-87a6-9f427dfb6e31")
26 boost::asio::io_context* io_context{};
31 struct : halp::lineedit<
"Host",
"">
33 void update(
Teleplot& self) { self.update(); }
43 std::pair<std::string, uint16_t> resolve_ip(
const std::string& url)
45 auto [host, port] = ossia::url_to_host_and_port(url);
46 if(
auto resolved = ossia::resolve_sync_v4<boost::asio::ip::udp>(host, port))
48 return {resolved->host, std::stoi(resolved->port)};
55 for(
auto& [param, cb] : params)
57 param->remove_callback(cb);
70 auto [ip, port] = resolve_ip(inputs.host.value);
71 if(!ip.empty() && port > 1)
73 socket = std::make_shared<ossia::net::udp_send_socket>(
74 ossia::net::outbound_socket_configuration{.host = ip, .port = port},
81 for(
auto nodes : this->roots)
83 if(
auto p = nodes->get_parameter(); p && !params.contains(p))
85 auto it = p->add_callback(
86 [p, socket = socket](
const ossia::value& v) { push(*socket, *p, v); });
87 params.emplace(p, it);
94 ossia::net::udp_send_socket& socket,
const ossia::net::parameter_base& param,
95 const ossia::value& v)
97 using clk = std::chrono::system_clock;
99 thread_local fmt::memory_buffer buf;
105 const std::string& addr;
106 int64_t t = std::chrono::duration_cast<std::chrono::milliseconds>(
107 clk::now().time_since_epoch())
110 void operator()(ossia::impulse v)
112 fmt::format_to(fmt::appender(buf),
"{}:{}:1\n", addr, t);
114 void operator()(
int v)
116 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v);
118 void operator()(
float v)
120 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v);
122 void operator()(std::string v)
124 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v);
126 void operator()(
bool v)
128 fmt::format_to(fmt::appender(buf),
"{}:{}:{}\n", addr, t, v ? 1 : 0);
130 void operator()(ossia::vec2f v)
133 fmt::appender(buf),
"{}.x:{}:{}\n{}.y:{}:{}\n", addr, t, v[0], addr, t,
136 void operator()(ossia::vec3f v)
139 fmt::appender(buf),
"{}.x:{}:{}\n{}.y:{}:{}\n{}.z:{}:{}\n", addr, t, v[0],
140 addr, t, v[1], addr, t, v[2]);
142 void operator()(ossia::vec4f v)
145 fmt::appender(buf),
"{}.x:{}:{}\n{}.y:{}:{}\n{}.z:{}:{}\n{}.w:{}:{}\n", addr,
146 t, v[0], addr, t, v[1], addr, t, v[2], addr, t, v[3]);
148 void operator()(
const std::vector<ossia::value>& v)
155 fmt::appender(buf),
"{}[{}]:{}:{}\n", addr, i, t,
156 ossia::convert<double>(val));
160 void operator()(
const ossia::value_map_type& v)
162 for(
auto& [k, val] : v)
166 fmt::appender(buf),
"{}[{}]:{}:{}\n", addr, k, t,
167 ossia::convert<double>(val));
170 void operator()() { }
172 } vis{.addr = param.get_node().osc_address()};
175 socket.write(buf.begin(), buf.size());
182 socket = std::make_shared<ossia::net::udp_send_socket>(
183 ossia::net::outbound_socket_configuration{.host =
"127.0.0.1", .port = 47269},
193 for(
auto nodes : this->roots)
195 if(
auto p = nodes->get_parameter(); p && !params.contains(p))
197 auto it = p->add_callback(
198 [p, socket = socket](
const ossia::value& v) { push(*socket, *p, v); });
199 params.emplace(p, it);
204 for(
auto it = params.begin(); it != params.end();)
206 if(!ossia::contains(this->roots, &(it->first)->get_node()))
208 it->first->remove_callback(it->second);
209 it = params.erase(it);
218 boost::container::flat_map<
219 ossia::net::parameter_base*,
220 ossia::callback_container<ossia::value_callback>::iterator>
222 std::shared_ptr<ossia::net::udp_send_socket> socket;