w11 - cpp 0.794
Backend server for Rlink and w11
Loading...
Searching...
No Matches
RlinkCommand.cpp
Go to the documentation of this file.
1// $Id: RlinkCommand.cpp 1185 2019-07-12 17:29:12Z mueller $
2// SPDX-License-Identifier: GPL-3.0-or-later
3// Copyright 2011-2019 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4//
5// Revision History:
6// Date Rev Version Comment
7// 2019-03-10 1121 1.4.3 Print(): use BlockDone() as length for rblk data
8// 2018-12-23 1091 1.4.2 CmdWblk(),SetBlockWrite(): add move version
9// 2018-12-19 1090 1.4.1 use RosPrintf(bool)
10// 2018-12-01 1076 1.4 use unique_ptr
11// 2017-04-07 868 1.3.2 Dump(): add detail arg
12// 2017-03-11 859 1.3.1 add CommandInfo()
13// 2015-04-02 661 1.3 expect logic: add stat check, Print() without cntx
14// 2015-02-07 642 1.2.3 Print()+Dump(): adopt for large nblk;
15// 2014-12-21 617 1.2.2 use kStat_M_RbTout for rbus timeout
16// 2014-12-20 616 1.2.1 Print(): display BlockDone; add kFlagChkDone
17// 2014-12-06 609 1.2 new rlink v4 iface
18// 2014-08-15 583 1.1 rb_mreq addr now 16 bit
19// 2013-05-06 495 1.0.2 add RlinkContext to Print() args
20// 2013-02-03 481 1.0.1 use Rexception
21// 2011-03-27 374 1.0 Initial version
22// 2011-01-15 355 0.1 First draft
23// ---------------------------------------------------------------------------
24
29// debug
30#include <iostream>
31#include <sstream>
32
33#include <algorithm>
34
35#include "RlinkCommand.hpp"
36
37#include "librtools/RosFill.hpp"
41
42using namespace std;
43
49// all method definitions in namespace Retro
50namespace Retro {
51
52//------------------------------------------+-----------------------------------
53// constants definitions
54
55const uint8_t RlinkCommand::kCmdRreg;
56const uint8_t RlinkCommand::kCmdRblk;
57const uint8_t RlinkCommand::kCmdWreg;
58const uint8_t RlinkCommand::kCmdWblk;
59const uint8_t RlinkCommand::kCmdLabo;
60const uint8_t RlinkCommand::kCmdAttn;
61const uint8_t RlinkCommand::kCmdInit;
62
63const uint32_t RlinkCommand::kFlagInit;
64const uint32_t RlinkCommand::kFlagSend;
65const uint32_t RlinkCommand::kFlagDone;
66const uint32_t RlinkCommand::kFlagLabo;
67const uint32_t RlinkCommand::kFlagPktBeg;
68const uint32_t RlinkCommand::kFlagPktEnd;
69const uint32_t RlinkCommand::kFlagErrNak;
70const uint32_t RlinkCommand::kFlagErrDec;
71const uint32_t RlinkCommand::kFlagChkStat;
72const uint32_t RlinkCommand::kFlagChkData;
73const uint32_t RlinkCommand::kFlagChkDone;
74
75const uint8_t RlinkCommand::kStat_M_Stat;
76const uint8_t RlinkCommand::kStat_V_Stat;
77const uint8_t RlinkCommand::kStat_B_Stat;
78const uint8_t RlinkCommand::kStat_M_Attn;
80const uint8_t RlinkCommand::kStat_M_RbNak;
81const uint8_t RlinkCommand::kStat_M_RbErr;
82
83//------------------------------------------+-----------------------------------
85
87 : fRequest(0),
88 fAddress(0),
89 fData(0),
90 fBlock(),
91 fpBlockExt(nullptr),
92 fBlockExtSize(0),
93 fBlockDone(0),
94 fStatus(0),
95 fFlags(0),
96 fRcvSize(0),
97 fExpectStatusSet(false),
98 fExpectStatusVal(0),
99 fExpectStatusMsk(0x0),
100 fupExpect()
101{}
102
103//------------------------------------------+-----------------------------------
105
107 : fRequest(rhs.fRequest),
108 fAddress(rhs.fAddress),
109 fData(rhs.fData),
110 fBlock(rhs.fBlock),
111 fpBlockExt(rhs.fpBlockExt),
112 fBlockExtSize(rhs.fBlockExtSize),
113 fBlockDone(rhs.fBlockDone),
114 fStatus(rhs.fStatus),
115 fFlags(rhs.fFlags),
116 fRcvSize(rhs.fRcvSize),
117 fExpectStatusSet(rhs.fExpectStatusSet),
118 fExpectStatusVal(rhs.fExpectStatusVal),
119 fExpectStatusMsk(rhs.fExpectStatusMsk),
120 fupExpect(rhs.fupExpect ? new RlinkCommandExpect(*rhs.fupExpect) : nullptr)
121{}
122
123//------------------------------------------+-----------------------------------
125
127{}
128
129//------------------------------------------+-----------------------------------
131
132void RlinkCommand::CmdRblk(uint16_t addr, size_t size)
133{
134 SetCommand(kCmdRblk, addr);
135 SetBlockRead(size);
136 return;
137}
138
139//------------------------------------------+-----------------------------------
141
142void RlinkCommand::CmdRblk(uint16_t addr, uint16_t* pblock, size_t size)
143{
144 SetCommand(kCmdRblk, addr);
145 SetBlockExt(pblock, size);
146 return;
147}
148
149//------------------------------------------+-----------------------------------
151
152void RlinkCommand::CmdWblk(uint16_t addr, const std::vector<uint16_t>& block)
153{
154 SetCommand(kCmdWblk, addr);
155 SetBlockWrite(block);
156 return;
157}
158
159//------------------------------------------+-----------------------------------
161
162void RlinkCommand::CmdWblk(uint16_t addr, std::vector<uint16_t>&& block)
163{
164 SetCommand(kCmdWblk, addr);
165 SetBlockWrite(move(block));
166 return;
167}
168
169//------------------------------------------+-----------------------------------
171
172void RlinkCommand::CmdWblk(uint16_t addr, const uint16_t* pblock, size_t size)
173{
174 SetCommand(kCmdWblk, addr);
175 SetBlockExt(const_cast<uint16_t*>(pblock), size);
176 return;
177}
178
179//------------------------------------------+-----------------------------------
181
182void RlinkCommand::SetCommand(uint8_t cmd, uint16_t addr, uint16_t data)
183{
184 if (cmd > kCmdInit)
185 throw Rexception("RlinkCommand::SetCommand()", "Bad args: invalid cmd");
186 fRequest = cmd;
187 fAddress = addr;
188 fData = data;
189 fpBlockExt = nullptr;
190 fBlockExtSize = 0;
191 fBlockDone = 0;
192 fStatus = 0;
194 fRcvSize = 0;
195 fupExpect.reset();
196 return;
197}
198
199//------------------------------------------+-----------------------------------
201
202void RlinkCommand::SetAddress(uint16_t addr)
203{
204 fAddress = addr;
205 return;
206}
207
208//------------------------------------------+-----------------------------------
210
211void RlinkCommand::SetBlockWrite(const std::vector<uint16_t>& block)
212{
213 if (block.size() == 0 || block.size() > 65535)
214 throw Rexception("RlinkCommand::SetBlockWrite()",
215 "Bad args: invalid block size");
216 fBlock = block;
217 fpBlockExt = nullptr;
218 fBlockExtSize = 0;
219 fBlockDone = 0;
220 return;
221}
222
223//------------------------------------------+-----------------------------------
225
226void RlinkCommand::SetBlockWrite(std::vector<uint16_t>&& block)
227{
228 if (block.size() == 0 || block.size() > 65535)
229 throw Rexception("RlinkCommand::SetBlockWrite()",
230 "Bad args: invalid block size");
231 fBlock = move(block);
232 fpBlockExt = nullptr;
233 fBlockExtSize = 0;
234 fBlockDone = 0;
235 return;
236}
237
238//------------------------------------------+-----------------------------------
240
242{
243 if (size == 0 || size > 65535)
244 throw Rexception("RlinkCommand::SetBlockRead()",
245 "Bad args: invalid block size");
246 fBlock.clear();
247 fBlock.resize(size);
248 fpBlockExt = nullptr;
249 fBlockExtSize = 0;
250 fBlockDone = 0;
251 return;
252}
253
254//------------------------------------------+-----------------------------------
256
257void RlinkCommand::SetBlockExt(uint16_t* pblock, size_t size)
258{
259 if (pblock == nullptr)
260 throw Rexception("RlinkCommand::SetBlockExt()",
261 "Bad args: pblock is null");
262 if (size == 0 || size > 65535)
263 throw Rexception("RlinkCommand::SetBlockExt()",
264 "Bad args: invalid block size");
265 fpBlockExt = pblock;
266 fBlockExtSize = size;
267 fBlockDone = 0;
268 return;
269}
270
271//------------------------------------------+-----------------------------------
273
275{
276 fupExpect = move(upexp);
277 return;
278}
279
280//------------------------------------------+-----------------------------------
282
283void RlinkCommand::Print(std::ostream& os,
284 const RlinkAddrMap* pamap, size_t abase,
285 size_t dbase, size_t sbase) const
286{
287 uint8_t ccode = Command();
288
289 // separator + command mnemonic, code and flags
290 // separator: ++ first in packet
291 // -- non-first in packet
292 // -! +! labo with abort
293 // -. +. labo canceled command
294
295 char sep0 = TestFlagAny(kFlagPktBeg) ? '+' : '-';
296 char sep1 = sep0;
297 if (ccode==kCmdLabo && fData) sep1 = '!'; // indicate aborting labo
298 if (TestFlagAny(kFlagLabo)) sep1 = '.'; // indicate aborted command
299
300 os << sep0 << sep1 << " " << CommandName(ccode)
301 << " (" << RosPrintBvi(Request(), 8)
302 << "," << RosPrintBvi(fFlags, 16, 20)
303 << ")";
304
305 // address field
306 if (ccode==kCmdRreg || ccode==kCmdRblk ||
307 ccode==kCmdWreg || ccode==kCmdWblk ||
308 ccode==kCmdInit) {
309 os << " a=" << RosPrintBvi(fAddress, abase);
310 if (pamap) {
311 string name;
312 if (!pamap->Find(fAddress, name)) name.clear();
313 os << "(" << name << RosFill(pamap->MaxNameLength()-name.length()) << ")";
314 }
315 }
316
317 // don't write more than command and address for canceled commands
318 if (TestFlagAny(kFlagLabo)) {
319 os << " CANCELED" << endl;
320 return;
321 }
322
323 // data field (scalar)
324 if (ccode== kCmdRreg || ccode==kCmdWreg ||
325 ccode== kCmdLabo || ccode==kCmdAttn ||
326 ccode== kCmdInit) {
327 os << " d=" << RosPrintBvi(fData, dbase);
328
329 if (HasExpect() &&
330 (ccode==kCmdRreg || ccode==kCmdLabo || ccode==kCmdAttn)) {
332 os << "#";
333 os << " D=" << RosPrintBvi(Expect().DataValue(), dbase);
334 if (Expect().DataMask() != 0xffff) {
335 os << "," << RosPrintBvi(Expect().DataMask(), dbase);
336 }
337 } else if (Expect().DataIsChecked()) {
338 os << "!";
339 } else {
340 os << " ";
341 }
342 } else {
343 os << " ";
344 }
345 }
346
347 // block length field
348 if (ccode== kCmdRblk || ccode==kCmdWblk) {
349 os << " n=" << RosPrintf(BlockSize(), "d", 4)
350 << (BlockSize()==BlockDone() ? "=" : ">")
351 << RosPrintf(BlockDone(), "d", 4);
352 if (HasExpect()) {
354 os << "#";
355 os << " N=" << RosPrintf(Expect().DoneValue(), "d", 4);
356 } else if (Expect().DoneIsChecked()) {
357 os << "!";
358 } else {
359 os << " ";
360 }
361 } else {
362 os << " ";
363 }
364 }
365
366 // status field
367 os << " s=" << RosPrintBvi(fStatus, sbase);
369 os << "#";
370 os << " S=" << RosPrintBvi(fExpectStatusVal, sbase);
371 if (fExpectStatusMsk != 0xff) {
372 os << "," << RosPrintBvi(fExpectStatusMsk, sbase);
373 }
374 } else {
375 os << (StatusIsChecked() ? (ExpectStatusSet() ? "|" : "!") : " " );
376 }
377
378 if (TestFlagAny(kFlagDone)) {
380 os << " FAIL: "
382 FlagNames(),',');
383 } else {
384 os << " OK";
385 }
386 } else if (TestFlagAny(kFlagSend)) {
387 os << " FAIL: "
389 FlagNames(),',');
390 } else {
391 os << " PEND";
392 }
393
394 // handle data part of rblk and wblk commands
395 size_t dwidth = (dbase==2) ? 16 : ((dbase==8) ? 6 : 4);
396
397 if (ccode==kCmdRblk) {
398 bool dcheck = (HasExpect() && Expect().BlockValue().size() > 0);
399 size_t ncol = (80-4-5)/(dwidth+2);
400
401 size_t size = BlockDone();
402 const uint16_t* pdat = BlockPointer();
403
404 for (size_t i=0; i<size; i++) {
405 if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",4) << ": ";
406 os << RosPrintBvi(pdat[i], dbase);
407 if (dcheck) {
408 if (!Expect().BlockCheck(i, pdat[i])) {
409 os << "#";
410 } else {
411 os << (Expect().BlockIsChecked(i) ? "!" : "-");
412 }
413 } else {
414 os << " ";
415 }
416 os << " ";
417 }
418
419 if (dcheck && TestFlagAny(kFlagChkData)) {
420 const vector<uint16_t>& evalvec = Expect().BlockValue();
421 const vector<uint16_t>& emskvec = Expect().BlockMask();
422 for (size_t i=0; i<size; i++) {
423 if (!Expect().BlockCheck(i, pdat[i])) {
424 os << "\n FAIL d[" << RosPrintf(i,"d",4) << "]: "
425 << RosPrintBvi(pdat[i], dbase) << "#"
426 << " D=" << RosPrintBvi(evalvec[i], dbase);
427 if (i < emskvec.size() && emskvec[i]!=0xffff) {
428 os << "," << RosPrintBvi(emskvec[i], dbase);
429 }
430 }
431 }
432 }
433 }
434
435 if (ccode==kCmdWblk) {
436 const uint16_t* pdat = BlockPointer();
437 size_t size = BlockSize();
438 size_t ncol = (80-4-5)/(dwidth+2);
439 for (size_t i=0; i<size; i++) {
440 if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",4) << ": ";
441 os << RosPrintBvi(pdat[i], dbase) << " ";
442 }
443 }
444
445 os << endl;
446
447 return;
448}
449
450//------------------------------------------+-----------------------------------
452
453std::string RlinkCommand::CommandInfo() const
454{
455 ostringstream sos;
456 uint8_t ccode = Command();
457
458 // separator + command mnemonic, code and flags
459 // separator: ++ first in packet
460 // -- non-first in packet
461 // -! +! labo with abort
462 // -. +. labo canceled command
463
464 char sep0 = TestFlagAny(kFlagPktBeg) ? '+' : '-';
465 char sep1 = sep0;
466 if (ccode==kCmdLabo && fData) sep1 = '!'; // indicate aborting labo
467 if (TestFlagAny(kFlagLabo)) sep1 = '.'; // indicate aborted command
468
469 sos << sep0 << sep1 << " " << CommandName(ccode);
470
471 // address field
472 if (ccode==kCmdRreg || ccode==kCmdRblk ||
473 ccode==kCmdWreg || ccode==kCmdWblk ||
474 ccode==kCmdInit) {
475 sos << " a=" << RosPrintBvi(fAddress, 16);
476 } else {
477 sos << " ";
478 }
479
480 // data field (scalar)
481 if (ccode== kCmdRreg || ccode==kCmdWreg ||
482 ccode== kCmdLabo || ccode==kCmdAttn ||
483 ccode== kCmdInit) {
484 sos << " d=" << RosPrintBvi(fData, 16) << " ";
485 } else if (ccode== kCmdRblk || ccode==kCmdWblk) {
486 sos << " n=" << RosPrintf(BlockSize(), "d", 4)
487 << (BlockSize()==BlockDone() ? "=" : ">")
488 << RosPrintf(BlockDone(), "d", 4);
489 } else {
490 sos << " ";
491 }
492
493 // don't write more that command and address for canceled commands
494 if (TestFlagAny(kFlagLabo)) {
495 sos << " CANCELED";
496 return sos.str();
497 }
498
499 // status field
500 sos << " s=" << RosPrintBvi(fStatus, 2);
501
502 if (TestFlagAny(kFlagDone)) {
504 sos << " FAIL: chk";
505 } else {
506 sos << " OK";
507 }
508 } else if (TestFlagAny(kFlagSend)) {
509 sos << " FAIL: snd";
510 } else {
511 sos << " PEND";
512 }
513
514 return sos.str();
515}
516
517//------------------------------------------+-----------------------------------
519
520void RlinkCommand::Dump(std::ostream& os, int ind, const char* text,
521 int detail) const
522{
523 RosFill bl(ind);
524 os << bl << (text?text:"--") << "RlinkCommand @ " << this << endl;
525
526 os << bl << " fRequest: " << RosPrintBvi(fRequest,8)
527 << " seq:" << RosPrintf(SeqNumber(),"d",2)
528 << " cmd:" << RosPrintf(Command(),"d",1)
529 << " " << CommandName(Command()) << endl;
530 os << bl << " fAddress: " << RosPrintBvi(fAddress,0) << endl;
531 os << bl << " fData: " << RosPrintBvi(fData,0) << endl;
532 os << bl << " fBlock.size: " << RosPrintf(fBlock.size(),"d",4) << endl;
533 os << bl << " fpBlockExt: " << fpBlockExt << endl;
534 os << bl << " fBlockExtSize: " << RosPrintf(fBlockExtSize,"d",4) << endl;
535 os << bl << " fBlockDone: " << RosPrintf(fBlockDone,"d",4) << endl;
536 os << bl << " fStatus: " << RosPrintBvi(fStatus,0) << endl;
537 os << bl << " fFlags: " << RosPrintBvi(fFlags,16,24)
538 << " " << Rtools::Flags2String(fFlags, FlagNames()) << endl;
539 os << bl << " fRcvSize: " << RosPrintf(fRcvSize,"d",4) << endl;
540 if (BlockSize() > 0) {
541 size_t ncol = max(1, (80-ind-4-5)/(4+1));
542 os << bl << " block data:";
543 for (size_t i=0; i<BlockSize(); i++) {
544 if (i%ncol == 0) os << "\n" << bl << " " << RosPrintf(i,"d",4) << ": ";
545 os << RosPrintBvi(BlockPointer()[i],16) << " ";
546 }
547 os << endl;
548 }
549 os << bl << " fExpectStatusSet:" << RosPrintf(fExpectStatusSet) << endl;
550 os << bl << " fExpectStatusVal:" << RosPrintBvi(fExpectStatusVal,0) << endl;
551 os << bl << " fExpectStatusMsk:" << RosPrintBvi(fExpectStatusMsk,0) << endl;
552 if (fupExpect) fupExpect->Dump(os, ind+2, "fupExpect: ", detail);
553
554 return;
555}
556
557//------------------------------------------+-----------------------------------
559
560const char* RlinkCommand::CommandName(uint8_t cmd)
561{
562 static const char* cmdname[8] = {"rreg","rblk","wreg","wblk",
563 "labo","attn","init","????"};
564
565 return cmdname[cmd&0x7];
566}
567
568//------------------------------------------+-----------------------------------
570
572{
573 // use msb first order, will also be printing order
574 static Retro::RflagName fnam[] = {
575 {kFlagChkData, "ChkData"},
576 {kFlagChkDone, "ChkDone"},
577 {kFlagChkStat, "ChkStat"},
578 {kFlagErrDec, "ErrDec"},
579 {kFlagErrNak, "ErrNak"},
580 {kFlagPktEnd, "PktEnd"},
581 {kFlagPktBeg, "PktBeg"},
582 {kFlagLabo, "Labo"},
583 {kFlagDone, "Done"},
584 {kFlagSend, "Send"},
585 {kFlagInit, "Init"},
586 {0u, ""}
587 };
588 return fnam;
589}
590
591//------------------------------------------+-----------------------------------
593
595{
596 if (&rhs == this) return *this;
597 fRequest = rhs.fRequest;
598 fAddress = rhs.fAddress;
599 fData = rhs.fData;
600 fBlock = rhs.fBlock;
601 fpBlockExt = rhs.fpBlockExt;
603 fBlockDone = rhs.fBlockDone;
604 fStatus = rhs.fStatus;
605 fFlags = rhs.fFlags;
606 fRcvSize = rhs.fRcvSize;
610 fupExpect.reset(rhs.fupExpect ?
611 new RlinkCommandExpect(*rhs.fupExpect) : nullptr);
612 return *this;
613}
614
615} // end namespace Retro
FIXME_docs.
Definition: Rexception.hpp:29
size_t MaxNameLength() const
FIXME_docs.
bool Find(const std::string &name, uint16_t &addr) const
FIXME_docs.
const std::vector< uint16_t > & BlockValue() const
FIXME_docs.
const std::vector< uint16_t > & BlockMask() const
FIXME_docs.
bool BlockIsChecked(size_t ind) const
FIXME_docs.
void SetCommand(uint8_t cmd, uint16_t addr=0, uint16_t data=0)
FIXME_docs.
void SetExpect(exp_uptr_t &&upexp)
FIXME_docs.
static const uint8_t kStat_B_Stat
RlinkCommand()
Default constructor.
static const uint32_t kFlagPktEnd
command last in packet
static const uint8_t kCmdInit
command code send initialize
uint8_t fExpectStatusVal
status value
void SetBlockExt(uint16_t *pblock, size_t size)
FIXME_docs.
static const uint32_t kFlagSend
command send
~RlinkCommand()
Destructor.
uint8_t Request() const
FIXME_docs.
static const uint8_t kCmdRblk
command code read block
uint8_t fExpectStatusMsk
status mask
void SetBlockRead(size_t size)
FIXME_docs.
static const uint32_t kFlagChkStat
stat expect check failed
uint8_t fStatus
rlink command status
size_t fBlockDone
valid transfer count
bool TestFlagAny(uint32_t mask) const
FIXME_docs.
static const uint8_t kStat_M_RbErr
stat: rberr flag set
uint8_t SeqNumber() const
FIXME_docs.
static const char * CommandName(uint8_t cmd)
FIXME_docs.
size_t fBlockExtSize
transfer size if data external
void CmdRblk(uint16_t addr, size_t size)
FIXME_docs.
bool ExpectStatusSet() const
FIXME_docs.
void Dump(std::ostream &os, int ind=0, const char *text=0, int detail=0) const
FIXME_docs.
uint8_t fRequest
rlink request (cmd+seqnum)
bool StatusIsChecked() const
FIXME_docs.
bool fExpectStatusSet
stat chk set explicitely
void Print(std::ostream &os, const RlinkAddrMap *pamap=0, size_t abase=16, size_t dbase=16, size_t sbase=16) const
FIXME_docs.
static const uint32_t kFlagErrNak
error: nak abort
static const uint8_t kStat_M_RbNak
stat: rbnak flag set
uint16_t fAddress
rbus address
static const uint8_t kStat_M_Attn
stat: attn flag set
static const uint8_t kStat_M_RbTout
stat: rbtout flag set
static const uint32_t kFlagDone
command done
RlinkCommand & operator=(const RlinkCommand &rhs)
FIXME_docs.
static const uint32_t kFlagLabo
command labo'ed
uint8_t Command() const
FIXME_docs.
uint16_t * fpBlockExt
external data for blk commands
size_t BlockSize() const
FIXME_docs.
static const uint8_t kCmdRreg
command code read register
static const uint32_t kFlagChkDone
done expect check failed
std::vector< uint16_t > fBlock
data vector for blk commands
static const uint8_t kStat_V_Stat
static const uint8_t kCmdWreg
command code write register
static const uint32_t kFlagPktBeg
command first in packet
void CmdWblk(uint16_t addr, const std::vector< uint16_t > &block)
FIXME_docs.
void SetAddress(uint16_t addr)
FIXME_docs.
static const RflagName * FlagNames()
FIXME_docs.
size_t BlockDone() const
FIXME_docs.
static const uint32_t kFlagErrDec
error: decode error
bool HasExpect() const
FIXME_docs.
exp_uptr_t fupExpect
pointer to expect container
size_t fRcvSize
receive size for command
static const uint8_t kStat_M_Stat
stat: external stat bits
static const uint32_t kFlagChkData
data expect check failed
static const uint8_t kCmdAttn
command code get attention
std::unique_ptr< RlinkCommandExpect > exp_uptr_t
static const uint8_t kCmdLabo
command code list abort
const RlinkCommandExpect & Expect() const
FIXME_docs.
void SetBlockWrite(const std::vector< uint16_t > &block)
FIXME_docs.
std::string CommandInfo() const
FIXME_docs.
uint16_t * BlockPointer()
FIXME_docs.
uint32_t fFlags
state bits
static const uint32_t kFlagInit
cmd,addr,data setup
static const uint8_t kCmdWblk
command code write block
I/O appicator to generate fill characters.
Definition: RosFill.hpp:24
RosPrintfS< bool > RosPrintf(bool value, const char *form=0, int width=0, int prec=0)
Creates a print object for the formatted output of a bool value.
Definition: RosPrintf.ipp:38
std::string Flags2String(uint32_t flags, const RflagName *fnam, char delim)
FIXME_docs.
Definition: Rtools.cpp:48
Declaration of class ReventLoop.
Definition: ReventLoop.cpp:47