📄 preuzimanjepodatakadlg.cpp
字号:
// PreuzimanjePodatakaDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RucniTerminal.h"
#include "PreuzimanjePodatakaDlg.h"
#include "IzaberiDatotekuDlg.h"
#include "Komunikator.h"
#include "Konfig.h"
#include <direct.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPreuzimanjePodatakaDlg dialog
CPreuzimanjePodatakaDlg::CPreuzimanjePodatakaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPreuzimanjePodatakaDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPreuzimanjePodatakaDlg)
m_NazivDatoteke = _T("");
//}}AFX_DATA_INIT
}
void CPreuzimanjePodatakaDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPreuzimanjePodatakaDlg)
DDX_Control(pDX, IDC_PROGRES_INDIKATOR, m_ProgresIndikator);
DDX_Text(pDX, IDC_NAZIV_DATOTEKE, m_NazivDatoteke);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPreuzimanjePodatakaDlg, CDialog)
//{{AFX_MSG_MAP(CPreuzimanjePodatakaDlg)
ON_BN_CLICKED(IDC_IZABERI_DATOTEKU, OnIzaberiDatoteku)
ON_BN_CLICKED(IDC_PREKINI_PREUZIMANJE, OnPrekiniPreuzimanje)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPreuzimanjePodatakaDlg message handlers
void CPreuzimanjePodatakaDlg::OnIzaberiDatoteku()
{
// Osvezi promenljive forme
CPreuzimanjePodatakaDlg::UpdateData();
// Ako je vec izabran neki naziv, predji na taj direktorijum i ponudi naziv tog fajla
CString cNazivDatoteke, cStaza;
CRucniTerminalApp::OdvojiDatotekuOdStaze( m_NazivDatoteke, cNazivDatoteke, cStaza );
if ( cStaza != "" ) _chdir( cStaza ); // Ovo ne radi ?????
CIzaberiDatotekuDlg dijalogZaIzborDatoteke( TRUE, NULL, cNazivDatoteke );
if ( dijalogZaIzborDatoteke.DoModal() == IDOK ) {
// Postavi izabrani naziv datoteke
m_NazivDatoteke = dijalogZaIzborDatoteke.GetPathName();
CPreuzimanjePodatakaDlg::UpdateData( FALSE );
}
}
// Procedura preuzima podatke sa rucnog terminala
void CPreuzimanjePodatakaDlg::PreuzmiPodatke( const TSpisakBrojila& spisakBrojila,
const KAdminInfo& adminInfo,
const KOpisRT& opisRT,
bool bNastavakPrenosa,
unsigned int nSBrBrojilaPrekida,
std::ofstream& izlazniFajl,
int& PorukaID ){
// Ako se radi o nastavku prenosa, preskoci sva brojila u spisku do zadatog serijskog broja
TSpisakBrojila::const_iterator sb_iter = spisakBrojila.begin();
TSpisakBrojila::const_iterator sb_iterEnd = spisakBrojila.end();
unsigned int nBrojPrenetihBrojila = 0;
if ( bNastavakPrenosa ) {
bool bNasoPrekid = false;
while ( !bNasoPrekid && ( sb_iter != sb_iterEnd ) ) {
if ( sb_iter->nSerijskiBrojBrojila == nSBrBrojilaPrekida ){
bNasoPrekid = true;
}
++nBrojPrenetihBrojila;
sb_iter++;
}
}
// Za potrebe 'progres indikatora' izracunaj ukupan broj bajtova koji treba preneti
unsigned int nBrojBajtovaZaSpisak = KKomunikator::Instance()->DuzinaSpiskaBrojila();
unsigned int nBrojBajtovaZaPodatak;
unsigned int nUkupanBrojBajtova;
if ( adminInfo.bDodatniOpisRT ) {
// u novoj verziji, duzina se racuna na osnovu opisa rucnog terminala i flegova
nBrojBajtovaZaPodatak = opisRT.DuzinaPodataka( adminInfo.nKontrolniFlegovi );
nUkupanBrojBajtova = nBrojBajtovaZaSpisak +
adminInfo.nBrojBrojilaUSpisku * nBrojBajtovaZaPodatak;
}
else {
// stara verzija
nBrojBajtovaZaPodatak = KKomunikator::Instance()->DuzinaGrupePodatakaOBrojilu( PODATAK_ZA_CITANJE );
nUkupanBrojBajtova = nBrojBajtovaZaSpisak +
KKomunikator::Instance()->DuzinaPodatakaOSvimBrojilima( PODATAK_ZA_CITANJE );
}
unsigned int nProgres = 0;
m_ProgresIndikator.SetRange32( 0, nUkupanBrojBajtova );
// Ukljuci dugme za prekid, iskljuci ostalu dugmad
CButton* dugmePrekini = (CButton*)this->GetDlgItem( IDC_PREKINI_PREUZIMANJE );
CButton* dugmeOK = (CButton*)this->GetDlgItem( IDOK );
CButton* dugmeCancel = (CButton*)this->GetDlgItem( IDCANCEL );
CButton* dugmeIzaberiDat= (CButton*)this->GetDlgItem( IDC_IZABERI_DATOTEKU );
if ( dugmePrekini != NULL
&& dugmeOK != NULL
&& dugmeCancel != NULL
&& dugmeIzaberiDat != NULL )
{
dugmePrekini->ShowWindow( SW_SHOW );
dugmeOK->ShowWindow( SW_HIDE );
dugmeCancel->ShowWindow( SW_HIDE );
dugmeIzaberiDat->ShowWindow( SW_HIDE );
}
PrekiniPreuzimanje = false;
// Prikazi "progres indikator"
m_ProgresIndikator.ShowWindow( SW_SHOWNA );
m_ProgresIndikator.SetPos( 0 );
this->RedrawWindow();
nProgres = nBrojBajtovaZaSpisak + nBrojPrenetihBrojila*nBrojBajtovaZaPodatak;
m_ProgresIndikator.SetPos( nProgres );
// Pomocne promenljive za ispis
string redTeksta;
string redTekstaPom;
// Zaglavlje ( 2 reda : nazivi pojedinih podataka i linija za podvlacenje )
// Ispisuje se samo ako nije nastavak prethodnog prenosa.
if ( !bNastavakPrenosa ) {
KKomunikator::Instance()->ZaglavljeZaGrupuPodataka( redTeksta, redTekstaPom );
izlazniFajl << redTeksta
<< endl;
izlazniFajl << redTekstaPom
<< endl;
}
// Obidji spisak brojila i pokupi podatke sa rucnog terminala
EIDTipaBrojila tipBrojila;
unsigned int nSerijskiBroj;
PorukaID = IDS_PREUZIMANJE_USPELO;
while( !PrekiniPreuzimanje
&& sb_iter != sb_iterEnd ) {
tipBrojila = sb_iter->tip;
nSerijskiBroj = sb_iter->nSerijskiBrojBrojila;
// Najpre ocitaj opis podataka ( ako je podrzan )
string cOpisPodataka;
bool bOpisOK = true;
if ( adminInfo.PostojiOpisPodataka() ) {
bOpisOK = KKomunikator::Instance()->OcitajPodatak( KT_OCITAJ_OPIS_PODATKA,
nSerijskiBroj,
cOpisPodataka,
OVERH+BROJ_BAJTOVA_ZA_OPIS_PODATKA );
}
else {
// 'default' ( za staru verzije terminala - 1.0 )
cOpisPodataka.append( 2, char( 0xFF ) ); // svi podaci su 'validni'
cOpisPodataka.append( 2, char( 0x00 ) ); // svi podaci imaju format 0 ( format 1 je za
// mernu grupu koju stari terminal ne podrzava )
}
// Zatim ocitaj i same podatke
string cKorisniPodaci;
if ( bOpisOK &&
KKomunikator::Instance()->OcitajSvePodatake( nSerijskiBroj, cKorisniPodaci ) ){
// String sa primljenim podacima pretvori u string pogodan za upis u fajl.
KKomunikator::Instance()->
GrupuPodatakaUFormatiranString( cKorisniPodaci,
tipBrojila, nSerijskiBroj, cOpisPodataka,
redTeksta );
izlazniFajl << redTeksta
<< endl;
m_ProgresIndikator.SetPos( nProgres += nBrojBajtovaZaPodatak );
}
else {
PorukaID = IDS_PREUZIMANJE_NEUSPELO;
break;
}
// Predji na sledece brojilo u spisku
sb_iter++;
// Proveri poruke koje su u medjuvremenu stigle
// ( da bi omogucio prekid operacije )
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOYIELD | PM_REMOVE)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
// Proveri da li je doslo do prekida ( ili je zavrsio do kraja )
if ( PrekiniPreuzimanje ) {
PorukaID = IDS_PREUZIMANJE_PREKINUTO;
// Pamtim dokle sam stigao ( da bi mogao kasnije da nastavim ).
// Pamtim tip i serijski broj poslednjeg ocitanog brojila u spisku,
// ukupan broj brojila u spisku, kao i serjski broj rucnog terminala
KKonfig::Instance()->ZapamtiPrekidKodPreuzimanja( tipBrojila,
nSerijskiBroj,
spisakBrojila.size(),
adminInfo.nSerijskiBrojTerminala );
}
else {
// Ako nije doslo do prekida, resetuj podatke o prekidu
KKonfig::Instance()->ObrisiPodatkeOPrekiduPreuzimanja();
}
// Sakrij "progres indikator"
m_ProgresIndikator.ShowWindow( SW_HIDE );
this->RedrawWindow();
// Vrati dugmad na default
dugmePrekini->ShowWindow( SW_HIDE );
dugmeOK->ShowWindow( SW_SHOW );
dugmeCancel->ShowWindow( SW_SHOW );
dugmeIzaberiDat->ShowWindow( SW_SHOW );
}
void CPreuzimanjePodatakaDlg::OnOK()
{
CRucniTerminalApp* pRTApp = ( CRucniTerminalApp* ) AfxGetApp();
int PorukaID;
bool bOdustao = false;
KAdminInfo admInf;
KOpisRT opisRT;
// Proveri da li je terminal spreman za narednu komandu
bool bNastavi = pRTApp->TerminalSpreman( PorukaID, admInf );
if ( bNastavi ) {
// Procitaj dodatni opis rucnog terminala( podrzan od verzije 1.3 )
if ( admInf.bDodatniOpisRT ) {
if ( !pRTApp->OcitajUbrzanoDodatniOpisRT( opisRT ) ) {
// Ako citanje opisa ne uspe, ne nastavljam dalje jer
// nesaglasnost opisa sa 'admin info', dovodi kasnije do gresaka !
PorukaID = IDS_PREUZIMANJE_NEUSPELO;
bNastavi = false;
}
}
}
// Proveri da li je zadat naziv datoteke.
CString cNazivDatoteke, cStaza;
if ( bNastavi ) {
// Pokupi podatke iz forme u odgovarajuce promenljive
CPreuzimanjePodatakaDlg::UpdateData();
// Odvoji naziv datoteke i naziv direktorijuma( staze )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -