ponyprog/SrcPony/portint.h
2019-08-19 01:41:40 +02:00

134 lines
4.1 KiB
C++

//=========================================================================//
// //
// PonyProg - Serial Device Programmer //
// //
// Copyright (C) 1997-2019 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. //
// //
//=========================================================================//
#ifndef _PORTINTERFACE_H
#define _PORTINTERFACE_H
#include <QtCore>
#include "types.h"
#ifdef Q_OS_WIN32
#include <windows.h>
typedef void (__stdcall *lpOut32)(short, short);
typedef short(__stdcall *lpInp32)(short);
typedef BOOL (__stdcall *lpIsInpOutDriverOpen)(void);
typedef BOOL (__stdcall *lpIsXP64Bit)(void);
#endif
// Maximum number of printer ports that would be installed on a system
#define MAX_LPTPORTS 4
#define MAX_COMPORTS 8
struct base_len
{
unsigned int base, len;
};
class PortInterface
{
public:
PortInterface();
virtual ~PortInterface();
int OpenPort(const base_len *ports);
void ClosePort();
int OpenSerial(int no);
void CloseSerial();
int OpenParallel(int no);
void CloseParallel();
int GetFirstPort() const
{
return first_port;
}
int GetLastPort() const
{
return last_port;
}
int GetNoPorts() const
{
return no_ports;
}
int GetSerBasePort(int no);
int GetParBasePort(int no);
virtual int InPort(int no = -1) const;
virtual int OutPort(int val, int no = -1);
virtual int OutPortMask(int mask, int val);
protected:
uint8_t GetCPWReg()
{
return cpwreg;
}
#ifdef Q_OS_WIN32
HANDLE hCom;
#endif
int write_port, // Number of output port (write I/O port address)
read_port; // Number of input port (read I/O port address)
uint8_t cpwreg; // write register image in memory (the content is the same of the hardware register)
private:
int IOperm(int a, int b, int c);
void DetectPorts();
#ifdef Q_OS_WIN32
//void DetectPorts9x(); // Win9x version
void DetectLPTPortsNT(); // WinNT/2000 version
void DetectCOMPortsNT(); // WinNT/2000 version
int LPTCount; //Number of LPT ports on the system
int COMCount; //Number of COM ports on the system
DWORD old_mask;
HINSTANCE hInpOutDll;
//Some global function pointers (messy but fine for an example)
lpOut32 gfpOut32;
lpInp32 gfpInp32;
lpIsInpOutDriverOpen gfpIsInpOutDriverOpen;
lpIsXP64Bit gfpIsXP64Bit;
#else
int lcr_copy;
int ier_copy;
#endif
int first_port;
int last_port;
int no_ports;
base_len ser_ports[MAX_COMPORTS];
base_len par_ports[MAX_LPTPORTS];
};
#endif