Line 1... |
Line 1... |
// $Id: RlinkPacketBuf.cpp 469 2013-01-05 12:29:44Z mueller $
|
// $Id: RlinkPacketBuf.cpp 492 2013-02-24 22:14:47Z mueller $
|
//
|
//
|
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
//
|
//
|
// This program is free software; you may redistribute and/or modify it under
|
// This program is free software; you may redistribute and/or modify it under
|
// the terms of the GNU General Public License as published by the Free
|
// the terms of the GNU General Public License as published by the Free
|
Line 11... |
Line 11... |
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// for complete details.
|
// for complete details.
|
//
|
//
|
// Revision History:
|
// Revision History:
|
// Date Rev Version Comment
|
// Date Rev Version Comment
|
|
// 2013-02-03 481 1.0.3 use Rexception
|
|
// 2013-01-13 474 1.0.2 add PollAttn() method
|
// 2013-01-04 469 1.0.1 SndOob(): Add filler 0 to ensure escape state
|
// 2013-01-04 469 1.0.1 SndOob(): Add filler 0 to ensure escape state
|
// 2011-04-02 375 1.0 Initial version
|
// 2011-04-02 375 1.0 Initial version
|
// 2011-03-05 366 0.1 First draft
|
// 2011-03-05 366 0.1 First draft
|
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
|
|
/*!
|
/*!
|
\file
|
\file
|
\version $Id: RlinkPacketBuf.cpp 469 2013-01-05 12:29:44Z mueller $
|
\version $Id: RlinkPacketBuf.cpp 492 2013-02-24 22:14:47Z mueller $
|
\brief Implemenation of class RlinkPacketBuf.
|
\brief Implemenation of class RlinkPacketBuf.
|
*/
|
*/
|
|
|
#include <sys/time.h>
|
#include <sys/time.h>
|
|
|
// debug
|
// debug
|
#include <iostream>
|
#include <iostream>
|
|
|
#include <stdexcept>
|
|
|
|
#include "RlinkPacketBuf.hpp"
|
#include "RlinkPacketBuf.hpp"
|
|
|
#include "librtools/RosFill.hpp"
|
#include "librtools/RosFill.hpp"
|
#include "librtools/RosPrintf.hpp"
|
#include "librtools/RosPrintf.hpp"
|
#include "librtools/RosPrintBvi.hpp"
|
#include "librtools/RosPrintBvi.hpp"
|
|
#include "librtools/Rexception.hpp"
|
|
|
using namespace std;
|
using namespace std;
|
using namespace Retro;
|
|
|
|
/*!
|
/*!
|
\class Retro::RlinkPacketBuf
|
\class Retro::RlinkPacketBuf
|
\brief FIXME_docs
|
\brief FIXME_docs
|
*/
|
*/
|
|
|
|
// all method definitions in namespace Retro
|
|
namespace Retro {
|
|
|
//------------------------------------------+-----------------------------------
|
//------------------------------------------+-----------------------------------
|
// constants definitions
|
// constants definitions
|
|
|
const uint32_t RlinkPacketBuf::kFlagSopSeen;
|
const uint32_t RlinkPacketBuf::kFlagSopSeen;
|
const uint32_t RlinkPacketBuf::kFlagEopSeen;
|
const uint32_t RlinkPacketBuf::kFlagEopSeen;
|
Line 149... |
Line 152... |
|
|
while (!(eopseen|nakseen)) { // try till eop or nak received
|
while (!(eopseen|nakseen)) { // try till eop or nak received
|
size_t nread = nrcv - fPktBuf.size();
|
size_t nread = nrcv - fPktBuf.size();
|
// FIXME_code: if the 'enough data' handling below correct ?
|
// FIXME_code: if the 'enough data' handling below correct ?
|
if (nread < 0) return true;
|
if (nread < 0) return true;
|
|
|
if (!sopseen) nread += 1;
|
if (!sopseen) nread += 1;
|
if (!eopseen) nread += 1;
|
if (!eopseen) nread += 1;
|
|
|
size_t sizeold = fRawBufSize;
|
size_t sizeold = fRawBufSize;
|
int irc = RcvRaw(port, nread, timeout, emsg);
|
int irc = RcvRaw(port, nread, timeout, emsg);
|
Line 200... |
Line 204... |
fPktBuf.push_back(c);
|
fPktBuf.push_back(c);
|
} else {
|
} else {
|
fNdrop += 1;
|
fNdrop += 1;
|
}
|
}
|
}
|
}
|
}
|
} // for (int i=0; i<irc; i++)
|
}
|
|
|
} // while (!(eopseen|nakseen))
|
|
|
return true;
|
return true;
|
}
|
}
|
|
|
//------------------------------------------+-----------------------------------
|
//------------------------------------------+-----------------------------------
|
//! FIXME_docs
|
//! FIXME_docs
|
|
|
double RlinkPacketBuf::WaitAttn(RlinkPort* port, double timeout, RerrMsg& emsg)
|
double RlinkPacketBuf::WaitAttn(RlinkPort* port, double timeout, RerrMsg& emsg)
|
{
|
{
|
if (timeout <= 0.)
|
if (timeout <= 0.)
|
throw invalid_argument("RlinkPacketBuf::WaitAttn(): timeout <= 0.");
|
throw Rexception("RlinkPacketBuf::WaitAttn()", "Bad args: timeout <= 0.");
|
|
|
struct timeval tval;
|
struct timeval tval;
|
gettimeofday(&tval, 0);
|
gettimeofday(&tval, 0);
|
double tbeg = double(tval.tv_sec) + 1.e-6*double(tval.tv_usec);
|
double tbeg = double(tval.tv_sec) + 1.e-6*double(tval.tv_usec);
|
double trest = timeout;
|
double trest = timeout;
|
Line 259... |
Line 264... |
}
|
}
|
|
|
//------------------------------------------+-----------------------------------
|
//------------------------------------------+-----------------------------------
|
//! FIXME_docs
|
//! FIXME_docs
|
|
|
|
int RlinkPacketBuf::PollAttn(RlinkPort* port, RerrMsg& emsg)
|
|
{
|
|
Init();
|
|
|
|
int irc = RcvRaw(port, 128, 0., emsg);
|
|
|
|
if (irc <= 0) {
|
|
if (irc == RlinkPort::kTout) {
|
|
SetFlagBit(kFlagTout);
|
|
return 0;
|
|
} else {
|
|
return -2;
|
|
}
|
|
}
|
|
|
|
for (size_t i=0; i<(size_t)irc; i++) {
|
|
uint8_t c = fRawBuf[i];
|
|
if (c == kCommaAttn) {
|
|
fNattn += 1;
|
|
SetFlagBit(kFlagAttnSeen);
|
|
break;
|
|
} else if (c == kCommaIdle) {
|
|
fNidle += 1;
|
|
} else {
|
|
fNdrop += 1;
|
|
}
|
|
}
|
|
|
|
return fNattn;
|
|
}
|
|
|
|
//------------------------------------------+-----------------------------------
|
|
//! FIXME_docs
|
|
|
bool RlinkPacketBuf::SndOob(RlinkPort* port, uint16_t addr, uint16_t data,
|
bool RlinkPacketBuf::SndOob(RlinkPort* port, uint16_t addr, uint16_t data,
|
RerrMsg& emsg)
|
RerrMsg& emsg)
|
{
|
{
|
Init();
|
Init();
|
|
|
Line 330... |
Line 369... |
//! FIXME_docs
|
//! FIXME_docs
|
|
|
bool RlinkPacketBuf::SndRaw(RlinkPort* port, RerrMsg& emsg)
|
bool RlinkPacketBuf::SndRaw(RlinkPort* port, RerrMsg& emsg)
|
{
|
{
|
if (port==0 || !port->IsOpen())
|
if (port==0 || !port->IsOpen())
|
throw logic_error("RlinkPacketBuf::SndRaw(): port not open");
|
throw Rexception("RlinkPacketBuf::SndRaw()", "Bad state: port not open");
|
|
|
fRawBufSize = fRawBuf.size();
|
fRawBufSize = fRawBuf.size();
|
int irc = port->Write(fRawBuf.data(), fRawBuf.size(), emsg);
|
int irc = port->Write(fRawBuf.data(), fRawBuf.size(), emsg);
|
if (irc < 0) return false;
|
if (irc < 0) return false;
|
if ((size_t)irc != fRawBuf.size()) {
|
if ((size_t)irc != fRawBuf.size()) {
|
Line 350... |
Line 389... |
|
|
int RlinkPacketBuf::RcvRaw(RlinkPort* port, size_t size, float timeout,
|
int RlinkPacketBuf::RcvRaw(RlinkPort* port, size_t size, float timeout,
|
RerrMsg& emsg)
|
RerrMsg& emsg)
|
{
|
{
|
if (port==0 || !port->IsOpen())
|
if (port==0 || !port->IsOpen())
|
throw logic_error("RlinkPacketBuf::RcvRaw(): port not open");
|
throw Rexception("RlinkPacketBuf::RcvRaw()", "Bad state: port not open");
|
|
|
if (fRawBuf.size() < fRawBufSize+size) fRawBuf.resize(fRawBufSize+size);
|
if (fRawBuf.size() < fRawBufSize+size) fRawBuf.resize(fRawBufSize+size);
|
int irc = port->Read(fRawBuf.data()+fRawBufSize, size, timeout, emsg);
|
int irc = port->Read(fRawBuf.data()+fRawBufSize, size, timeout, emsg);
|
if (irc == RlinkPort::kEof) {
|
if (irc == RlinkPort::kEof) {
|
emsg.Init("RlinkPacketBuf::RcvRaw()", "eof on read");
|
emsg.Init("RlinkPacketBuf::RcvRaw()", "eof on read");
|
Line 365... |
Line 404... |
}
|
}
|
|
|
return irc;
|
return irc;
|
}
|
}
|
|
|
//------------------------------------------+-----------------------------------
|
} // end namespace Retro
|
#if (defined(Retro_NoInline) || defined(Retro_RlinkPacketBuf_NoInline))
|
|
#define inline
|
|
#include "RlinkPacketBuf.ipp"
|
|
#undef inline
|
|
#endif
|
|
|
|
No newline at end of file
|
No newline at end of file
|