{ verze 1.0 }

unit uEcpDef;

interface

{$IFDEF DELPHI32}
  {$MINENUMSIZE 1}
  {$ALIGN 2}
{$ELSE}
  {$A+}
{$ENDIF}


type

{$IFDEF DELPHI32}
  TInteger = SmallInt;
  TReal    = Real48;
{$ELSE}
  TInteger = Integer;
  TReal    = Real;
{$ENDIF}

{-------------------------------------------------------------}
{ ECP - Embedded Control Protocol                             }
{-------------------------------------------------------------}

{ Definice ECP protokolu }

type

{ Struktura zpravy ECP protokolu

  |     header    |   data     |
  +---+---+---+---+------------+
  |Flg|Len|Seq|Cmd|            |
  +---+---+---+---+------------+

}
  { Zahlavi ECP protokolu }

  PECPHeader = ^TECPHeader;
  TECPHeader = packed
  record
    Flg  : Word;        { Priznaky datagramu                   }
    Len  : Word;        { Delka datagramu vcetne teto hlavicky }
    Seq  : Word;        { Cislovani datagramu                  }
    Cmd  : Word;        { Identifikator prikazu                }
    Data : record end;
  end;

const { TECPHeader.Flags }

{ Zatim jsou definovany pouze dva priznaky: }

  ECP_FLAG_ACK   = 1;   { Zprava je potvrzeni           }
  ECP_FLAG_ERR   = 2;   { Zprava je negativni potvrzeni }


{
   ACK | ERR |
  -----+-----+----------------------------
    0  |  0  |  bezna zprava
    0  |  1  |  pozitivni potvrzeni zpravy
    1  |  0  |  !!! neplatna kombinace
    1  |  1  |  negativni potvrzeni zpravy

}


const { TEcpHeader.Cmd }
{
   15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  |--+--+--+--|--+--+--+--+--+--+--+--+--+--+--+--|
  |  process  |            command                |
  |--+--+--+--|--+--+--+--+--+--+--+--+--+--+--+--|
}

  ECP_PROC_LOADER     = $1000; { Proces loader             }
  ECP_PROC_DEBUGGER   = $2000; { Proces debugger           }
  ECP_PROC_FILETRANS  = $3000; { Proces pro prenos souboru }

  ECP_PROC_MASK       = $F000;

  { Cisla procesu 0..7 jsou rezervovane.
    Cisla procesu 8..15 jsou k dispozici uzivateli }

  { Nasledujici zpravy musi implementovat kazdy process }

  ECP_CMD_PROC_ID     = 1; { Identifikace procesu      }
  ECP_CMD_PROC_VER    = 2; { Verze procesu             }

  { Nasledujici zpravy muze implementovat kazdy process }

  ECP_CMD_USER        = 3; { Identifikace uzivatele    }

  ECP_CMD_MASK        = $0FFF;

  { Cisla identifikatoru 0..31 jsou rezervovane }

const

  { Maximalni delka textoveho popisu chyby }

  MAX_ECP_ERROR_LENGTH = 255;

type

  { _RS ... RESPONSE, _RQ ... REQUEST }

  { Identifikace procesu }

  TECP_PROC_ID_RS = packed
  record
    Ident : array[0..15] of Char;
  end;

  { Verze procesu }

  TECP_PROC_VER_RS = packed
  record
    Version : Longint;
  end;


  { Stuktura dat ECP protokolu v pripade negativni odpovedi
    tj. ACK=ERR=1,

    delka dat je volitelna, minimalne 2, maximalne 258 bajtu
  }

  TECP_ERROR_RS = packed
  record
    ErrCode : Word;
    ErrText : packed array[0..MAX_ECP_ERROR_LENGTH - 1] of Char;
  end;


  TECPData = packed
  record
    case Integer of
      0: ( PROC_ID_RS   : TECP_PROC_ID_RS );
      1: ( PROC_VER_RS  : TECP_PROC_VER_RS );
      2: ( ERROR_RS     : TECP_ERROR_RS );
  end;

