ultimatepp/uppdev/src/Comm/Comport.cpp
cxl 4a1c627474 Adding uppdev....
git-svn-id: svn://ultimatepp.org/upp/trunk@328 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-08-15 08:36:24 +00:00

244 lines
5.7 KiB
C++

#ifndef _COMPORT_
#include "ComPort.hpp"
#endif
//using namespace std;
COMPort::COMPort () : dcb (NULL) {
dcb = new char [sizeof(DCB)];
getState(); // Riempie il DCB con le impostazioni attuali della porta
setBlockingMode();
setHandshaking();
open = false;
}
COMPort::~COMPort() {
delete [] dcb;
CloseHandle ((HANDLE)portHandle);
open = false;
}
COMPort& COMPort::connect(const char * const portName, unsigned long _rate, Parity _parity, DataBits _bytesize, StopBits _stopbits ) {
DCB & aDCB = *((LPDCB)dcb);
if(!open) {
portHandle = (unsigned) CreateFile ( portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL );
if (portHandle == HFILE_ERROR) return *this;
aDCB.fBinary = true;
aDCB.fNull = false;
aDCB.BaudRate = _rate;
aDCB.Parity = _parity;
aDCB.ByteSize = _bytesize;
aDCB.StopBits = _stopbits;
aDCB.fAbortOnError = true;
open = true;
return setState();
}
else return *this;
}
COMPort& COMPort::disconnect() {
if(open) CloseHandle((HANDLE)portHandle);
open = false;
}
void COMPort::getState () const {
if (!GetCommState ( (HANDLE)portHandle, (LPDCB)dcb ) ) {
}
}
COMPort& COMPort::setState () {
if (!SetCommState ( (HANDLE)portHandle, (LPDCB)dcb ) ) {
}
return *this;
}
COMPort& COMPort::setBitRate ( unsigned long Param ) {
DCB & aDCB = *((LPDCB)dcb);
aDCB.BaudRate = Param;
return setState();
}
unsigned long COMPort::bitRate() const {
DCB & aDCB = *((LPDCB)dcb);
return aDCB.BaudRate;
}
COMPort& COMPort::setLineCharacteristics( char * inConfig ) {
COMMTIMEOUTS aTimeout;
if ( !BuildCommDCBAndTimeouts ( inConfig, (LPDCB)dcb, &aTimeout ) ) {
}
if ( ! SetCommTimeouts ( (HANDLE(portHandle)), &aTimeout ) ) {
}
return setState();
}
char COMPort::read () {
char buffer;
DWORD charsRead = 0;
ReadFile ((HANDLE(portHandle)), &buffer, sizeof(char), &charsRead, NULL);
return buffer;
}
unsigned long COMPort::readString ( void *inBuffer, const unsigned long inCharsReq) {
DWORD charsRead = 0;
ReadFile ((HANDLE(portHandle)), inBuffer, inCharsReq, &charsRead, NULL);
return charsRead;
}
COMPort & COMPort::write ( const char inChar ) {
char buffer = inChar;
DWORD charsWritten = 0;
if ( !WriteFile ( (HANDLE(portHandle)), &buffer, sizeof(char), &charsWritten, NULL) ) {
}
return *this;
}
unsigned long COMPort::writeString ( const void *inBuffer, const unsigned long inBufSize ) {
DWORD charsWritten = 0;
if ( !WriteFile ( (HANDLE(portHandle)), inBuffer, inBufSize, &charsWritten, NULL ) ) {
}
return charsWritten;
}
COMPort& COMPort::setxONxOFF ( bool Param ) {
DCB & aDCB = *((LPDCB)dcb);
aDCB.fOutX = Param ? 1 : 0;
aDCB.fInX = Param ? 1 : 0;
return setState();
}
bool COMPort::isxONxOFF () const {
DCB & aDCB = *((LPDCB)dcb);
return (aDCB.fOutX && aDCB.fInX);
}
COMPort& COMPort::setBlockingMode ( unsigned long inReadInterval, unsigned long inReadMultiplyer, unsigned long inReadConstant ) {
COMMTIMEOUTS commTimeout;
if ( !GetCommTimeouts ( (HANDLE(portHandle)), &commTimeout ) ) {
}
commTimeout.ReadIntervalTimeout = inReadInterval;
if ( inReadInterval==MAXDWORD ) {
commTimeout.ReadTotalTimeoutMultiplier = 0;
commTimeout.ReadTotalTimeoutConstant = 0;
}
else {
commTimeout.ReadTotalTimeoutMultiplier = inReadMultiplyer;
commTimeout.ReadTotalTimeoutConstant = inReadConstant;
}
if ( !SetCommTimeouts ( (HANDLE(portHandle)), &commTimeout) ) {
}
return *this;
}
COMPort & COMPort::setHandshaking ( bool inHandshaking ) {
DCB & aDCB = *((LPDCB)dcb);
if (inHandshaking) {
aDCB.fOutxCtsFlow = TRUE;
aDCB.fOutxDsrFlow = FALSE;
aDCB.fRtsControl = RTS_CONTROL_HANDSHAKE;
}
else {
aDCB.fOutxCtsFlow = FALSE;
aDCB.fOutxDsrFlow = FALSE;
aDCB.fRtsControl = RTS_CONTROL_ENABLE;
}
return setState();
}
unsigned long COMPort::getMaximumBitRate() const {
COMMPROP aProp;
if ( !GetCommProperties ( (HANDLE)portHandle, &aProp ) ) {
}
return aProp.dwMaxBaud;
}
COMPort::MSPack COMPort::getModemSignals() const {
MSPack aPack;
if ( !GetCommModemStatus ( (HANDLE)portHandle, (LPDWORD)&aPack ) ) {
}
return aPack;
}
COMPort& COMPort::setParity ( Parity Param ) {
DCB & aDCB = *((LPDCB)dcb);
aDCB.Parity = Param;
return setState();
}
COMPort& COMPort::setDataBits ( DataBits Param ) {
DCB & aDCB = *((LPDCB)dcb);
aDCB.ByteSize = Param;
return setState();
}
COMPort& COMPort::setStopBits ( StopBits Param ) {
DCB & aDCB = *((LPDCB)dcb);
aDCB.StopBits = Param;
return setState();
}
COMPort::Parity COMPort::parity () const {
DCB & aDCB = *((LPDCB)dcb);
return (COMPort::Parity)aDCB.Parity;
}
COMPort::DataBits COMPort::dataBits () const {
DCB & aDCB = *((LPDCB)dcb);
return (COMPort::DataBits)aDCB.ByteSize;
}
COMPort::StopBits COMPort::stopBits () const {
DCB & aDCB = *((LPDCB)dcb);
return (COMPort::StopBits)aDCB.StopBits;
}
COMPort::errorStatus COMPort::clearError() const {
errorStatus eS;
BOOL fOOP, fOVERRUN, fPTO, fRXOVER, fRXPARITY, fTXFULL;
BOOL fBREAK, fDNS, fFRAME, fIOE, fMODE;
// Get and clear current errors on the port.
if (!ClearCommError((HANDLE(portHandle)), &eS.dwErrors, &eS.comStat)) {
}
return eS;
}
bool COMPort::Setup(DWORD dwInQueue, DWORD dwOutQueue) {
return SetupComm((HANDLE(portHandle)), dwInQueue, dwOutQueue);
}
bool COMPort::Purge(DWORD dwFlags) {
return PurgeComm((HANDLE(portHandle)), dwFlags);
}
bool COMPort::ClearWriteBuffer() {
return Purge(PURGE_TXCLEAR);
}
bool COMPort::ClearReadBuffer() {
return Purge(PURGE_RXCLEAR);
}
bool COMPort::Flush() {
return FlushFileBuffers((HANDLE(portHandle)));
}