Line 1... |
Line 1... |
// $Id: RlinkCommand.cpp 609 2014-12-07 19:35:25Z mueller $
|
// $Id: RlinkCommand.cpp 628 2015-01-04 16:22:09Z mueller $
|
//
|
//
|
// Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
// Copyright 2011-2015 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
|
|
// 2015-01-04 628 1.2.3 Print(): adopt large nblk;
|
|
// 2014-12-21 617 1.2.2 use kStat_M_RbTout for rbus timeout
|
|
// 2014-12-20 616 1.2.1 Print(): display BlockDone; add kFlagChkDone
|
// 2014-12-06 609 1.2 new rlink v4 iface
|
// 2014-12-06 609 1.2 new rlink v4 iface
|
// 2014-08-15 583 1.1 rb_mreq addr now 16 bit
|
// 2014-08-15 583 1.1 rb_mreq addr now 16 bit
|
// 2013-05-06 495 1.0.2 add RlinkContext to Print() args
|
// 2013-05-06 495 1.0.2 add RlinkContext to Print() args
|
// 2013-02-03 481 1.0.1 use Rexception
|
// 2013-02-03 481 1.0.1 use Rexception
|
// 2011-03-27 374 1.0 Initial version
|
// 2011-03-27 374 1.0 Initial version
|
// 2011-01-15 355 0.1 First draft
|
// 2011-01-15 355 0.1 First draft
|
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
|
|
/*!
|
/*!
|
\file
|
\file
|
\version $Id: RlinkCommand.cpp 609 2014-12-07 19:35:25Z mueller $
|
\version $Id: RlinkCommand.cpp 628 2015-01-04 16:22:09Z mueller $
|
\brief Implemenation of class RlinkCommand.
|
\brief Implemenation of class RlinkCommand.
|
*/
|
*/
|
|
|
// debug
|
// debug
|
#include <iostream>
|
#include <iostream>
|
Line 68... |
Line 71... |
const uint32_t RlinkCommand::kFlagPktEnd;
|
const uint32_t RlinkCommand::kFlagPktEnd;
|
const uint32_t RlinkCommand::kFlagErrNak;
|
const uint32_t RlinkCommand::kFlagErrNak;
|
const uint32_t RlinkCommand::kFlagErrDec;
|
const uint32_t RlinkCommand::kFlagErrDec;
|
const uint32_t RlinkCommand::kFlagChkStat;
|
const uint32_t RlinkCommand::kFlagChkStat;
|
const uint32_t RlinkCommand::kFlagChkData;
|
const uint32_t RlinkCommand::kFlagChkData;
|
|
const uint32_t RlinkCommand::kFlagChkDone;
|
|
|
const uint8_t RlinkCommand::kStat_M_Stat;
|
const uint8_t RlinkCommand::kStat_M_Stat;
|
const uint8_t RlinkCommand::kStat_V_Stat;
|
const uint8_t RlinkCommand::kStat_V_Stat;
|
const uint8_t RlinkCommand::kStat_B_Stat;
|
const uint8_t RlinkCommand::kStat_B_Stat;
|
const uint8_t RlinkCommand::kStat_M_Attn;
|
const uint8_t RlinkCommand::kStat_M_Attn;
|
|
const uint8_t RlinkCommand::kStat_M_RbTout;
|
const uint8_t RlinkCommand::kStat_M_RbNak;
|
const uint8_t RlinkCommand::kStat_M_RbNak;
|
const uint8_t RlinkCommand::kStat_M_RbErr;
|
const uint8_t RlinkCommand::kStat_M_RbErr;
|
|
|
//------------------------------------------+-----------------------------------
|
//------------------------------------------+-----------------------------------
|
//! Default constructor
|
//! Default constructor
|
Line 258... |
Line 263... |
uint8_t ccode = Command();
|
uint8_t ccode = Command();
|
|
|
// separator + command mnemonic, code and flags
|
// separator + command mnemonic, code and flags
|
// separator: ++ first in packet
|
// separator: ++ first in packet
|
// -- non-first in packet
|
// -- non-first in packet
|
// ?? FIXME: separator for labo canceled commands
|
// ?? FIXME_code: separator for labo canceled commands
|
const char* sep = "??";
|
const char* sep = "??";
|
if (TestFlagAny(kFlagPktBeg)) {
|
if (TestFlagAny(kFlagPktBeg)) {
|
sep = "++";
|
sep = "++";
|
} else {
|
} else {
|
sep = "--";
|
sep = "--";
|
Line 307... |
Line 312... |
} else {
|
} else {
|
os << " ";
|
os << " ";
|
}
|
}
|
}
|
}
|
|
|
|
// block length field
|
if (ccode== kCmdRblk || ccode==kCmdWblk) {
|
if (ccode== kCmdRblk || ccode==kCmdWblk) {
|
os << " n=" << RosPrintf(BlockSize(), "d", 3);
|
os << " n=" << RosPrintf(BlockSize(), "d", 4)
|
|
<< (BlockSize()==BlockDone() ? "=" : ">")
|
|
<< RosPrintf(BlockDone(), "d", 4);
|
|
if (fpExpect) {
|
|
if (TestFlagAny(kFlagChkDone)) {
|
|
os << "#";
|
|
os << " N=" << RosPrintf(fpExpect->DoneValue(), "d", 4);
|
|
} else if (fpExpect->DoneIsChecked()) {
|
|
os << "!";
|
|
} else {
|
|
os << " ";
|
|
}
|
|
} else {
|
|
os << " ";
|
|
}
|
}
|
}
|
|
|
// status field
|
// status field
|
os << " s=" << RosPrintBvi(fStatus, sbase);
|
os << " s=" << RosPrintBvi(fStatus, sbase);
|
uint8_t scval = fpExpect ? fpExpect->StatusValue() : cntx.StatusValue();
|
uint8_t scval = fpExpect ? fpExpect->StatusValue() : cntx.StatusValue();
|
Line 326... |
Line 346... |
} else {
|
} else {
|
os << ( scmsk != 0xff ? "!" : " " );
|
os << ( scmsk != 0xff ? "!" : " " );
|
}
|
}
|
|
|
if (TestFlagAny(kFlagDone)) {
|
if (TestFlagAny(kFlagDone)) {
|
if (TestFlagAny(kFlagChkStat|kFlagChkData)) {
|
if (TestFlagAny(kFlagChkStat|kFlagChkData|kFlagChkDone)) {
|
os << " FAIL: "
|
os << " FAIL: "
|
<< Rtools::Flags2String(fFlags&(kFlagChkStat|kFlagChkData),
|
<< Rtools::Flags2String(fFlags&(kFlagChkStat|kFlagChkData|kFlagChkDone),
|
FlagNames(),',');
|
FlagNames(),',');
|
} else {
|
} else {
|
os << " OK";
|
os << " OK";
|
}
|
}
|
} else if (TestFlagAny(kFlagSend)) {
|
} else if (TestFlagAny(kFlagSend)) {
|
Line 352... |
Line 372... |
|
|
size_t size = BlockSize();
|
size_t size = BlockSize();
|
const uint16_t* pdat = BlockPointer();
|
const uint16_t* pdat = BlockPointer();
|
|
|
for (size_t i=0; i<size; i++) {
|
for (size_t i=0; i<size; i++) {
|
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",3) << ": ";
|
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",4) << ": ";
|
os << RosPrintBvi(pdat[i], dbase);
|
os << RosPrintBvi(pdat[i], dbase);
|
if (dcheck) {
|
if (dcheck) {
|
if (!fpExpect->BlockCheck(i, pdat[i])) {
|
if (!fpExpect->BlockCheck(i, pdat[i])) {
|
os << "#";
|
os << "#";
|
} else {
|
} else {
|
Line 371... |
Line 391... |
if (dcheck && TestFlagAny(kFlagChkData)) {
|
if (dcheck && TestFlagAny(kFlagChkData)) {
|
const vector<uint16_t>& evalvec = fpExpect->BlockValue();
|
const vector<uint16_t>& evalvec = fpExpect->BlockValue();
|
const vector<uint16_t>& emskvec = fpExpect->BlockMask();
|
const vector<uint16_t>& emskvec = fpExpect->BlockMask();
|
for (size_t i=0; i<size; i++) {
|
for (size_t i=0; i<size; i++) {
|
if (!fpExpect->BlockCheck(i, pdat[i])) {
|
if (!fpExpect->BlockCheck(i, pdat[i])) {
|
os << "\n FAIL d[" << RosPrintf(i,"d",3) << "]: "
|
os << "\n FAIL d[" << RosPrintf(i,"d",4) << "]: "
|
<< RosPrintBvi(pdat[i], dbase) << "#"
|
<< RosPrintBvi(pdat[i], dbase) << "#"
|
<< " D=" << RosPrintBvi(evalvec[i], dbase);
|
<< " D=" << RosPrintBvi(evalvec[i], dbase);
|
if (i < emskvec.size() && emskvec[i]!=0x0000) {
|
if (i < emskvec.size() && emskvec[i]!=0x0000) {
|
os << "," << RosPrintBvi(emskvec[i], dbase);
|
os << "," << RosPrintBvi(emskvec[i], dbase);
|
}
|
}
|
Line 387... |
Line 407... |
if (ccode==kCmdWblk) {
|
if (ccode==kCmdWblk) {
|
const uint16_t* pdat = BlockPointer();
|
const uint16_t* pdat = BlockPointer();
|
size_t size = BlockSize();
|
size_t size = BlockSize();
|
size_t ncol = (80-4-5)/(dwidth+2);
|
size_t ncol = (80-4-5)/(dwidth+2);
|
for (size_t i=0; i<size; i++) {
|
for (size_t i=0; i<size; i++) {
|
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",3) << ": ";
|
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",4) << ": ";
|
os << RosPrintBvi(pdat[i], dbase) << " ";
|
os << RosPrintBvi(pdat[i], dbase) << " ";
|
}
|
}
|
}
|
}
|
|
|
os << endl;
|
os << endl;
|
Line 452... |
Line 472... |
const Retro::RflagName* RlinkCommand::FlagNames()
|
const Retro::RflagName* RlinkCommand::FlagNames()
|
{
|
{
|
// use msb first order, will also be printing order
|
// use msb first order, will also be printing order
|
static Retro::RflagName fnam[] = {
|
static Retro::RflagName fnam[] = {
|
{kFlagChkData, "ChkData"},
|
{kFlagChkData, "ChkData"},
|
|
{kFlagChkDone, "ChkDone"},
|
{kFlagChkStat, "ChkStat"},
|
{kFlagChkStat, "ChkStat"},
|
{kFlagErrDec, "ErrDec"},
|
{kFlagErrDec, "ErrDec"},
|
{kFlagErrNak, "ErrNak"},
|
{kFlagErrNak, "ErrNak"},
|
{kFlagPktEnd, "PktEnd"},
|
{kFlagPktEnd, "PktEnd"},
|
{kFlagPktBeg, "PktBeg"},
|
{kFlagPktBeg, "PktBeg"},
|