📄 komanda.cpp
字号:
#include "Komanda.h"
#include "Global.h"
//*********************************** KOpisPodataka << BEGIN >> ***************************************
// Pristup jedinom objektu klase
KOpisPodataka* KOpisPodataka::Instance( void ){
static KOpisPodataka instance;
return &instance;
}
// Inicijalizacija opisa podataka
void KOpisPodataka::InicijalizacijaOpisaPodataka( void ){
OpisPodataka.clear();
// Podaci su navedeni u redosledu u kojem ih salje rucni terminal !
DodajOpis( KF_POTROSNJA, BROJ_BAJTOVA_ZA_POTROSNJU_MG, PODATAK_ZA_CITANJE );
DodajOpis( KF_VREME, BROJ_BAJTOVA_ZA_VREME, PODATAK_ZA_CITANJE );
DodajOpis( KF_TARIFA, BROJ_BAJTOVA_ZA_TARIFU, PODATAK_ZA_CITANJE );
DodajOpis( KF_TABELA_1, BROJ_BAJTOVA_ZA_TABELU_1, PODATAK_ZA_CITANJE );
DodajOpis( KF_MAX_SS, BROJ_BAJTOVA_ZA_MAX_SS_MG, PODATAK_ZA_CITANJE );
DodajOpis( KF_POTR_PRETH_MESEC, BROJ_BAJTOVA_ZA_POTR_P_MES_MG, PODATAK_ZA_CITANJE );
DodajOpis( KF_NAPOMENA, BROJ_BAJTOVA_ZA_NAPOMENU, PODATAK_ZA_UPIS );
}
// Konstruktor
KOpisPodataka::KOpisPodataka( void ){
InicijalizacijaOpisaPodataka();
}
// Pomocna procedura: kreira novi opis i dodaje u spisak
void KOpisPodataka::DodajOpis( unsigned int nFleg, unsigned int nDuzina, unsigned char nOpis ){
KPodaciInfo* pOpis = new KPodaciInfo( nFleg, nDuzina, nOpis );
OpisPodataka.push_back( *pOpis );
}
// Funkcija vraca sumu duzina svih podataka
unsigned int KOpisPodataka::BrojBajtovaZaSvePodatke( const KAdminInfo& adminInfo ){
unsigned int nUkupnaDuzina = 0;
// Na pocetku bloka podataka nalaze se flegovi za opis podataka
nUkupnaDuzina = adminInfo.BrojBajtovaZaOpisPodatka();
// Iza flegova se nalaze sami podaci
TPodaciInfo::iterator o_iter = OpisPodataka.begin();
TPodaciInfo::iterator o_iterEnd = OpisPodataka.end();
while ( o_iter != o_iterEnd ) {
nUkupnaDuzina += o_iter->nDuzina;
o_iter++;
}
return nUkupnaDuzina;
}
// Vraca duzinu grupe podataka 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 KOpisPodataka::DuzinaGrupePodataka( unsigned int nFlegovi, EOpisPodatka nOpis ){
unsigned int nDuzinaPodataka = 0;
TPodaciInfo::iterator o_iter = OpisPodataka.begin();
TPodaciInfo::iterator o_iterEnd = OpisPodataka.end();
while ( o_iter != o_iterEnd ) {
if ( ( nOpis == BILO_KOJI_OPIS || o_iter->nOpis == nOpis )
&& ( o_iter->nFleg & nFlegovi ) )
nDuzinaPodataka += o_iter->nDuzina;
o_iter++;
}
return nDuzinaPodataka;
}
// Vraca poziciju podatka 'nID' u grupi podataka definisanoj flegovima 'nFlegovi'.
unsigned int KOpisPodataka::PozicijaPodatka( unsigned int nID, unsigned int nFlegovi,
const KAdminInfo& adminInfo ){
unsigned int nPozicija = 0;
TPodaciInfo::iterator o_iter = OpisPodataka.begin();
TPodaciInfo::iterator o_iterEnd = OpisPodataka.end();
while ( o_iter != o_iterEnd ) {
if ( o_iter->nFleg == nID ) break;
if ( o_iter->nFleg & nFlegovi ) {
// Za staru verziju rucnog terminala posebna obrada
unsigned int nDuzinaPodatka = adminInfo.BrBajtovaZaPodatakKompat( o_iter->nFleg );
if ( nDuzinaPodatka == 0 ) {
// Za novu verziju citaj vrednost iz tabele
nDuzinaPodatka = o_iter->nDuzina;
}
nPozicija += nDuzinaPodatka;
// U najnovijoj verziji, uz podatak postoji 1 dodatni bajt ( duzina podatka )
if ( adminInfo.bDodatniOpisRT ) {
++nPozicija;
}
}
o_iter++;
}
return nPozicija;
}
//************************************ KOpisPodataka << END >> ****************************************
//*********************************** KSpisakKomandi << BEGIN >> ***************************************
// Pristup jedinom objektu klase
KSpisakKomandi* KSpisakKomandi::Instance( void ){
static KSpisakKomandi instance;
return &instance;
}
// Definicija komandi za kontrolu terminala
void KSpisakKomandi::InicijalizacijaSpiskaKomandi( void ){
SpisakKomandi.clear();
// ID komande Duzina odgovora Format odgovora Flegovi
// ------------------------------ ------------------------------------- --------------------------- -------
// Komande za setovanje terminala
DodajKomanduUSpisak( KT_POSTAVI_VREME, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_POSTAVI_MASTER_TARIFU, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_POSTAVI_SPISAK_BROJILA, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_POSTAVI_SERIJSKI_BROJ, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_POSTAVI_KONTROLNE_FLEGOVE, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_IZMENA_LOZINKE, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_OTKLJUCAVANJE_TARIFE, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_ZAKLJUCAVANJE_TARIFE, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_IZMENA_TARIF_LOZINKE, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_OTKLJUCAVANJE_VREMENA, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_ZAKLJUCAVANJE_VREMENA, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_IZMENA_VREME_LOZINKE, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_OTKLJUCAVANJE_RESETA_MSS, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_ZAKLJUCAVANJE_RESETA_MSS, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
DodajKomanduUSpisak( KT_IZMENA_RESET_MSS_LOZINKE, 3, FP_POTVRDA_SA_TERMINALA, 0x0000 );
// Komande za ocitavanje terminala
// NAPOMENA: duzine odgovora su bitne samo za verzije terminala manje od 1.3;
// kod nove verzije duzine se ocitavaju sa terminala ( 'opis RT' )
DodajKomanduUSpisak( KT_OCITAJ_POTROSNJU, OVERH+BROJ_BAJTOVA_ZA_POTROSNJU_MG, FP_PODACI_TERMINAL, KF_POTROSNJA );
DodajKomanduUSpisak( KT_OCITAJ_VREME, OVERH+BROJ_BAJTOVA_ZA_VREME, FP_PODACI_TERMINAL, KF_VREME );
DodajKomanduUSpisak( KT_OCITAJ_TARIFU, OVERH+BROJ_BAJTOVA_ZA_TARIFU, FP_PODACI_TERMINAL, KF_TARIFA );
DodajKomanduUSpisak( KT_OCITAJ_TABELU_1, OVERH+BROJ_BAJTOVA_ZA_TABELU_1, FP_PODACI_TERMINAL, KF_TABELA_1 );
DodajKomanduUSpisak( KT_OCITAJ_MAX_SS, OVERH+BROJ_BAJTOVA_ZA_MAX_SS_MG, FP_PODACI_TERMINAL, KF_MAX_SS );
DodajKomanduUSpisak( KT_OCITAJ_POTR_PRETH_MESEC, OVERH+BROJ_BAJTOVA_ZA_POTR_P_MES_MG, FP_PODACI_TERMINAL, KF_POTR_PRETH_MESEC );
DodajKomanduUSpisak( KT_OCITAJ_NAPOMENU, OVERH+BROJ_BAJTOVA_ZA_NAPOMENU, FP_PODACI_TERMINAL, KF_NAPOMENA );
DodajKomanduUSpisak( KT_OCITAJ_STATUS, OVERH+BROJ_BAJTOVA_ZA_STATUS, FP_PODACI_TERMINAL, KF_STATUS );
DodajKomanduUSpisak( KT_OCITAJ_MAX_UI, OVERH+BROJ_BAJTOVA_ZA_MAX_UI, FP_PODACI_TERMINAL, KF_MAX_UI );
DodajKomanduUSpisak( KT_OCITAJ_SVE_PODATKE, 0, FP_PODACI_TERMINAL, 0x0000 );
DodajKomanduUSpisak( KT_OCITAJ_SPISAK_BROJILA, 0, FP_PODACI_TERMINAL, 0x0000 );
DodajKomanduUSpisak( KT_OCITAJ_OPIS_PODATKA, OVERH+BROJ_BAJTOVA_ZA_OPIS_PODATKA, FP_PODACI_TERMINAL, 0x0000 );
DodajKomanduUSpisak( KT_OCITAJ_ADMIN_INFO, OVERH+BROJ_BAJTOVA_ZA_ADMIN_INFO_11, FP_PODACI_TERMINAL, 0x0000 );
DodajKomanduUSpisak( KT_OCITAJ_MASTER_TARIFU, OVERH+BROJ_BAJTOVA_ZA_MASTER_TARIFU, FP_PODACI_TERMINAL, 0x0000 );
DodajKomanduUSpisak( KT_PROVERI_PCAPP_ID, 0, FP_PODACI_TERMINAL, 0x0000 );
DodajKomanduUSpisak( KT_OCITAVANJE_OPISA_RT, OVERH+BROJ_BAJTOVA_ZA_OPIS_RT, FP_PODACI_TERMINAL, 0x0000 );
}
// Pronalazi datu komandu u spisku i vraca njen iterator ili NULL ako komanda ne postoji u spisku.
TSpisakKomandi::iterator KSpisakKomandi::DajIterator( EIDKomande ID ){
TSpisakKomandi::iterator sk_iter = SpisakKomandi.begin();
TSpisakKomandi::iterator sk_iterEnd = SpisakKomandi.end();
while( sk_iter != sk_iterEnd && sk_iter->IDkomande != ID ) {
sk_iter++;
}
if ( sk_iter == sk_iterEnd ) sk_iter = NULL;
return sk_iter;
}
// Funkcija ispituje da li postoji komanda sa datim ID-om
bool KSpisakKomandi::PostojiKomanda( int cmdID ){
bool izlaz = false;
TSpisakKomandi::iterator sk_iter = SpisakKomandi.begin();
TSpisakKomandi::iterator sk_iterEnd = SpisakKomandi.end();
while( sk_iter != sk_iterEnd ) {
if ( int( sk_iter->IDkomande ) == cmdID ) {
izlaz = true;
break;
}
sk_iter++;
}
return izlaz;
}
// Pronalazi datu komandu u spisku i vraca je u promenljivu 'komanda'.
// Ako komanda ne postoji u spisku vraca false.
bool KSpisakKomandi::DajKomandu( EIDKomande ID, KKomanda& komanda ){
bool izlaz = false;
TSpisakKomandi::iterator sk_iter = DajIterator( ID );
if ( sk_iter != NULL ){
komanda = *sk_iter;
izlaz = true;
}
return izlaz;
}
// Postavlja duzinu odgovora za datu komandu iz spiska.
// Ako komanda ne postoji u spisku vraca false.
bool KSpisakKomandi::PostaviDuzinuOdgovora( EIDKomande ID, unsigned int nDuzinaOdg ){
bool izlaz = false;
TSpisakKomandi::iterator sk_iter = DajIterator( ID );
if ( sk_iter != NULL ){
sk_iter->nDuzinaOdgovora = nDuzinaOdg;
izlaz = true;
}
return izlaz;
}
// Funkcija vraca podatke iz opisa komande sa datim ID-om.
// Ako ne nadje komandu sa datim ID-om, vraca false.
bool KSpisakKomandi::DajOpisKomande( EIDKomande ID, const KAdminInfo& adminInfo,
unsigned int& nDuzinaOdgovora,
IDFormataPoruke& formatOdgovora,
unsigned int& nPodatakFleg ){
bool izlaz = false;
KKomanda komanda;
if ( izlaz = KSpisakKomandi::Instance()->DajKomandu( ID, komanda ) ) {
// Za staru verziju rucnog terminala ( v 1.0 ), duzina odgovora se razlikuje
nDuzinaOdgovora = adminInfo.BrBajtovaZaPodatakKompat( komanda.nPodatakFleg );
if ( nDuzinaOdgovora == 0 ){
// Za novu verziju, duzina se ocitava iz spiska komandi
nDuzinaOdgovora = komanda.nDuzinaOdgovora;
}
else
nDuzinaOdgovora += OVERH;
formatOdgovora = komanda.formatOdgovora;
nPodatakFleg = komanda.nPodatakFleg;
}
return izlaz;
}
// Konstruktor
KSpisakKomandi::KSpisakKomandi( void ){
InicijalizacijaSpiskaKomandi();
}
// Pomocna procedura: kreira novu komandu i dodaje komandu u spisak
void KSpisakKomandi::DodajKomanduUSpisak( EIDKomande ID, unsigned int nDuzinaOdg,
IDFormataPoruke formatOdgovora, unsigned int nPodFleg ){
KKomanda* pKomanda = new KKomanda( ID, nDuzinaOdg, formatOdgovora, nPodFleg );
SpisakKomandi.push_back( *pKomanda );
}
//*********************************** KSpisakKomandi << END >> ***************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -