• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ossia / score / 36213733900

26 Sep 2026 03:05AM UTC coverage: 42.353% (+0.1%) from 42.23%
36213733900

Pull #2310

github

web-flow
Merge 9f9d60cd9 into c0c64ec39
Pull Request #2310: bitfocus: host companion modules the way companion does

41 of 2024 new or added lines in 11 files covered. (2.03%)

210 existing lines in 15 files now uncovered.

126773 of 299323 relevant lines covered (42.35%)

118427.51 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/plugins/score-plugin-protocols/Protocols/Bitfocus/BitfocusProtocol.cpp
1
#include "BitfocusProtocol.hpp"
2

3
#include <ossia/network/base/node_attributes.hpp>
4
#include <ossia/network/domain/domain.hpp>
5
#include <ossia/network/generic/generic_parameter.hpp>
6

7
#include <ossia-qt/js_utilities.hpp>
8

9
#include <QPointer>
10

11
#include <limits>
12

13
namespace ossia::net
14
{
15
namespace
16
{
17
using config_field = bitfocus::module_data::config_field;
18

NEW
19
ossia::val_type optionType(const config_field& opt)
×
20
{
NEW
21
  if(opt.type == "number")
×
NEW
22
    return opt.isInteger() ? ossia::val_type::INT : ossia::val_type::FLOAT;
×
NEW
23
  if(opt.type == "checkbox")
×
NEW
24
    return ossia::val_type::BOOL;
×
NEW
25
  if(opt.type == "multidropdown")
×
NEW
26
    return ossia::val_type::LIST;
×
NEW
27
  if(opt.type == "colorpicker" && !opt.default_json.isString()
×
NEW
28
     && opt.returnType != "string")
×
NEW
29
    return ossia::val_type::INT;
×
NEW
30
  return ossia::val_type::STRING;
×
NEW
31
}
×
32

NEW
33
void applyDomain(ossia::net::parameter_base& p, const config_field& opt)
×
34
{
NEW
35
  if(opt.type == "number")
×
36
  {
NEW
37
    if(opt.min.isValid() && opt.max.isValid())
×
38
    {
NEW
39
      if(p.get_value_type() == ossia::val_type::INT)
×
NEW
40
        p.set_domain(ossia::make_domain(opt.min.toInt(), opt.max.toInt()));
×
41
      else
NEW
42
        p.set_domain(ossia::make_domain(opt.min.toFloat(), opt.max.toFloat()));
×
NEW
43
    }
×
NEW
44
  }
×
NEW
45
  else if(opt.type == "dropdown" || opt.type == "multidropdown")
×
46
  {
NEW
47
    auto dom = ossia::domain_base<std::string>{};
×
NEW
48
    for(const auto& choice : opt.choices)
×
NEW
49
      dom.values.push_back(choice.id.toStdString());
×
NEW
50
    p.set_domain(std::move(dom));
×
NEW
51
  }
×
NEW
52
}
×
53

NEW
54
ossia::value receivedValue(const QVariant& v)
×
55
{
NEW
56
  constexpr double int_min = std::numeric_limits<int32_t>::min();
×
NEW
57
  constexpr double int_max = std::numeric_limits<int32_t>::max();
×
NEW
58
  switch(v.typeId())
×
59
  {
60
    case QMetaType::Double: {
NEW
61
      const double d = v.toDouble();
×
NEW
62
      if(std::floor(d) != d)
×
NEW
63
        return (float)d;
×
NEW
64
      if(d >= int_min && d <= int_max)
×
NEW
65
        return (int)d;
×
NEW
66
      return QString::number(d, 'f', 0).toStdString();
×
67
    }
68
    case QMetaType::LongLong:
69
    case QMetaType::ULongLong: {
NEW
70
      const auto i = v.toLongLong();
×
NEW
71
      if(i >= int_min && i <= int_max)
×
NEW
72
        return (int)i;
×
NEW
73
      return QString::number(i).toStdString();
×
74
    }
75
    default:
NEW
76
      return ossia::qt::qt_to_ossia{}(v);
×
77
  }
NEW
78
}
×
79

80
std::unordered_map<std::string, ossia::net::node_base*>
NEW
81
childIndex(ossia::net::node_base& n)
×
82
{
NEW
83
  std::unordered_map<std::string, ossia::net::node_base*> res;
×
NEW
84
  const auto& cld = n.children();
×
NEW
85
  res.reserve(cld.size());
×
NEW
86
  for(auto& c : cld)
×
NEW
87
    res.emplace(c->get_name(), c.get());
×
NEW
88
  return res;
×
NEW
89
}
×
90

NEW
91
ossia::net::node_base& findOrCreate(
×
92
    ossia::net::node_base& parent,
93
    std::unordered_map<std::string, ossia::net::node_base*>& index,
94
    const std::string& name)
95
{
NEW
96
  if(auto it = index.find(name); it != index.end())
×
NEW
97
    return *it->second;
×
NEW
98
  auto n = parent.create_child(name);
×
NEW
99
  index.emplace(name, n);
×
NEW
100
  return *n;
×
NEW
101
}
×
102

NEW
103
void setDescription(ossia::net::node_base& n, const QString& desc)
×
104
{
NEW
105
  auto str = desc.toStdString();
×
NEW
106
  if(ossia::net::get_description(n) != str)
×
NEW
107
    ossia::net::set_description(n, std::move(str));
×
NEW
108
}
×
109

110
//! Removes the children whose name is not a key of `model`
111
template <typename Map>
NEW
112
void removeGone(
×
113
    ossia::net::node_base& parent, const Map& model,
114
    const std::function<void(const std::string&)>& onRemove = {})
115
{
NEW
116
  std::vector<std::string> gone;
×
NEW
117
  for(auto& c : parent.children())
×
NEW
118
    if(!model.contains(QString::fromStdString(c->get_name())))
×
NEW
119
      gone.push_back(c->get_name());
×
NEW
120
  for(auto& name : gone)
×
121
  {
NEW
122
    if(onRemove)
×
NEW
123
      onRemove(name);
×
NEW
124
    parent.remove_child(name);
×
125
  }
NEW
126
}
×
127

NEW
128
ossia::val_type feedbackType(const bitfocus::module_data::feedback_definition& fb)
×
129
{
NEW
130
  if(fb.type == "boolean")
×
NEW
131
    return ossia::val_type::BOOL;
×
NEW
132
  if(fb.type == "advanced")
×
NEW
133
    return ossia::val_type::MAP;
×
NEW
134
  return ossia::val_type::STRING;
×
NEW
135
}
×
136
}
137

NEW
138
ossia::value bitfocus_protocol::optionDefault(const config_field& opt)
×
139
{
NEW
140
  const auto def = bitfocus::defaultOptionValue(opt);
×
NEW
141
  switch(optionType(opt))
×
142
  {
143
    case ossia::val_type::INT:
NEW
144
      return (int)def.toDouble();
×
145
    case ossia::val_type::FLOAT:
NEW
146
      return (float)def.toDouble();
×
147
    case ossia::val_type::BOOL:
NEW
148
      return def.toBool();
×
149
    case ossia::val_type::LIST: {
NEW
150
      std::vector<ossia::value> res;
×
NEW
151
      if(def.isArray())
×
NEW
152
        for(const auto& v : def.toArray())
×
NEW
153
          res.push_back(v.toVariant().toString().toStdString());
×
NEW
154
      else if(!def.isUndefined() && !def.isNull())
×
NEW
155
        res.push_back(def.toVariant().toString().toStdString());
×
NEW
156
      return res;
×
NEW
157
    }
×
158
    default:
NEW
159
      if(def.isUndefined() || def.isNull())
×
NEW
160
        return std::string{};
×
NEW
161
      return def.toVariant().toString().toStdString();
×
162
  }
NEW
163
}
×
164

NEW
165
bitfocus_protocol::bitfocus_protocol(
×
166
    std::shared_ptr<bitfocus::module_handler> rc, ossia::net::network_context_ptr ctx)
NEW
167
    : m_rc{rc}
×
NEW
168
    , m_context{ctx}
×
NEW
169
{
×
NEW
170
  QObject::connect(
×
NEW
171
      m_rc.get(), &bitfocus::module_handler::variableChanged, this,
×
NEW
172
      [this](const QString& name, const QVariant& v) {
×
NEW
173
    if(auto it = m_variables_recv.find(name); it != m_variables_recv.end())
×
174
    {
NEW
175
      set_received_value(*it->second, receivedValue(v));
×
NEW
176
    }
×
NEW
177
    else if(m_dev)
×
178
    {
NEW
179
      auto& m = m_rc->model();
×
NEW
180
      if(auto def = m.variables.find(name); def != m.variables.end())
×
181
      {
NEW
182
        if(!nodes.variables)
×
NEW
183
          nodes.variables = m_dev->get_root_node().create_child("variable");
×
NEW
184
        auto index = childIndex(*nodes.variables);
×
NEW
185
        sync_variable(index, name, def->second);
×
NEW
186
      }
×
NEW
187
    }
×
NEW
188
  });
×
189

NEW
190
  QObject::connect(
×
NEW
191
      m_rc.get(), &bitfocus::module_handler::feedbackValueChanged, this,
×
NEW
192
      [this](const QString& id, const QString&, const QVariant& v) {
×
NEW
193
    if(auto it = m_feedbacks_recv.find(id); it != m_feedbacks_recv.end())
×
NEW
194
      set_received_value(*it->second, receivedValue(v));
×
NEW
195
  });
×
196

NEW
197
  QObject::connect(
×
NEW
198
      m_rc.get(), &bitfocus::module_handler::definitionsChanged, this,
×
NEW
199
      [this] { init_device(m_rc->takeChangedDefinitions()); });
×
200

NEW
201
  QObject::connect(
×
NEW
202
      m_rc.get(), &bitfocus::module_handler::reregistered, this, [this] {
×
NEW
203
    m_subscribed.clear();
×
NEW
204
    init_device();
×
NEW
205
  });
×
NEW
206
}
×
207

NEW
208
bitfocus_protocol::~bitfocus_protocol() = default;
×
209

NEW
210
void bitfocus_protocol::set_received_value(ossia::net::parameter_base& p, ossia::value v)
×
211
{
NEW
212
  if(!v.valid())
×
NEW
213
    return;
×
NEW
214
  const auto cur = p.get_value_type();
×
NEW
215
  const auto next = v.get_type();
×
NEW
216
  if(cur == ossia::val_type::FLOAT && next == ossia::val_type::INT)
×
217
  {
NEW
218
    p.set_value(float(*v.target<int>()));
×
NEW
219
    return;
×
220
  }
NEW
221
  if(cur != next)
×
NEW
222
    p.set_value_type(next);
×
NEW
223
  p.set_value(std::move(v));
×
NEW
224
}
×
225

NEW
226
bool bitfocus_protocol::pull(ossia::net::parameter_base&)
×
227
{
NEW
228
  return true;
×
229
}
230

NEW
231
QVariantMap bitfocus_protocol::collectOptions(
×
232
    const ossia::net::node_base& node, const std::vector<config_field>& defs,
233
    const std::string& group)
234
{
NEW
235
  std::unique_lock lock{m_touchedMutex};
×
NEW
236
  QVariantMap options;
×
NEW
237
  for(const auto& opt : defs)
×
238
  {
NEW
239
    if(opt.type == "static-text")
×
NEW
240
      continue;
×
NEW
241
    auto cld = const_cast<ossia::net::node_base&>(node).find_child(opt.id.toStdString());
×
NEW
242
    if(!cld)
×
NEW
243
      continue;
×
NEW
244
    auto p = cld->get_parameter();
×
NEW
245
    if(!p)
×
NEW
246
      continue;
×
NEW
247
    const auto val = p->value();
×
NEW
248
    const QVariant qv = val.apply(ossia::qt::ossia_to_qvariant{});
×
NEW
249
    const bool touched
×
NEW
250
        = m_touched.contains({group, node.get_name(), opt.id.toStdString()});
×
NEW
251
    if(!touched && val == optionDefault(opt))
×
252
    {
NEW
253
      if(opt.hasDefault())
×
NEW
254
        options[opt.id] = bitfocus::defaultOptionValue(opt).toVariant();
×
NEW
255
      continue;
×
256
    }
NEW
257
    const auto jv = bitfocus::toModuleValue(opt, qv);
×
NEW
258
    if(!jv.isUndefined())
×
NEW
259
      options[opt.id] = jv.toVariant();
×
NEW
260
  }
×
NEW
261
  return options;
×
NEW
262
}
×
263

NEW
264
bool bitfocus_protocol::push(const ossia::net::parameter_base& p, const ossia::value& v)
×
265
{
266
  // Called from the execution thread
NEW
267
  auto& node = p.get_node();
×
NEW
268
  auto parent = node.get_parent();
×
NEW
269
  if(!parent)
×
NEW
270
    return false;
×
271

NEW
272
  auto actions = m_actionsNode.load();
×
NEW
273
  auto feedbacks = m_feedbacksNode.load();
×
NEW
274
  if(auto grand = parent->get_parent(); grand && (grand == actions || grand == feedbacks))
×
275
  {
NEW
276
    std::unique_lock lock{m_touchedMutex};
×
NEW
277
    m_touched.insert(
×
NEW
278
        {grand == actions ? "action" : "feedback", parent->get_name(), node.get_name()});
×
NEW
279
  }
×
280

NEW
281
  if(actions && parent == actions)
×
282
  {
NEW
283
    QMetaObject::invokeMethod(this, [this, id = node.get_name()] { run_action(id); });
×
NEW
284
  }
×
NEW
285
  else if(actions && parent->get_parent() == actions && parent->children_count() == 1)
×
286
  {
NEW
287
    QMetaObject::invokeMethod(this, [this, id = parent->get_name()] { run_action(id); });
×
NEW
288
  }
×
NEW
289
  else if(feedbacks && parent->get_parent() == feedbacks)
×
290
  {
NEW
291
    QMetaObject::invokeMethod(this, [this, id = parent->get_name()] {
×
NEW
292
      subscribe_feedbacks({id});
×
NEW
293
    });
×
NEW
294
  }
×
NEW
295
  return true;
×
NEW
296
}
×
297

NEW
298
void bitfocus_protocol::forget_touched(const std::string& group, const std::string& name)
×
299
{
NEW
300
  std::unique_lock lock{m_touchedMutex};
×
NEW
301
  std::erase_if(m_touched, [&](const auto& t) {
×
NEW
302
    return std::get<0>(t) == group && std::get<1>(t) == name;
×
303
  });
NEW
304
}
×
305

NEW
306
void bitfocus_protocol::run_action(const std::string& id)
×
307
{
NEW
308
  if(!nodes.actions)
×
NEW
309
    return;
×
NEW
310
  auto node = nodes.actions->find_child(id);
×
NEW
311
  const auto& defs = m_rc->model().actions;
×
NEW
312
  auto it = defs.find(QString::fromStdString(id));
×
NEW
313
  if(!node || it == defs.end())
×
NEW
314
    return;
×
NEW
315
  m_rc->actionRun(id, collectOptions(*node, it->second.options, "action"));
×
NEW
316
}
×
317

NEW
318
bool bitfocus_protocol::push_raw(const ossia::net::full_parameter_data&)
×
319
{
NEW
320
  return true;
×
321
}
NEW
322
bool bitfocus_protocol::observe(ossia::net::parameter_base&, bool)
×
323
{
NEW
324
  return true;
×
325
}
NEW
326
bool bitfocus_protocol::update(ossia::net::node_base& node_base)
×
327
{
NEW
328
  return true;
×
329
}
330

NEW
331
void bitfocus_protocol::sync_options(
×
332
    ossia::net::node_base& node, const std::vector<config_field>& options)
333
{
NEW
334
  std::vector<std::string> expected;
×
NEW
335
  auto index = childIndex(node);
×
NEW
336
  for(const auto& opt : options)
×
337
  {
NEW
338
    if(opt.type == "static-text")
×
NEW
339
      continue;
×
NEW
340
    const auto name = opt.id.toStdString();
×
NEW
341
    expected.push_back(name);
×
342

NEW
343
    auto cld = &findOrCreate(node, index, name);
×
NEW
344
    setDescription(*cld, opt.label);
×
345

NEW
346
    const auto type = optionType(opt);
×
NEW
347
    auto p = cld->get_parameter();
×
NEW
348
    if(p && p->get_value_type() != type)
×
349
    {
NEW
350
      cld->remove_parameter();
×
NEW
351
      p = nullptr;
×
NEW
352
    }
×
NEW
353
    if(!p)
×
354
    {
NEW
355
      p = cld->create_parameter(type);
×
NEW
356
      p->set_value(optionDefault(opt));
×
NEW
357
    }
×
NEW
358
    applyDomain(*p, opt);
×
NEW
359
  }
×
360

NEW
361
  std::vector<std::string> extra;
×
NEW
362
  for(auto& c : node.children())
×
NEW
363
    if(std::find(expected.begin(), expected.end(), c->get_name()) == expected.end())
×
NEW
364
      extra.push_back(c->get_name());
×
NEW
365
  for(auto& name : extra)
×
NEW
366
    node.remove_child(name);
×
NEW
367
}
×
368

NEW
369
void bitfocus_protocol::sync_actions()
×
370
{
NEW
371
  auto& m = m_rc->model();
×
NEW
372
  auto& root = m_dev->get_root_node();
×
NEW
373
  if(m.actions.empty())
×
374
  {
NEW
375
    if(nodes.actions)
×
NEW
376
      root.remove_child("action");
×
NEW
377
    nodes.actions = nullptr;
×
NEW
378
    m_actionsNode = nullptr;
×
NEW
379
    return;
×
380
  }
NEW
381
  if(!nodes.actions)
×
382
  {
NEW
383
    nodes.actions = root.create_child("action");
×
NEW
384
    m_actionsNode = nodes.actions;
×
NEW
385
  }
×
386

NEW
387
  removeGone(*nodes.actions, m.actions, [this](const std::string& name) {
×
NEW
388
    forget_touched("action", name);
×
NEW
389
  });
×
390

NEW
391
  auto index = childIndex(*nodes.actions);
×
NEW
392
  for(auto& [id, def] : m.actions)
×
393
  {
NEW
394
    auto node = &findOrCreate(*nodes.actions, index, id.toStdString());
×
NEW
395
    setDescription(*node, def.name);
×
NEW
396
    if(!node->get_parameter())
×
NEW
397
      node->create_parameter(ossia::val_type::IMPULSE);
×
NEW
398
    sync_options(*node, def.options);
×
399
  }
NEW
400
}
×
401

NEW
402
void bitfocus_protocol::sync_feedbacks()
×
403
{
NEW
404
  auto& m = m_rc->model();
×
NEW
405
  auto& root = m_dev->get_root_node();
×
406

NEW
407
  std::map<QString, bitfocus::module_data::feedback_instance> changes;
×
NEW
408
  if(nodes.feedbacks)
×
NEW
409
    removeGone(*nodes.feedbacks, m.feedbacks, [&](const std::string& name) {
×
NEW
410
      forget_touched("feedback", name);
×
NEW
411
      const auto id = QString::fromStdString(name);
×
NEW
412
      m_subscribed.erase(id);
×
NEW
413
      m_feedbacks_recv.erase(id);
×
NEW
414
      bitfocus::module_data::feedback_instance inst;
×
NEW
415
      inst.id = id;
×
NEW
416
      inst.disabled = true;
×
NEW
417
      changes[id] = inst;
×
NEW
418
    });
×
419

NEW
420
  if(m.feedbacks.empty())
×
421
  {
NEW
422
    if(nodes.feedbacks)
×
NEW
423
      root.remove_child("feedback");
×
NEW
424
    nodes.feedbacks = nullptr;
×
NEW
425
    m_feedbacksNode = nullptr;
×
NEW
426
  }
×
427
  else
428
  {
NEW
429
    if(!nodes.feedbacks)
×
430
    {
NEW
431
      nodes.feedbacks = root.create_child("feedback");
×
NEW
432
      m_feedbacksNode = nodes.feedbacks;
×
NEW
433
    }
×
434

NEW
435
    std::vector<std::string> ids;
×
NEW
436
    auto index = childIndex(*nodes.feedbacks);
×
NEW
437
    for(auto& [id, def] : m.feedbacks)
×
438
    {
NEW
439
      const auto name = id.toStdString();
×
NEW
440
      auto node = &findOrCreate(*nodes.feedbacks, index, name);
×
NEW
441
      setDescription(*node, def.name);
×
442

NEW
443
      const auto type = feedbackType(def);
×
NEW
444
      auto p = node->get_parameter();
×
NEW
445
      if(p && def.type != "value" && p->get_value_type() != type)
×
446
      {
NEW
447
        node->remove_parameter();
×
NEW
448
        p = nullptr;
×
NEW
449
      }
×
NEW
450
      if(!p)
×
NEW
451
        p = node->create_parameter(type);
×
NEW
452
      m_feedbacks_recv[id] = p;
×
453

NEW
454
      sync_options(*node, def.options);
×
NEW
455
      ids.push_back(name);
×
NEW
456
    }
×
NEW
457
    subscribe_feedbacks(ids);
×
NEW
458
  }
×
459

NEW
460
  if(!changes.empty())
×
NEW
461
    m_rc->updateFeedbacks(changes);
×
NEW
462
}
×
463

NEW
464
void bitfocus_protocol::subscribe_feedbacks(const std::vector<std::string>& ids)
×
465
{
NEW
466
  if(!nodes.feedbacks)
×
NEW
467
    return;
×
NEW
468
  auto& m = m_rc->model();
×
NEW
469
  std::map<QString, bitfocus::module_data::feedback_instance> instances;
×
NEW
470
  for(auto& name : ids)
×
471
  {
NEW
472
    const auto id = QString::fromStdString(name);
×
NEW
473
    auto def = m.feedbacks.find(id);
×
NEW
474
    auto node = nodes.feedbacks->find_child(name);
×
NEW
475
    if(def == m.feedbacks.end() || !node)
×
NEW
476
      continue;
×
477

NEW
478
    auto options = collectOptions(*node, def->second.options, "feedback");
×
NEW
479
    auto [sub, isNew] = m_subscribed.try_emplace(id, options);
×
NEW
480
    if(!isNew && sub->second == options)
×
NEW
481
      continue;
×
NEW
482
    sub->second = options;
×
483

NEW
484
    bitfocus::module_data::feedback_instance inst;
×
NEW
485
    inst.id = id;
×
NEW
486
    inst.controlId = "feedback/" + id;
×
NEW
487
    inst.definitionId = id;
×
NEW
488
    inst.options = std::move(options);
×
NEW
489
    instances[id] = std::move(inst);
×
NEW
490
  }
×
NEW
491
  if(!instances.empty())
×
NEW
492
    m_rc->updateFeedbacks(instances);
×
NEW
493
}
×
494

NEW
495
void bitfocus_protocol::sync_variables()
×
496
{
NEW
497
  auto& m = m_rc->model();
×
NEW
498
  auto& root = m_dev->get_root_node();
×
NEW
499
  if(m.variables.empty())
×
500
  {
NEW
501
    if(nodes.variables)
×
NEW
502
      root.remove_child("variable");
×
NEW
503
    nodes.variables = nullptr;
×
NEW
504
    m_variables_recv.clear();
×
NEW
505
    return;
×
506
  }
NEW
507
  if(!nodes.variables)
×
NEW
508
    nodes.variables = root.create_child("variable");
×
509

NEW
510
  removeGone(*nodes.variables, m.variables, [this](const std::string& name) {
×
NEW
511
    m_variables_recv.erase(QString::fromStdString(name));
×
NEW
512
  });
×
513

NEW
514
  auto index = childIndex(*nodes.variables);
×
NEW
515
  for(auto& [id, def] : m.variables)
×
NEW
516
    sync_variable(index, id, def);
×
NEW
517
}
×
518

NEW
519
void bitfocus_protocol::sync_variable(
×
520
    std::unordered_map<std::string, ossia::net::node_base*>& index, const QString& id,
521
    const bitfocus::module_data::variable_definition& def)
522
{
NEW
523
  auto node = &findOrCreate(*nodes.variables, index, id.toStdString());
×
NEW
524
  if(!def.name.isEmpty())
×
NEW
525
    setDescription(*node, def.name);
×
526

NEW
527
  auto p = node->get_parameter();
×
NEW
528
  if(!p)
×
529
  {
NEW
530
    auto val = receivedValue(def.value);
×
NEW
531
    p = node->create_parameter(
×
NEW
532
        val.valid() && val.get_type() != ossia::val_type::IMPULSE
×
NEW
533
            ? val.get_type()
×
534
            : ossia::val_type::STRING);
NEW
535
    if(val.valid())
×
NEW
536
      p->set_value(val);
×
NEW
537
  }
×
NEW
538
  m_variables_recv[id] = p;
×
NEW
539
}
×
540

NEW
541
void bitfocus_protocol::init_device(int categories)
×
542
{
NEW
543
  if(!m_dev)
×
NEW
544
    return;
×
545

NEW
546
  if(categories & bitfocus::module_handler::Actions)
×
NEW
547
    sync_actions();
×
NEW
548
  if(categories & bitfocus::module_handler::Feedbacks)
×
NEW
549
    sync_feedbacks();
×
NEW
550
  if(categories & bitfocus::module_handler::Variables)
×
NEW
551
    sync_variables();
×
NEW
552
}
×
553

NEW
554
void bitfocus_protocol::set_device(ossia::net::device_base& dev)
×
555
{
NEW
556
  m_dev = &dev;
×
NEW
557
}
×
558
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc