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/line_framing.hpp>
9 #include <ossia/network/sockets/no_framing.hpp>
10 #include <ossia/network/sockets/serial_socket.hpp>
11 #include <ossia/network/sockets/size_prefix_framing.hpp>
12 #include <ossia/network/sockets/slip_framing.hpp>
14 #include <ossia-qt/js_utilities.hpp>
16 #include <boost/asio/error.hpp>
17 #include <boost/asio/streambuf.hpp>
20 #include <QSerialPort>
32 struct serial_parameter_data_base
34 serial_parameter_data_base() =
default;
35 serial_parameter_data_base(
const serial_parameter_data_base&) =
default;
36 serial_parameter_data_base(serial_parameter_data_base&&) =
default;
37 serial_parameter_data_base& operator=(
const serial_parameter_data_base&) =
default;
38 serial_parameter_data_base& operator=(serial_parameter_data_base&&) =
default;
39 serial_parameter_data_base(
const QJSValue& val)
41 request = val.property(
"request");
42 if(!request.isString() && !request.isCallable())
44 request = val.property(
"name");
50 struct serial_parameter_data final
51 :
public parameter_data
52 ,
public serial_parameter_data_base
54 using base_data_type = serial_parameter_data_base;
55 serial_parameter_data() =
default;
56 serial_parameter_data(
const serial_parameter_data&) =
default;
57 serial_parameter_data(serial_parameter_data&&) =
default;
58 serial_parameter_data& operator=(
const serial_parameter_data&) =
default;
59 serial_parameter_data& operator=(serial_parameter_data&&) =
default;
61 serial_parameter_data(
const std::string& name)
62 : parameter_data{name}
66 serial_parameter_data(
const QJSValue& val)
67 : parameter_data{
ossia::qt::make_parameter_data(val)}
68 , serial_parameter_data_base{val}
72 bool valid() const noexcept
74 return request.isString() || request.isCallable() || type;
78 struct no_framing_socket : ossia::net::serial_socket<no_framing>
80 using serial_socket::serial_socket;
82 struct size_framing_socket : ossia::net::serial_socket<size_prefix_framing>
84 using serial_socket::serial_socket;
86 struct slip_framing_socket : ossia::net::serial_socket<slip_framing>
88 using serial_socket::serial_socket;
90 struct line_framing_socket : ossia::net::serial_socket<line_framing>
92 using serial_socket::serial_socket;
95 using framed_serial_socket = ossia::slow_variant<
96 no_framing_socket, size_framing_socket, slip_framing_socket, line_framing_socket>;
98 struct serial_protocol_configuration
100 ossia::net::framing framing;
101 std::string line_framing_delimiter;
103 serial_configuration transport;
106 class OSSIA_EXPORT serial_wrapper final :
public QObject
108 W_OBJECT(serial_wrapper)
112 const network_context_ptr& ctx,
113 const ossia::net::serial_protocol_configuration& port);
114 ~serial_wrapper() noexcept;
116 void write(QByteArray arg_1) E_SIGNAL(OSSIA_EXPORT, write, arg_1);
117 void read(QString txt, QByteArray raw) E_SIGNAL(OSSIA_EXPORT, read, txt, raw);
119 void on_write(const QByteArray& b) noexcept;
122 void on_read(const QByteArray& arr);
128 framed_serial_socket make_socket(
129 const network_context_ptr& ctx,
130 const
ossia::net::serial_protocol_configuration& port);
131 framed_serial_socket m_socket;
135 class serial_protocol;
136 struct serial_protocol_object;
138 using serial_parameter = wrapped_parameter<serial_parameter_data>;
139 using serial_node = ossia::net::wrapped_node<serial_parameter_data, serial_parameter>;
140 class OSSIA_EXPORT serial_protocol final
147 const ossia::net::network_context_ptr&,
const QByteArray& code,
148 const ossia::net::serial_configuration& bot);
149 ~serial_protocol()
override;
158 void stop()
override;
160 static serial_parameter_data read_data(
const QJSValue& js) {
return js; }
163 static serial_protocol_object load_serial_object_from_qml(
164 serial_protocol& proto,
const ossia::net::network_context_ptr& ctx,
165 const ossia::net::serial_configuration& cfg);
167 const ossia::net::network_context_ptr&,
168 const ossia::net::serial_configuration& cfg);
169 void on_read(
const QString& txt,
const QByteArray&);
171 QQmlEngine* m_engine{};
172 QQmlComponent* m_component{};
177 QJSValue m_onTextMessage{};
178 QJSValue m_onBinaryMessage{};
180 std::shared_ptr<serial_wrapper> m_port;
183 QObject* m_threadWorker{};
186 coalescing_queue m_queue;
187 std::optional<double> m_coalesce{};
189 using serial_device = ossia::net::wrapped_device<serial_node, serial_protocol>;
191 class OSSIA_EXPORT Serial :
public QObject
Root of a device tree.
Definition: ossia/network/base/device.hpp:58
The node_base class.
Definition: network/base/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