------------------------------------------------------------------------------
D C O P Y M O D - P O P I S   C I N N O S T I   D R I V E R U
------------------------------------------------------------------------------
verze: 2.02 (CP/DOS)

posledni editace: 6.3.1998

vlastnosti novych verzi:
------------------------
2.00 uvolnena 30.01.1997 - vznik ovladace

2.01 uvolnena 16.10.1997 - vzdalene ovladani aplikaci pomoci kanalu 13 az 25 (viz dale)

2.02 uvolnena  6. 3.1998 - oprava kodovani souboru typu CP2
                         - zmena kanalu c. 2 na typ ShortCard (0=master, 1=slave)
                         - zmena zapisu modemovych zprav do PAR-souboru
                           (znak CR se zapise znakem |, puvodne bylo #)
                         - zmena identifikace -> provedte upgrade na vsech spojovanych
                           pocitacich

v rozsirene verzi (DCOPYMOD+HLAS, v.1.03 pro CW) je dale:
    - prenos alarmovych zprav (ihned po zmene), tj. obecny prenos boolean-kanalu
      (postupne by to melo umet prenaset libovolny typ kanalu)
    - hlasove zpravy (DIGITAL VOICE !!!) pro hlaseni zmen boolean-kanalu na obycejny
      telefon (servisman call, ...)

------------------------------------------------------------------------------

Funkce: Prenos datovych souboru vytvarenych behem aplikace systemu Control
        panel 2 pomoci pristroju Archiver, Alarm, Trend, ... obecne
        souboru typu .DBF. s moznosti monitorovani stavu prenosu nadrazenou
        aplikaci pomoci informacnich kanalu.

------------------------------------------------------------------------------

Logika zjistovani datovych souboru na disku a jejich vyberu pro prenos:

1. Jsou hledany soubory v adresari podle nastaveni parametrickeho souboru
   - melo by souhlasit s nastavenim typu *.DBF v presmerovacim souboru .RED.

2. Kazdy archivovany soubor obsahuje v nazvu zakodovan datum a cas jeho
   vzniku - ovladac dekoduje tyto nazvy a vybere pouze soubory podle vybrane-
   ho casoveho intervalu.

3. Pokud je pristrojich s vystupem do .DBF zadan interval (polozka pristroje
   "file_length") delsi nez DEN, tak je v nazvu zakodovano datum pocatku
   zadaneho intervalu (napr. pro mesic je to 1.mesic.rok 00:00, pro rok je to
   1.1.rok 00:00). Proto je pri zahajeni prenosu nutno pocitat s tim, ze Vas
   vybrany casovy interval v okne ovladace musi obsahovat prave tyto pocatky
   vzniku souboru, aby byl pozadovany soubor prenesen.

4. Doporucujeme pouzivat delku archivniho souboru denni nebo i kratsi, nejle-
   pe s polozkou "file_mask_expression=<vyraz>" a "file_name=XX@@@@@@", kde
   <vyraz> je vypocitane cislo z aktualniho data. Tim se zprehledni nazvy
   souboru (bude z nich primo videt datum jijich vzniku, namisto pro uzivate-
   le neprehledne cislo v sestnactkove - CP1 nebo i osmatricitkove
   soustave - CP2). Mozne jsou samozrejme vsechny moznosti.

   priklad:
     var
       CodeDate = real, 0;
     end_var;

     archiver XX;
       timer = 3600;
       owner = ...;
       position = x1, y1, d, h;
       file_type = relative;
       file_length = day;
       file_name = 'XX@@@@@@';
       file_mask_expression = CodeDate;
       item
        ...
       end_item;
     end_archiver;

     program CalcDate;
       timer = 1;
       begin
        CodeDate = 10000*(year-100*Int(year/100)) + 100*month + day;
        (* vypocitana hodnota ve tvaru YYMMDD, kde YY=posl. dvoucisli roku,
                                                   MM=mesic
                                                   DD=den      *)
        (* tento vypocet odpovida zadani CODE_TYPE = YYMMDD v PAR-souboru
           pro ovladac DCOPYMOD, pokud otocime vahy dne (day) a roku (year),
           odpovida to zadani CODE_TYPE = DDMMYY *)
       end;
     end_program;

5. Dale je vybiran typ souboru, ktery urcuje hlavicka nazvu souboru - jedno-
   duse receno prvni pismena jeho nazvu. Pocet pismen, ktere lze pouzit pro
   hlavicku urcuje typ kodovani a maximalni delka nazvu - 8 pismen, pak pri
   kodovani (polozka CODE_TYPE):
             CP1    - datum na 7 znaku - zbyva 1 znak pro hlavicku
             CP2    - datum na 5 znaku - zbyva 1 az 3 znaky pro hlavicku
             YYMMDD,
             DDMMYY - datum na 6 znaku - zbyva 1 nebo 2 znaky hlavicky

6. Behem cinnosti ovladace lze vybrat ze tri skupin typu souboru - pro kazdou
   skupinu se definuje vycet hlavicek nazvu zadanim polozek NAME_ALL,
   NAME_CUSTOM1 a NAME_CUSTOM2 v PAR-souboru. Kazda skupina muze obsahovat
   maximalne 30 ruznych typu hlavicek. Jednotlivym skupinam pak odpovida
   vyber polozky VSECHNY, SKUPINA 1 nebo SKUPINA 2 v zadani TYP SOUBORU v
   dialogovem okne ovladace.

------------------------------------------------------------------------------

Okno ovladace:
--------------
Obsahuje ovladaci tlacitka:

  Od data (den, mesic, rok) - pomoci sipek nebo primym zadanim se urci
                              datum, od ktereho budou prenaseny vznikle
                              datove soubory.

  Do data (den, mesic, rok) - pomoci sipek nebo primym zadanim se urci
                              datum, do ktereho budou prenaseny vznikle
                              datove soubory.

  Typ souboru - vyber: Vsechny / Skupina 1 / Skupina 2
              - vyber typu souboru pro prenos podle hlavicky nazvu souboru

  Vyslat - Vytoci telefonni cislo a vysle vybrane soubory, pokud je vybrana
           polozka "automaticke zaveseni", tak po ukonceni prenosu zavesi
           telefonni linku.

  Prijmout - Vytoci telefonni cislo a prijme vybrane soubory, zavesi (viz
             tlacitko "Vyslat")

  Prerusit - prerusi prenos, v pripade vytaceni tel. cisla prerusi cinnost
             (nutno potvrdit souhlasem - okno s dotazem ANO/NE)

  Zavesit - prerusi prenos a provede rucni zaveseni linky
            (nutno potvrdit souhlasem - okno s dotazem ANO/NE)

  Info - zobrazi informace o autorovi

  Vyslat text + prijaty text - (v soucasne verzi zatim neni)
                             - prenos kratke textove zpravy do druheho PC


Zakladni informace o stavu ovladace:
1. Stav modemu - zobrazuje prave vysilany modemovy prikaz nebo smer
                 prenosu dat (vysilani, prijem, v klidu)

2. Stav prenosu - zobrazuje zbyvanici cas na odpoved modemoveho prikazu
                  nebo stav prenosu aktualniho souboru - jeho cely
                  nazev a velikost jeho prenesene casti (v procentech)

3. Spojeni - ukazatel poctu navazanych spojeni, jejich celkoveho doby trvani
             a doby trvani posledniho spojeni (hodnoty techto ukazatelu lze
             zalohovat pomoci kanalu ovladace 6 a 7 pristrojem BACKUP).



------------------------------------------------------------------------------
P O P I S   P A R A M E T R I C K E H O   S O U B O R U
------------------------------------------------------------------------------

{ ve slozenych zavorkach lze psat poznamky }
{ pozor: poznamky NELZE vkladat mezi klicove slovo promenne a jeji hodnotu !!! }
{ znaky slozenych zavorek jsou brany take jako klicova slova, proto je musite
  uvadet s oddelovacem ( novy radek, tabulator, mezera ); slozena zavorka spo-
  jena primo s textem je ignorovana: napr. slova {ahoj nebo ahoj} jsou jako
  pocatek nebo konec poznamky ignorovany. }

{ tento popis je cely "vyzavorkovany" mimo definic jednotlivych promennych
  pro driver DCOPYMOD.DLL, to znamena, ze jej lze zadat jako jeho vstupni
  parametricky soubor }

{ definice zprav pro rizeni modemu - modemove AT-prikazy a jejich odpovedi
     1. prikaz se uvadi jako retezec bez oddelovacu
     2. v retezci lze uvadet tyto specialni znaky, ktere maji nize popsanou
        funkci:
                 znak ~ ..... udela casovou prodlevu 1 sec behem vysilani
                              prikazu do modemu (delsi prodlevu provedeme
                              jednoduchym razenim techto znaku za sebou)
                 znak | ..... odpovida znaku CR, kod 0Dh (13 dekadicky)
                              Carrige Return
                              (poznamka: do verze 2.01 to byl znak #, to znamena
                              ze pri upgrade musite zmenit sve PAR-soubory !!!)
                 znak @ ..... odpovida znaku LF, kod 0Ah (10 dekadicky)
                              Line Feed

  funkce pro prikazy modemu typu HAYES-compatible:
  AT  ... znamena "attention", tj. pozor
  E0  ... vypne lokalni echo modemu
  X3  ... nevyzaduje detekci DIAL_TONE pred navazovanim spojeni
          (na linkach post-vychodni Evropy NUTNE !!!)
  &D0 ... ignorovani signalu DTR (nutno navolit kvuli zpusobu obsluhy
          hand-shake signalu systemem Control Panel)
  V1  ... dlouha forma navratovych odpovedi na prikazy modemu
          (vraci texty a ne cisla)
  H0  ... zavesi linku
  +++ ... prepne z datoveho do prikazoveho modu
}

{ definice serioveho portu pro pripojeni modemu }
{ --------------------------------------------- }

COM 1 2400 8 N 1 0 2048    { definice portu: cislo system.portu podle COM.INI
                                             rychlost
                                             pocet_bitu
                                             parita
                                             pocet_stop_bitu
                                             parametry hand-shake - viz dale
                                             velikost vyrov. pameti }

{ parametry HAND-SHAKE + RTS
  --------------------------
  Zadava se cislo typu WORD ( cele cislo v rozsahu 0 az 65535 ), kde jedno-
  tlive jeho bity maji nize popsany vyznam:

        bit 0 ... HW hand-shake CTS-RTS
        bit 1 ... plny duplex
        bit 2 ... obrati logiku signalu DTR
        bit 3 ... neni obsluhovan signal DTR (je stale ve stavu podle bitu 2)
        bit 4 ... protokol Xon/Xoff

  logika signalu RTS:

        bit 5 ... prohodi logiku signalu DTR a RTS
        bit 6 ... RTS do log. 1
        bit 5+6 ... RTS do log. 0
        bit 15 ... rezervovano pro spec.funkce -> NEPOUZIVAT !!!

        vahy jednotlivych bitu:
        bit 0 ...  1
        bit 1 ...  2
        bit 2 ...  4
        bit 3 ...  8
        bit 4 ...  16
        bit 5 ...  32
        bit 6 ...  64

  Kombinaci vice bitu soucasne provedeme jednoduchym sectenim jejich vah.
  Funkce spojene s dalsimi bity mohou vzniknout pozdeji.

}

{ prikazy pro volajici modem }
{ -------------------------- }

INIT ~~+++~~ATH0#~~ATE0X3&D0V1|  { inicializacni prikaz modemu }

INIT_OK |@OK|@             { spravna odpoved na inicializaci }

INIT_TIME 2.0              { maximalni cas pro odpoved }

CONNECT ATDP               { prikaz pro navazani spojeni:
                                 ATDP ..... dial pulse (pulsni volba)
                                 ATDT ..... dial tone  (tonova volba)
                             cely prikaz bude proveden najednou slozenim
                             promennych
                                CONNECT + CUNNECT_NUMBER + CONNECT_ENDCHAR }

CONNECT_NUMBER 22230       { telefonni cislo volaneho modemu
                             v cisle lze uvadet znak , (carka) pro provedeni
                             casove prodlevy behem vytaceni cisla }

CONNECT_ENDCHAR |          { ukoncovaci znak pro prikaz navazani spojeni }

CONNECT_OK CONNECT         { spravna odpoved - spojeni bylo provedeno }

CONNECT_TIME 60.0          { maximalni cas pro provedeni spojeni modemu }

LINEOFF ~~+++~~ATH0|~~        { prikaz pro uzavreni spojeni modemu
                             - zaveseni linky }

LINEOFF_OK |@OK|@          { spravna odpoved na zaveseni linky }

LINEOFF_TIME 3.0           { maximalni cas pro prikaz zaveseni linky }


{ prikazy pro ovladani volaneho modemu }
{ ------------------------------------ }

CONNECT_ANSWER ATA|        { prikaz pro provedeni spojeni modemu }

ANSWER_TIME 30.0           { maximalni cas pro prikaz spojeni }

CONNECT_RING |@RING|@      { zprava rikajici: NEKDO ZVONI !!! }

RING_COUNT 3               { pocet zvoneni, po kterych je proveden prikaz
                             CONNECT_ANSWER }

RING_TIME 10.0             { maximalni cas mezi jednotlivymi zpravami RING,
                             pri prekroceni casu je snulovano pocitadlo
                             zvoneni }


{ promenne pro prenos dat }
{ ----------------------- }

MAX_ERROR_COUNT 5          { maximalni pocet chyb komunikace za sebou,
                             po prekroceni je automaticky zavesena linka }

PACKET_TIMEOUT 1.5         { maximalni cas odpovedi jedne komunikacni zpravy }

NO_COMM_TIMEOUT 20.0       { maximalni cas bez komunikacnich zprav, po uplynuti
                             volana strana (slave) automaticky zavesi linku }

SOURCE_PATH C:\CP221\MODEM\DBF     { cesta k adresari na disku, odkud jsou
                                        brany soubory pro VYSILANI }

DEST_PATH C:\CP221\MODEM\DBF_ZAL   { cesta k adresari na disku, kam budou
                                        ukladany soubory pri PRIJMU }

FILE_EXT DBF               { pripona prenasenych souboru }

CODE_TYPE CP2              { typ kodovani nazvu datovych souboru:
                             CP2 ... Control Panel 2.xx
                             CP1 ... Control Panel 1.xx (u archiveru s para-
                                     metrem "Old_file_name")
                             YYMMDD nebo DDMMYY
                                 ... soubor s nazev obsahujicim posledni
                                     dvojcisli roku, mesic a den vzniku
                                     (popripade obracene) }

NAME_ALL ( AAA BBB )      { seznam pocatku nazvu prenasenych souboru v pripade
                            vyberu Vsechny/All/Vsetky }

NAME_CUSTOM1 ( AAA )      { viz NAME_ALL, pri vyberu Skupina 1 / Custom 1 }

NAME_CUSTOM2 ( BBB )      { viz NAME_ALL, pri vyberu Skupina 2 / Custom 2 }

NAME_CUSTOM3 ( )

NAME_CUSTOM4 ( )

NAME_CUSTOM5 ( )

OVERWRITE_MODE ALWAYS     { zpusob prepisovani existujicich souboru:
                            ALWAYS   ... soubor bude prepsan bez dotazu
                            QUESTION ... soubor bude prepsan s dotazem - Ano/Ne
                            NEVER    ... soubor nebude nikdy prepsan }


{ seznam i/o kanalu pro vyhodnoceni stavu driveru aplikaci CP }
{ ----------------------------------------------------------- }

{  nize popsana tabulka odpovida mapovacimu souboru .DMF

   kanal
   cislo smer      typ       popis
   -----------------------------------------------------------------------------
     1   input     boolean   true = modem je "online"
     2   input     shortcard 0 = master (vysila data), 1 = slave (prijem)
                             (do verze 2.01 to byl typ boolean -> zmente si .DMF)
     3   input     integer   den vzniku prave prenaseneho souboru
     4   input     integer   mesic vzniku prave prenaseneho souboru
     5   input     integer   rok vzniku prave prenaseneho souboru
     6   bidirect  real      celkovy cas "online"               *)
     7   bidirect  longint   celkovy pocet provedenych spojeni  *)
     8   input     real      podil v % prave prenaseneho souboru
     9   output    boolean   zapis TRUE zpusobi inicializaci COM-portu a
                             prikaz INIT_MODEM pouze kdyz neni "online"
    10   input     boolean   stav posledni inicializace, TRUE=v poradku
    11   input     integer   pocet souboru ve vysilaci fronte
    12   input     string    nazev prave prenaseneho souboru

    vzdalene nastaveni dialogu:
    13   output    integer   od - den
    14   output    integer   od - mesic
    15   output    integer   od - rok
    16   output    integer   do - den
    17   output    integer   do - mesic
    18   output    integer   do - rok
    19   output    boolean   true = custom phone
    20   output    string    custom phone number
    21   output    integer   group choice: 0=all, 1=group 1, 2=group 2
    22   output    boolean   true = transmit dle nastaveni
    23   output    boolean   true = receive
    24   output    boolean   true = prerusit
    25   output    boolean   true = zavesit

 poznamky:
   *) kanaly jsou obousmerne (bidirectional) z duvodu vazby na pristroj BACKUP
      pro zalohovani napocitanych hodnot jako ochrana pred jijich snulovanim
      pri startu driveru (aplikace)
}


