UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
SerialReader.hpp
[詳解]
1//
2// Serial 受信クラス
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6// Sender --[Serial]--> Receiver
7// ^^^^^^^^
8//
9
10#pragma once
11
13#include <Udon/Utility/Show.hpp>
14
15namespace Udon
16{
17
20 template <typename Message>
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
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
#define F(x)
Definition Show.hpp:17
オプショナル型
Definition Optional.hpp:62
Serial 受信クラス
Definition SerialReader.hpp:22
void showRaw() const
送信内容を表示
Definition SerialReader.hpp:74
SerialReader(Stream &serial)
コンストラクタ
Definition SerialReader.hpp:38
void show() const
送信内容を表示
Definition SerialReader.hpp:61
Message MessageType
メッセージ型
Definition SerialReader.hpp:34
Udon::Optional< Message > getMessage()
メッセージの取得
Definition SerialReader.hpp:47
Definition Bit.hpp:12
Udon::Optional< T > Deserialize(ArrayView< const uint8_t > buffer)
バイト列からオブジェクトに逆シリアル化します
Definition Serializer.hpp:87
void Show(Args &&... args)
区切り文字ありで出力する
Definition Show.hpp:339
constexpr size_t SerializedSize() noexcept
Tをシリアライズした際のバイト列の要素数を取得する
Definition Serializer.hpp:22
constexpr NulloptT nullopt
無効値
Definition Optional.hpp:52