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

📄 komanda.h

📁 s/w handheld terminal ( based on Cygnal 8051f230)
💻 H
字号:
/*
    Klase sa definicijama komandi za rad sa rucnim terminalom.
*/
#ifndef KOMANDA_H
#define KOMANDA_H
#include "FormatPoruke.h"
#include "Interpret.h"
#include <string>
#include <vector>
using namespace std;

//******************************* Deklaracije << BEGIN >> *******************************
//      - enumeracije
enum    EIDKomande;
enum    EOpisPodatka;
//      - kalse
class   KPodaciInfo;
class   KOpisPodataka;
class   KKomanda;
class   KSpisakKomandi;
//      - tipovi
typedef vector<KKomanda>    TSpisakKomandi;
typedef vector<KPodaciInfo> TPodaciInfo;
// - konstante
const unsigned int  BROJ_BAJTOVA_ZA_TIP_BROJILA     = 1;
const unsigned int  BROJ_BAJTOVA_ZA_SERIJSKI_BR     = 4;
const unsigned int  BROJ_BAJTOVA_ZA_EEPROM_ADRESU   = 3;
const unsigned int  BROJ_BAJTOVA_ZA_BCS             = 1;

//      Duzine pojedinih podataka ocitanih sa brojila
//          - opis podataka ( flegovi )
const unsigned int  BROJ_BAJTOVA_ZA_OPIS_PODATKA    = 4;
//          - potrosnja
const unsigned int  BROJ_BAJTOVA_ZA_POTROSNJU       = 10;
const unsigned int  BROJ_BAJTOVA_ZA_POTROSNJU_MG    = 20;
const unsigned int  BROJ_BAJTOVA_ZA_POTROSNJU_MGIND = 37;
const unsigned int  BROJ_BAJTOVA_ZA_POTROSNJU_MFTPLC= 19;
//          - vreme
const unsigned int  BROJ_BAJTOVA_ZA_VREME           = 6;
const unsigned int  BROJ_BAJTOVA_ZA_VREME_SEKUNDE   = 7;
//          - tarifa
const unsigned int  BROJ_BAJTOVA_ZA_TARIFU          = 33;
const unsigned int  BROJ_BAJTOVA_ZA_TARIFU_MG       = 25;
//          - tabela 1
const unsigned int  BROJ_BAJTOVA_ZA_TABELU_1        = 40;
//          - maksimum srednje snage
const unsigned int  BROJ_BAJTOVA_ZA_MAX_SS          = 21;
const unsigned int  BROJ_BAJTOVA_ZA_MAX_SS_MG       = 25;
const unsigned int  BROJ_BAJTOVA_ZA_MAX_SS_MGIND    = 33;
const unsigned int  BROJ_BAJTOVA_ZA_MAX_SS_MFTPLC   = 2;
//          - potrosnja za prethodni mesec
const unsigned int  BROJ_BAJTOVA_ZA_POTR_P_MES      = 12;
const unsigned int  BROJ_BAJTOVA_ZA_POTR_P_MES_MG   = 22;
const unsigned int  BROJ_BAJTOVA_ZA_POTR_P_MES_MGIND= 26;
const unsigned int  BROJ_BAJTOVA_ZA_POTR_P_MES_MFTPLC=14;
//          - napomena
const unsigned int  BROJ_BAJTOVA_ZA_NAPOMENU        = 30;
//          - status
const unsigned int  BROJ_BAJTOVA_ZA_STATUS          = 1;
//          - maksimalni i minimalni naponi i struje
const unsigned int  BROJ_BAJTOVA_ZA_MAX_UI          = 27;

//      Duzine ostalih podataka
const unsigned int  BROJ_BAJTOVA_ZA_MASTER_TARIFU   = 25;
const unsigned int  BROJ_BAJTOVA_ZA_MASTER_VREME    = 7;

const unsigned int  BROJ_BAJTOVA_ZA_ADMIN_INFO_10   = 10;
const unsigned int  BROJ_BAJTOVA_ZA_ADMIN_INFO_11   = 32;
const unsigned int  BROJ_BAJTOVA_ZA_OPIS_RT         = 61;

const unsigned int  BROJ_BAJTOVA_ZA_LOZINKU         = 20;

const unsigned int  BROJ_BAJTOVA_ZA_PCAPP_ID        = 50;

const unsigned int  OVERH                           = 3;    // 'overhed' ( start+komanda+suma = 3 bajta )

const unsigned int  KF_POTROSNJA                    = 0x0001;
const unsigned int  KF_VREME                        = 0x0002;
const unsigned int  KF_TARIFA                       = 0x0004;
const unsigned int  KF_TABELA_1                     = 0x0008;
const unsigned int  KF_MAX_SS                       = 0x0010;
const unsigned int  KF_POTR_PRETH_MESEC             = 0x0020;
const unsigned int  KF_NAPOMENA                     = 0x0040;
const unsigned int  KF_STATUS                       = 0x0080;
const unsigned int  KF_MAX_UI                       = 0x0100;

enum EOpisPodatka{
                    PODATAK_ZA_UPIS,
                    PODATAK_ZA_CITANJE,
                    BILO_KOJI_OPIS = 100    // koristi se u proceduri 'DuzinaGrupePodataka'
};
//******************************** Deklaracije << END >> ********************************

class KPodaciInfo{
public:
    unsigned int  nFleg;    // fleg koristim kao ID podatka
    unsigned int  nDuzina;
    unsigned char nOpis;

    // Konstruktori
    KPodaciInfo( unsigned int nID, unsigned int nLen, unsigned char nDesc ):
                    nFleg( nID ), nDuzina( nLen ), nOpis( nDesc ) {}

    KPodaciInfo( void ) {}
};

// Klasa za opis podataka koji se preuzimaju sa rucnog terminala
// NAPOMENA: Ova klasa se koristi za verzije terminala < 1.3;
//           kod novih verzija postoji komanda za citanje opisa RT sa samog terminala.
class KOpisPodataka{
public:
    // Pristup jedinom objektu klase
    static KOpisPodataka* Instance( void );

    // Inicijalizacija opisa podataka
    void InicijalizacijaOpisaPodataka( void );

    // Funkcija vraca sumu duzina svih podataka
    unsigned int BrojBajtovaZaSvePodatke( const KAdminInfo& adminInfo );

    // 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 DuzinaGrupePodataka( unsigned int nFlegovi, EOpisPodatka nOpis = BILO_KOJI_OPIS );

    // Vraca poziciju podatka 'nID' u grupi podataka definisanoj flegovima 'nFlegovi'.
    unsigned int PozicijaPodatka( unsigned int nID, unsigned int nFlegovi,
                                  const KAdminInfo& adminInfo );

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

    // Pomocna procedura: kreira novi opis i dodaje u spisak
    void DodajOpis( unsigned int nFleg, unsigned int nDuzina, unsigned char nOpis );

    // Vektor koji pamti opise podataka
    TPodaciInfo OpisPodataka;
};

