DUzun's Web
Programare, proiecte personale, divertisment

DUzun it's ME
 
\ 09 aprilie 2025, 14:38:25 \  
Conținut

Connection.pas

x
 
unit Connection;
{ Nivelul legăturii de date }
interface
{-----------------------------------------------------------------------------}
uses
  Funcs, IOStream, Pack, CmdByte,
  ExtCtrls, Classes;
{-----------------------------------------------------------------------------}
const
  c_BaudRate    = 250; // frames/sec : Max = 1000
  c_Retries     = 10;
  c_Reading     = $1;
  c_Writing     = $2;
{-----------------------------------------------------------------------------}
type
{ Class baza pentru protocoalele de comunicare }
  TConnection = class(TIOStream)
    MaxAddr, MyAddr: byte; 
    StateMsg: string; 
    OnStateChange: TNotifyEvent;
    procedure SendLog(Msg: string); 
  private
    FConectTime: TDateTime;
    FBaudRate: word;
    RWState:   byte;
    FOnTimer:  TNotifyEvent;
    function  GetConected: boolean;
    function  GetFConected: boolean;
    function  GetBaud: word;
    function  GetReading: boolean;
    function  GetWriting: boolean;
    procedure SetConected(const Value: boolean);
    procedure SetBaud(Value: word);
    procedure SetReading(const Value: boolean);
    procedure SetWriting(const Value: boolean);
    procedure SetOnTimer(const Value: TNotifyEvent);
    procedure SetFConected(const Value: boolean);
    property  FConected: boolean  read GetFConected write SetFConected;
    Procedure TimerProc(Sender: TObject);
  protected
    FTimer:    TTimer;
    FOwner:    TComponent;
    
    RetryCount: word;
    BaudCounter: word;
    {Discompunerea Frame-ului primit}
//     Pack :TPack; 
    p, len, tgt, src:  byte;
    Cycle: integer;
    Data: TBArray;
    function SplitRBAr: boolean;
    
  public
    property OnTimer  : TNotifyEvent read FOnTimer    write SetOnTimer;
    property BaudRate : word         read GetBaud     write SetBaud;
    property Conected : boolean      read GetConected write SetConected;
    property Reading  : boolean      read GetReading  write SetReading;
    property Writing  : boolean      read GetWriting  write SetWriting;
    function  Conect(NameOfFile: ShortString = ''): boolean;
    function  Disconect(force: boolean = false): boolean;
    procedure Synchronize(Sender: TObject);
    procedure ResetCycleCount;
    procedure Reset_All;
    procedure Reset_Connection;
    function  ConectionTime: TDateTime;
    procedure OnConect();    virtual;
    procedure OnDisconect(); virtual;
    constructor Create(AOwner: TComponent; NameOfFile: ShortString = ''; BaudR: word = c_BaudRate);
    destructor  Destroy; override;
   end;
{-----------------------------------------------------------------------------}
implementation
uses
   SysUtils;
{-----------------------------------------------------------------------------}
{ TConnection }
{-----------------------------------------------------------------------------}
procedure TConnection.SendLog(Msg: string);
begin
  StateMsg := Msg;
  OnStateChange(Self);
end; 
{-----------------------------------------------------------------------------}
constructor TConnection.Create;
begin
  inherited Create(NameOfFile);
  FOwner          := AOwner;
  OnTimer         := nil;
  BaudRate        := BaudR;
  Reset_Connection;
//   Pack := TPack.Create(0);
  FTimer          := TTimer.Create(FOwner);
  FTimer.Enabled  := false;
  FTimer.Interval := 1;
  Conected        := false;
end;
{-----------------------------------------------------------------------------}
procedure TConnection.Reset_Connection;
begin
  MaxAddr         := $00;
  MyAddr          := $00;
  RWState         := 0;
  BaudCounter     := 0;
end;
{-----------------------------------------------------------------------------}
procedure TConnection.Reset_All;
begin
   Reset_IO;
   Reset_IO_Buffers;
   Reset_Connection;
end;
{-----------------------------------------------------------------------------}
procedure TConnection.Synchronize;
begin
  if not FConected then begin // first call
     Reset_Connection;
     Opened         := true;
     CycleCount     := 0;
     FTimer.OnTimer := Synchronize;
     FTimer.Enabled := true;
     FConected      := true;
  end;
  if Writing then exit; // its locked by another call to Synchronize
  Writing := true;      // lock Synchronize
  ReadSBuf;
  if (NoReadCount >= 20 * FBaudRate) then
    begin // nobody inline
       MyAddr := 1;
       ReadResult := IO_OK;
    end;   
  case ReadResult of
  IO_OK:
     begin
        BaudCounter := FBaudRate;
        Reading     := true; // Enable Reading
        FTimer.OnTimer := TimerProc;
        FConected := true;
        OnConect();
     end;
  IO_NoData: ;
  IO_Failed:
     begin
        BaudCounter  := 0;
        CycleCount   := 0;
     end;
  end;
  Writing := false; // unlock Synchronize
