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

📄 formatporuke.h

📁 s/w handheld terminal ( based on Cygnal 8051f230)
💻 H
字号:
/*
    Klase za rad sa formatima poruka.
*/
#ifndef FORMATPORUKE_H
#define FORMATPORUKE_H

#include <string>
#include <vector>       // template "vector"
#include "Korisno.h"
using namespace std;

//******************************* Deklaracije << BEGIN >> *******************************
//      - enumeracije
enum    IDFormataPoruke;
enum    IDKomponentePoruke;
//      - kalse
class   KOpisKomponenetePoruke;
class   KFormatPoruke;
class   KSpisakFormata;
//      - tipovi
typedef vector<KOpisKomponenetePoruke>  TOpisPoruke;
typedef vector<KFormatPoruke>           TTabelaFormata;
//                  - konstante
const unsigned char START_PORUKE = 0x02;
//******************************** Deklaracije << END >> ********************************

// Tipovi formata poruke; prefiks FP ( Formt Poruke )
enum IDFormataPoruke    { FP_DEFAULT = 1,
                          FP_KOMANDA,
                          FP_PODACI_TERMINAL,
                          FP_POTVRDA_SA_TERMINALA,
                          FP_KOMPLETNA_PORUKA
                        };

// Tipovi komponenata poruke; prefiks KP ( Komponenta Poruke )
enum IDKomponentePoruke { KP_START = 1,
                          KP_KOMANDA,
                          KP_SERIJSKI_BROJ,
                          KP_SADRZAJ,
                          KP_SUMA
                        };

class KOpisKomponenetePoruke {
public:
    IDKomponentePoruke  IDkomponente;
    unsigned int        pozicija;
    unsigned int        duzina;

    // Konstruktori
    KOpisKomponenetePoruke( void ) {}

    KOpisKomponenetePoruke( IDKomponentePoruke ID, unsigned int poz, unsigned int duz ) :
        IDkomponente( ID ), pozicija( poz ), duzina( duz ) { }
};

/*
    Klasa za format poruke.
*/
class KFormatPoruke{
public:
    // Konstruktori
    KFormatPoruke( void ){};    // mora da postoji default konstruktor ( zbog Poruka.cpp )
    KFormatPoruke( IDFormataPoruke formatID, TOpisPoruke& opisFormata ) : ID( formatID ), opis( opisFormata ) {}

    // Vraca ID formata poruke
    IDFormataPoruke DajID( void );

    // Vraca opis svih komponenti poruke u promenljivu 'opis'
    void DajOpis( TOpisPoruke& 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 DajPozicijuKomponente( IDKomponentePoruke ID, unsigned int& nPozicija, unsigned int& nDuzina );

    // Postavlja poziciju i duzinu komponente poruke.
    // Ako ne nadje komponentu sa datim ID-om, vraca 'false'
    bool PostaviPozicijuKomponente( IDKomponentePoruke ID, unsigned int nPozicija, unsigned int nDuzina );

    // Vraca 'true' ako data komponenta poruke postoji
    bool PostojiKomponenta( IDKomponentePoruke ID );

private:
    IDFormataPoruke ID;
    TOpisPoruke     opis;

    // Vraca iterator koji ukazuje na element vektora opisa sa datim ID-om ili NULL ako ne nadje.
    TOpisPoruke::iterator DajIterator( IDKomponentePoruke ID );
};

/*
    Klase koja cuva spisak formata poruka. Takodje, sadrzi procedure za manipulaciju 'formatiranim' stringovima.
    Klasa je 'singleton': pristup procedurama se vrsi preko pointera 'KFormatPoruke::Instance()'.
*/
class KSpisakFormata {
public:
    // Spisak formata poruka.
    TTabelaFormata Tabela;

    // Pristup jedinom objektu klase
    static KSpisakFormata* Instance( void );

    // Inizijalizacija spiska formata poruka. U slucaju neuspeha vraca false.
    bool Inicijalizacija( void );

    // Vraca format poruke u promenljivu 'format'. Ako ne nadje, vraca false.
    bool DajFormatPoruke( IDFormataPoruke formatID, KFormatPoruke& format );

    // Vraca 'default' format poruke u promenljivu 'format'. Ako ne nadje, vraca false.
    bool DajDefaultFormat( KFormatPoruke& format );

    // Vraca 'true' ako je dati format default format
    bool FormatDefault( KFormatPoruke& format );

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

    // Od 'formatiranog stringa' pravi 'obican niz bajtova'.
    string DeformatPoruku( KString cUlazniString, KFormatPoruke& format );
    string DeformatPoruku( KString cUlazniString, IDFormataPoruke formatID );

    // Od 'obicnog niza bajtova' pravi 'formatirani string'.
    string FormatPoruku( string cUlazniString, KFormatPoruke& format );
    string FormatPoruku( string cUlazniString, IDFormataPoruke formatID );

    // Pomocna procedura : ispisuje spisak formata
    void OdstampajSpisakTxt( void );

    // Postavlja velicinu i poziciju date komponente ( ovo zato sto sadrzaj moze da bude promenljiv )
    void PostaviPozicijuIDuzinu( IDFormataPoruke formatID, IDKomponentePoruke IDkomponente,
                                 unsigned int nPozicija, unsigned int nDuzina );

private:
    // Posto je klasa singlton, konstruktor je privatni
    KSpisakFormata();

    // Vraca iterator koji ukazuje na element spiska formata sa datim ID-om ili NULL ako ga ne nadje.
    TTabelaFormata::iterator DajIterator( IDFormataPoruke formatID );

    // Pomocna procedura ( poziva se u 'DeformatPoruku' ). Vraca duzinu komponente u ulaznom stringu,
    // a u 'cDeformatiranaKomponenta' vraca taj deo ulaznog stringa u 'deformatiranom' obliku.
    unsigned int DeformatKomponentu( string& cDeformatiranaKomponenta, KString cUlazniString, unsigned int pozUlStr,
                                     UIFormat formatKomponente, unsigned int duzinaKomponente );
};

#endif

⌨️ 快捷键说明

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