⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 komunikator.h

📁 s/w handheld terminal ( based on Cygnal 8051f230)
💻 H
字号:
/*
    Glavna klasa za slanje/prijem poruka preko serijskog porta.
    Klasa je 'singleton': pristup procedurama se vrsi preko pointera 'KKomunikator::Instance()'.
    Na pocetku su izdvojene deklaracije svega sto je kasnije definisano.
*/
#ifndef KOMUNIKATOR_H
#define KOMUNIKATOR_H
#include "Poruka.h"
#include "Korisno.h"
#include "Interpret.h"
#include "Komanda.h"
#include "Serial.h"
#include <fstream>      // rad sa datotekama

//******************************* Deklaracije << BEGIN >> *******************************
//      - kalse
class KTransakcija;
class KKomunikator;
//******************************** Deklaracije << END >> ********************************

class KTransakcija {
public:
    // Konstruktori
    KTransakcija( string cNaziv, TListaTransakcPoruka& listaPoruka );
    KTransakcija( void );

    // Vraca naziv transakcije
    string DajNaziv( void );

    // Postavlja naziv transakcije
    void PostaviNaziv( string cNoviNaziv );

    // Prazni listu poruka
    void IsprazniListuPoruka( void );

    // Vraca true ako je lista poruka prazna
    bool PraznaListaPoruka( void );

    // Dodaje poruku na kraj liste
    void DodajPoruku( KTransankcionaPoruka trPoruka );

    // Obilazi sve poruke transakcije i salje/prima na dati serijski port.
    // Ako ne uspe slanje/prijem samo jedne poruke, prekida transakciju i vraca false.
    bool Izvrsi( KSerial& COMPort, double nTajmaut );

    // Izdvaja korisne podatke iz poruka primljenih od terminala i smesta u string 'cKorisniPodaci'
    virtual void IzdvojiKorisnePodatke( string& cKorisniPodaci );

    // Isprazni 'dnevnik' transakcije
    void IsprazniLog( void );

    // Dodaje poruku u 'dnevnik' transakcije
    void DodajPorukuULog( KString cPoruka );

    // Vraca 'dnevnik' transakcije preko parametra log
    void DajLog( TListaStringova& log );

private:
    string                  naziv;          // ID transakcije.
    TListaTransakcPoruka    listaPoruka;    // Poruke koje cine 'transakciju'.
    TListaStringova         log;            // Poruke o toku izvrsenja transakcije
};

class KKomunikator {
public:
    // Procedura za pristup jedinom objektu klase
    static KKomunikator* Instance( void );

    // Procedura za inicijalizaciju : 
    //  - cita konfiguracione parametare iz konfig. fajla koji se nalazi u datom direktorijumu
    //  - postavlja parametare za transakcije ( broj pokusaja i tajmaut )
    void Init( string cNazivExeDatoteke, string cAppDir, 
               unsigned int nBrPokusaja, double nTajmaut );

    // Vraca broj pokusaja da izvrsi transakciju pre nego sto javi gresku
    unsigned int DajBrojPokusaja( void );

    // Postavlja koliko puta pokusava da izvrsi transakciju pre nego sto javi gresku
    void PostaviBrojPokusaja( unsigned int nBrPokusaja );

    // Vraca vrednost tajmauta za serijsku komunikaciju.
    double DajTajmaut( void );

    // Vraca vrednost tajmauta izmedju dva pokusaja izvrsenja transakcije.
    double DajTransakcTajmaut( void );

    // Postavlja vrednost tajmauta za serijsku komunikaciju.
    void PostaviTajmaut( double nSendRcvTajmaut );

    // Postavlja vrednost tajmauta izmedju dva pokusaja izvrsenja transakcije.
    void PostaviTransakcTajmaut( double nTerminalTajmaut );

    // Vraca vrednosti parametara komunikacije ( tajmauti i broj pokusaja )
    void DajParametreKomunikacije( double& nSendRcvTajmaut, double& nTransakcTajmaut,
                                   unsigned int& nBrPokusaja );

    // Postavi vrednosti parametara komunikacije ( tajmauti i broj pokusaja )
    void PostaviParametreKomunikacije( double nSendRcvTajmaut, double nTransakcTajmaut,
                                       unsigned int nBrPokusaja = 0 );

    // Vraca 'true' ako lista poruka transakcije nije prazna
    bool TransakcijaFormirana( void );

    // Prima poruku date duzine sa datog serijskog porta i smesta u promenljivu 'poruka'.
    // U slucaju greske vraca 'false'.
    // Nakon prijema, sadrzaj poruke se dekodira ako je nDekodirajSadrzaj == true.
    bool PrimiPoruku( KPoruka& poruka, unsigned int nDuzinaOcekivanePoruke, 
                      KSerial& COMPort, double nTajmaut, bool nDekodirajSadrzaj = false );

    // Salje datu poruku na dati serijski port. U slucaju neuspeha vraca 'false'.
    // Pre slanja, sadrzaj poruke se kodira ako je nKodirajSadrzaj == true.
    bool PosaljiPoruku( KPoruka& poruka, KSerial& COMPort, double nTajmaut,
                        bool nKodirajSadrzaj = false );

    // Ocitavanje podataka sa terminala, za brojilo sa datim serijskim brojem.
    // Ocitane podatke vraca preko parametra cKorisniPodaci. U slucaju neuspeha vraca false.
    // Ako je nDuzinaOdg==0, uzima se duzina odgovora definisana u spisku komandi.
    bool OcitajPodatak( EIDKomande ID, unsigned int nSerijskiBroj, string& cKorisniPodaci,
                        unsigned int nDuzinaOdg = 0 );

    // Preuzima 'administrativne' informacije sa rucnog terminala.
    // U slucaju neuspeha vraca false.
    // nDuzinaOdg ( duzina odgovora ) zavisi od verzije softvera na rucnom terminalu.
    bool OcitajOpisRT( void );

    // Preuzima 'administrativne' informacije sa rucnog terminala.
    // U slucaju neuspeha vraca false.
    bool OcitajAdminInfo( void );

    // Ocitavanje tarife koja treba da se setuje na brojilima. U slucaju neuspeha vraca false.
    bool OcitajMasterTarifu( string& cKorisniPodaci );

    // Ocitavanje sve podataka sa terminala, za brojilo sa datim serijskim brojem.
    // Grupa podataka je definisana flegovima setovanim na terminalu.
    // Ocitane podatke vraca preko parametra cKorisniPodaci. U slucaju neuspeha vraca false.
    bool OcitajSvePodatake( unsigned int nSerijskiBroj, string& cKorisniPodaci );

    // Ocitava trazene podatke za sva brojila u spisku koji se nalazi u rucnom terminalu.
    // Ocitane podatke vraca preko vektora 'korisniPodaci'. U slucaju neuspeha vraca false.
    bool OcitajPodatakZaSvaBrojila( EIDKomande IDkomande, TListaStringova& korisniPodaci );

    // Ocitavanje spiska brojila sa rucnog terminala.
    // Ocitane podatke vraca preko parametra cKorisniPodaci. U slucaju neuspeha vraca false.
    bool OcitajSpisakBrojila( string& cKorisniPodaci );

    // Izvrsava komandu za snimanje datog podatka na rucni terminal.
    // U slucaju neuspeha vraca false.
    bool SnimiNaTerminal( EIDKomande ID, string cKorisniPodaci );

    // Izvrsava komandu za snimanje lozinke na rucni terminal.
    // Ako rucni terminal podrzava i proveru 'ID-a PC aplikacije' onda treba zadati i taj ID.
    // U slucaju neuspeha vraca false.
    bool SnimiLozinkuNaTerminal( EIDKomande ID, string cLozinke, 
                                 bool PodrzanPCAppID=false, string cAppID="" );

