OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.74/] [tools/] [src/] [librlink/] [RlinkPacketBuf.cpp] - Diff between revs 18 and 19

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 18 Rev 19
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.