📄 punjenjespiskabrojiladlg.cpp
字号:
// PunjenjeSpiskaBrojilaDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RucniTerminal.h"
#include "PunjenjeSpiskaBrojilaDlg.h"
#include <direct.h>
#include <stdlib.h>
#include "IzaberiDatotekuDlg.h"
#include "Komunikator.h"
#include "Konfig.h"
#include "HardverRT.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPunjenjeSpiskaBrojilaDlg dialog
CPunjenjeSpiskaBrojilaDlg::CPunjenjeSpiskaBrojilaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPunjenjeSpiskaBrojilaDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPunjenjeSpiskaBrojilaDlg)
m_NazivDatoteke = _T("");
//}}AFX_DATA_INIT
}
void CPunjenjeSpiskaBrojilaDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPunjenjeSpiskaBrojilaDlg)
DDX_Control(pDX, IDC_PROGRES_INDIKATOR, m_ProgresIndikator);
DDX_Text(pDX, IDC_NAZIV_DATOTEKE, m_NazivDatoteke);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPunjenjeSpiskaBrojilaDlg, CDialog)
//{{AFX_MSG_MAP(CPunjenjeSpiskaBrojilaDlg)
ON_BN_CLICKED(IDC_IZABERI_DATOTEKU, OnIzaberiDatoteku)
ON_BN_CLICKED(IDC_PREKINI_PUNJENJE, OnPrekiniPunjenje)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPunjenjeSpiskaBrojilaDlg message handlers
void CPunjenjeSpiskaBrojilaDlg::OnIzaberiDatoteku()
{
CIzaberiDatotekuDlg dijalogZaIzborDatoteke( TRUE );
if ( dijalogZaIzborDatoteke.DoModal() == IDOK ) {
// Postavi izabrani naziv datoteke
m_NazivDatoteke = dijalogZaIzborDatoteke.GetPathName();
CPunjenjeSpiskaBrojilaDlg::UpdateData( FALSE );
}
}
void CPunjenjeSpiskaBrojilaDlg::OnOK()
{
CRucniTerminalApp* pRTApp = ( CRucniTerminalApp* ) AfxGetApp();
int PorukaID;
bool bOdustao = false;
bool bNastavi( true );
// Najpre proveri da li je terminal spreman za narednu komandu
KAdminInfo admInf;
if( pRTApp->TerminalSpreman( PorukaID, admInf ) ) {
// Procitaj dodatni opis rucnog terminala( podrzan od verzije 1.3 )
KOpisRT opisRT;
bNastavi = true;
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_PUNJENJE_SPISKA_JOK;
bNastavi = false;
}
}
if ( bNastavi ) {
// Pokupi podatke iz forme u odgovarajuce promenljive
CPunjenjeSpiskaBrojilaDlg::UpdateData();
TOpisBrojilaMap tabela;
TSpisakSerijskihBrojeva pesackiPut;
// Procitaj spisak iz datoteke i formiraj tabelu( podaci ) i pesacki put( redosled podataka )
if ( ProcitajSpisakIzDatoteke( m_NazivDatoteke, tabela, pesackiPut, PorukaID ) ) {
unsigned int nBrojBrojila;
KString cKontrolInfo;
TListaStringova podaciOBrojilima;
// Prevedi podateke u oblik pogodan za slanje
if ( PripremiPodatkeZaSlanje( tabela, pesackiPut, admInf, opisRT,
nBrojBrojila, cKontrolInfo, podaciOBrojilima,
PorukaID ) ){
// Trazi potvrdu od korisnika
if ( pRTApp->PrikaziSigurnosnoPitanje( IDS_SIGUR_PITANJE ) == IDOK ) {
// Ukljuci dugme za prekid, iskljuci ostalu dugmad
CButton* dugmePrekini = (CButton*)this->GetDlgItem( IDC_PREKINI_PUNJENJE );
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 );
}
PrekiniPunjenje = false;
// Prikazi "progres indikator"
m_ProgresIndikator.ShowWindow( SW_SHOWNA );
m_ProgresIndikator.SetPos( 0 );
this->RedrawWindow();
// Za potrebe 'progres indikatora' izracunaj ukupan broj bajtova koji treba preneti
unsigned int nBrojBajtovaZaPodatak;
if ( admInf.bDodatniOpisRT ) {
// nova verzija ( >= 1.3 )
nBrojBajtovaZaPodatak = admInf.BrojBajtovaZaOpisPodatka() + opisRT.DuzinaSvihPodatakaBezOpisa();
}
else {
// stara verzija
nBrojBajtovaZaPodatak = KOpisPodataka::Instance()->BrojBajtovaZaSvePodatke( admInf );
}
unsigned int nUkupanBrojBajtova = ( nBrojBrojila + 1 ) * nBrojBajtovaZaPodatak;
unsigned int nProgres = 0;
m_ProgresIndikator.SetRange32( 0, nUkupanBrojBajtova );
//////////////////// SLANJE PODATAKA << BEGIN >> ///////////////////
// Najpre posalji podatke za inicijalizaciju prenosa :
// broj brojila koji treba preneti i adresu poslednjeg brojila u spisku.
if ( KKomunikator::Instance()->InitSnimiSpisakBrojila( cKontrolInfo.cString ) ) {
m_ProgresIndikator.SetPos( nProgres += nBrojBajtovaZaPodatak );
// Za svako brojilo u spisku posalji po jednu poruku terminalu
TListaStringova::iterator ls_iter = podaciOBrojilima.begin();
TListaStringova::iterator ls_iterEnd = podaciOBrojilima.end();
bool bPunjenjeSpiskaUspelo = true;
while ( !PrekiniPunjenje
&& bPunjenjeSpiskaUspelo
&& ls_iter != ls_iterEnd )
{
bPunjenjeSpiskaUspelo =
KKomunikator::Instance()->PosaljiPodatakOBrojiluIzSpiska( ls_iter->cString );
m_ProgresIndikator.SetPos( nProgres += nBrojBajtovaZaPodatak );
ls_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 ( PrekiniPunjenje ) {
PorukaID = IDS_PUNJENJE_PREKINUTO;
bPunjenjeSpiskaUspelo = false;
// Napuni 'default' spisak na rucni terminal
// ( da bi na rucnom terminalu imao 'regularne' podatke )
BeginWaitCursor();
NapraviDefaultSpisak( tabela, pesackiPut );
int pomPorukaID;
if ( PripremiPodatkeZaSlanje( tabela, pesackiPut, admInf, opisRT,
nBrojBrojila, cKontrolInfo, podaciOBrojilima,
pomPorukaID ) ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -