📄 komunikator.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 + -