    // Otkljucava funkciju terminala definisanu ID-om, pod uslovom da je lozinka ispravna.
    // Koristi se za otkljucavanje funkcija za programiranje brojila ( tarife, vremena ... ).
    // Ako rucni terminal podrzava i proveru 'ID-a PC aplikacije' onda treba zadati i taj ID.
    // U slucaju neuspeha vraca false.
    bool OtkljucajFunkcijuTerminala( EIDKomande ID, string cLozinka, 
                                     bool PodrzanPCAppID=false, string cAppID="" );

    // Zakljucava funkciju terminala definisanu ID-om.
    // Koristi se za zakljucavanje funkcija za programiranje brojila ( tarife, vremena ... ).
    // Ako rucni terminal podrzava i proveru 'ID-a PC aplikacije' onda treba zadati i taj ID.
    // U slucaju neuspeha vraca false.
    bool ZakljucajFunkcijuTerminala( EIDKomande ID, 
                                     bool PodrzanPCAppID=false, string cAppID="" );

    // Izvrsava komandu za proveru ID-a aplikacije.
    // ( rucni terminal treba da se odaziva samo aplikaciji sa odgovarajucim ID-om )
    bool ProveriPCAppID( string cAppID );

    // 'Uvodna transakcija' kod snimanja spiska brojila :
    // salju se podaci za inicijalizaciju prenosa ( komanda, broj brojila koji treba preneti i sl. )
    bool InitSnimiSpisakBrojila( string cKontrolInfo );

    // Transakcija za slanje podataka o brojilu. Koristi se kod snimanja spiska brojila.
    bool PosaljiPodatakOBrojiluIzSpiska( string cPodatak );

    // Snima spisak brojila koja treba ocitati na rucni terminal.
    // U slucaju neuspeha vraca false.
    bool SnimiSpisakBrojila( string cKontrolInfo, TListaStringova& podaciOBrojilima );

    // Vraca duzinu spiska brojila koji treba preuzeti sa terminala ( u bajtovima ).
    unsigned int DuzinaSpiskaBrojila( void );

    // Vraca duzinu grupe podataka o jednom brojilu ( u bajtovima ). 
    // Grupa je definisana flegovima i opisom, sto znaci da se uzimaju se u obzir samo podaci 
    // za koje je postavljen fleg i koji 'odgovaraju opisu'.
    unsigned int DuzinaGrupePodatakaOBrojilu( EOpisPodatka nOpis );

    // Vraca duzinu grupe podataka za sva brojila ( u bajtovima ).
    // Grupa je definisana flegovima i opisom, sto znaci da se uzimaju u obzir samo podaci 
    // za koje je postavljen fleg i koji 'odgovaraju opisu'.
    // NAPOMENA: ova funkcija se koristi samo za stare verzije terminala ( < 1.3 );
    //           u novim verzijama, ovo se racuna na osnovu opisa RT.
    unsigned int DuzinaPodatakaOSvimBrojilima( EOpisPodatka nOpis );

    // String sa podacima primljenim od rucnog terminala pretvara u string pogodan za upis u fajl.
    void GrupuPodatakaUFormatiranString( const string& cKorisniPodaci, 
                                         EIDTipaBrojila tipBrojila, unsigned int nSerijskiBroj, 
                                         const string& cOpis, string& cString );

    // Vraca dva stringa koji cine zaglavlje podataka dobijenih iz procedure 'GrupuPodatakaUFormatiranString'
    // Prvi string su nazivi podataka, a drugi je linija za podvlacenje
    void ZaglavljeZaGrupuPodataka( string& cNazivi, string& cLinija );

    // Procedura vraca serijski broj terminala koji je prikljucen, flegove i broj brojila u terminalu
    // i opis memorijske konfiguracije rucnog terminala.
    // Vraca false ako ne uspe da ocita ( ima smisla ako je bProcitajSaTerminala = true ).
    bool DajAdminInfoTerminala( KAdminInfo& admInf, bool bProcitajSaTerminala = true );

