📄 komunikator.cpp
字号:
ResetujTransakciju( string( "Setovanje lozinke" ) );
// Formiraj komandu ( poruku formata FP_KOMANDA_TERMINALU ) koja se salje terminalu
DodajKomandnuPoruku( ID, false );
// Formiraj poruku za prijem potvrde od terminala da je spreman da primi sledeci podatak
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
if ( PodrzanPCAppID ) {
// Formiraj poruku za slanje ID-a pc aplikacije
DodajPorukuPodatakaZaTerminal( ID, true, cAppID ); // kodirati pre slanja( true )
// Formiraj poruku za prijem potvrde od terminala da je ID dobar
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
}
// Formiraj poruku sa lozinkama
DodajPorukuPodatakaZaTerminal( ID, true, cLozinke ); //kodirati pre slanja
// Formiraj poruku za potvrdu koju salje terminal da je primio podatke
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
// Izvrsi transakciju
izlaz = IzvrsiTransakciju();
return izlaz;
}
// 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 KKomunikator::OtkljucajFunkcijuTerminala( EIDKomande ID, string cLozinka,
bool PodrzanPCAppID, string cAppID ){
bool izlaz = false;
// Inicijalizuj transakciju
ResetujTransakciju( string( "Otkljucavanje funkcije" ) );
// Formiraj komandu ( poruku formata FP_KOMANDA_TERMINALU ) koja se salje terminalu
DodajKomandnuPoruku( ID, false );
// Formiraj poruku za prijem potvrde od terminala da je spreman da primi sledeci podatak
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
if ( PodrzanPCAppID ) {
// Formiraj poruku za slanje ID-a pc aplikacije
DodajPorukuPodatakaZaTerminal( ID, true, cAppID ); // kodirati pre slanja( true )
// Formiraj poruku za prijem potvrde od terminala da je ID dobar
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
}
// Formiraj poruku sa lozinkama
DodajPorukuPodatakaZaTerminal( ID, true, cLozinka ); //kodirati pre slanja
// Formiraj poruku za potvrdu koju salje terminal da je primio podatke
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
// Izvrsi transakciju
izlaz = IzvrsiTransakciju();
return izlaz;
}
// Zakljucava funkciju terminala definisanu ID-om.
// Koristi se za zakljucavanje funkcija za programiranje brojila ( tarife, vremena ... ).
// U slucaju neuspeha vraca false.
bool KKomunikator::ZakljucajFunkcijuTerminala( EIDKomande ID,
bool PodrzanPCAppID, string cAppID ){
bool izlaz = false;
// Inicijalizuj transakciju
ResetujTransakciju( string( "Zakljucavanje funkcije" ) );
// Formiraj komandu ( poruku formata FP_KOMANDA_TERMINALU ) koja se salje terminalu
DodajKomandnuPoruku( ID, false );
// Formiraj poruku za prijem potvrde od terminala da je spreman da primi sledeci podatak
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
if ( PodrzanPCAppID ){
// Formiraj poruku za slanje ID-a pc aplikacije
DodajPorukuPodatakaZaTerminal( ID, true, cAppID ); // kodirati pre slanja( true )
// Formiraj poruku za prijem potvrde od terminala da je ID dobar
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
}
// Izvrsi transakciju
izlaz = IzvrsiTransakciju();
return izlaz;
}
// Izvrsava komandu za proveru ID-a aplikacije.
// ( rucni terminal treba da se odaziva samo aplikaciji sa odgovarajucim ID-om )
bool KKomunikator::ProveriPCAppID( string cAppID ){
bool izlaz = false;
EIDKomande ID = KT_PROVERI_PCAPP_ID;
// Inicijalizuj transakciju
ResetujTransakciju( string( "Provera ID-a" ) );
// Formiraj komandu ( poruku formata FP_KOMANDA_TERMINALU ) koja se salje terminalu
DodajKomandnuPoruku( ID, false );
// Formiraj poruku za prijem potvrde od terminala da je spreman da primi sledeci podatak
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
// Formiraj poruku za slanje ID-a pc aplikacije
DodajPorukuPodatakaZaTerminal( ID, true, cAppID ); // kodira se pre slanja
// Formiraj poruku za prijem potvrde od terminala da je ID dobar
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
// Izvrsi transakciju
izlaz = IzvrsiTransakciju();
return izlaz;
}
// 'Uvodna transakcija' kod snimanja spiska brojila :
// salju se podaci za inicijalizaciju prenosa ( komanda, broj brojila koji treba preneti i sl. )
bool KKomunikator::InitSnimiSpisakBrojila( string cKontrolInfo ){
bool izlaz = false;
EIDKomande ID = KT_POSTAVI_SPISAK_BROJILA;
// Inicijalizuj transakciju
ResetujTransakciju( string( "Setovanje spiska brojila : inicijalizacija" ) );
// Formiraj komandu ( poruku formata FP_KOMANDA_TERMINALU ) koja se salje terminalu
DodajKomandnuPoruku( ID, false );
// Formiraj poruku za prijem potvrde od terminala da je spreman da primi sledeci podatak
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
// Formiraj poruku sa KONTROLNIM PODACIMA ( broj brojila i adresa poslednjeg )
DodajPorukuPodatakaZaTerminal( ID, false, cKontrolInfo );
// Formiraj poruku za prijem potvrde od terminala da je spreman da primi sledeci podatak
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
// Izvrsi transakciju
izlaz = IzvrsiTransakciju();
return izlaz;
}
// Transakcija za slanje podataka o brojilu. Koristi se kod snimanja spiska brojila.
bool KKomunikator::PosaljiPodatakOBrojiluIzSpiska( string cPodatak ){
bool izlaz = false;
// Inicijalizuj transakciju
ResetujTransakciju( string( "Setovanje spiska brojila : podaci o brojilu" ) );
// Formiraj poruku sa PODACIMA o brojilu.
DodajPorukuPodatakaZaTerminal( KT_POSTAVI_SPISAK_BROJILA, false, cPodatak );
// Formiraj poruku za potvrdu koju salje terminal da je primio podatke
DodajPorukuZaOdgovor( 3, false, FP_POTVRDA_SA_TERMINALA );
// Izvrsi transakciju
izlaz = IzvrsiTransakciju();
return izlaz;
}
// Snima spisak brojila koja treba ocitati na rucni terminal.
// U slucaju neuspeha vraca false.
bool KKomunikator::SnimiSpisakBrojila( string cKontrolInfo, TListaStringova& podaciOBrojilima ){
bool izlaz = false;
// Posalji podatke za inicijalizaciju prenosa :
// broj brojila koji treba preneti i adresu poslednjeg brojila u spisku.
if ( InitSnimiSpisakBrojila( cKontrolInfo ) ) {
// Za svako brojilo u spisku posalji po jednu poruku terminalu
TListaStringova::iterator ls_iter = podaciOBrojilima.begin();
TListaStringova::iterator ls_iterEnd = podaciOBrojilima.end();
izlaz = true;
while ( izlaz && ls_iter != ls_iterEnd ) {
izlaz = PosaljiPodatakOBrojiluIzSpiska( ls_iter->cString );
ls_iter++;
}
}
return izlaz;
}
// Vraca duzinu spiska brojila koji treba preuzeti sa terminala ( u bajtovima ).
unsigned int KKomunikator::DuzinaSpiskaBrojila( void ){
return ( adminInfo.nBrojBrojilaUSpisku * adminInfo.DuzinaElementaSpiska() );
}
// 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 KKomunikator::DuzinaGrupePodatakaOBrojilu( EOpisPodatka nOpis ){
return KOpisPodataka::Instance()->DuzinaGrupePodataka( adminInfo.nKontrolniFlegovi, 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 KKomunikator::DuzinaPodatakaOSvimBrojilima( EOpisPodatka nOpis ){
return ( adminInfo.nBrojBrojilaUSpisku * DuzinaGrupePodatakaOBrojilu( nOpis ) );
}
// String sa podacima primljenim od rucnog terminala pretvara u string pogodan za upis u fajl.
void KKomunikator::GrupuPodatakaUFormatiranString( const string& cKorisniPodaci,
EIDTipaBrojila tipBrojila, unsigned int nSerijskiBroj,
const string& cOpis, string& cString ){
TSiroviPodaci podaci;
KInterpret::Instance()->
RasclaniPodatak( cKorisniPodaci, adminInfo.nKontrolniFlegovi, cOpis,
adminInfo, opisTerminala, podaci );
KInterpret::Instance()->
GrupuPodatakaUFormatiranString( tipBrojila, nSerijskiBroj, podaci, cString );
}
// Vraca dva stringa koji cine zaglavlje podataka dobijenih iz procedure 'GrupuPodatakaUFormatiranString'
// Prvi string su nazivi podataka, a drugi je linija za podvlacenje
void KKomunikator::ZaglavljeZaGrupuPodataka( string& cNazivi, string& cLinija ){
KInterpret::Instance()->
ZaglavljeZaGrupuPodataka( adminInfo.nKontrolniFlegovi, cNazivi, cLinija );
}
// Procedura vraca serijski broj terminala koji je prikljucen, flegove, broj brojila u terminalu
// i opis memorijske konfiguracije rucnog terminala.
// Vraca false ako ne uspe da ocita ( ima smisla ako je bProcitajSaTerminala = true ).
bool KKomunikator::DajAdminInfoTerminala( KAdminInfo& admInf, bool bProcitajSaTerminala ){
bool izlaz = false;
// Ako je potrebno, ocitaj admin info sa terminala
if ( bProcitajSaTerminala ) izlaz = OcitajAdminInfo();
admInf = adminInfo;
return izlaz;
}
// 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 KKomunikator::DajOpisRT( KOpisRT& opisRT, bool bProcitajSaTerminala ){
bool izlaz = false;
// Ako je potrebno, ocitaj admin info sa terminala
if ( bProcitajSaTerminala ) izlaz = OcitajOpisRT();
opisRT = opisTerminala;
return izlaz;
}
// Proverava da li u datoj verziji rucni terminal podrzava proveru ID-a PC aplikacije.
bool KKomunikator::PodrzanPCAppID( unsigned char cVerzija, unsigned char cPodverzija )
{
return RTPodrzavaKomandu( cVerzija, cPodverzija, KT_PROVERI_PCAPP_ID );
}
// Proverava da li u datoj verziji rucni terminal podrzava datu komandu
bool KKomunikator::RTPodrzavaKomandu( unsigned char cVerzija, unsigned char cPodverzija,
EIDKomande ID )
{
// Komande koje podrzavaju sve verzije
if ( ID == KT_POSTAVI_VREME ||
ID == KT_POSTAVI_MASTER_TARIFU ||
ID == KT_POSTAVI_SPISAK_BROJILA ||
ID == KT_POSTAVI_SERIJSKI_BROJ ||
ID == KT_POSTAVI_KONTROLNE_FLEGOVE ||
ID == KT_OCITAJ_POTROSNJU ||
ID == KT_OCITAJ_VREME ||
ID == KT_OCITAJ_TARIFU ||
ID == KT_OCITAJ_TABELU_1 ||
ID == KT_OCITAJ_MAX_SS ||
ID == KT_OCITAJ_POTR_PRETH_MESEC ||
ID == KT_OCITAJ_NAPOMENU ||
ID == KT_OCITAJ_SVE_PODATKE ||
ID == KT_OCITAJ_SPISAK_BROJILA ||
ID == KT_OCITAJ_ADMIN_INFO ||
ID == KT_OCITAJ_MASTER_TARIFU ){
return true;
}
// Komande koje podrzavaju sve verzije od 1.1 pa navise
if ( ( cVerzija == 1 && cPodverzija >= 1 ) ||
( cVerzija > 1 ) ){
if ( ID == KT_IZMENA_LOZINKE ||
ID == KT_OTKLJUCAVANJE_TARIFE ||
ID == KT_ZAKLJUCAVANJE_TARIFE ||
ID == KT_IZMENA_TARIF_LOZINKE ||
ID == KT_OTKLJUCAVANJE_VREMENA ||
ID == KT_ZAKLJUCAVANJE_VREMENA ||
ID == KT_IZMENA_VREME_LOZINKE ||
ID == KT_OCITAJ_OPIS_PODATKA ){
return true;
}
}
// Komande koje podrzava verzija 1.1
if ( cVerzija == 1 && cPodverzija == 1 ){
if ( ID == KT_PROVERI_PCAPP_ID ) {
return true;
}
}
// Komande koje podrzavaju sve verzije od 1.2 pa navise
else if ( ( cVerzija == 1 && cPodverzija >= 2 ) ||
( cVerzija > 1 ) ){
if ( ID == KT_OTKLJUCAVANJE_RESETA_MSS ||
ID == KT_ZAKLJUCAVANJE_RESETA_MSS ||
ID == KT_IZMENA_RESET_MSS_LOZINKE ){
return true;
}
}
return false;
}
// Funkcija za testiranje drugih funkcija
void KKomunikator::Testiranje( void ){
}
//********************************* KKomunikator << END >> **************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -