source: branches/ByteArray/Devices/Serial.pas

Last change on this file was 10, checked in by chronos, 2 months ago
  • Modified: Improved serial console handling.
File size: 2.9 KB
Line 
1unit Serial;
2
3interface
4
5uses
6 Classes, SysUtils, Device, Int, Channel, syncobjs;
7
8type
9 { TSerial }
10
11 TSerial = class(TDevice)
12 private
13 FLock: TCriticalSection;
14 FOnInput: TNotifyEvent;
15 FOnOutput: TNotifyEvent;
16 InputBuffer: string;
17 OutputBuffer: string;
18 function ReadData(Size: TIntSize): TInt;
19 function ReadInputBufferCount(Size: TIntSize): TInt;
20 function ReadOutputBufferCount(Size: TIntSize): TInt;
21 procedure WriteData(Size: TIntSize; Value: TInt);
22 procedure WriteInputBufferCount(Size: TIntSize; Value: TInt);
23 procedure WriteOutputBufferCount(Size: TIntSize; Value: TInt);
24 public
25 constructor Create;
26 destructor Destroy; override;
27 function ReadOutputBuffer: string;
28 procedure WriteInputBuffer(Text: string);
29 function GetHandlers: THandlers; override;
30 property OnOutput: TNotifyEvent read FOnOutput write FOnOutput;
31 property OnInput: TNotifyEvent read FOnInput write FOnInput;
32 end;
33
34
35implementation
36
37{ TSerial }
38
39function TSerial.ReadData(Size: TIntSize): TInt;
40begin
41 FLock.Acquire;
42 try
43 if Length(InputBuffer) > 0 then begin
44 Result := Ord(InputBuffer[1]);
45 Delete(InputBuffer, 1, 1);
46 end;
47 finally
48 FLock.Release;
49 end;
50end;
51
52function TSerial.ReadInputBufferCount(Size: TIntSize): TInt;
53begin
54 FLock.Acquire;
55 try
56 Result := Length(InputBuffer);
57 finally
58 FLock.Release;
59 end;
60end;
61
62function TSerial.ReadOutputBufferCount(Size: TIntSize): TInt;
63begin
64 FLock.Acquire;
65 try
66 Result := Length(OutputBuffer);
67 finally
68 FLock.Release;
69 end;
70end;
71
72procedure TSerial.WriteData(Size: TIntSize; Value: TInt);
73begin
74 FLock.Acquire;
75 try
76 OutputBuffer := OutputBuffer + Chr(Value);
77 finally
78 FLock.Release;
79 end;
80end;
81
82procedure TSerial.WriteInputBufferCount(Size: TIntSize; Value: TInt);
83begin
84 FLock.Acquire;
85 try
86 InputBuffer := '';
87 finally
88 FLock.Release;
89 end;
90end;
91
92procedure TSerial.WriteOutputBufferCount(Size: TIntSize; Value: TInt);
93begin
94 FLock.Acquire;
95 try
96 OutputBuffer := '';
97 finally
98 FLock.Release;
99 end;
100end;
101
102constructor TSerial.Create;
103begin
104 FLock := TCriticalSection.Create;
105 OutputBuffer := '';
106 InputBuffer := '';
107end;
108
109destructor TSerial.Destroy;
110begin
111 FreeAndNil(FLock);
112 inherited;
113end;
114
115function TSerial.ReadOutputBuffer: string;
116begin
117 FLock.Acquire;
118 try
119 Result := OutputBuffer;
120 OutputBuffer := '';
121 finally
122 FLock.Release;
123 end;
124end;
125
126procedure TSerial.WriteInputBuffer(Text: string);
127begin
128 FLock.Acquire;
129 try
130 InputBuffer := InputBuffer + Text;
131 finally
132 FLock.Release;
133 end;
134end;
135
136function TSerial.GetHandlers: THandlers;
137begin
138 Result := THandlers.Create;
139 Result.ReadHandlers.Add(ReadData);
140 Result.ReadHandlers.Add(ReadOutputBufferCount);
141 Result.ReadHandlers.Add(ReadOutputBufferCount);
142 Result.WriteHandlers.Add(WriteData);
143 Result.WriteHandlers.Add(WriteInputBufferCount);
144 Result.WriteHandlers.Add(WriteOutputBufferCount);
145end;
146
147end.
148
Note: See TracBrowser for help on using the repository browser.