ponyprog/SrcPony/lpt_io_interf.cpp
Claudio Lanconelli 1ea8c14e75 fix year
2020-02-05 17:23:29 +01:00

232 lines
5.3 KiB
C++

//=========================================================================//
// //
// PonyProg - Serial Device Programmer //
// //
// Copyright (C) 1997-2020 Claudio Lanconelli //
// //
// http://ponyprog.sourceforge.net //
// //
//-------------------------------------------------------------------------//
// //
// This program is free software; you can redistribute it and/or //
// modify it under the terms of the GNU General Public License //
// as published by the Free Software Foundation; either version2 of //
// the License, or (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU //
// General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program (see LICENSE); if not, write to the //
// Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //
// //
//=========================================================================//
#include "types.h"
#include "errcode.h"
#include <QDebug>
#include <QtCore>
#ifdef Q_OS_WIN32
#include <windows.h>
#endif
#ifdef Q_OS_LINUX
#include <unistd.h>
#include <fcntl.h>
#endif
#include "lpt_io_interf.h"
enum LptRegs
{
dataOfst,
statOfst,
ctrlOfst
};
LPTIOInterface::LPTIOInterface()
{
qDebug() << "LPTIOInterface::LPTIOInterface()";
last_ctrl = last_data = 0;
lpt_port = -1;
//PortInterface::OpenParallel(lpt_port);
}
LPTIOInterface::~LPTIOInterface()
{
qDebug() << "LPTIOInterface::~LPTIOInterface()";
PortInterface::CloseParallel();
}
void LPTIOInterface::SetPort(int port_no)
{
qDebug() << "LPTIOInterface::SetPort(" << port_no << ")";
if (port_no >= 0 && port_no < MAX_LPTPORTS)
{
lpt_port = port_no;
PortInterface::CloseParallel();
PortInterface::OpenParallel(lpt_port);
}
}
// Bit Bit
// 0 - Unused 4 - Pin 13
// 1 - Unused 5 - Pin 12
// 2 - Unused 6 - Pin 10
// 3 - Pin 15 7 - Pin 11 (Inverted)
//
/////////////////////////////////////////////////////////////////
int LPTIOInterface::InDataPort(int port_no)
{
qDebug() << "LPTIOInterface::InDataPort(" << port_no << ") ** lp=" << lpt_port;
int ret_val = OK;
if (port_no >= 0 && port_no < MAX_LPTPORTS &&
port_no != lpt_port)
{
lpt_port = port_no;
PortInterface::CloseParallel();
ret_val = PortInterface::OpenParallel(lpt_port);
}
if (ret_val == OK)
{
ret_val = PortInterface::InPort(statOfst);
}
qDebug() << "LPTIOInterface::InDataPort() = " << ret_val;
return ret_val;
}
//
// Bit Bit
// 0 - Pin 2 4 - Pin 6
// 1 - Pin 3 5 - Pin 7
// 2 - Pin 4 6 - Pin 8
// 3 - Pin 5 7 - Pin 9
//
/////////////////////////////////////////////////////////////////
int LPTIOInterface::OutDataPort(int val, int port_no)
{
qDebug() << "LPTIOInterface::OutDataPort(" << val << ", " << port_no << ")";
int ret_val = OK;
if (port_no >= 0 && port_no < MAX_LPTPORTS &&
port_no != lpt_port)
{
lpt_port = port_no;
PortInterface::CloseParallel();
ret_val = PortInterface::OpenParallel(lpt_port);
}
if (ret_val == OK)
{
last_data = val;
ret_val = PortInterface::OutPort(val, dataOfst);
}
qDebug() << "LPTIOInterface::OutDataPort() = " << ret_val;
return ret_val;
}
//
// Bit
// 0 - Pin 1
// 1 - Pin 14
// 2 - Pin 16
// 3 - Pin 17 NOTE: Bits 5-7 are not used.
//
/////////////////////////////////////////////////////////////////
int LPTIOInterface::OutControlPort(int val, int port_no)
{
qDebug() << "LPTIOInterface::OutControlPort(" << val << ", " << port_no << ")";
int ret_val = OK;
if (port_no >= 0 && port_no < MAX_LPTPORTS &&
port_no != lpt_port)
{
lpt_port = port_no;
PortInterface::CloseParallel();
ret_val = PortInterface::OpenParallel(lpt_port);
}
if (ret_val == OK)
{
last_ctrl = val;
ret_val = PortInterface::OutPort(val, ctrlOfst);
}
qDebug() << "LPTIOInterface::OutControlPort() = " << ret_val;
return ret_val;
}
int LPTIOInterface::OutDataMask(int mask, int val)
{
int ret_val;
if (val == 0)
{
last_data &= ~mask;
}
else if (val == 1)
{
last_data |= mask;
}
else
{
last_data ^= mask;
}
ret_val = OutDataPort(last_data);
return ret_val;
}
int LPTIOInterface::OutControlMask(int mask, int val)
{
int ret_val;
if (val == 0)
{
last_ctrl &= ~mask;
}
else if (val == 1)
{
last_ctrl |= mask;
}
else
{
last_ctrl ^= mask;
}
ret_val = OutControlPort(last_ctrl);
return ret_val;
}