Polyphase Game Engine
Loading...
Searching...
No Matches
SerialManager.h
Go to the documentation of this file.
1#pragma once
2
3#include "EngineTypes.h"
4#include "ScriptFunc.h"
5#include "Serial/Serial.h"
6
7#include <atomic>
8#include <regex>
9#include <string>
10#include <vector>
11
12// Conflict with winuser.h's SendMessage macro.
13#ifdef SendMessage
14#undef SendMessage
15#endif
16
18{
19 enum class Type { Exact, Regex };
20 uint32_t mId = 0;
22 std::string mPattern;
23 std::regex mRegex;
25};
26
28{
29public:
30
31 static void Create();
32 static void Destroy();
33 static SerialManager* Get();
34
35 void Initialize();
36 void Shutdown();
37 void PreTickUpdate(float deltaTime);
38
39 std::vector<SerialPortInfo> EnumeratePorts();
40
41 SerialHandle Connect(const char* portName, const SerialConfig& cfg);
42 void Disconnect(SerialHandle handle);
43 bool IsConnected(SerialHandle handle) const;
44
45 int32_t SendMessage(SerialHandle handle, const uint8_t* data, uint32_t size);
46 int32_t SendMessage(SerialHandle handle, const std::string& data);
47
48 void StartReceive(SerialHandle handle);
49 void StopReceive(SerialHandle handle);
50 bool IsReceiving(SerialHandle handle) const;
51
52 uint32_t RegisterMessageMatcher(SerialHandle handle, const std::string& pattern,
53 SerialMessageMatcher::Type type, const ScriptFunc& callback);
54 void UnregisterMessageMatcher(SerialHandle handle, uint32_t matcherId);
56
57 void SetScriptMessageCallback(const ScriptFunc& func) { mScriptOnMessage = func; }
58 void SetScriptConnectCallback(const ScriptFunc& func) { mScriptOnConnect = func; }
59 void SetScriptDisconnectCallback(const ScriptFunc& func) { mScriptOnDisconnect = func; }
60
61 // Current-event accessors used by graph nodes during Evaluate().
62 SerialHandle GetCurrentEventHandle() const { return mCurrentEventHandle; }
63 const std::string& GetCurrentEventPortName() const { return mCurrentEventPortName; }
64 const std::string& GetCurrentEventData() const { return mCurrentEventData; }
65
66private:
67
68 struct Port
69 {
70 SerialHandle mHandle = INVALID_SERIAL_HANDLE;
71 std::string mPortName;
72 SerialNative* mNative = nullptr;
73 std::atomic<bool> mShouldStop { false };
74 std::atomic<bool> mDisconnected{ false };
75 bool mReceiving = false;
76 bool mConnectPending = true;
77 void* mReadThread = nullptr; // ThreadObject* — opaque to avoid pulling <Windows.h> into this header.
78 void* mRxMutex = nullptr; // MutexObject*
79 std::vector<uint8_t> mRxBuffer;
80
81 std::string mLineBuffer;
82 std::vector<SerialMessageMatcher> mMatchers;
83 uint32_t mNextMatcherId = 1;
84 };
85
86 static SerialManager* sInstance;
87
90
91 Port* FindPort(SerialHandle handle);
92 const Port* FindPort(SerialHandle handle) const;
93
94 void JoinAndDestroyReadThread(Port* port);
95 void DispatchMessage(SerialHandle handle, const uint8_t* data, uint32_t size);
96 void DispatchConnect(SerialHandle handle, const std::string& portName);
97 void DispatchDisconnect(SerialHandle handle);
98 void DispatchLineToMatchers(Port* port, const std::string& line);
99
100 std::vector<Port*> mPorts;
101 SerialHandle mNextHandle = 1;
102
103 ScriptFunc mScriptOnMessage;
104 ScriptFunc mScriptOnConnect;
105 ScriptFunc mScriptOnDisconnect;
106
107 // Populated during DispatchXxx so graph event nodes can read the payload.
108 SerialHandle mCurrentEventHandle = INVALID_SERIAL_HANDLE;
109 std::string mCurrentEventPortName;
110 std::string mCurrentEventData;
111};
uint32_t SerialHandle
Definition SerialTypes.h:6
Definition ScriptFunc.h:10
Definition SerialManager.h:28
void StartReceive(SerialHandle handle)
Definition SerialManager.cpp:201
void PreTickUpdate(float deltaTime)
Definition SerialManager.cpp:379
const std::string & GetCurrentEventPortName() const
Definition SerialManager.h:63
void Initialize()
Definition SerialManager.cpp:92
static SerialManager * Get()
Definition SerialManager.cpp:79
void StopReceive(SerialHandle handle)
Definition SerialManager.cpp:226
bool IsReceiving(SerialHandle handle) const
Definition SerialManager.cpp:235
bool IsConnected(SerialHandle handle) const
Definition SerialManager.cpp:181
uint32_t RegisterMessageMatcher(SerialHandle handle, const std::string &pattern, SerialMessageMatcher::Type type, const ScriptFunc &callback)
Definition SerialManager.cpp:280
static void Destroy()
Definition SerialManager.cpp:70
void SetScriptConnectCallback(const ScriptFunc &func)
Definition SerialManager.h:58
int32_t SendMessage(SerialHandle handle, const uint8_t *data, uint32_t size)
Definition SerialManager.cpp:187
SerialHandle GetCurrentEventHandle() const
Definition SerialManager.h:62
void SetScriptMessageCallback(const ScriptFunc &func)
Definition SerialManager.h:57
std::vector< SerialPortInfo > EnumeratePorts()
Definition SerialManager.cpp:124
void Shutdown()
Definition SerialManager.cpp:97
void UnregisterMessageMatcher(SerialHandle handle, uint32_t matcherId)
Definition SerialManager.cpp:318
const std::string & GetCurrentEventData() const
Definition SerialManager.h:64
static void Create()
Definition SerialManager.cpp:64
void SetScriptDisconnectCallback(const ScriptFunc &func)
Definition SerialManager.h:59
void ClearMessageMatchers(SerialHandle handle)
Definition SerialManager.cpp:334
Definition SerialTypes.h:19
Definition SerialManager.h:18
std::string mPattern
Definition SerialManager.h:22
Type mType
Definition SerialManager.h:21
ScriptFunc mCallback
Definition SerialManager.h:24
uint32_t mId
Definition SerialManager.h:20
std::regex mRegex
Definition SerialManager.h:23
Type
Definition SerialManager.h:19