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
|