end;
{-----------------------------------------------------------------------------}
procedure TConnection.TimerProc(Sender: TObject);
begin
   if(BaudCounter = 0)then begin
     if(Reading) then ReadSBuf  else    // --- Data reading  ---
     if(Writing) then WriteSBuf else    // --- Data writing  ---
     inc(OffSetCycle);                  // Cycles from connection
     BaudCounter := FBaudRate;  // renew counter
//      SplitRBAr;  // ReadResult - ?
     OnTimer(Self);             // --- Next level ---
   end else begin
     dec(BaudCounter);
   end;
end;
{-----------------------------------------------------------------------------}
function  TConnection.Conect(NameOfFile: ShortString=''): boolean;
begin
  if NameOfFile = '' then NameOfFile := FileName;
  if Conected and (NameOfFile = FileName) then Result := true
  else if Open(NameOfFile) then begin
     Synchronize(Self);
     Result := true;
  end else Result := false;
end;
{-----------------------------------------------------------------------------}
function  TConnection.Disconect;
begin
  if Conected then begin
    if (WSBuf.ready<>0)and(not force) then Result:=false
    else begin
      Conected  := false;
      Opened    := false;
      Reset_All;
      Result    := true;
      OnDisconect();
    end;
  end else Result:=true;
end;
{-----------------------------------------------------------------------------}
function  TConnection.GetConected: boolean; begin Result := FConected and Opened; end;
procedure TConnection.SetConected(const Value: boolean);
begin  
   if not Value then begin
      FTimer.Enabled := false;
      Opened := false; // release the file
      FConected := false;
   end else 
      Conect();
end;
{-----------------------------------------------------------------------------}
procedure TConnection.OnDisconect;begin end;
procedure TConnection.OnConect;begin end;
{-----------------------------------------------------------------------------}
function  TConnection.GetReading: boolean;begin Result := RWState and c_Reading <> 0; end;
function  TConnection.GetWriting: boolean;begin Result := RWState and c_Writing <> 0; end;
{-----------------------------------------------------------------------------}
procedure TConnection.SetReading(const Value: boolean);
begin
   if (Value) then RWState := c_Reading
   else RWState := RWState and c_Writing;  
end;
{-----------------------------------------------------------------------------}
procedure TConnection.SetWriting(const Value: boolean);
begin
   if (Value) then RWState := c_Writing
   else RWState := RWState and c_Reading;  
end;
{-----------------------------------------------------------------------------}
function  TConnection.GetBaud: word;        begin Result    := 1000 div FBaudRate; end;
procedure TConnection.SetBaud(Value: word); begin FBaudRate := 1000 div Value;     end;
{-----------------------------------------------------------------------------}
procedure TConnection.ResetCycleCount;begin CycleCount := CycleCount and $3; end;
{-----------------------------------------------------------------------------}
procedure TConnection.SetOnTimer(const Value: TNotifyEvent); begin FOnTimer := Value; end;
{-----------------------------------------------------------------------------}
destructor TConnection.Destroy;
begin
  Disconect;
  FTimer.Destroy;
  inherited Destroy;
end;
{-----------------------------------------------------------------------------}
function TConnection.SplitRBAr;
var r: boolean;
begin
   r := SplitFrame(RBAr, p, len, src, tgt)=0;
   if not r then exit;
   Data  := Copy(RBAr, p, len);
   Cycle := BAr2Int(RBAr, p+len+1, 4);
   Result := r;
end;
{-----------------------------------------------------------------------------}
procedure TConnection.SetFConected; begin if Value then FConectTime:=Time else FConectTime:=0; end;
function  TConnection.GetFConected; begin Result := FConectTime <> 0; end;
{-----------------------------------------------------------------------------}
function TConnection.ConectionTime; begin Result := FConectTime; end;
{-----------------------------------------------------------------------------}
end.

Aici acumulez programe şi algoritmi interesanti alcătuiţi de mine (cu mici excepţii) pe parcursul studierii unor limbaje de programare.

Cea mai mare parte din ele sunt realizate în Pascal. 

Nu am scopul creării unui curs specializat sau a descrierii detaliate a anumitor limbaje, ci doar prezint informaţii utile, plus ceva exemple interesante...

 

Răsfoitorul de fișiere (File Browser):

Codul sursă al programelor este organizat în mape şi fişiere.

Paginile care conțin cod sursă de programe de regulă au un răsfoitor de fișiere în partea stangă a paginii reprezentat de un bloc cu titlul „File Browser”.

Pentru a vizualiza un program sau conţinutul unei mape, faceţi click pe numele fişierului / mapei. Dacă fişierul nu este textual, el se va descărca automat, iar dacă este textual, conținutul lui se va afișa într-un bloc pe centrul paginii.

Pentru a descărca un fişier, faceţi click pe dimensiunea (size) lui.

arr_d Limba / Language


 


arr_r Login
 
 
Loading...