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

📄 komunikator.cpp

📁 s/w handheld terminal ( based on Cygnal 8051f230)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 + -