source: PinConnection/UCommMark.pas

Last change on this file was 414, checked in by chronos, 12 years ago
  • Fixed: Use parent TCommNode Active property instead custom in PinConnection package.
File size: 2.6 KB
Line 
1unit UCommMark;
2
3{$mode delphi}{$H+}
4
5interface
6
7uses
8 Classes, SysUtils, UCommPin, SpecializedList;
9
10type
11
12 { TCommMark }
13
14 TCommMark = class(TCommNode)
15 private
16 FMarkIndex: Integer;
17 FFrameData: TListByte;
18 procedure RawDataReceive(Sender: TCommPin; Stream: TListByte);
19 procedure RawSetStatus(Sender: TCommPin; Status: Integer);
20 procedure FrameDataReceive(Sender: TCommPin; Stream: TListByte);
21 procedure FrameSetStatus(Sender: TCommPin; Status: Integer);
22 protected
23 procedure SetActive(const AValue: Boolean); override;
24 public
25 PinRaw: TCommPin;
26 PinFrame: TCommPin;
27 Mark: TListByte;
28 procedure Reset;
29 constructor Create(AOwner: TComponent); override;
30 destructor Destroy; override;
31 end;
32
33implementation
34
35{ TCommMark }
36
37procedure TCommMark.RawDataReceive(Sender: TCommPin; Stream: TListByte);
38var
39 I: Integer;
40begin
41 for I := 0 to Stream.Count - 1 do
42 if (Mark.Count > 0) and (Stream[I] = Mark[FMarkIndex]) then begin
43 Inc(FMarkIndex);
44 if FMarkIndex >= Mark.Count then begin
45 PinFrame.Send(FFrameData);
46 FFrameData.Count := 0;
47 FMarkIndex := 0;
48 end;
49 end else begin
50 FFrameData.Count := FFrameData.Count + 1;
51 FFrameData[FFrameData.Count - 1] := Stream[I];
52 FMarkIndex := 0;
53 if Mark.Count = 0 then begin
54 PinFrame.Send(FFrameData);
55 FFrameData.Count := 0;
56 end;
57 end;
58end;
59
60procedure TCommMark.RawSetStatus(Sender: TCommPin; Status: Integer);
61begin
62 PinFrame.Status := Status;
63end;
64
65procedure TCommMark.FrameDataReceive(Sender: TCommPin; Stream: TListByte);
66begin
67 PinRaw.Send(Stream);
68 PinRaw.Send(Mark);
69end;
70
71procedure TCommMark.FrameSetStatus(Sender: TCommPin; Status: Integer);
72begin
73 PinRaw.Status := Status;
74end;
75
76procedure TCommMark.SetActive(const AValue: Boolean);
77begin
78 if FActive = AValue then Exit;
79 FActive := AValue;
80 if FActive then Reset;
81 inherited;
82end;
83
84procedure TCommMark.Reset;
85begin
86 FMarkIndex := 0;
87 FFrameData.Clear;
88end;
89
90constructor TCommMark.Create(AOwner: TComponent);
91begin
92 inherited;
93 PinRaw := TCommPin.Create;
94 PinRaw.OnReceive := RawDataReceive;
95 PinRaw.OnSetSatus := RawSetStatus;
96 PinRaw.Node := Self;
97 PinFrame := TCommPin.Create;
98 PinFrame.OnReceive := FrameDataReceive;
99 PinFrame.OnSetSatus := FrameSetStatus;
100 PinFrame.Node := Self;
101 Mark := TListByte.Create;
102 FMarkIndex := 0;
103 FFrameData := TListByte.Create;
104end;
105
106destructor TCommMark.Destroy;
107begin
108 FFrameData.Free;
109 Mark.Free;
110 PinRaw.Free;
111 PinFrame.Free;
112 inherited Destroy;
113end;
114
115end.
116
Note: See TracBrowser for help on using the repository browser.