3#include <ossia/detail/variant.hpp>
4#include <ossia/network/base/message_queue.hpp>
5#include <ossia/network/base/protocol.hpp>
6#include <ossia/network/context.hpp>
7#include <ossia/network/generic/wrapped_parameter.hpp>
8#include <ossia/network/sockets/cobs_framing.hpp>
9#include <ossia/network/sockets/fixed_length_framing.hpp>
10#include <ossia/network/sockets/line_framing.hpp>
11#include <ossia/network/sockets/no_framing.hpp>
12#include <ossia/network/sockets/serial_socket.hpp>
13#include <ossia/network/sockets/size_prefix_framing.hpp>
14#include <ossia/network/sockets/slip_framing.hpp>
15#include <ossia/network/sockets/stx_etx_framing.hpp>
16#include <ossia/network/sockets/var_size_prefix_framing.hpp>
18#include <ossia-qt/js_utilities.hpp>
20#include <boost/asio/error.hpp>
21#include <boost/asio/streambuf.hpp>
24#include <QQmlComponent>
37struct serial_parameter_data_base
39 serial_parameter_data_base() =
default;
40 serial_parameter_data_base(
const serial_parameter_data_base&) =
default;
41 serial_parameter_data_base(serial_parameter_data_base&&) =
default;
42 serial_parameter_data_base& operator=(
const serial_parameter_data_base&) =
default;
43 serial_parameter_data_base& operator=(serial_parameter_data_base&&) =
default;
44 serial_parameter_data_base(
const QJSValue& val)
46 request = val.property(
"request");
47 if(!request.isString() && !request.isCallable())
49 request = val.property(
"name");
52 if(val.hasProperty(
"osc_address"))
53 osc_address = val.property(
"osc_address").toString();
59struct serial_parameter_data final
60 :
public parameter_data
61 ,
public serial_parameter_data_base
63 using base_data_type = serial_parameter_data_base;
64 serial_parameter_data() =
default;
65 serial_parameter_data(
const serial_parameter_data&) =
default;
66 serial_parameter_data(serial_parameter_data&&) =
default;
67 serial_parameter_data& operator=(
const serial_parameter_data&) =
default;
68 serial_parameter_data& operator=(serial_parameter_data&&) =
default;
70 serial_parameter_data(
const std::string& name)
71 : parameter_data{name}
75 serial_parameter_data(
const QJSValue& val)
76 : parameter_data{
ossia::qt::make_parameter_data(val)}
77 , serial_parameter_data_base{val}
81 bool valid() const noexcept
83 return request.isString() || request.isCallable() || type;
87struct no_framing_socket : ossia::net::serial_socket<no_framing>
89 using serial_socket::serial_socket;
91struct size_framing_socket : ossia::net::serial_socket<size_prefix_framing>
93 using serial_socket::serial_socket;
95struct slip_framing_socket : ossia::net::serial_socket<slip_framing>
97 using serial_socket::serial_socket;
99struct line_framing_socket : ossia::net::serial_socket<line_framing>
101 using serial_socket::serial_socket;
103struct cobs_framing_socket : ossia::net::serial_socket<cobs_framing>
105 using serial_socket::serial_socket;
107struct stx_etx_framing_socket : ossia::net::serial_socket<stx_etx_framing>
109 using serial_socket::serial_socket;
111struct size_prefix_1byte_socket : ossia::net::serial_socket<size_prefix_1byte_framing>
113 using serial_socket::serial_socket;
115struct size_prefix_2byte_be_socket : ossia::net::serial_socket<size_prefix_2byte_be_framing>
117 using serial_socket::serial_socket;
119struct size_prefix_2byte_le_socket : ossia::net::serial_socket<size_prefix_2byte_le_framing>
121 using serial_socket::serial_socket;
123struct size_prefix_4byte_le_socket : ossia::net::serial_socket<size_prefix_4byte_le_framing>
125 using serial_socket::serial_socket;
127struct fixed_length_socket : ossia::net::serial_socket<fixed_length_framing>
129 using serial_socket::serial_socket;
132using framed_serial_socket = ossia::slow_variant<
133 no_framing_socket, size_framing_socket, slip_framing_socket, line_framing_socket,
134 cobs_framing_socket, stx_etx_framing_socket, size_prefix_1byte_socket,
135 size_prefix_2byte_be_socket, size_prefix_2byte_le_socket,
136 size_prefix_4byte_le_socket, fixed_length_socket>;
138struct serial_protocol_configuration
140 ossia::net::framing framing;
141 std::string line_framing_delimiter;
142 std::size_t fixed_frame_size{64};
144 serial_configuration transport;
147class OSSIA_EXPORT serial_wrapper final :
public QObject
149 W_OBJECT(serial_wrapper)
153 const network_context_ptr& ctx,
154 const ossia::net::serial_protocol_configuration& port);
155 ~serial_wrapper() noexcept;
157 void write(QByteArray arg_1) E_SIGNAL(OSSIA_EXPORT, write, arg_1);
158 void read(QString txt, QByteArray raw) E_SIGNAL(OSSIA_EXPORT, read, txt, raw);
160 void on_write(const QByteArray& b) noexcept;
161 W_SLOT(on_write, (const QByteArray&))
163 void on_write(std::string_view b) noexcept;
165 void on_read(const QByteArray& arr);
171 framed_serial_socket make_socket(
172 const network_context_ptr& ctx,
173 const
ossia::net::serial_protocol_configuration& port);
174 framed_serial_socket m_socket;
178class serial_protocol;
179struct serial_protocol_object;
181using serial_parameter = wrapped_parameter<serial_parameter_data>;
182using serial_node = ossia::net::wrapped_node<serial_parameter_data, serial_parameter>;
183class OSSIA_EXPORT serial_protocol final
190 const ossia::net::network_context_ptr&,
const QByteArray& code,
191 const ossia::net::serial_configuration& bot);
192 ~serial_protocol()
override;
201 void stop()
override;
203 static serial_parameter_data read_data(
const QJSValue& js) {
return js; }
205 static serial_protocol_object load_serial_object_from_qml(
206 serial_protocol& proto,
const ossia::net::network_context_ptr& ctx,
207 const ossia::net::serial_configuration& cfg);
209 const ossia::net::network_context_ptr&,
210 const ossia::net::serial_configuration& cfg);
211 void on_read(
const QString& txt,
const QByteArray&);
213 void do_write_osc(
const serial_parameter&,
const ossia::value& v);
214 void do_write_osc_bundle(
215 std::span<std::pair<const serial_parameter*, const ossia::value*>> vec);
216 void do_write_osc_impl(
217 const serial_parameter& addr,
const ossia::value& v, std::string& str);
220 void startup_engine();
221 void create_object(QQmlComponent::Status status);
223 ossia::net::network_context_ptr m_context;
224 ossia::net::serial_configuration m_cfg;
226 QQmlEngine* m_engine{};
227 QQmlComponent* m_component{};
232 QJSValue m_onTextMessage{};
233 QJSValue m_onBinaryMessage{};
235 std::shared_ptr<serial_wrapper> m_port;
238 QObject* m_threadWorker{};
241 coalescing_queue m_queue;
242 std::optional<double> m_coalesce{};
245using serial_device = ossia::net::wrapped_device<serial_node, serial_protocol>;
247class OSSIA_EXPORT Serial :
public QObject
Root of a device tree.
Definition ossia/network/base/device.hpp:58
The node_base class.
Definition node.hpp:48
The parameter_base class.
Definition ossia/network/base/parameter.hpp:48
The protocol_base class.
Definition protocol.hpp:40
The value class.
Definition value.hpp:173
Full information about a parameter.
Definition parameter_data.hpp:61