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

📄 preuzimanjepodatakadlg.cpp

📁 load data from pc to hand held terminal and vice versa
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -