Changeset 119 for Comm/UCommFrame.pas


Ignore:
Timestamp:
Jan 5, 2011, 1:16:30 PM (14 years ago)
Author:
george
Message:
  • Created: New Lazarus package as container for few classes with bidirectional pin interconnection system .
Location:
Comm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Comm

    • Property svn:ignore set to
      lib
  • Comm/UCommFrame.pas

    r26 r119  
    66
    77uses
    8   Classes, UMemoryStreamEx, Dialogs, SysUtils,
    9   Forms, UCommPin;
     8  Classes, UStreamHelper, Dialogs, SysUtils,
     9  UCommPin;
    1010
    1111const
     
    2222  private
    2323    LastCharIsSpecialChar: Boolean;
    24     ReceiveBuffer: TMemoryStreamEx;
     24    ReceiveBuffer: TStreamHelper;
    2525    FrameState: TFrameState;
    2626    FFrameErrorCount: Integer;
     
    3131    FrameDataPin: TCommPin;
    3232    PacketLoss: Real;
    33     procedure RawDataReceive(Stream: TStream);
    34     procedure FrameDataReceive(Stream: TStream);
     33    procedure RawDataReceive(Sender: TCommPin; Stream: TStream);
     34    procedure FrameDataReceive(Sender: TCommPin; Stream: TStream);
    3535    constructor Create;
    3636    destructor Destroy; override;
     
    4646constructor TCommFrame.Create;
    4747begin
    48   ReceiveBuffer := TMemoryStreamEx.Create;
     48  ReceiveBuffer := TStreamHelper.Create;
    4949  RawDataPin := TCommPin.Create;
    5050  RawDataPin.OnReceive := RawDataReceive;
     
    6262end;
    6363
    64 procedure TCommFrame.FrameDataReceive(Stream: TStream);
     64procedure TCommFrame.FrameDataReceive(Sender: TCommPin; Stream: TStream);
    6565var
    66   RawData: TMemoryStreamEx;
     66  RawData: TStreamHelper;
    6767  I: Integer;
    6868  Character: Byte;
     
    7575  // Byte stuffing
    7676  Stream.Position := 0;
    77   RawData := TMemoryStreamEx.Create;
    78   RawData.WriteByte(SpecialChar);
    79   RawData.WriteByte(ControlCodeFrameStart);
    80   for I := 0 to Stream.Size - 1 do begin
    81     Character := TMemoryStreamEx(Stream).ReadByte;
     77  try
     78    RawData := TStreamHelper.Create;
     79    RawData.WriteByte(SpecialChar);
     80    RawData.WriteByte(ControlCodeFrameStart);
     81    for I := 0 to Stream.Size - 1 do begin
     82      Character := Stream.ReadByte;
     83      if Character = SpecialChar then begin
     84        RawData.WriteByte(SpecialChar);
     85        RawData.WriteByte(ControlCodeSpecialChar);
     86      end else RawData.WriteByte(Character);
     87    end;
     88
     89    Character := CRC;
    8290    if Character = SpecialChar then begin
    8391      RawData.WriteByte(SpecialChar);
    8492      RawData.WriteByte(ControlCodeSpecialChar);
    8593    end else RawData.WriteByte(Character);
     94
     95    RawData.WriteByte(SpecialChar);
     96    RawData.WriteByte(ControlCodeFrameEnd);
     97    //if Random >= PacketLoss then
     98      RawDataPin.Send(RawData);
     99
     100  finally
     101    RawData.Free;
    86102  end;
    87 
    88   Character := CRC;
    89   if Character = SpecialChar then begin
    90     RawData.WriteByte(SpecialChar);
    91     RawData.WriteByte(ControlCodeSpecialChar);
    92   end else RawData.WriteByte(Character);
    93 
    94   RawData.WriteByte(SpecialChar);
    95   RawData.WriteByte(ControlCodeFrameEnd);
    96   //if Random >= PacketLoss then
    97     RawDataPin.Send(RawData);
    98   RawData.Free;
    99103end;
    100104
    101 procedure TCommFrame.RawDataReceive(Stream: TStream);
     105procedure TCommFrame.RawDataReceive(Sender: TCommPin; Stream: TStream);
    102106var
    103107  Character: Byte;
     
    107111begin
    108112  for I := 0 to Stream.Size - 1 do begin
    109     Character := TMemoryStreamEx(Stream).ReadByte;
     113    Character := Stream.ReadByte;
    110114    if LastCharIsSpecialChar then begin
    111115      if Character = ControlCodeSpecialChar then begin
     
    115119          if FrameState = fsInside then
    116120            Inc(FFrameErrorCount);
    117           ReceiveBuffer.Clear;
     121          ReceiveBuffer.Size := 0;
    118122          FrameState := fsInside;
    119123        end else
     
    123127            if ReceiveBuffer.Size > 0 then begin
    124128              ReceiveBuffer.Position := ReceiveBuffer.Size - 1;
    125               CRC := TMemoryStreamEx(ReceiveBuffer).ReadByte;
     129              CRC := ReceiveBuffer.ReadByte;
    126130              ReceiveBuffer.Size := ReceiveBuffer.Size - 1;
    127131              ExpectedCRC := GetStreamCRC8(ReceiveBuffer);
Note: See TracChangeset for help on using the changeset viewer.