📄 komanda.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 + -