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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.61/] [tools/] [src/] [librlinktpp/] [RtclRlinkConnect.cpp] - Diff between revs 15 and 19

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

Rev 15 Rev 19
Line 1... Line 1...
// $Id: RtclRlinkConnect.cpp 434 2011-12-02 19:17:38Z mueller $
// $Id: RtclRlinkConnect.cpp 495 2013-03-06 17:13:48Z mueller $
//
//
// Copyright 2011- 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
// Software Foundation, either version 2, or at your option any later version.
// Software Foundation, either version 2, or at your option any later version.
//
//
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-23   492   1.1.6  use RlogFile.Name(); use Context().ErrorCount()
 
// 2013-02-22   491   1.1.5  use new RlogFile/RlogMsg interfaces
 
// 2013-02-02   480   1.1.4  allow empty exec commands
 
// 2013-01-27   478   1.1.3  use RtclRlinkPort::DoRawio on M_rawio
 
// 2013-01-06   473   1.1.2  add M_rawio: rawio -write|-read
// 2011-11-28   434   1.1.1  ConfigBase(): use uint32_t for lp64 compatibility
// 2011-11-28   434   1.1.1  ConfigBase(): use uint32_t for lp64 compatibility
// 2011-04-23   380   1.1    use boost/bind instead of RmethDsc
// 2011-04-23   380   1.1    use boost/bind instead of RmethDsc
// 2011-04-17   376   1.0.1  M_wtlam: now correct log levels
// 2011-04-17   376   1.0.1  M_wtlam: now correct log levels
// 2011-03-27   374   1.0    Initial version
// 2011-03-27   374   1.0    Initial version
// 2011-02-11   360   0.1    First draft
// 2011-02-11   360   0.1    First draft
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
 
 
/*!
/*!
  \file
  \file
  \version $Id: RtclRlinkConnect.cpp 434 2011-12-02 19:17:38Z mueller $
  \version $Id: RtclRlinkConnect.cpp 495 2013-03-06 17:13:48Z mueller $
  \brief   Implemenation of class RtclRlinkConnect.
  \brief   Implemenation of class RtclRlinkConnect.
 */
 */
 
 
#include <ctype.h>
#include <ctype.h>
 
 
#include <stdexcept>
 
#include <iostream>
#include <iostream>
 
 
#include "boost/bind.hpp"
#include "boost/bind.hpp"
 
 
#include "librtcltools/Rtcl.hpp"
#include "librtcltools/Rtcl.hpp"
#include "librtcltools/RtclOPtr.hpp"
#include "librtcltools/RtclOPtr.hpp"
#include "librtcltools/RtclNameSet.hpp"
#include "librtcltools/RtclNameSet.hpp"
#include "librtcltools/RtclStats.hpp"
#include "librtcltools/RtclStats.hpp"
#include "librtools/RosPrintf.hpp"
#include "librtools/RosPrintf.hpp"
 
#include "librtools/RlogMsg.hpp"
#include "librlink/RlinkCommandList.hpp"
#include "librlink/RlinkCommandList.hpp"
 
#include "RtclRlinkPort.hpp"
 
 
#include "RtclRlinkConnect.hpp"
#include "RtclRlinkConnect.hpp"
 
 
using namespace std;
using namespace std;
using namespace Retro;
 
 
 
/*!
/*!
  \class Retro::RtclRlinkConnect
  \class Retro::RtclRlinkConnect
  \brief FIXME_docs
  \brief FIXME_docs
*/
*/
 
 
 
// all method definitions in namespace Retro
 
namespace Retro {
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! Default constructor
//! Default constructor
 
 
RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name)
RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name)
  : RtclProxyOwned<RlinkConnect>("RlinkConnect", interp, name,
  : RtclProxyOwned<RlinkConnect>("RlinkConnect", interp, name,
                                 new RlinkConnect()),
                                 new RlinkConnect())
    fErrCnt(0),
 
    fLogFileName("-")
 
{
{
  AddMeth("open",     boost::bind(&RtclRlinkConnect::M_open,    this, _1));
  AddMeth("open",     boost::bind(&RtclRlinkConnect::M_open,    this, _1));
  AddMeth("close",    boost::bind(&RtclRlinkConnect::M_close,   this, _1));
  AddMeth("close",    boost::bind(&RtclRlinkConnect::M_close,   this, _1));
  AddMeth("exec",     boost::bind(&RtclRlinkConnect::M_exec,    this, _1));
  AddMeth("exec",     boost::bind(&RtclRlinkConnect::M_exec,    this, _1));
  AddMeth("amap",     boost::bind(&RtclRlinkConnect::M_amap,    this, _1));
  AddMeth("amap",     boost::bind(&RtclRlinkConnect::M_amap,    this, _1));
  AddMeth("errcnt",   boost::bind(&RtclRlinkConnect::M_errcnt,  this, _1));
  AddMeth("errcnt",   boost::bind(&RtclRlinkConnect::M_errcnt,  this, _1));
  AddMeth("wtlam",    boost::bind(&RtclRlinkConnect::M_wtlam,   this, _1));
  AddMeth("wtlam",    boost::bind(&RtclRlinkConnect::M_wtlam,   this, _1));
  AddMeth("oob",      boost::bind(&RtclRlinkConnect::M_oob,     this, _1));
  AddMeth("oob",      boost::bind(&RtclRlinkConnect::M_oob,     this, _1));
 
  AddMeth("rawio",    boost::bind(&RtclRlinkConnect::M_rawio,   this, _1));
  AddMeth("stats",    boost::bind(&RtclRlinkConnect::M_stats,   this, _1));
  AddMeth("stats",    boost::bind(&RtclRlinkConnect::M_stats,   this, _1));
  AddMeth("log",      boost::bind(&RtclRlinkConnect::M_log,     this, _1));
  AddMeth("log",      boost::bind(&RtclRlinkConnect::M_log,     this, _1));
  AddMeth("print",    boost::bind(&RtclRlinkConnect::M_print,   this, _1));
  AddMeth("print",    boost::bind(&RtclRlinkConnect::M_print,   this, _1));
  AddMeth("dump",     boost::bind(&RtclRlinkConnect::M_dump,    this, _1));
  AddMeth("dump",     boost::bind(&RtclRlinkConnect::M_dump,    this, _1));
  AddMeth("config",   boost::bind(&RtclRlinkConnect::M_config,  this, _1));
  AddMeth("config",   boost::bind(&RtclRlinkConnect::M_config,  this, _1));
Line 93... Line 101...
  if (!args.GetArg("?path", path)) return kERR;
  if (!args.GetArg("?path", path)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  RerrMsg emsg;
  RerrMsg emsg;
  if (args.NOptMiss() == 0) {               // open path
  if (args.NOptMiss() == 0) {               // open path
    if (!Obj().Open(path, emsg)) {
    if (!Obj().Open(path, emsg)) return args.Quit(emsg);
      args.AppendResult(emsg.Message());
 
      return kERR;
 
    }
 
  } else {                                  // open 
  } else {                                  // open 
    string name = Obj().IsOpen() ? Obj().Port()->Url() : string();
    string name = Obj().IsOpen() ? Obj().Port()->Url().Url() : string();
    args.SetResult(name);
    args.SetResult(name);
  }
  }
  return kOK;
  return kOK;
}
}
 
 
Line 110... Line 115...
//! FIXME_docs
//! FIXME_docs
 
 
int RtclRlinkConnect::M_close(RtclArgs& args)
int RtclRlinkConnect::M_close(RtclArgs& args)
{
{
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
  if (!Obj().IsOpen()) return args.Quit("-E: port not open");
  if (!Obj().IsOpen()) {
 
    args.AppendResult("-E: port not open", NULL);
 
    return kERR;
 
  }
 
  Obj().Close();
  Obj().Close();
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
Line 261... Line 262...
 
 
  int nact = 0;
  int nact = 0;
  if (varprint == "-") nact += 1;
  if (varprint == "-") nact += 1;
  if (vardump  == "-") nact += 1;
  if (vardump  == "-") nact += 1;
  if (varlist  == "-") nact += 1;
  if (varlist  == "-") nact += 1;
  if (nact > 1) {
  if (nact > 1)
    args.AppendResult("-E: more that one of -print,-dump,-list without ",
    return args.Quit(
                      "target variable found", NULL);
      "-E: more that one of -print,-dump,-list without target variable found");
    return kERR;
 
  }
 
 
 
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
  if (clist.Size() == 0) return kOK;
 
 
  RerrMsg emsg;
  RerrMsg emsg;
 
 
  if (!Obj().Exec(clist, emsg)) {
  if (!Obj().Exec(clist, emsg)) return args.Quit(emsg);
    args.AppendResult(emsg.Message());
 
    return kERR;
 
  }
 
 
 
  for (size_t icmd=0; icmd<clist.Size(); icmd++) {
  for (size_t icmd=0; icmd<clist.Size(); icmd++) {
    RlinkCommand& cmd = clist[icmd];
    RlinkCommand& cmd = clist[icmd];
 
 
    if (cmd.TestFlagAny(RlinkCommand::kFlagChkStat)) fErrCnt += 1;
 
    if (cmd.TestFlagAny(RlinkCommand::kFlagChkData)) fErrCnt += 1;
 
 
 
    if (icmd<vardata.size() && !vardata[icmd].empty()) {
    if (icmd<vardata.size() && !vardata[icmd].empty()) {
      RtclOPtr pres;
      RtclOPtr pres;
      vector<uint16_t> retstat;
      vector<uint16_t> retstat;
      RtclOPtr pele;
      RtclOPtr pele;
      switch (cmd.Command()) {
      switch (cmd.Command()) {
Line 315... Line 309...
  }
  }
 
 
  if (!varprint.empty()) {
  if (!varprint.empty()) {
    ostringstream sos;
    ostringstream sos;
    const RlinkConnect::LogOpts& logopts = Obj().GetLogOpts();
    const RlinkConnect::LogOpts& logopts = Obj().GetLogOpts();
    clist.Print(sos, &Obj().AddrMap(), logopts.baseaddr, logopts.basedata,
    clist.Print(sos, Obj().Context(), &Obj().AddrMap(), logopts.baseaddr,
                logopts.basestat);
                logopts.basedata, logopts.basestat);
    RtclOPtr pobj = Rtcl::NewLinesObj(sos);
    RtclOPtr pobj = Rtcl::NewLinesObj(sos);
    if (!Rtcl::SetVarOrResult(args.Interp(), varprint, pobj)) return kERR;
    if (!Rtcl::SetVarOrResult(args.Interp(), varprint, pobj)) return kERR;
  }
  }
 
 
  if (!vardump.empty()) {
  if (!vardump.empty()) {
Line 386... Line 380...
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      string   tstname;
      string   tstname;
      if(addrmap.Find(addr, tstname)) {
      if(addrmap.Find(addr, tstname)) {
        args.SetResult(tstname);
        args.SetResult(tstname);
      } else {
      } else {
        args.AppendResult("-E: address \"", args.PeekArgString(-1),
        return args.Quit(string("-E: address '") + args.PeekArgString(-1) +
                          "\" not mapped", NULL);
                         "' not mapped");
        return kERR;
 
      }
      }
 
 
    } else if (opt == "-testname") {        // amap -testname name
    } else if (opt == "-testname") {        // amap -testname name
      if (!args.GetArg("name", name)) return kERR;
      if (!args.GetArg("name", name)) return kERR;
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
Line 409... Line 402...
      uint16_t tstaddr;
      uint16_t tstaddr;
      string   tstname;
      string   tstname;
      int      tstint;
      int      tstint;
      if (!args.GetArg("name", name)) return kERR;
      if (!args.GetArg("name", name)) return kERR;
      // enforce that the name is not a valid representation of an int
      // enforce that the name is not a valid representation of an int
      if (Tcl_GetIntFromObj(NULL, args[args.NDone()-1], &tstint) == kOK) {
      if (Tcl_GetIntFromObj(NULL, args[args.NDone()-1], &tstint) == kOK)
        args.AppendResult("-E: name should not look like an int but \"",
        return args.Quit(string("-E: name should not look like an int but '")+
                          name.c_str(), "\" does", NULL);
                         name + "' does");
        return kERR;
 
      }
 
      if (!args.GetArg("addr", addr, 0x00ff)) return kERR;
      if (!args.GetArg("addr", addr, 0x00ff)) return kERR;
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      if (addrmap.Find(name, tstaddr)) {
      if (addrmap.Find(name, tstaddr))
        args.AppendResult("-E: mapping already defined for \"", name.c_str(),
        return args.Quit(string("-E: mapping already defined for '")+name+"'");
                          "\"", NULL);
      if (addrmap.Find(addr, tstname))
        return kERR;
        return args.Quit(string("-E: mapping already defined for address '") +
      }
                         args.PeekArgString(-1) + "'");
      if (addrmap.Find(addr, tstname)) {
 
        args.AppendResult("-E: mapping already defined for address \"",
 
                          args.PeekArgString(-1), "\"", NULL);
 
        return kERR;
 
      }
 
      Obj().AddrMapInsert(name, addr);
      Obj().AddrMapInsert(name, addr);
 
 
    } else if (opt == "-erase") {           // amap -erase name
    } else if (opt == "-erase") {           // amap -erase name
      if (!args.GetArg("name", name)) return kERR;
      if (!args.GetArg("name", name)) return kERR;
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      if (!Obj().AddrMapErase(name)) {
      if (!Obj().AddrMapErase(name))
        args.AppendResult("-E: no mapping defined for \"", name.c_str(),
        return args.Quit(string("-E: no mapping defined for '") + name + "'");
                          "\"", NULL);
 
        return kERR;
 
      }
 
 
 
    } else if (opt == "-clear") {           // amap -clear
    } else if (opt == "-clear") {           // amap -clear
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      Obj().AddrMapClear();
      Obj().AddrMapClear();
 
 
Line 456... Line 439...
    if (args.NOptMiss()==0) {               // amap name
    if (args.NOptMiss()==0) {               // amap name
      uint16_t tstaddr;
      uint16_t tstaddr;
      if(addrmap.Find(name, tstaddr)) {
      if(addrmap.Find(name, tstaddr)) {
        args.SetResult(int(tstaddr));
        args.SetResult(int(tstaddr));
      } else {
      } else {
        args.AppendResult("-E: no mapping defined for \"", name.c_str(),
        return args.Quit(string("-E: no mapping defined for '") + name + "'");
                          "\"", NULL);
 
        return kERR;
 
      }
      }
 
 
    } else {                                // amap
    } else {                                // amap
      RtclOPtr plist = Tcl_NewListObj(0, NULL);
      RtclOPtr plist = Tcl_NewListObj(0, NULL);
      const RlinkAddrMap::amap_t amap = addrmap.Amap();
      const RlinkAddrMap::amap_t amap = addrmap.Amap();
Line 491... Line 472...
  while (args.NextOpt(opt, optset)) {
  while (args.NextOpt(opt, optset)) {
    if (opt == "-clear") fclear = true;
    if (opt == "-clear") fclear = true;
  }
  }
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
 
 
  args.SetResult(int(fErrCnt));
  args.SetResult(int(Obj().Context().ErrorCount()));
  if (fclear) fErrCnt = 0;
  if (fclear) Obj().Context().ClearErrorCount();
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
Line 510... Line 491...
 
 
  RerrMsg emsg;
  RerrMsg emsg;
  double twait = Obj().WaitAttn(tout, emsg);
  double twait = Obj().WaitAttn(tout, emsg);
 
 
  if (twait == -2.) {
  if (twait == -2.) {
    args.AppendResult(emsg.Message());
    return args.Quit(emsg);
    return kERR;
 
  } else if (twait == -1.) {
  } else if (twait == -1.) {
    if (Obj().GetLogOpts().printlevel >= 1) {
    if (Obj().GetLogOpts().printlevel >= 1) {
      Obj().LogFile()() << "-- wtlam to=" << RosPrintf(tout, "f", 0,3)
      RlogMsg lmsg(Obj().LogFile());
 
      lmsg << "-- wtlam to=" << RosPrintf(tout, "f", 0,3)
                        << " FAIL timeout" << endl;
                        << " FAIL timeout" << endl;
      fErrCnt += 1;
      Obj().Context().IncErrorCount();
      args.SetResult(tout);
      args.SetResult(tout);
      return kOK;
      return kOK;
    }
    }
  }
  }
 
 
  if (Obj().GetLogOpts().printlevel >= 3) {
  if (Obj().GetLogOpts().printlevel >= 3) {
    Obj().LogFile()() << "-- wtlam to=" << RosPrintf(tout, "f", 0,3)
    RlogMsg lmsg(Obj().LogFile());
 
    lmsg << "-- wtlam to=" << RosPrintf(tout, "f", 0,3)
                      << "  T=" << RosPrintf(twait, "f", 0,3)
                      << "  T=" << RosPrintf(twait, "f", 0,3)
                      << "  OK" << endl;
                      << "  OK" << endl;
  }
  }
 
 
  args.SetResult(twait);
  args.SetResult(twait);
Line 549... Line 531...
  if (args.NextOpt(opt, optset)) {
  if (args.NextOpt(opt, optset)) {
    if        (opt == "-rlmon") {           // oob -rlmon (0|1)
    if        (opt == "-rlmon") {           // oob -rlmon (0|1)
      if (!args.GetArg("val", data, 1)) return kERR;
      if (!args.GetArg("val", data, 1)) return kERR;
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      addr = 15;                              // rlmon on bit 15
      addr = 15;                              // rlmon on bit 15
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) {
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) return args.Quit(emsg);
        args.AppendResult(emsg.Message());
 
        return kERR;
 
      }
 
 
 
    } else if (opt == "-rbmon") {           // oob -rbmon (0|1)
    } else if (opt == "-rbmon") {           // oob -rbmon (0|1)
      if (!args.GetArg("val", data, 1)) return kERR;
      if (!args.GetArg("val", data, 1)) return kERR;
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      addr = 14;                              // rbmon on bit 14
      addr = 14;                              // rbmon on bit 14
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) {
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) return args.Quit(emsg);
        args.AppendResult(emsg.Message());
 
        return kERR;
 
      }
 
 
 
    } else if (opt == "-sbcntl") {          // oob -sbcntl bit (0|1)
    } else if (opt == "-sbcntl") {          // oob -sbcntl bit (0|1)
      if (!args.GetArg("bit", addr, 15)) return kERR;
      if (!args.GetArg("bit", addr, 15)) return kERR;
      if (!args.GetArg("val", data,  1)) return kERR;
      if (!args.GetArg("val", data,  1)) return kERR;
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) {
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) return args.Quit(emsg);
        args.AppendResult(emsg.Message());
 
        return kERR;
 
      }
 
 
 
    } else if (opt == "-sbdata") {          // oob -sbdata addr val
    } else if (opt == "-sbdata") {          // oob -sbdata addr val
      if (!args.GetArg("bit", addr, 0x0ff)) return kERR;
      if (!args.GetArg("bit", addr, 0x0ff)) return kERR;
      if (!args.GetArg("val", data)) return kERR;
      if (!args.GetArg("val", data)) return kERR;
      if (!args.AllDone()) return kERR;
      if (!args.AllDone()) return kERR;
      if (!Obj().SndOob(addr, data, emsg)) {
      if (!Obj().SndOob(addr, data, emsg)) return args.Quit(emsg);
        args.AppendResult(emsg.Message());
 
        return kERR;
 
      }
 
    }
    }
  } else {
  } else {
     args.AppendResult("-E: missing option, one of "
    return args.Quit(
                       "-rlmon,-rbmon,-sbcntl,-sbdata",
      "-E: missing option, one of -rlmon,-rbmon,-sbcntl,-sbdata");
                       NULL);
 
     return kERR;
 
  }
  }
 
 
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
//! FIXME_docs
//! FIXME_docs
 
 
 
int RtclRlinkConnect::M_rawio(RtclArgs& args)
 
{
 
  size_t errcnt = 0;
 
  int rc = RtclRlinkPort::DoRawio(args, Obj().Port(), errcnt);
 
  Obj().Context().IncErrorCount(errcnt);
 
  return rc;
 
}
 
 
 
//------------------------------------------+-----------------------------------
 
//! FIXME_docs
 
 
int RtclRlinkConnect::M_stats(RtclArgs& args)
int RtclRlinkConnect::M_stats(RtclArgs& args)
{
{
  RtclStats::Context cntx;
  RtclStats::Context cntx;
  if (!RtclStats::GetArgs(args, cntx)) return kERR;
  if (!RtclStats::GetArgs(args, cntx)) return kERR;
  if (!RtclStats::Exec(args, cntx, Obj().Stats())) return kERR;
  if (!RtclStats::Collect(args, cntx, Obj().Stats())) return kERR;
  if (Obj().Port()) {
  if (Obj().Port()) {
    if (!RtclStats::Exec(args, cntx, Obj().Port()->Stats())) return kERR;
    if (!RtclStats::Collect(args, cntx, Obj().Port()->Stats())) return kERR;
  }
  }
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
Line 616... Line 595...
  if (!args.GetArg("msg", msg)) return kERR;
  if (!args.GetArg("msg", msg)) return kERR;
  if (!args.AllDone()) return kERR;
  if (!args.AllDone()) return kERR;
  if (Obj().GetLogOpts().printlevel != 0 ||
  if (Obj().GetLogOpts().printlevel != 0 ||
      Obj().GetLogOpts().dumplevel  != 0 ||
      Obj().GetLogOpts().dumplevel  != 0 ||
      Obj().GetLogOpts().tracelevel != 0) {
      Obj().GetLogOpts().tracelevel != 0) {
    Obj().LogFile()() << "# " << msg << endl;
    Obj().LogFile().Write(string("# ") + msg);
  }
  }
  return kOK;
  return kOK;
}
}
 
 
//------------------------------------------+-----------------------------------
//------------------------------------------+-----------------------------------
Line 663... Line 642...
  if (args.NDone() == (size_t)args.Objc()) {
  if (args.NDone() == (size_t)args.Objc()) {
    ostringstream sos;
    ostringstream sos;
    sos << "-baseaddr " << RosPrintf(logopts.baseaddr, "d")
    sos << "-baseaddr " << RosPrintf(logopts.baseaddr, "d")
        << " -basedata " << RosPrintf(logopts.basedata, "d")
        << " -basedata " << RosPrintf(logopts.basedata, "d")
        << " -basestat " << RosPrintf(logopts.basestat, "d")
        << " -basestat " << RosPrintf(logopts.basestat, "d")
        << " -logfile {" << fLogFileName << "}"
        << " -logfile {" << Obj().LogFile().Name() << "}"
        << " -logprintlevel " << RosPrintf(logopts.printlevel, "d")
        << " -logprintlevel " << RosPrintf(logopts.printlevel, "d")
        << " -logdumplevel " << RosPrintf(logopts.dumplevel, "d")
        << " -logdumplevel " << RosPrintf(logopts.dumplevel, "d")
        << " -logtracelevel " << RosPrintf(logopts.tracelevel, "d");
        << " -logtracelevel " << RosPrintf(logopts.tracelevel, "d");
    args.AppendResult(sos);
    args.AppendResult(sos);
    return kOK;
    return kOK;
Line 686... Line 665...
    } else if (opt == "-basestat") {        // -basestat ?base -----------------
    } else if (opt == "-basestat") {        // -basestat ?base -----------------
      if (!ConfigBase(args, logopts.basestat)) return kERR;
      if (!ConfigBase(args, logopts.basestat)) return kERR;
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
 
 
    } else if (opt == "-logfile") {         // -logfile ?name ------------------
    } else if (opt == "-logfile") {         // -logfile ?name ------------------
      if (!args.Config("??name", fLogFileName)) return false;
      string name;
 
      if (!args.Config("??name", name)) return false;
      if (args.NOptMiss() == 0) {             // new filename ?
      if (args.NOptMiss() == 0) {             // new filename ?
        if (fLogFileName == "-") {
        if (name == "-" || name == "<cout>") {
          Obj().LogUseStream(&cout);
          Obj().LogUseStream(&cout, "<cout>");
        } else {
        } else {
          if (!Obj().LogOpen(fLogFileName)) {
          if (!Obj().LogOpen(name)) {
            args.AppendResult("-E: open failed for \"",
            Obj().LogUseStream(&cout, "<cout>");
                              fLogFileName.c_str(), "\", using stdout", NULL);
            return args.Quit(string("-E: open failed for '") + name +
            Obj().LogUseStream(&cout);
                             "', using stdout");
            fLogFileName = "-";
 
            return kERR;
 
          }
          }
        }
        }
      }
      }
 
 
    } else if (opt == "-logprintlevel") {   // -logprintlevel ?loglevel --------
    } else if (opt == "-logprintlevel") {   // -logprintlevel ?loglevel --------
Line 731... Line 709...
  const RlinkConnect::LogOpts& logopts = Obj().GetLogOpts();
  const RlinkConnect::LogOpts& logopts = Obj().GetLogOpts();
 
 
  sos << "print base:  " << "addr " << RosPrintf(logopts.baseaddr, "d", 2)
  sos << "print base:  " << "addr " << RosPrintf(logopts.baseaddr, "d", 2)
      << "  data " << RosPrintf(logopts.basedata, "d", 2)
      << "  data " << RosPrintf(logopts.basedata, "d", 2)
      << "  stat " << RosPrintf(logopts.basestat, "d", 2) << endl;
      << "  stat " << RosPrintf(logopts.basestat, "d", 2) << endl;
  sos << "logfile:     " << fLogFileName
  sos << "logfile:     " << Obj().LogFile().Name()
      << "   printlevel " << logopts.printlevel
      << "   printlevel " << logopts.printlevel
      << "   dumplevel " << logopts.dumplevel;
      << "   dumplevel " << logopts.dumplevel;
 
 
  args.AppendResultLines(sos);
  args.AppendResultLines(sos);
  return kOK;
  return kOK;
Line 754... Line 732...
  // if a number is given..
  // if a number is given..
  if (Tcl_GetIntFromObj(NULL, pobj, &tstint) == kOK) {
  if (Tcl_GetIntFromObj(NULL, pobj, &tstint) == kOK) {
    if (tstint >= 0 && tstint <= 0x00ff) {
    if (tstint >= 0 && tstint <= 0x00ff) {
      addr = (uint16_t)tstint;
      addr = (uint16_t)tstint;
    } else {
    } else {
      args.AppendResult("-E: value \"", Tcl_GetString(pobj),
      args.AppendResult("-E: value '", Tcl_GetString(pobj),
                        "\" for \"addr\" out of range 0...0x00ff", NULL);
                        "' for 'addr' out of range 0...0x00ff", NULL);
      return false;
      return false;
    }
    }
  // if a name is given 
  // if a name is given 
  } else {
  } else {
    string name(Tcl_GetString(pobj));
    string name(Tcl_GetString(pobj));
    uint16_t tstaddr;
    uint16_t tstaddr;
    if (Obj().AddrMap().Find(name, tstaddr)) {
    if (Obj().AddrMap().Find(name, tstaddr)) {
      addr = tstaddr;
      addr = tstaddr;
    } else {
    } else {
      args.AppendResult("-E: no address mapping known for \"",
      args.AppendResult("-E: no address mapping known for '",
                        Tcl_GetString(pobj), "\"", NULL);
                        Tcl_GetString(pobj), "'", NULL);
      return false;
      return false;
    }
    }
  }
  }
 
 
  return true;
  return true;
Line 787... Line 765...
  string name;
  string name;
  if (!args.GetArg(argname, name)) return false;
  if (!args.GetArg(argname, name)) return false;
  if (name.length()) {                      // if variable defined
  if (name.length()) {                      // if variable defined
    char c = name[0];
    char c = name[0];
    if (isdigit(c) || c=='+' || c=='-' ) {  // check for mistaken number
    if (isdigit(c) || c=='+' || c=='-' ) {  // check for mistaken number
      args.AppendResult("-E: invalid variable name \"", name.c_str(),
      args.AppendResult("-E: invalid variable name '", name.c_str(),
                        "\": looks like a number", NULL);
                        "': looks like a number", NULL);
      return false;
      return false;
    }
    }
  }
  }
 
 
  varname[nind] = name;
  varname[nind] = name;
Line 805... Line 783...
bool RtclRlinkConnect::ConfigBase(RtclArgs& args, uint32_t& base)
bool RtclRlinkConnect::ConfigBase(RtclArgs& args, uint32_t& base)
{
{
  uint32_t tmp = base;
  uint32_t tmp = base;
  if (!args.Config("??base", tmp, 16, 2)) return false;
  if (!args.Config("??base", tmp, 16, 2)) return false;
  if (tmp != base && tmp != 2 && tmp !=8 && tmp != 16) {
  if (tmp != base && tmp != 2 && tmp !=8 && tmp != 16) {
    args.AppendResult("-E: base must be 2, 8, or 16, found \"",
    args.AppendResult("-E: base must be 2, 8, or 16, found '",
                      args.PeekArgString(-1), "\"", NULL);
                      args.PeekArgString(-1), "'", NULL);
 
    return false;
  }
  }
  base = tmp;
  base = tmp;
  return true;
  return true;
}
}
 
 
Line 820... Line 799...
 
 
bool RtclRlinkConnect::ClistNonEmpty(RtclArgs& args,
bool RtclRlinkConnect::ClistNonEmpty(RtclArgs& args,
                                     const RlinkCommandList& clist)
                                     const RlinkCommandList& clist)
{
{
  if (clist.Size() == 0) {
  if (clist.Size() == 0) {
    args.AppendResult("-E: -volatile not allowed on empty command list", NULL);
    args.AppendResult("-E: -edata, -estat, or -volatile "
 
                      "not allowed on empty command list", NULL);
    return false;
    return false;
  }
  }
  return true;
  return true;
}
}
 
 
//------------------------------------------+-----------------------------------
} // end namespace Retro
#if (defined(Retro_NoInline) || defined(Retro_RtclRlinkConnect_NoInline))
 
#define inline
 
//#include "RtclRlinkConnect.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.