------------------------------------------------------------------------------
D C O P Y M O D - KOMUNIKACNI PROTOKOL
------------------------------------------------------------------------------

  struktura komunikacnich zprav pro prenos DCOPYMOD:
  dotaz - odpoved:

                  prefix+ kod zpravy + delka + datovy blok + XOR-byt (ze vseho,
                  2 byty  1 byt        1 byt   <dle delka>   1 byt    bez prefixu)
                  -------------------------------------------------------------
 msgIDENT                   00         10     ConnectIDENT(10zn.)
 msgFileHeader              01      max.16    filelen(4) +FILENAME.EXT
 msgBlock                   02      max.250   Number(2) + DATA
 msgEnd                     AAh        0      <nic>
 msgSendME                  05         7      OD(YY+MM+DD) + DO(YY+MM+DD) + TYP
 msgSendText                06         X      Text
 msgFilesEnd                0Ah        0      <nic>

 msgAnswerIDENT             ff         10     ConnectIDENT(10zn.)
 msgAnswerFileHeader        03         16     filelen(4) +FILENAME.EXT
 msgAnswerFileNoOverWrite   04         0      <nic>
 msgAnswerBlockOK           E1h        0      <nic>
 msgAnswerBlockERR          5Ch        0      <nic>
 msgAnswerEnd               55h        0      <nic>
 msgAnswerSendText          07         0      <nic>
 msgAnswerSendMe            08         0      <nic> + vymena Master/Slave
 msgAnswerNoData            09         0      <nic> ... odp. na SendMe
 msgAnswerFilesEnd          0Bh        0      <nic>