{
   ErrCode  .. identifikator chyby, ECP_ERR_xxx
   ErrText  .. Volitelny textovy popis chyby, nulou zakonceny string
}


const

  ECP_ERR_NOERROR          = 0;
  ECP_ERR_NOTSPECIFIED     = 1; { Nespecifikovana chyba          }
  ECP_ERR_INVALID_PROC     = 2; { Neplatny identifikator procesu }
  ECP_ERR_INVALID_CMD      = 3; { Neplatny identifikator prikazu }
  ECP_ERR_INVALID_LEN      = 4; { Neplatna delka dat             }
  ECP_ERR_ACCESS_DENIED    = 5; { Pristup odmitnut               }
  ECP_ERR_NOTIMPL          = 6; { Funkce neimplementovana        }

  { Cisla chyby 0 az 31 jsou rezervovane }

{-------------------------------------------------------------}
{ EFTP - Embedded File Trasfer Protocol                       }
{-------------------------------------------------------------}

const { Identifikatory prikazu protokolu EFTP }

  EFTP_CMD_RESET               = 32; { Reset automatu,               }
                                     { uzavreni vsech souboru        }

  EFTP_CMD_OPEN                = 33; { Otevreni souboru              }
  EFTP_CMD_CLOSE               = 34; { Uzavreni souboru              }
  EFTP_CMD_READ                = 35; { Cteni dat ze souboru          }
  EFTP_CMD_WRITE               = 36; { Zapis dat do souboru          }

  EFTP_CMD_GETDIR              = 37; { Cteni aktualniho adresare     }
  EFTP_CMD_SETDIR              = 38; { Nastaveni aktualniho adresare }

  EFTP_CMD_OPENDIR             = 39; { Otevreni adresare             }
  EFTP_CMD_CLOSEDIR            = 40; { Uzavreni adresare             }
  EFTP_CMD_READDIR             = 41; { Cteni polozky adresare        }

const { Identifikatory chyb protokolu EFTP }

  EFTP_ERR_INVALID_HANDLE      = 32;  { Neplatne cislo handle           }
  EFTP_ERR_FILE_ACCESS_DENIED  = 33;  { Odmitnuti pristupu              }
  EFTP_ERR_FILE_NOT_FOUND      = 34;  { Soubor nenalezen                }
  EFTP_ERR_PATH_NOT_FOUND      = 35;  { Cesta nenalezena                }
  EFTP_ERR_TOO_MANY_OPEN_FILES = 36;  { Prilis mnoho otevrenych souboru }
  EFTP_ERR_READ_ERROR          = 37;  { Chyba pri cteni z media         }
  EFTP_ERR_WRITE_ERROR         = 38;  { Chyba pri zapisu na medium      }


{ Popis jednotlivych prikazu }

{

* RESET .. provede reset EFTP serveru
           uzavre vsechny otevrene soubory, predchozi handle jsou neplatne

  Data:    -
  Odpoved: -
  Chyby:   -

* OPEN  .. otevreni souboru

  Data:    2B + n, mod otevreni, nazev souboru
  Odpoved: 2B, handle
  Chyby:   FILE_ACCESS_DENIED
           FILE_NOT_FOUND
           TOO_MANY_OPEN_FILES

* CLOSE .. uzavreni souboru

  Data:    2B, handle vraceny v odpovedi na zpravu OPEN
  Odpoved: -
  Chyby:   INVALID_HANDLE

* READ  .. cteni dat souboru

  Data:    4B, handle vraceny v odpovedi na zpravu OPEN, max. delka v bajtech
  Odpoved: n, data
  Chyby:   INVALID_HANDLE
           READ_ERROR

* WRITE .. zapis dat do souboru

  Data:    2B + n, handle vraceny v odpovedi na zpravu OPE, data
  Odpoved: 2B, pocet zapsanych bajtu
  Chyby:   INVALID_HANDLE
           WRITE_ERROR

* GETDIR .. cteni cesty aktualniho adresare

  Data:    -
  Odpoved: cesta k adresari (nulou zakonceny string)
  Chyby:   -

* SETDIR .. nastaveni cesty aktualniho adresare

  Data:    n, cesta k adresari (nulou zakonceny string)
  Odpoved: -
  Chyby:   EFTP_ERR_PATH_NOT_FOUND


* OPENDIR .. otevreni adresare

  Data:    n, cesta k adresari (nulou zakonceny string)
  Odpoved: 2B, handle
  Chyby:   TOO_MANY_OPEN_FILES
           PATH_NOT_FOUND

* CLOSEDIR .. uzavreni adresare

  Data:    2B, handle vraceny v odpovedi na zpravy OPENDIR
  Odpoved: -
  Chyby:   INVALID_HANDLE

* READDIR  .. cteni polozky adresare

  Data:    2B, handle vraceny v odpovedi na zpravy OPENDIR
  Odpoved: ?, ????
  Chyby:   INVALID_HANDLE
           TOO_MANY_OPEN_FILES
           READ_ERROR

}

const

  MAX_FILENAME_LENGTH        = 256;
  MAX_EFTP_DATA_BLOCK_LENGTH = 512;

type

  { _RS ... RESPONSE, _RQ ... REQUEST }

  TEFTP_OPEN_RQ = packed
  record
    Mode     : Word;
    Filename : array[0..MAX_FILENAME_LENGTH - 1] of Char;
  end;

  TEFTP_OPEN_RS = packed
  record
    Handle : Word;
  end;

  TEFTP_WRITE_RQ = packed
  record
    Handle : Word;
    Data   : array[0..MAX_EFTP_DATA_BLOCK_LENGTH - 1] of Byte;
  end;

  TEFTP_WRITE_RS = packed
  record
    BytesWritten : Word;
  end;

  TEFTP_READ_RQ = packed
  record
    Handle      : Word;
    BytesToRead : Word;
  end;

  TEFTP_READ_RS = packed
  record
    Data   : array[0..MAX_EFTP_DATA_BLOCK_LENGTH - 1] of Byte;
  end;

  TEFTP_CLOSE_RQ = packed
  record
    Handle : Word;
  end;

  TEFTP_GETDIR_RS = packed
  record
    PathName : array[0..MAX_FILENAME_LENGTH - 1] of Char;
  end;

  TEFTP_SETDIR_RQ = packed
  record
    PathName : array[0..MAX_FILENAME_LENGTH - 1] of Char;
  end;

  TEFTP_OPENDIR_RQ = packed
  record
    PathName : array[0..MAX_FILENAME_LENGTH - 1] of Char;
  end;

  TEFTP_OPENDIR_RS = packed
  record
    Handle : Word;
  end;

  TEFTP_CLOSEDIR_RQ = packed
  record
    Handle : Word;
  end;


  TEFTP_READDIR_RQ = packed
  record
    { !@# doplnit }
  end;

  TEFTP_READDIR_RS = packed
  record
    { !@# doplnit }
  end;

  TEFTPData = packed
  record
    case Integer of
      0:  ( OPEN_RQ     : TEFTP_OPEN_RQ );
      1:  ( OPEN_RS     : TEFTP_OPEN_RS );
      2:  ( CLOSE_RQ    : TEFTP_CLOSE_RQ );
      3:  ( READ_RQ     : TEFTP_READ_RQ );
      4:  ( READ_RS     : TEFTP_READ_RS );
      5:  ( WRITE_RQ    : TEFTP_WRITE_RQ );
      6:  ( WRITE_RS    : TEFTP_WRITE_RS );
      7:  ( GETDIR_RS   : TEFTP_GETDIR_RS );
      8:  ( SETDIR_RQ   : TEFTP_SETDIR_RQ );
      9:  ( OPENDIR_RQ  : TEFTP_OPENDIR_RQ );
      10: ( OPENDIR_RS  : TEFTP_OPENDIR_RS );
      11: ( CLOSEDIR_RQ : TEFTP_CLOSEDIR_RQ );
      12: ( READDIR_RS  : TEFTP_READDIR_RQ );
      13: ( ERROR_RS    : TECP_ERROR_RS );
  end;


implementation



end.