    // Procedura vraca opis rucnog terminala koji je prikljucen ( maksimanlne duzine podataka, ... ).
    // Komanda je podrzana od verzije 1.3.
    // Vraca false ako ne uspe da ocita ( ima smisla ako je bProcitajSaTerminala = true ).
    bool DajOpisRT( KOpisRT& opisRT, bool bProcitajSaTerminala = true );

    // Proverava da li u datoj verziji rucni terminal podrzava proveru ID-a PC aplikacije.
    bool PodrzanPCAppID( unsigned char cVerzija, unsigned char cPodverzija );

    // Proverava da li u datoj verziji rucni terminal podrzava datu komandu
	bool RTPodrzavaKomandu( unsigned char cVerzija, unsigned char cPodverzija,
                            EIDKomande ID );

    // Funkcija za testiranje drugih funkcija
    void Testiranje( void );

private:
    // Posto je klasa singlton, konstruktor je privatni
    KKomunikator( void );

    // Pomocna procedura : inicijalizuje transakciju
    void ResetujTransakciju( string cNaziv );

    // Pomocna procedura : dodaje komandu( poruku formata FP_KOMANDA_TERMINALU ) u transakciju.
    void DodajKomandnuPoruku( EIDKomande IDkomande, bool bKodirajSadrzaj, 
                              unsigned int nSerijskiBroj = 0 );

    // Pomocna procedura : dodaje prijemnu poruku u transakciju
    void DodajPorukuZaOdgovor( unsigned int nDuzinaOdgovora, bool bKodirajSadrzaj,
                               IDFormataPoruke formatOdgovora );

    // Pomocna procedura : u transakciju dodaje poruku sa podacima za slanje terminalu
    void DodajPorukuPodatakaZaTerminal( EIDKomande IDkomande, bool bKodirajSadrzaj,
                                        string cPodaciZaTerminal );

    // Pomocna procedura : izvrsava transakciju i izdvaja korisne podatke.
    // U slucaju neuspeha vraca false;
    bool ProcitajPodatkeSaTerminala( string& cKorisniPodaci );

    // Salje/prima poruke transakcije. U slucaju neuspeha vraca 'false'.
    bool IzvrsiTransakciju( void );

    // Vraca podatke primljene tokom izvrsenja date transakcije
    void DajPodatkeIzTransakcije( string& cKorisniPodaci );

    // Ocitavanje grupe podataka sa terminala, za brojilo sa datim serijskim brojem.
    // Grupa podataka je definisana flegovima.
    // Ocitane podatke vraca preko parametra cKorisniPodaci. U slucaju neuspeha vraca false.
    bool OcitajGrupuPodataka( unsigned int nFlegovi, unsigned int nSerijskiBroj, string& cKorisniPodaci );

    // Ocitava trazene podatke za sva brojila u spisku 'spisakBrojila'.
    // Ocitane podatke vraca preko vektora 'korisniPodaci'. U slucaju neuspeha vraca false.
    bool OcitajPodatkeZaBrojilaIzSpiska( TSpisakBrojila& spisakBrojila, EIDKomande IDkomande, 
                                         TListaStringova& korisniPodaci );

    // Preuzima 'administrativne' informacije sa rucnog terminala.
    // U slucaju neuspeha vraca false.
    // nDuzinaOdg ( duzina odgovora ) zavisi od verzije softvera na rucnom terminalu.
    bool OcitajAdminInfoDateDuzine( unsigned int nDuzinaOdg );

    // Procedura za kodiranje/dekodiranje datog stringa ( niza bajtova )
    string KoDekuj( const string& cStr );

    // Transakcija koja se izvrsava pri komunikaciji sa terminalom
    KTransakcija transakcija;
    // Parametri za komunikaciju sa terminalom
    unsigned char   nBrojPokusaja;
    double          nTajmaut;
    double          nTransakcTajmaut; // koliko ceka izmedju dva izvrsenja transakcije ( ako je nBrojPokusaja > 1 )
    // ADMIN_INFO ( informacije o rucnom terminalu )
    KAdminInfo      adminInfo;
    KOpisRT         opisTerminala;
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -