From ed4988d0e4a2137a30bb65f75a288b4fcb55be21 Mon Sep 17 00:00:00 2001 From: "Walter F.J. Mueller" Date: Sun, 30 Apr 2017 15:20:16 +0200 Subject: [PATCH] re-arrange rawio commands for rlc and rlp - RtclRlink(Connect|Port): drop M_rawio; add M_rawread,M_rawrblk,M_rawwblk - RtclRlinkPort: LogFileName(): returns now const std::string& --- tools/src/librlinktpp/RtclRlinkConnect.cpp | 27 ++- tools/src/librlinktpp/RtclRlinkConnect.hpp | 9 +- tools/src/librlinktpp/RtclRlinkPort.cpp | 188 ++++++++++++++------- tools/src/librlinktpp/RtclRlinkPort.hpp | 16 +- 4 files changed, 164 insertions(+), 76 deletions(-) diff --git a/tools/src/librlinktpp/RtclRlinkConnect.cpp b/tools/src/librlinktpp/RtclRlinkConnect.cpp index dca4124e..26c7241e 100644 --- a/tools/src/librlinktpp/RtclRlinkConnect.cpp +++ b/tools/src/librlinktpp/RtclRlinkConnect.cpp @@ -1,4 +1,4 @@ -// $Id: RtclRlinkConnect.cpp 887 2017-04-28 19:32:52Z mueller $ +// $Id: RtclRlinkConnect.cpp 888 2017-04-30 13:06:51Z mueller $ // // Copyright 2011-2017 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2017-04-29 888 1.6 drop M_rawio; add M_rawread,M_rawrblk,M_rawwblk // 2017-04-22 883 1.5.2 M_amap: -testname opt addr check; add hasrbmon get // 2017-04-02 865 1.5.1 M_dump: use GetArgsDump and Dump detail // 2017-02-20 854 1.5 use Rtime @@ -91,7 +92,9 @@ RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name) AddMeth("errcnt", boost::bind(&RtclRlinkConnect::M_errcnt, this, _1)); AddMeth("wtlam", boost::bind(&RtclRlinkConnect::M_wtlam, this, _1)); AddMeth("oob", boost::bind(&RtclRlinkConnect::M_oob, this, _1)); - AddMeth("rawio", boost::bind(&RtclRlinkConnect::M_rawio, this, _1)); + AddMeth("rawread", boost::bind(&RtclRlinkConnect::M_rawread, this, _1)); + AddMeth("rawrblk", boost::bind(&RtclRlinkConnect::M_rawrblk, this, _1)); + AddMeth("rawwblk", boost::bind(&RtclRlinkConnect::M_rawwblk, this, _1)); AddMeth("stats", boost::bind(&RtclRlinkConnect::M_stats, this, _1)); AddMeth("log", boost::bind(&RtclRlinkConnect::M_log, this, _1)); AddMeth("print", boost::bind(&RtclRlinkConnect::M_print, this, _1)); @@ -676,10 +679,18 @@ int RtclRlinkConnect::M_oob(RtclArgs& args) //------------------------------------------+----------------------------------- //! FIXME_docs -int RtclRlinkConnect::M_rawio(RtclArgs& args) +int RtclRlinkConnect::M_rawread(RtclArgs& args) +{ + return RtclRlinkPort::DoRawRead(args, Obj().Port()); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +int RtclRlinkConnect::M_rawrblk(RtclArgs& args) { size_t errcnt = 0; - int rc = RtclRlinkPort::DoRawio(args, Obj().Port(), errcnt); + int rc = RtclRlinkPort::DoRawRblk(args, Obj().Port(), errcnt); Obj().Context().IncErrorCount(errcnt); return rc; } @@ -687,6 +698,14 @@ int RtclRlinkConnect::M_rawio(RtclArgs& args) //------------------------------------------+----------------------------------- //! FIXME_docs +int RtclRlinkConnect::M_rawwblk(RtclArgs& args) +{ + return RtclRlinkPort::DoRawWblk(args, Obj().Port()); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + int RtclRlinkConnect::M_stats(RtclArgs& args) { RtclStats::Context cntx; diff --git a/tools/src/librlinktpp/RtclRlinkConnect.hpp b/tools/src/librlinktpp/RtclRlinkConnect.hpp index e3059abd..b731c34f 100644 --- a/tools/src/librlinktpp/RtclRlinkConnect.hpp +++ b/tools/src/librlinktpp/RtclRlinkConnect.hpp @@ -1,6 +1,6 @@ -// $Id: RtclRlinkConnect.hpp 887 2017-04-28 19:32:52Z mueller $ +// $Id: RtclRlinkConnect.hpp 888 2017-04-30 13:06:51Z mueller $ // -// Copyright 2011-2015 by Walter F.J. Mueller +// Copyright 2011-2017 by Walter F.J. Mueller // // 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 @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2017-04-29 888 1.1 drop M_rawio; add M_rawread,M_rawrblk,M_rawwblk // 2015-04-12 666 1.0.5 add M_init // 2015-01-06 631 1.0.4 add M_get, M_set, remove M_config // 2013-02-23 492 1.0.3 use RlogFile.Name(); use Context().ErrorCount() @@ -56,7 +57,9 @@ namespace Retro { int M_errcnt(RtclArgs& args); int M_wtlam(RtclArgs& args); int M_oob(RtclArgs& args); - int M_rawio(RtclArgs& args); + int M_rawread(RtclArgs& args); + int M_rawrblk(RtclArgs& args); + int M_rawwblk(RtclArgs& args); int M_stats(RtclArgs& args); int M_log(RtclArgs& args); int M_print(RtclArgs& args); diff --git a/tools/src/librlinktpp/RtclRlinkPort.cpp b/tools/src/librlinktpp/RtclRlinkPort.cpp index 62a13a18..c5e0e6ad 100644 --- a/tools/src/librlinktpp/RtclRlinkPort.cpp +++ b/tools/src/librlinktpp/RtclRlinkPort.cpp @@ -1,4 +1,4 @@ -// $Id: RtclRlinkPort.cpp 887 2017-04-28 19:32:52Z mueller $ +// $Id: RtclRlinkPort.cpp 888 2017-04-30 13:06:51Z mueller $ // // Copyright 2013-2017 by Walter F.J. Mueller // @@ -13,6 +13,8 @@ // // Revision History: // Date Rev Version Comment +// 2017-04-29 888 1.2 LogFileName(): returns now const std::string& +// drop M_rawio; add M_rawread,M_rawrblk,M_rawwblk // 2017-04-02 865 1.1.1 M_dump: use GetArgsDump and Dump detail // 2017-02-19 853 1.1 use Rtime // 2015-01-09 632 1.0.4 add M_get, M_set, remove M_config @@ -67,7 +69,9 @@ RtclRlinkPort::RtclRlinkPort(Tcl_Interp* interp, const char* name) AddMeth("open", boost::bind(&RtclRlinkPort::M_open, this, _1)); AddMeth("close", boost::bind(&RtclRlinkPort::M_close, this, _1)); AddMeth("errcnt", boost::bind(&RtclRlinkPort::M_errcnt, this, _1)); - AddMeth("rawio", boost::bind(&RtclRlinkPort::M_rawio, this, _1)); + AddMeth("rawread", boost::bind(&RtclRlinkPort::M_rawread, this, _1)); + AddMeth("rawrblk", boost::bind(&RtclRlinkPort::M_rawrblk, this, _1)); + AddMeth("rawwblk", boost::bind(&RtclRlinkPort::M_rawwblk, this, _1)); AddMeth("stats", boost::bind(&RtclRlinkPort::M_stats, this, _1)); AddMeth("log", boost::bind(&RtclRlinkPort::M_log, this, _1)); AddMeth("dump", boost::bind(&RtclRlinkPort::M_dump, this, _1)); @@ -147,9 +151,25 @@ int RtclRlinkPort::M_errcnt(RtclArgs& args) //------------------------------------------+----------------------------------- //! FIXME_docs -int RtclRlinkPort::M_rawio(RtclArgs& args) +int RtclRlinkPort::M_rawread(RtclArgs& args) { - return DoRawio(args, fpObj, fErrCnt); + return DoRawRead(args, fpObj); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +int RtclRlinkPort::M_rawrblk(RtclArgs& args) +{ + return DoRawRblk(args, fpObj, fErrCnt); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +int RtclRlinkPort::M_rawwblk(RtclArgs& args) +{ + return DoRawWblk(args, fpObj); } //------------------------------------------+----------------------------------- @@ -272,7 +292,7 @@ void RtclRlinkPort::SetLogFileName(const std::string& name) //------------------------------------------+----------------------------------- //! FIXME_docs -inline std::string RtclRlinkPort::LogFileName() const +inline const std::string& RtclRlinkPort::LogFileName() const { return fspLog->Name(); } @@ -280,80 +300,120 @@ inline std::string RtclRlinkPort::LogFileName() const //------------------------------------------+----------------------------------- //! FIXME_docs -int RtclRlinkPort::DoRawio(RtclArgs& args, RlinkPort* pport, size_t& errcnt) +int RtclRlinkPort::DoRawRead(RtclArgs& args, RlinkPort* pport) { - static RtclNameSet optset("-rblk|-wblk|-edata|-timeout"); - - if (!pport || !pport->IsOpen()) args.Quit("-E: port not open"); - - string opt; - char mode = 0; - + if (!(pport && pport->IsOpen())) return args.Quit("-E: port not open"); + int32_t rsize; string rvname; vector rdata; - vector wdata; - vector edata; - vector emask; double timeout = 1.; + if (!args.GetArg("bsize", rsize, 1, 4096)) return kERR; + if (!args.GetArg("varData", rvname)) return kERR; + + static RtclNameSet optset("-timeout"); + string opt; while (args.NextOpt(opt, optset)) { - if (opt == "-rblk") { // -rblk size ?varData ------------ - if (mode) return args.Quit("-E: only one -rblk or -wblk allowed"); - mode = 'r'; - if (!args.GetArg("bsize", rsize, 1, 256)) return kERR; - if (!args.GetArg("??varData", rvname)) return kERR; - - } else if (opt == "-wblk") { // -wblk block -------------------- - if (mode) return args.Quit("-E: only one -rblk or -wblk allowed"); - mode = 'w'; - if (!args.GetArg("data", wdata, 1, 256)) return kERR; - - } else if (opt == "-edata") { // -edata data ?mask -------------- - if (mode != 'r') return args.Quit("-E: -edata only allowed after -rblk"); - if (!args.GetArg("data", edata, 0, rsize)) return kERR; - if (!args.GetArg("??mask", emask, 0, rsize)) return kERR; - - } else if (opt == "-timeout") { // -timeout tsec ------------------ + if (opt == "-timeout") { // -timeout tsec ------------------ if (!args.GetArg("tsec", timeout, 0.)) return kERR; } } - - if (!args.AllDone()) return kERR; - if (!mode) return args.Quit("-E: no -rblk or -wblk given"); + RerrMsg emsg; + Rtime tused; + rdata.resize(rsize); - if (mode == 'r') { // handle -rblk ------------------ - RerrMsg emsg; - Rtime tused; - rdata.resize(rsize); - int irc = pport->RawRead(rdata.data(), rdata.size(), true, Rtime(timeout), - tused, emsg); - if (irc == RlinkPort::kErr) return args.Quit("-E: timeout on -rblk"); - if (irc != (int)rdata.size()) return args.Quit(emsg); - if (rvname.length()) { - RtclOPtr pres(Rtcl::NewListIntObj(rdata)); - if(!Rtcl::SetVar(args.Interp(), rvname, pres)) return kERR; - } - if (edata.size()) { - size_t nerr=0; - for (size_t i=0; i= edata.size()) break; - uint8_t eval = edata[i]; - uint8_t emsk = (i < emask.size()) ? emask[i] : 0x0000; - if ((rdata[i]|emsk) != (eval|emsk)) nerr += 1; - } - if (nerr) errcnt += 1; - } - args.SetResult(double(tused)); + int irc = pport->RawRead(rdata.data(), rdata.size(), false, Rtime(timeout), + tused, emsg); - } else { // handle -wblk ------------------ - RerrMsg emsg; - int irc = pport->RawWrite(wdata.data(), wdata.size(), emsg); - if (irc != (int)wdata.size()) return args.Quit(emsg); - } + if (irc == RlinkPort::kEof) return args.Quit("-E: RawRead EOF"); + if (irc == RlinkPort::kTout) return args.Quit("-E: RawRead timeout"); + if (irc < 0) return args.Quit(emsg); + + rdata.resize(irc); + + RtclOPtr pres(Rtcl::NewListIntObj(rdata)); + if(!Rtcl::SetVar(args.Interp(), rvname, pres)) return kERR; + + args.SetResult(double(tused)); return kOK; } +//------------------------------------------+----------------------------------- +//! FIXME_docs + +int RtclRlinkPort::DoRawRblk(RtclArgs& args, RlinkPort* pport, size_t& errcnt) +{ + if (!(pport && pport->IsOpen())) return args.Quit("-E: port not open"); + + int32_t rsize; + string rvname; + vector rdata; + vector edata; + vector emask; + double timeout = 1.; + + if (!args.GetArg("bsize", rsize, 1, 4096)) return kERR; + if (!args.GetArg("??varData", rvname)) return kERR; + + static RtclNameSet optset("-edata|-timeout"); + string opt; + while (args.NextOpt(opt, optset)) { + if (opt == "-edata") { // -edata data ?mask -------------- + if (!args.GetArg("data", edata, 0, rsize)) return kERR; + if (!args.GetArg("??mask", emask, 0, rsize)) return kERR; + } else if (opt == "-timeout") { // -timeout tsec ------------------ + if (!args.GetArg("tsec", timeout, 0.)) return kERR; + } + } + + RerrMsg emsg; + Rtime tused; + rdata.resize(rsize); + + int irc = pport->RawRead(rdata.data(), rdata.size(), true, Rtime(timeout), + tused, emsg); + if (irc == RlinkPort::kEof) return args.Quit("-E: RawRead EOF"); + if (irc == RlinkPort::kTout) return args.Quit("-E: RawRead timeout"); + if (irc < 0) return args.Quit(emsg); + + if (rvname.length()) { + RtclOPtr pres(Rtcl::NewListIntObj(rdata)); + if(!Rtcl::SetVar(args.Interp(), rvname, pres)) return kERR; + } + if (edata.size()) { + size_t nerr=0; + for (size_t i=0; i= edata.size()) break; + uint8_t eval = edata[i]; + uint8_t emsk = (i < emask.size()) ? emask[i] : 0x00; + if ((rdata[i]|emsk) != (eval|emsk)) nerr += 1; + } + if (nerr) errcnt += 1; + } + args.SetResult(double(tused)); + + return kOK; +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +int RtclRlinkPort::DoRawWblk(RtclArgs& args, RlinkPort* pport) +{ + if (!(pport && pport->IsOpen())) return args.Quit("-E: port not open"); + + vector wdata; + if (!args.GetArg("data", wdata, 1, 4096)) return kERR; + + RerrMsg emsg; + int irc = pport->RawWrite(wdata.data(), wdata.size(), emsg); + if (irc != (int)wdata.size()) return args.Quit(emsg); + + return kOK; +} + + } // end namespace Retro diff --git a/tools/src/librlinktpp/RtclRlinkPort.hpp b/tools/src/librlinktpp/RtclRlinkPort.hpp index 108d226e..394ce227 100644 --- a/tools/src/librlinktpp/RtclRlinkPort.hpp +++ b/tools/src/librlinktpp/RtclRlinkPort.hpp @@ -1,6 +1,6 @@ -// $Id: RtclRlinkPort.hpp 887 2017-04-28 19:32:52Z mueller $ +// $Id: RtclRlinkPort.hpp 888 2017-04-30 13:06:51Z mueller $ // -// Copyright 2013-2015 by Walter F.J. Mueller +// Copyright 2013-2017 by Walter F.J. Mueller // // 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 @@ -13,6 +13,8 @@ // // Revision History: // Date Rev Version Comment +// 2017-04-29 888 1.1 LogFileName(): returns now const std::string& +// drop M_rawio; add M_rawread,M_rawrblk,M_rawwblk // 2015-01-09 632 1.0.2 add M_get, M_set, remove M_config // 2013-02-23 492 1.0.1 use RlogFile.Name(); // 2013-01-27 478 1.0 Initial version @@ -51,7 +53,9 @@ namespace Retro { int M_open(RtclArgs& args); int M_close(RtclArgs& args); int M_errcnt(RtclArgs& args); - int M_rawio(RtclArgs& args); + int M_rawread(RtclArgs& args); + int M_rawrblk(RtclArgs& args); + int M_rawwblk(RtclArgs& args); int M_stats(RtclArgs& args); int M_log(RtclArgs& args); int M_dump(RtclArgs& args); @@ -62,9 +66,11 @@ namespace Retro { void SetupGetSet(); bool TestOpen(RtclArgs& args); void SetLogFileName(const std::string& name); - std::string LogFileName() const; + const std::string& LogFileName() const; - static int DoRawio(RtclArgs& args, RlinkPort* pport, size_t& errcnt); + static int DoRawRead(RtclArgs& args, RlinkPort* pport); + static int DoRawRblk(RtclArgs& args, RlinkPort* pport, size_t& errcnt); + static int DoRawWblk(RtclArgs& args, RlinkPort* pport); protected: RlinkPort* fpObj; //!< ptr to managed object