// Tipovi komandi koje se salju terminalu
enum EIDKomande   { 
                    // Komande za setovanje terminala
                    KT_POSTAVI_VREME            = 0x80,
                    KT_POSTAVI_MASTER_TARIFU    = 0x81,
                    KT_POSTAVI_SPISAK_BROJILA   = 0x82,
                    KT_POSTAVI_SERIJSKI_BROJ    = 0x83,
                    KT_POSTAVI_KONTROLNE_FLEGOVE= 0x84,
                    KT_IZMENA_LOZINKE           = 0x85,
                    KT_OTKLJUCAVANJE_TARIFE     = 0x86,
                    KT_ZAKLJUCAVANJE_TARIFE     = 0x87,
                    KT_IZMENA_TARIF_LOZINKE     = 0x88,
                    KT_OTKLJUCAVANJE_VREMENA    = 0x89,
                    KT_ZAKLJUCAVANJE_VREMENA    = 0x8A,
                    KT_IZMENA_VREME_LOZINKE     = 0x8B,
                    KT_OTKLJUCAVANJE_RESETA_MSS = 0x8C,
                    KT_ZAKLJUCAVANJE_RESETA_MSS = 0x8D,
                    KT_IZMENA_RESET_MSS_LOZINKE = 0x8E,
                    // Komande za ocitavanje terminala
                    KT_OCITAJ_POTROSNJU         = 0x90,
                    KT_OCITAJ_VREME             = 0x91,
                    KT_OCITAJ_TARIFU            = 0x92,
                    KT_OCITAJ_TABELU_1          = 0x93,
                    KT_OCITAJ_MAX_SS            = 0x94,
                    KT_OCITAJ_POTR_PRETH_MESEC  = 0x95,
                    KT_OCITAJ_NAPOMENU          = 0x96,
                    KT_OCITAJ_STATUS            = 0x97,
                    KT_OCITAJ_SVE_PODATKE       = 0x98,
                    KT_OCITAJ_SPISAK_BROJILA    = 0x99,
                    KT_OCITAJ_OPIS_PODATKA      = 0x9A,
                    KT_OCITAJ_MAX_UI            = 0x9B,
                    KT_OCITAJ_ADMIN_INFO        = 0xA0,
                    KT_OCITAJ_MASTER_TARIFU     = 0xA1,
                    KT_PROVERI_PCAPP_ID         = 0xA2,
                    KT_OCITAVANJE_OPISA_RT      = 0xA3
                  };

class KKomanda{
public:
    EIDKomande          IDkomande;
    unsigned int        nDuzinaOdgovora;
    IDFormataPoruke     formatOdgovora;
    unsigned int        nPodatakFleg;

    // Konstruktori
    KKomanda( EIDKomande ID, unsigned int nDuzinaOdg, IDFormataPoruke format,
              unsigned int nPodFleg ):
                    IDkomande( ID ), nDuzinaOdgovora( nDuzinaOdg ), formatOdgovora( format ),
                    nPodatakFleg( nPodFleg ) {}

    KKomanda( void ) {}
};

class KSpisakKomandi {
public:
    // Pristup jedinom objektu klase
    static KSpisakKomandi* Instance( void );

    // Spisak komandi
    TSpisakKomandi SpisakKomandi;

    // Definicija komandi za kontrolu terminala
    void InicijalizacijaSpiskaKomandi( void );

    // Funkcija ispituje da li postoji komanda sa datim ID-om
    bool PostojiKomanda( int cmdID );

    // Pronalazi datu komandu u spisku i vraca je u promenljivu 'komanda'.
    // Ako komanda ne postoji u spisku vraca false.
    bool DajKomandu( EIDKomande ID, KKomanda& komanda );

    // Postavlja duzinu odgovora za datu komandu iz spiska.
    // Ako komanda ne postoji u spisku vraca false.
    bool PostaviDuzinuOdgovora( EIDKomande ID, unsigned int nDuzinaOdg );

    // Funkcija vraca podatke iz opisa komande sa datim ID-om.
    // Ako ne nadje komandu sa datim ID-om, vraca false.
    bool DajOpisKomande( EIDKomande ID, const KAdminInfo& adminInfo,
                         unsigned int& nDuzinaOdgovora, 
                         IDFormataPoruke& formatOdgovora, 
                         unsigned int& nPodatakFleg );

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

    // Pronalazi datu komandu u spisku i vraca njen iterator ili NULL ako komanda ne postoji u spisku.
    TSpisakKomandi::iterator DajIterator( EIDKomande ID );

    // Pomocna procedura: kreira novu komandu i dodaje komandu u spisak
    void DodajKomanduUSpisak( EIDKomande ID, unsigned int nDuzinaOdg, 
                              IDFormataPoruke formatOdgovora, unsigned int nPodFleg );
};

#endif

⌨️ 快捷键说明

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