UdonLibrary
1.0.0
機械システム研究部 C++ ライブラリ
Toggle main menu visibility
読み取り中…
検索中…
一致する文字列を見つけられません
SerialReader.hpp
[詳解]
1
//
2
// Serial 受信クラス
3
//
4
// Copyright (c) 2022 udonrobo
5
//
6
// Sender --[Serial]--> Receiver
7
// ^^^^^^^^
8
//
9
10
#pragma once
11
12
#include <
Udon/Serializer/Serializer.hpp
>
13
#include <
Udon/Utility/Show.hpp
>
14
15
namespace
Udon
16
{
17
20
template
<
typename
Message>
21
class
SerialReader
22
{
23
static
constexpr
size_t
Size =
Udon::SerializedSize<Message>
();
24
25
Stream& serial;
26
27
uint8_t buffer[Size];
28
29
uint32_t transmitMs;
30
31
public
:
32
34
using
MessageType
=
Message
;
35
38
SerialReader
(Stream& serial)
39
: serial(serial)
40
, buffer()
41
, transmitMs()
42
{
43
}
44
47
Udon::Optional<Message>
getMessage
()
48
{
49
update();
50
if
(millis() - transmitMs < 100)
51
{
52
return
Udon::Deserialize<Message>
(buffer);
53
}
54
else
55
{
56
return
Udon::nullopt
;
57
}
58
}
59
61
void
show
()
const
62
{
63
if
(
const
auto
message =
Udon::Deserialize<Message>
(buffer))
64
{
65
Udon::Show
(*message);
66
}
67
else
68
{
69
Serial.print(
F
(
"receive failed!"
));
70
}
71
}
72
74
void
showRaw
()
const
75
{
76
for
(
auto
&& it : buffer)
77
{
78
Serial.print(it);
79
Serial.print(
' '
);
80
}
81
}
82
83
private
:
84
void
update()
85
{
86
if
(serial.available() >=
static_cast<
int
>
(Size))
87
{
88
89
// バッファにデータを格納
90
for
(
auto
&& it : buffer)
91
{
92
const
auto
d = serial.read();
93
if
(d == -1)
94
{
95
break
;
96
}
97
else
98
{
99
it = d;
100
}
101
}
102
103
// タイミングによってバッファにデータが残っている可能性があるためクリア
104
while
(serial.available())
105
{
106
(void)serial.read();
107
}
108
109
transmitMs = millis();
110
}
111
}
112
};
113
114
}
// namespace Udon
Serializer.hpp
Show.hpp
F
#define F(x)
Definition
Show.hpp:17
Udon::Optional
オプショナル型
Definition
Optional.hpp:62
Udon::SerialReader::showRaw
void showRaw() const
送信内容を表示
Definition
SerialReader.hpp:74
Udon::SerialReader::SerialReader
SerialReader(Stream &serial)
コンストラクタ
Definition
SerialReader.hpp:38
Udon::SerialReader::show
void show() const
送信内容を表示
Definition
SerialReader.hpp:61
Udon::SerialReader::MessageType
Message MessageType
メッセージ型
Definition
SerialReader.hpp:34
Udon::SerialReader::getMessage
Udon::Optional< Message > getMessage()
メッセージの取得
Definition
SerialReader.hpp:47
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
Udon::nullopt
constexpr NulloptT nullopt
無効値
Definition
Optional.hpp:52