UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
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>
14#include <Udon/Utility/Show.hpp>
15
16namespace Udon
17{
18
21 template <typename Message>
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:
38
41 SivSerialReader(s3d::Serial& bus)
42 : serial(bus)
43 , buffer(Size)
44 , thread([this]()
45 { receive(); })
46 , isRunning(true)
47 {
48 }
49
52 {
53 isRunning = false;
54 thread.join();
55 }
56
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
オプショナル型
Definition Optional.hpp:62
~SivSerialReader()
デストラクタ
Definition SivSerialReader.hpp:51
SivSerialReader(s3d::Serial &bus)
コンストラクタ
Definition SivSerialReader.hpp:41
Message MessageType
Definition SivSerialReader.hpp:37
void showRaw() const
Definition SivSerialReader.hpp:79
Udon::Optional< Message > getMessage() const
メッセージの取得
Definition SivSerialReader.hpp:59
void show() const
メッセージの表示
Definition SivSerialReader.hpp:66
Definition AirCylinder.hpp:16
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