-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSerial.cs
127 lines (104 loc) · 2.93 KB
/
Serial.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.Threading;
using System.Text.RegularExpressions;
using System.Runtime.CompilerServices;
namespace NanoPanel
{
class Serial
{
static SerialPort _serialPort;
static Regex regex_digital = new Regex(@"^2\s+D(?<pin>\d+)\s+(?<value>\d+)");
bool _isSerialOpen = false;
public bool IsSerialOpen
{
get => _isSerialOpen;
private set
{
bool prev = _isSerialOpen;
_isSerialOpen = value;
if(prev != value)
{
OnSerialOpenChanged(new(value));
}
}
}
bool _exitReadThread = false;
Thread readThread;
public event EventHandler<SerialOpenChangedArgs> SerialOpenChanged;
public event EventHandler<ReceivedLineArgs> ReceivedLine;
public virtual void OnSerialOpenChanged(SerialOpenChangedArgs e)
{
SerialOpenChanged?.Invoke(this, e);
}
public Serial()
{
_serialPort = new SerialPort("COM3", 9600);
}
public void Open()
{
readThread = new Thread(Read);
readThread.Start();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void ensureSerialIsOpen()
{
while (!_serialPort.IsOpen)
{
IsSerialOpen = false;
try
{
_serialPort.Open();
}
catch (System.IO.FileNotFoundException)
{
}
catch (System.IO.IOException)
{
}
Thread.Sleep(500);
}
IsSerialOpen = true;
}
private void Read()
{
while (!_exitReadThread)
{
try
{
ensureSerialIsOpen();
string message = _serialPort.ReadLine();
OnReceivedLine(new ReceivedLineArgs(message));
}
catch (TimeoutException) { }
catch (System.UnauthorizedAccessException) { }
}
}
public virtual void OnReceivedLine(ReceivedLineArgs e)
{
ReceivedLine?.Invoke(this, e);
}
void Close()
{
_serialPort.Close();
}
}
class ReceivedLineArgs : EventArgs
{
public string line;
public ReceivedLineArgs(String line) : base()
{
this.line = line;
}
}
class SerialOpenChangedArgs : EventArgs
{
public bool IsSerialOpen;
public SerialOpenChangedArgs(bool value)
{
IsSerialOpen = value;
}
}
}