popis jednotlivych zprav:

 msgIDENT
 msgAnswerIDENT
 - identifikace spojeni - vzdy 1. komun. zprava
   (ochrana pred spojenim s cizim SW)

 msgFileHeader
 msgAnswerFileHeader
 msgAnswerFileNoOverWrite
 - hlavicka souboru - pocatek jeho prenosu
 - odpovi stejnou hlavickou (mozno zahajit prenos) nebo zpravou "neprepisovat"

 msgBlock
 msgAnswerBlockOK
 msgAnswerBlockERR
 - jednotlivy blok prenaseneho souboru, obsahuje cislovani a moznost opakova-
   ni bloku pri chybe, nutno dodrzet kontinuitu dat, poradi bloku nelze
   menit

 msgEnd
 msgAnswerEnd
 - zprava typu "bude se zavesovat linka"

 msgFilesEnd
 msgAnswerFilesEnd
 - konec seznamu, "jiz nebude dalsi", mozno prepnout rizeni toku (vysilano
   pouze pri vyberu PREJMOUT, kde se zpravou SENDME otoci smer rizeni linky
   Master/Slave

 msgSendME
 msgAnswerSendMe
 msgAnswerNoData
 - zprava vyslana pri vyberu PRIJMOUT, obsahuje informace o casovem intervalu
   a typu vybrane skupiny, po odpovedi "AnswerSendMe" nasleduje otoceni rizeni
   Master/Slave a druha strana, ktera se stala docasne Masterem vytvori
   svuj seznam souboru a zacne ho vysilat. Po ukonceni preda rizeni zpet
   zpravou "FileEnd". Odpovedi "AnswerNoData" da navedomi, ze podle pozado-
   vaneho vyberu neexistuji zadne soubory.

 msgSendText
 msgAnswerSendText
 - pripravovano (neni nutno pro chod), zprava mimo logicky cyklus, prenese
   kratky text pro jednoduchou komunikaci mezi uzivateli

 prefix =  66h + BBh
 ConnectIDENT = 'DCOPYMOD22'
 Filelen(4) = delka souboru ve formatu LONGINTEGER;
 Number(2) = cislo prave renaseneho bloku - od 00, nutno s kazdym blokem
             zvetsit o +1
 <nic> = kratka zprava, neobsahuje zadna data


prijem: 2 byty = prefix, pak dalsi 2 byty - kod+delka, pak (delka+1) * byty


zpusob kom.:

  MASTER-Navazuje spojeni           SLAVE-PRIJIMA
  "connect"                         "ring" x krat + "ata"
( msgIDENT                          msgAnswerIDENT )
  msgSendME                         msgAnswerSendMe
                                       odpoved je "kolo vysilani",
                                       tj. vymeni se Master/Slave
                                    msgAnswerNoData

  [v teto fazi si Master vytvori seznam souboru pro prenos]

kolo vysilani:
( msgFILEheader            +------  msgAnswerFILEheader
                           |        msgAnswerFILEnoOverWrite ---> next file
                   <-------+
( msgBLOCK                          msgAnswerBlockOK ---> next block/file
                                    msgAnswerBlockERR ---> repeat block     ))

  msgFilesEnd                       msgAnswerFilesEnd

  msgEND                            msgAnswerEND ---> ATH0, total konec
                                    msgSendME ---> dtto nove kolo
  ---------------------------------------------------------------------------
  msgSendText                       msgAnswerSendText


-konec-souboru-