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

📄 formatporuke.cpp

📁 s/w handheld terminal ( based on Cygnal 8051f230)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "FormatPoruke.h"
#include <iostream>

//********************************** KFormatPoruke << BEGIN >> **************************************
// Funkcija vraca iterator koji ukazuje na element vektora 'opis' sa datim ID-om ili NULL ako ne nadje.
TOpisPoruke::iterator KFormatPoruke::DajIterator( IDKomponentePoruke ID ) {
    TOpisPoruke::iterator iter = opis.begin();
    TOpisPoruke::iterator iPoslednji = opis.end();

    while( iter!=iPoslednji && iter->IDkomponente != ID ) iter++;
    if ( iter == iPoslednji ) iter = NULL;

    return iter;
}

// Vraca ID formata poruke
IDFormataPoruke KFormatPoruke::DajID( void ){
    return ID;
}

// Vraca opis formata poruke u promenljivu na koju ukazuje pokazivac 'pOpis'
void KFormatPoruke::DajOpis( TOpisPoruke& opis ){
    opis = KFormatPoruke::opis;
}

// Vraca poziciju i duzinu komponente poruke preko parametara nPozicija i nDuzina.
    // Ako ne nadje komponentu sa datim ID-om, vraca 'false', a nPozicija = nDuzina = 0.
bool KFormatPoruke::DajPozicijuKomponente( IDKomponentePoruke ID, unsigned int& nPozicija, unsigned int& nDuzina ){
    bool izlaz = false;

    nPozicija = 0;
    nDuzina = 0;
    TOpisPoruke::iterator iter = DajIterator( ID );
    if( iter != NULL ){
        nPozicija = iter->pozicija;
        nDuzina   = iter->duzina;
        izlaz = true;
    }

    return izlaz;
}

// Postavlja poziciju i duzinu komponente poruke.
// Ako ne nadje komponentu sa datim ID-om, vraca 'false'
bool KFormatPoruke::PostaviPozicijuKomponente( IDKomponentePoruke ID, unsigned int nPozicija, unsigned int nDuzina ){
    bool izlaz = false;
    TOpisPoruke::iterator iter = DajIterator( ID );
    if( iter != NULL ){
        iter->pozicija = nPozicija;
        iter->duzina   = nDuzina;
        izlaz = true;
    }
    return izlaz;
}

// Vraca 'true' ako data komponenta poruke postoji
bool KFormatPoruke::PostojiKomponenta( IDKomponentePoruke ID ){
    if( DajIterator( ID ) != NULL )  return true;
    else return false;
}
//*********************************** KFormatPoruke << END >> **************************************

//********************************* KSpisakFormata << BEGIN >> *************************************
// Konstruktor
KSpisakFormata::KSpisakFormata(){
    Inicijalizacija();
}

// Pristup jedinom objektu klase
KSpisakFormata* KSpisakFormata::Instance( void ){
    static KSpisakFormata instance;
    return &instance;
}

// Inizijalizacija spiska formata poruka. U slucaju neuspeha vraca false.
bool KSpisakFormata::Inicijalizacija( void ){
    bool izlaz = true;
    KFormatPoruke*           pFormatPoruke = NULL;
    TOpisPoruke*             pOpisPoruke = NULL;
    KOpisKomponenetePoruke*  pOpisKomponenete = NULL;

    // trebalo bi da cita iz nekog konfiguracionog fajla
    try {
        // 'Default' format ( poruka koja ima samo sadrzaj, a duzina je definisana tim sadrzajem )
        pOpisPoruke = new TOpisPoruke;
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SADRZAJ, 0, 0 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pFormatPoruke = new KFormatPoruke( FP_DEFAULT, *pOpisPoruke );
        Tabela.push_back( *pFormatPoruke );
        // Komanda ( start, komanda, serijski broj, suma )
        pOpisPoruke = new TOpisPoruke;
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_START,        0, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_KOMANDA,      1, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SERIJSKI_BROJ,2, 4 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SUMA,         6, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pFormatPoruke = new KFormatPoruke( FP_KOMANDA, *pOpisPoruke );
        Tabela.push_back( *pFormatPoruke );
        // Poruka sa podacima ( sa sadrzajem )
        pOpisPoruke = new TOpisPoruke;
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_START,        0, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_KOMANDA,      1, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SADRZAJ,      2, 0 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SUMA,         0, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pFormatPoruke = new KFormatPoruke( FP_PODACI_TERMINAL, *pOpisPoruke );
        Tabela.push_back( *pFormatPoruke );
        // Potvrda terminala ( ACK )
        pOpisPoruke = new TOpisPoruke;
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_START,        0, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_KOMANDA,      1, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SUMA,         2, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pFormatPoruke = new KFormatPoruke( FP_POTVRDA_SA_TERMINALA, *pOpisPoruke );
        Tabela.push_back( *pFormatPoruke );
        // Poruka koja sadrzi i serijski broj i sadrzaj
        pOpisPoruke = new TOpisPoruke;
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_START,        0, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_KOMANDA,      1, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SERIJSKI_BROJ,2, 4 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SADRZAJ,      6, 0 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pOpisKomponenete = new KOpisKomponenetePoruke( KP_SUMA,         0, 1 );
        pOpisPoruke->push_back( *pOpisKomponenete );
        pFormatPoruke = new KFormatPoruke( FP_KOMPLETNA_PORUKA, *pOpisPoruke );
        Tabela.push_back( *pFormatPoruke );
    }
    catch (std::bad_alloc) {    // nije uspela alokacija memorije sa 'new'
        // oslobodi ono sto je alocirano
        if ( pOpisPoruke != NULL ) {
            (*pOpisPoruke).clear(); // obrisi elemente vektora ( da li ovo brise i same podatke ? )
            delete pOpisPoruke;     // obrisi vektor
        }
        izlaz = false;
    }

    return izlaz;
}

// Vraca format poruke u promenljivu 'format'. Ako ne nadje, vraca false.
bool KSpisakFormata::DajFormatPoruke( IDFormataPoruke formatID, KFormatPoruke& format ){
    bool izlaz = false;
    TTabelaFormata::iterator s_iter = DajIterator( formatID );
    
    if ( s_iter != NULL ) {
        format = *s_iter;
        izlaz = true;
	}
    return izlaz;
}

// Vraca 'default' format poruke u promenljivu 'format'. Ako ne nadje, vraca false.
bool KSpisakFormata::DajDefaultFormat( KFormatPoruke& format ){
    return DajFormatPoruke( FP_DEFAULT, format );
}

// Vraca 'true' ako je dati format default format
bool KSpisakFormata::FormatDefault( KFormatPoruke& format ){
    if ( format.DajID() == FP_DEFAULT ) return true;
    else return false;
}

// Vraca 'default' poziciju i duzinu komponente poruke u datom formatu.
// Ako data komponenta u datom formatu ne postoju, vraca false
bool KSpisakFormata::DefaultPozicijaKomponente( IDFormataPoruke formatID, IDKomponentePoruke IDkomponente,
                                                unsigned int& nPozicija, unsigned int& nDuzina ){
    bool izlaz = false;

    TTabelaFormata::iterator s_iter = DajIterator( formatID );
    
    if ( ( s_iter != NULL ) &&

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -