20.10.2013 - Modified PIObject - virtual debugName() for macro piCoutObj, improved timer measurements and timers on Windows
This commit is contained in:
64
piserial.cpp
64
piserial.cpp
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "piserial.h"
|
||||
#include "piconfig.h"
|
||||
|
||||
|
||||
PISerial::PISerial(const PIString & device, void * data_, ReadRetFunc slot): PIIODevice(device, ReadWrite) {
|
||||
@@ -67,14 +68,14 @@ bool PISerial::setPin(int number, bool on) {
|
||||
case 3: return setST(on); break;
|
||||
case 4: return setDTR(on); break;
|
||||
case 5:
|
||||
piCoutObj << "[PISerial] Pin number 5 is ground";
|
||||
piCoutObj << "Pin number 5 is ground";
|
||||
return false;
|
||||
case 6: return setDSR(on); break;
|
||||
case 7: return setRTS(on); break;
|
||||
case 8: return setCTS(on); break;
|
||||
case 9: return setRNG(on); break;
|
||||
default:
|
||||
piCoutObj << "[PISerial] Pin number " << number << " doesn`t exists!";
|
||||
piCoutObj << "Pin number " << number << " doesn`t exists!";
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
@@ -93,7 +94,7 @@ bool PISerial::isPin(int number) const {
|
||||
case 8: return isCTS(); break;
|
||||
case 9: return isRNG(); break;
|
||||
default:
|
||||
piCoutObj << "[PISerial] Pin number " << number << " doesn`t exists!";
|
||||
piCoutObj << "Pin number " << number << " doesn`t exists!";
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
@@ -103,16 +104,16 @@ bool PISerial::isPin(int number) const {
|
||||
bool PISerial::setBit(int bit, bool on, const PIString & bname) {
|
||||
#ifndef WINDOWS
|
||||
if (fd < 0) {
|
||||
piCoutObj << "[PISerial] set" << bname << " error: \"" << path_ << "\" is not opened!";
|
||||
piCoutObj << "set" << bname << " error: \"" << path_ << "\" is not opened!";
|
||||
return false;
|
||||
}
|
||||
if (ioctl(fd, on ? TIOCMBIS : TIOCMBIC, &bit) < 0) {
|
||||
piCoutObj << "[PISerial] set" << bname << " error: " << errorString();
|
||||
piCoutObj << "set" << bname << " error: " << errorString();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#else
|
||||
piCoutObj << "[PISerial] set" << bname << " doesn`t implemented on Windows, sorry :-(";
|
||||
piCoutObj << "set" << bname << " doesn`t implemented on Windows, sorry :-(";
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
@@ -121,15 +122,15 @@ bool PISerial::setBit(int bit, bool on, const PIString & bname) {
|
||||
bool PISerial::isBit(int bit, const PIString & bname) const {
|
||||
#ifndef WINDOWS
|
||||
if (fd < 0) {
|
||||
piCoutObj << "[PISerial] is" << bname << " error: \"" << path_ << "\" is not opened!";
|
||||
piCoutObj << "is" << bname << " error: \"" << path_ << "\" is not opened!";
|
||||
return false;
|
||||
}
|
||||
int ret = 0;
|
||||
if (ioctl(fd, TIOCMGET, &ret) < 0)
|
||||
piCoutObj << "[PISerial] is" << bname << " error: " << errorString();
|
||||
piCoutObj << "is" << bname << " error: " << errorString();
|
||||
return ret & bit;
|
||||
#else
|
||||
piCoutObj << "[PISerial] set" << bname << " doesn`t implemented on Windows, sorry :-(";
|
||||
piCoutObj << "set" << bname << " doesn`t implemented on Windows, sorry :-(";
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
@@ -301,7 +302,7 @@ bool PISerial::openDevice() {
|
||||
if (isWriteable()) {ds |= GENERIC_WRITE; sm |= FILE_SHARE_WRITE;}
|
||||
hCom = CreateFileA(path_.data(), ds, sm, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
|
||||
if(hCom == INVALID_HANDLE_VALUE) {
|
||||
piCoutObj << "[PISerial] Unable to open \"" << path_ << "\"";
|
||||
piCoutObj << "Unable to open \"" << path_ << "\"";
|
||||
return false;
|
||||
}
|
||||
fd = 0;
|
||||
@@ -312,7 +313,7 @@ bool PISerial::openDevice() {
|
||||
times.WriteTotalTimeoutConstant = 1;
|
||||
times.WriteTotalTimeoutMultiplier = 0;
|
||||
if (SetCommTimeouts(hCom, ×) == -1) {
|
||||
piCoutObj << "[PISerial] Unable to set timeouts for \"" << path_ << "\"";
|
||||
piCoutObj << "Unable to set timeouts for \"" << path_ << "\"";
|
||||
CloseHandle(hCom);
|
||||
fd = -1;
|
||||
return false;
|
||||
@@ -330,7 +331,7 @@ bool PISerial::openDevice() {
|
||||
}
|
||||
desc.StopBits = params[PISerial::TwoStopBits] ? TWOSTOPBITS : ONESTOPBIT;
|
||||
if (SetCommState(hCom, &desc) == -1) {
|
||||
piCoutObj << "[PISerial] Unable to set comm state for \"" << path_ << "\"";
|
||||
piCoutObj << "Unable to set comm state for \"" << path_ << "\"";
|
||||
CloseHandle(hCom);
|
||||
fd = -1;
|
||||
return false;
|
||||
@@ -345,7 +346,7 @@ bool PISerial::openDevice() {
|
||||
//cout << "init ser " << path_ << " mode " << om << " param " << params << endl;
|
||||
fd = ::open(path_.data(), O_NOCTTY | om);
|
||||
if(fd == -1) {
|
||||
piCoutObj << "[PISerial] Unable to open \"" << path_ << "\"";
|
||||
piCoutObj << "Unable to open \"" << path_ << "\"";
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -371,20 +372,33 @@ bool PISerial::openDevice() {
|
||||
fcntl(fd, F_SETFL, 0);
|
||||
|
||||
if(tcsetattr(fd, TCSANOW, &desc) < 0) {
|
||||
piCoutObj << "[PISerial] Can`t set attributes for \"" << path_ << "\"";
|
||||
piCoutObj << "Can`t set attributes for \"" << path_ << "\"";
|
||||
::close(fd);
|
||||
return false;
|
||||
}
|
||||
//piCoutObj << "[PISerial] Initialized " << path_;
|
||||
//piCoutObj << "Initialized " << path_;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
int PISerial::read(void * read_to, int max_size) {
|
||||
#ifdef WINDOWS
|
||||
if (!canRead()) return -1;
|
||||
WaitCommEvent(hCom, 0, 0);
|
||||
ReadFile(hCom, read_to, max_size, &readed, 0);
|
||||
return readed;
|
||||
#else
|
||||
if (!canRead()) return -1;
|
||||
return ::read(fd, read_to, max_size);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int PISerial::write(const void * data, int max_size, bool wait) {
|
||||
//piCoutObj << "[PISerial] send " << max_size << ": " << PIString((char*)data, max_size);
|
||||
//piCoutObj << "send " << max_size << ": " << PIString((char*)data, max_size);
|
||||
if (fd == -1 || !canWrite()) {
|
||||
//piCoutObj << "[PISerial] Can`t write to uninitialized COM";
|
||||
//piCoutObj << "Can`t write to uninitialized COM";
|
||||
return -1;
|
||||
}
|
||||
#ifdef WINDOWS
|
||||
@@ -402,6 +416,18 @@ int PISerial::write(const void * data, int max_size, bool wait) {
|
||||
if (wait) tcdrain(fd);
|
||||
#endif
|
||||
return (int)wrote;
|
||||
//piCoutObj << "[PISerial] Error while sending";
|
||||
//piCoutObj << "[PISerial] Wrote " << wrote << " bytes in " << path_;
|
||||
//piCoutObj << "Error while sending";
|
||||
//piCoutObj << "Wrote " << wrote << " bytes in " << path_;
|
||||
}
|
||||
|
||||
|
||||
bool PISerial::configureDevice(const void * e_main, const void * e_parent) {
|
||||
PIConfig::Entry * em = (PIConfig::Entry * )e_main;
|
||||
PIConfig::Entry * ep = (PIConfig::Entry * )e_parent;
|
||||
setDevice(readDeviceSetting<PIString>("device", device(), em, ep));
|
||||
setSpeed((PISerial::Speed)(readDeviceSetting<int>("speed", (int)ospeed, em, ep)));
|
||||
setParameter(PISerial::ParityControl, readDeviceSetting<bool>("parityControl", isParameterSet(PISerial::ParityControl), em, ep));
|
||||
setParameter(PISerial::ParityOdd, readDeviceSetting<bool>("parityOdd", isParameterSet(PISerial::ParityOdd), em, ep));
|
||||
setParameter(PISerial::TwoStopBits, readDeviceSetting<bool>("twoStopBits", isParameterSet(PISerial::TwoStopBits), em, ep));
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user