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

📄 lptport.cpp

📁 pc paralel port programming
💻 CPP
字号:
// LPTPort.cpp: implementation of the CLPTPort class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "LPTPort.h"
#include "BaznaLPTAdresa.h"
#include "RegistarDATA.h"
#include "RegistarSTATUS.h"
#include "RegistarCONTROL.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

CLPTPort::CLPTPortException::CLPTPortException(const std::string& opis)
{
    opisGreske = opis;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CLPTPort::CLPTPort(int LPTport)
{
    // odredi baznu adresu porta
    int adr;
    try {
        adr = CBaznaLPTAdresa::GetAddressLptPort(LPTport);
    }
    catch (...) {
        throw CLPTPortException("Error : cannot obtain base address !");
    }
    if (adr == -1) {
        throw CLPTPortException("Port does not exists !");
    }

    // inicijalizuj spisak registara
    try {
        registri_m.push_back(new CRegistarDATA(adr));
        registri_m.push_back(new CRegistarSTATUS(adr));
        registri_m.push_back(new CRegistarCONTROL(adr));
    }
    catch (...) {
        IsprazniSpisakRegistara();
        throw CLPTPortException("Error : register creation failed !");
    }

    // sledece dve naredbe ne mogu da bace izuzetak
    this->port_m = LPTport;
    this->baznaAdresa_m = adr;
}

CLPTPort::~CLPTPort()
{
    IsprazniSpisakRegistara();
}

std::string CLPTPort::NazivPorta(int LPTport)
{
    std::string naziv("LPT");

    char pombuff[20];
    sprintf(pombuff, "%d", LPTport);
    naziv += pombuff;

    return naziv;
}

std::string CLPTPort::DajNaziv(void)
{
    return NazivPorta(port_m);
}

int CLPTPort::DajBaznuAdresu(void)
{
    return baznaAdresa_m;
}

int CLPTPort::DajBrojPorta(void)
{
    return port_m;
}

//////////////////////////////////////////////////////////////////////
// Funkcije koje implementiraju 'interfejs' CKontrolaLPTRegistara
//////////////////////////////////////////////////////////////////////

int CLPTPort::Postavi(int bitMaska, LPT::ECiljKomande bitPin)
{
    CLPTRegistar* pRegistar;
    tSpisakReg::const_iterator regEnd = registri_m.end();
    for (tSpisakReg::iterator r_iter = registri_m.begin(); r_iter != regEnd; ++r_iter) {
        pRegistar = (*r_iter);
        if (pRegistar->AdresiranMaskom(bitMaska)){
            pRegistar->Postavi(bitMaska, PosmatrajPinove(bitPin));
        }
    }

    // citanje vrednosti pinova nakon je izbaceno zbog performansi
//    return (Procitaj(LPT::SVI_BITOVI, bitPin));
    return 0;
}

int CLPTPort::Obori(int bitMaska, LPT::ECiljKomande bitPin)
{
    CLPTRegistar* pRegistar;
    tSpisakReg::const_iterator regEnd = registri_m.end();
    for (tSpisakReg::iterator r_iter = registri_m.begin(); r_iter != regEnd; ++r_iter) {
        pRegistar = (*r_iter);
        if (pRegistar->AdresiranMaskom(bitMaska)){
            pRegistar->Obori(bitMaska, PosmatrajPinove(bitPin));
        }
    }

    // citanje vrednosti pinova je izbaceno zbog performansi
//    return (Procitaj(LPT::SVI_BITOVI, bitPin));
    return 0;
}

int CLPTPort::Procitaj(int bitMaska, LPT::ECiljKomande bitPin)
{
    int rezultat = 0;

    CLPTRegistar* pRegistar;
    tSpisakReg::const_iterator regEnd = registri_m.end();
    for (tSpisakReg::iterator r_iter = registri_m.begin(); r_iter != regEnd; ++r_iter) {
        pRegistar = (*r_iter);
        if (pRegistar->AdresiranMaskom(bitMaska)){
            pRegistar->Procitaj(PosmatrajPinove(bitPin));
            rezultat |= pRegistar->RasporediBitoveSadrzajaUMasku(PosmatrajPinove(bitPin));
        }
    }

    // vracam samo bitove koji su trazeni(definisani parametrom 'bitMaska')
    return (rezultat & bitMaska);
}

bool CLPTPort::Postavljen(int bitMaska, LPT::ECiljKomande bitPin)
{
    bool bSetovan = false;
    CLPTRegistar* pRegistar;
    tSpisakReg::const_iterator regEnd = registri_m.end();
    for (tSpisakReg::iterator r_iter = registri_m.begin(); r_iter != regEnd; ++r_iter) {
        pRegistar = (*r_iter);
        if (pRegistar->AdresiranMaskom(bitMaska)){
            bSetovan = pRegistar->Postavljen(bitMaska, PosmatrajPinove(bitPin));
            break;
        }
    }
    return bSetovan;
}

//////////////////////////////////////////////////////////////////////
// Funkcije za manipulaciju registrima.
//////////////////////////////////////////////////////////////////////

int CLPTPort::PostaviSadrzaj(const std::string& reg, int val, LPT::ECiljKomande bitPin)
{
    CLPTRegistar* pReg = DajRegistar(reg);
    if ( pReg != 0 ){
        pReg->Posalji(val, PosmatrajPinove(bitPin));
    }
    return ProcitajSadrzaj(reg, bitPin);
}

int CLPTPort::ProcitajSadrzaj(const std::string& reg, LPT::ECiljKomande bitPin)
{
    CLPTRegistar* pReg = DajRegistar(reg);
    if ( pReg != 0 ){
        return (pReg->Procitaj(PosmatrajPinove(bitPin)));
    }
    return 0;
}

bool CLPTPort::MoguceCitanje(const std::string& reg)
{
    CLPTRegistar* pReg = DajRegistar(reg);
    if ( pReg != 0 ){
        return (pReg->MoguceCitanje());
    }
    return false;
}

bool CLPTPort::MogucUpis(const std::string& reg)
{
    CLPTRegistar* pReg = DajRegistar(reg);
    if ( pReg != 0 ){
        return (pReg->MogucUpis());
    }
    return false;
}

void CLPTPort::MoguceCitanje(const std::string& reg, bool omoguci)
{
    CLPTRegistar* pReg = DajRegistar(reg);
    if ( pReg != 0 ){
        pReg->MoguceCitanje(omoguci);
    }
}

void CLPTPort::MogucUpis(const std::string& reg, bool omoguci)
{
    CLPTRegistar* pReg = DajRegistar(reg);
    if ( pReg != 0 ){
        pReg->MogucUpis(omoguci);
    }
}

void CLPTPort::ProcitajSadrzajSvihRegistara(LPT::ECiljKomande bitPin)
{
    tSpisakReg::const_iterator regEnd = registri_m.end();
    for (tSpisakReg::iterator r_iter = registri_m.begin(); r_iter != regEnd; ++r_iter) {
        (*r_iter)->Procitaj(PosmatrajPinove(bitPin));
    }
}

//////////////////////////////////////////////////////////////////////
// Pomocne funkcije
//////////////////////////////////////////////////////////////////////

void CLPTPort::IsprazniSpisakRegistara(void)
{
    tSpisakReg::const_iterator regEnd = registri_m.end();
    for (tSpisakReg::iterator r_iter = registri_m.begin(); r_iter != regEnd; ++r_iter) {
        delete (*r_iter);
    }
    registri_m.clear();
}

CLPTRegistar* CLPTPort::DajRegistar(std::string naziv)
{
    tSpisakReg::const_iterator regEnd = registri_m.end();
    for (tSpisakReg::iterator r_iter = registri_m.begin(); r_iter != regEnd; ++r_iter) {
        if ((*r_iter)->Naziv() == naziv){
            return (*r_iter);
        }
    }
    return 0;
}

bool CLPTPort::PosmatrajPinove(LPT::ECiljKomande bitPin)
{
    return (bitPin == LPT::PIN);
}

⌨️ 快捷键说明

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