UdonLibrary
1.0.0
機械システム研究部 C++ ライブラリ
Toggle main menu visibility
読み取り中…
検索中…
一致する文字列を見つけられません
SivSerialReader.hpp
[詳解]
1
//
2
// OpenSiv3D用 Serial 受信クラス
3
//
4
// Copyright (c) 2022 udonrobo
5
//
6
// Sender --[Serial]--> Receiver
7
// ^^^^^^^^
8
//
9
10
#pragma once
11
12
#include <Siv3D/Serial.hpp>
13
#include <
Udon/Serializer/Serializer.hpp
>
14
#include <
Udon/Utility/Show.hpp
>
15
16
namespace
Udon
17
{
18
21
template
<
typename
Message>
22
class
SivSerialReader
23
{
24
static
constexpr
size_t
Size =
Udon::SerializedSize<Message>
();
25
26
s3d::Serial& serial;
27
28
s3d::Array<uint8_t> buffer;
29
30
std::mutex mutex;
31
32
std::thread thread;
33
34
std::atomic_bool isRunning;
// thread stop token
35
36
public
:
37
using
MessageType
=
Message
;
38
41
SivSerialReader
(s3d::Serial& bus)
42
: serial(bus)
43
, buffer(Size)
44
, thread([this]()
45
{ receive(); })
46
, isRunning(
true
)
47
{
48
}
49
51
~SivSerialReader
()
52
{
53
isRunning =
false
;
54
thread.join();
55
}
56
59
Udon::Optional<Message>
getMessage
()
const
60
{
61
std::lock_guard lock(mutex);
62
return
Udon::Deserialize<Message>
(buffer);
63
}
64
66
void
show
()
const
67
{
68
if
(
const
auto
message =
getMessage
())
69
{
70
Udon::Show
(*message);
71
s3d::Print.writeln();
72
}
73
else
74
{
75
s3d::Print << U
"receive failed!"
;
76
}
77
}
78
79
void
showRaw
()
const
80
{
81
s3d::Print << buffer;
82
}
83
84
private
:
85
void
receive()
86
{
87
while
(isRunning)
88
{
89
if
(not serial)
90
continue
;
91
92
if
(serial.available() < Size)
93
continue
;
94
95
s3d::Array<uint8> temp;
96
if
(serial.readBytes(temp) && temp.size() == Size)
97
{
98
std::lock_guard lock(mutex);
99
buffer = std::move(temp);
100
}
101
102
serial.clearInput();
103
}
104
}
105
};
106
}
// namespace Udon
Serializer.hpp
Show.hpp
Udon::Optional
オプショナル型
Definition
Optional.hpp:62
Udon::SivSerialReader::~SivSerialReader
~SivSerialReader()
デストラクタ
Definition
SivSerialReader.hpp:51
Udon::SivSerialReader::SivSerialReader
SivSerialReader(s3d::Serial &bus)
コンストラクタ
Definition
SivSerialReader.hpp:41
Udon::SivSerialReader::MessageType
Message MessageType
Definition
SivSerialReader.hpp:37
Udon::SivSerialReader::showRaw
void showRaw() const
Definition
SivSerialReader.hpp:79
Udon::SivSerialReader::getMessage
Udon::Optional< Message > getMessage() const
メッセージの取得
Definition
SivSerialReader.hpp:59
Udon::SivSerialReader::show
void show() const
メッセージの表示
Definition
SivSerialReader.hpp:66
Udon::Message
Definition
AirCylinder.hpp:16
Udon
Definition
Bit.hpp:12
Udon::Deserialize
Udon::Optional< T > Deserialize(ArrayView< const uint8_t > buffer)
バイト列からオブジェクトに逆シリアル化します
Definition
Serializer.hpp:87
Udon::Show
void Show(Args &&... args)
区切り文字ありで出力する
Definition
Show.hpp:339
Udon::SerializedSize
constexpr size_t SerializedSize() noexcept
Tをシリアライズした際のバイト列の要素数を取得する
Definition
Serializer.hpp:22