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

📄 komanda.cpp

📁 s/w handheld terminal ( based on Cygnal 8051f230)
💻 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 + -