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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.6/] [tools/] [src/] [librlinktpp/] [RtclRlinkConnect.cpp] - Blame information for rev 36

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 22 wfjm
// $Id: RtclRlinkConnect.cpp 521 2013-05-20 22:16:45Z mueller $
2 10 wfjm
//
3 19 wfjm
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4 10 wfjm
//
5
// This program is free software; you may redistribute and/or modify it under
6
// the terms of the GNU General Public License as published by the Free
7
// Software Foundation, either version 2, or at your option any later version.
8
//
9
// This program is distributed in the hope that it will be useful, but
10
// WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
11
// or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12
// for complete details.
13
// 
14
// Revision History: 
15
// Date         Rev Version  Comment
16 19 wfjm
// 2013-02-23   492   1.1.6  use RlogFile.Name(); use Context().ErrorCount()
17
// 2013-02-22   491   1.1.5  use new RlogFile/RlogMsg interfaces
18
// 2013-02-02   480   1.1.4  allow empty exec commands
19
// 2013-01-27   478   1.1.3  use RtclRlinkPort::DoRawio on M_rawio
20
// 2013-01-06   473   1.1.2  add M_rawio: rawio -write|-read
21 15 wfjm
// 2011-11-28   434   1.1.1  ConfigBase(): use uint32_t for lp64 compatibility
22 12 wfjm
// 2011-04-23   380   1.1    use boost/bind instead of RmethDsc
23 11 wfjm
// 2011-04-17   376   1.0.1  M_wtlam: now correct log levels
24 10 wfjm
// 2011-03-27   374   1.0    Initial version
25
// 2011-02-11   360   0.1    First draft
26
// ---------------------------------------------------------------------------
27
 
28
/*!
29
  \file
30 22 wfjm
  \version $Id: RtclRlinkConnect.cpp 521 2013-05-20 22:16:45Z mueller $
31 10 wfjm
  \brief   Implemenation of class RtclRlinkConnect.
32
 */
33
 
34
#include <ctype.h>
35
 
36
#include <iostream>
37
 
38 12 wfjm
#include "boost/bind.hpp"
39
 
40 10 wfjm
#include "librtcltools/Rtcl.hpp"
41
#include "librtcltools/RtclOPtr.hpp"
42
#include "librtcltools/RtclNameSet.hpp"
43
#include "librtcltools/RtclStats.hpp"
44
#include "librtools/RosPrintf.hpp"
45 19 wfjm
#include "librtools/RlogMsg.hpp"
46 10 wfjm
#include "librlink/RlinkCommandList.hpp"
47 19 wfjm
#include "RtclRlinkPort.hpp"
48
 
49 10 wfjm
#include "RtclRlinkConnect.hpp"
50
 
51
using namespace std;
52
 
53
/*!
54
  \class Retro::RtclRlinkConnect
55
  \brief FIXME_docs
56
*/
57
 
58 19 wfjm
// all method definitions in namespace Retro
59
namespace Retro {
60
 
61 10 wfjm
//------------------------------------------+-----------------------------------
62
//! Default constructor
63
 
64
RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name)
65
  : RtclProxyOwned<RlinkConnect>("RlinkConnect", interp, name,
66 19 wfjm
                                 new RlinkConnect())
67 10 wfjm
{
68 12 wfjm
  AddMeth("open",     boost::bind(&RtclRlinkConnect::M_open,    this, _1));
69
  AddMeth("close",    boost::bind(&RtclRlinkConnect::M_close,   this, _1));
70
  AddMeth("exec",     boost::bind(&RtclRlinkConnect::M_exec,    this, _1));
71
  AddMeth("amap",     boost::bind(&RtclRlinkConnect::M_amap,    this, _1));
72
  AddMeth("errcnt",   boost::bind(&RtclRlinkConnect::M_errcnt,  this, _1));
73
  AddMeth("wtlam",    boost::bind(&RtclRlinkConnect::M_wtlam,   this, _1));
74
  AddMeth("oob",      boost::bind(&RtclRlinkConnect::M_oob,     this, _1));
75 19 wfjm
  AddMeth("rawio",    boost::bind(&RtclRlinkConnect::M_rawio,   this, _1));
76 12 wfjm
  AddMeth("stats",    boost::bind(&RtclRlinkConnect::M_stats,   this, _1));
77
  AddMeth("log",      boost::bind(&RtclRlinkConnect::M_log,     this, _1));
78
  AddMeth("print",    boost::bind(&RtclRlinkConnect::M_print,   this, _1));
79
  AddMeth("dump",     boost::bind(&RtclRlinkConnect::M_dump,    this, _1));
80
  AddMeth("config",   boost::bind(&RtclRlinkConnect::M_config,  this, _1));
81
  AddMeth("$default", boost::bind(&RtclRlinkConnect::M_default, this, _1));
82 10 wfjm
 
83
  for (size_t i=0; i<8; i++) {
84
    fCmdnameObj[i] = Tcl_NewStringObj(RlinkCommand::CommandName(i), -1);
85
  }
86
}
87
 
88
//------------------------------------------+-----------------------------------
89
//! Destructor
90
 
91
RtclRlinkConnect::~RtclRlinkConnect()
92
{}
93
 
94
//------------------------------------------+-----------------------------------
95
//! FIXME_docs
96
 
97
int RtclRlinkConnect::M_open(RtclArgs& args)
98
{
99
  string path;
100
 
101
  if (!args.GetArg("?path", path)) return kERR;
102
  if (!args.AllDone()) return kERR;
103
 
104
  RerrMsg emsg;
105
  if (args.NOptMiss() == 0) {               // open path
106 19 wfjm
    if (!Obj().Open(path, emsg)) return args.Quit(emsg);
107 10 wfjm
  } else {                                  // open 
108 19 wfjm
    string name = Obj().IsOpen() ? Obj().Port()->Url().Url() : string();
109 10 wfjm
    args.SetResult(name);
110
  }
111
  return kOK;
112
}
113
 
114
//------------------------------------------+-----------------------------------
115
//! FIXME_docs
116
 
117
int RtclRlinkConnect::M_close(RtclArgs& args)
118
{
119
  if (!args.AllDone()) return kERR;
120 19 wfjm
  if (!Obj().IsOpen()) return args.Quit("-E: port not open");
121 10 wfjm
  Obj().Close();
122
  return kOK;
123
}
124
 
125
//------------------------------------------+-----------------------------------
126
//! FIXME_docs
127
 
128
int RtclRlinkConnect::M_exec(RtclArgs& args)
129
{
130
  static RtclNameSet optset("-rreg|-rblk|-wreg|-wblk|-stat|-attn|-init|"
131
                            "-edata|-estat|-estatdef|"
132
                            "-volatile|-print|-dump|-rlist");
133
 
134
  Tcl_Interp* interp = args.Interp();
135
 
136
  RlinkCommandList clist;
137
  string opt;
138
  uint16_t addr;
139
 
140
  vector<string> vardata;
141
  vector<string> varstat;
142
  string varprint;
143
  string vardump;
144
  string varlist;
145
 
146
  uint8_t estatdef_val = 0x00;
147
  uint8_t estatdef_msk = 0xff;
148
 
149
  while (args.NextOpt(opt, optset)) {
150
 
151
    size_t lsize = clist.Size();
152
    if        (opt == "-rreg") {            // -rreg addr ?varData ?varStat ---
153
      if (!GetAddr(args, Obj(), addr)) return kERR;
154
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
155
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
156
      clist.AddRreg(addr);
157
 
158
    } else if (opt == "-rblk") {            // -rblk addr size ?varData ?varStat
159
      int32_t bsize;
160
      if (!GetAddr(args, Obj(), addr)) return kERR;
161
      if (!args.GetArg("bsize", bsize, 1, 256)) return kERR;
162
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
163
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
164
      clist.AddRblk(addr, (size_t) bsize);
165
 
166
    } else if (opt == "-wreg") {            // -wreg addr data ?varStat -------
167
      uint16_t data;
168
      if (!GetAddr(args, Obj(), addr)) return kERR;
169
      if (!args.GetArg("data", data)) return kERR;
170
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
171
      clist.AddWreg(addr, data);
172
 
173
    } else if (opt == "-wblk") {            // -wblk addr block ?varStat ------
174
      vector<uint16_t> block;
175
      if (!GetAddr(args, Obj(), addr)) return kERR;
176
      if (!args.GetArg("data", block, 1, 256)) return kERR;
177
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
178
      clist.AddWblk(addr, block);
179
 
180
    } else if (opt == "-stat") {            // -stat varData ?varStat ---------
181
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
182
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
183
      clist.AddStat();
184
 
185
    } else if (opt == "-attn") {            // -attn varData ?varStat ---------
186
      if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
187
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
188
      clist.AddAttn();
189
 
190
    } else if (opt == "-init") {            // -init addr data ?varStat -------
191
      uint16_t data;
192
      if (!GetAddr(args, Obj(), addr)) return kERR;
193
      if (!args.GetArg("data", data)) return kERR;
194
      if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
195
      clist.AddInit(addr, data);
196
 
197
    } else if (opt == "-edata") {           // -edata data ?mask --------------
198
      if (!ClistNonEmpty(args, clist)) return kERR;
199
      if (clist[lsize-1].Expect()==0) {
200
        clist.LastExpect(new RlinkCommandExpect());
201
      }
202
      if (clist[lsize-1].Command() == RlinkCommand::kCmdRblk) {
203
        vector<uint16_t> data;
204
        vector<uint16_t> mask;
205
        size_t bsize = clist[lsize-1].BlockSize();
206
        if (!args.GetArg("data", data, 0, bsize)) return kERR;
207
        if (!args.GetArg("??mask", mask, 0, bsize)) return kERR;
208
        clist[lsize-1].Expect()->SetBlock(data, mask);
209
      } else {
210
        uint16_t data=0;
211
        uint16_t mask=0;
212
        if (!args.GetArg("data", data)) return kERR;
213
        if (!args.GetArg("??mask", mask)) return kERR;
214
        clist[lsize-1].Expect()->SetData(data, mask);
215
      }
216
 
217
    } else if (opt == "-estat") {           // -estat ?stat ?mask -------------
218
      if (!ClistNonEmpty(args, clist)) return kERR;
219
      uint8_t stat=0;
220
      uint8_t mask=0;
221
      if (!args.GetArg("??stat", stat)) return kERR;
222
      if (!args.GetArg("??mask", mask)) return kERR;
223
      if (args.NOptMiss() == 2)  mask = 0xff;
224
      if (clist[lsize-1].Expect()==0) {
225
        clist.LastExpect(new RlinkCommandExpect());
226
      }
227
      clist[lsize-1].Expect()->SetStatus(stat, mask);
228
 
229
    } else if (opt == "-estatdef") {        // -estatdef ?stat ?mask -----------
230
      uint8_t stat=0;
231
      uint8_t mask=0;
232
      if (!args.GetArg("??stat", stat)) return kERR;
233
      if (!args.GetArg("??mask", mask)) return kERR;
234
      if (args.NOptMiss() == 2)  mask = 0xff;
235
      estatdef_val = stat;
236
      estatdef_msk = mask;
237
 
238
    } else if (opt == "-volatile") {        // -volatile ----------------------
239
      if (!ClistNonEmpty(args, clist)) return kERR;
240
      clist.LastVolatile();
241
 
242
    } else if (opt == "-print") {           // -print ?varRes -----------------
243
      varprint = "-";
244
      if (!args.GetArg("??varRes", varprint)) return kERR;
245
    } else if (opt == "-dump") {            // -dump ?varRes ------------------
246
      vardump = "-";
247
      if (!args.GetArg("??varRes", vardump)) return kERR;
248
    } else if (opt == "-rlist") {           // -rlist ?varRes -----------------
249
      varlist = "-";
250
      if (!args.GetArg("??varRes", varlist)) return kERR;
251
    }
252
 
253
    if (lsize != clist.Size()) {            // cmd added to clist (ind=lsize!)
254
      if (estatdef_msk != 0xff) {             // estatdef defined
255
        if (clist[lsize].Expect()==0) {
256
          clist.LastExpect(new RlinkCommandExpect());
257
        }
258
        clist[lsize].Expect()->SetStatus(estatdef_val, estatdef_msk);
259
      }
260
    }
261
  }
262
 
263
  int nact = 0;
264
  if (varprint == "-") nact += 1;
265
  if (vardump  == "-") nact += 1;
266
  if (varlist  == "-") nact += 1;
267 19 wfjm
  if (nact > 1)
268
    return args.Quit(
269
      "-E: more that one of -print,-dump,-list without target variable found");
270 10 wfjm
 
271
  if (!args.AllDone()) return kERR;
272 19 wfjm
  if (clist.Size() == 0) return kOK;
273 10 wfjm
 
274
  RerrMsg emsg;
275
 
276 19 wfjm
  if (!Obj().Exec(clist, emsg)) return args.Quit(emsg);
277 10 wfjm
 
278
  for (size_t icmd=0; icmd<clist.Size(); icmd++) {
279
    RlinkCommand& cmd = clist[icmd];
280
 
281
    if (icmd<vardata.size() && !vardata[icmd].empty()) {
282
      RtclOPtr pres;
283
      vector<uint16_t> retstat;
284
      RtclOPtr pele;
285
      switch (cmd.Command()) {
286
        case RlinkCommand::kCmdRreg:
287
        case RlinkCommand::kCmdAttn:
288
          pres = Tcl_NewIntObj((int)cmd.Data());
289
          break;
290
 
291
        case RlinkCommand::kCmdRblk:
292
          pres = Rtcl::NewListIntObj(cmd.Block());
293
          break;
294
 
295
        case RlinkCommand::kCmdStat:
296
          retstat.resize(2);
297
          retstat[0] = cmd.StatRequest();
298
          retstat[1] = cmd.Data();
299
          pres = Rtcl::NewListIntObj(retstat);
300
          break;
301
      }
302
      if(!Rtcl::SetVar(interp, vardata[icmd], pres)) return kERR;
303
    }
304
 
305
    if (icmd<varstat.size() && !varstat[icmd].empty()) {
306 22 wfjm
      RtclOPtr pres(Tcl_NewIntObj((int)cmd.Status()));
307 10 wfjm
      if (!Rtcl::SetVar(interp, varstat[icmd], pres)) return kERR;
308
    }
309
  }
310
 
311
  if (!varprint.empty()) {
312
    ostringstream sos;
313
    const RlinkConnect::LogOpts& logopts = Obj().GetLogOpts();
314 19 wfjm
    clist.Print(sos, Obj().Context(), &Obj().AddrMap(), logopts.baseaddr,
315
                logopts.basedata, logopts.basestat);
316 22 wfjm
    RtclOPtr pobj(Rtcl::NewLinesObj(sos));
317 10 wfjm
    if (!Rtcl::SetVarOrResult(args.Interp(), varprint, pobj)) return kERR;
318
  }
319
 
320
  if (!vardump.empty()) {
321
    ostringstream sos;
322
    clist.Dump(sos, 0);
323 22 wfjm
    RtclOPtr pobj(Rtcl::NewLinesObj(sos));
324 10 wfjm
    if (!Rtcl::SetVarOrResult(args.Interp(), vardump, pobj)) return kERR;
325
  }
326
 
327
  if (!varlist.empty()) {
328 22 wfjm
    RtclOPtr prlist(Tcl_NewListObj(0, NULL));
329 10 wfjm
    for (size_t icmd=0; icmd<clist.Size(); icmd++) {
330
      RlinkCommand& cmd(clist[icmd]);
331
 
332 22 wfjm
      RtclOPtr pres(Tcl_NewListObj(0, NULL));
333 10 wfjm
      Tcl_ListObjAppendElement(NULL, pres, fCmdnameObj[cmd.Command()]);
334
      Tcl_ListObjAppendElement(NULL, pres, Tcl_NewIntObj((int)cmd.Request()));
335
      Tcl_ListObjAppendElement(NULL, pres, Tcl_NewIntObj((int)cmd.Flags()));
336
      Tcl_ListObjAppendElement(NULL, pres, Tcl_NewIntObj((int)cmd.Status()));
337
 
338
      switch (cmd.Command()) {
339
        case RlinkCommand::kCmdRreg:
340
        case RlinkCommand::kCmdAttn:
341
          Tcl_ListObjAppendElement(NULL, pres, Tcl_NewIntObj((int)cmd.Data()));
342
          break;
343
 
344
        case RlinkCommand::kCmdRblk:
345
          Tcl_ListObjAppendElement(NULL, pres,
346
                                   Rtcl::NewListIntObj(cmd.Block()));
347
          break;
348
 
349
        case RlinkCommand::kCmdStat:
350
          Tcl_ListObjAppendElement(NULL, pres,
351
                                   Tcl_NewIntObj((int)cmd.StatRequest()));
352
          Tcl_ListObjAppendElement(NULL, pres, Tcl_NewIntObj((int)cmd.Data()));
353
          break;
354
      }
355
      Tcl_ListObjAppendElement(NULL, prlist, pres);
356
    }
357
    if (!Rtcl::SetVarOrResult(args.Interp(), varlist, prlist)) return kERR;
358
  }
359
 
360
  return kOK;
361
}
362
 
363
//------------------------------------------+-----------------------------------
364
//! FIXME_docs
365
 
366
int RtclRlinkConnect::M_amap(RtclArgs& args)
367
{
368
  static RtclNameSet optset("-name|-testname|-testaddr|-insert|-erase|"
369
                            "-clear|-print");
370
 
371
  const RlinkAddrMap& addrmap = Obj().AddrMap();
372
 
373
  string opt;
374
  string name;
375
  uint16_t addr=0;
376
 
377
  if (args.NextOpt(opt, optset)) {
378
    if        (opt == "-name") {            // amap -name addr
379
      if (!args.GetArg("addr", addr, 0x00ff)) return kERR;
380
      if (!args.AllDone()) return kERR;
381
      string   tstname;
382
      if(addrmap.Find(addr, tstname)) {
383
        args.SetResult(tstname);
384
      } else {
385 19 wfjm
        return args.Quit(string("-E: address '") + args.PeekArgString(-1) +
386
                         "' not mapped");
387 10 wfjm
      }
388
 
389
    } else if (opt == "-testname") {        // amap -testname name
390
      if (!args.GetArg("name", name)) return kERR;
391
      if (!args.AllDone()) return kERR;
392
      uint16_t tstaddr;
393
      args.SetResult(int(addrmap.Find(name, tstaddr)));
394
 
395
    } else if (opt == "-testaddr") {        // amap -testaddr addr
396
      if (!args.GetArg("addr", addr, 0x00ff)) return kERR;
397
      if (!args.AllDone()) return kERR;
398
      string   tstname;
399
      args.SetResult(int(addrmap.Find(addr, tstname)));
400
 
401
    } else if (opt == "-insert") {          // amap -insert name addr
402
      uint16_t tstaddr;
403
      string   tstname;
404
      int      tstint;
405
      if (!args.GetArg("name", name)) return kERR;
406
      // enforce that the name is not a valid representation of an int
407 19 wfjm
      if (Tcl_GetIntFromObj(NULL, args[args.NDone()-1], &tstint) == kOK)
408
        return args.Quit(string("-E: name should not look like an int but '")+
409
                         name + "' does");
410 10 wfjm
      if (!args.GetArg("addr", addr, 0x00ff)) return kERR;
411
      if (!args.AllDone()) return kERR;
412 19 wfjm
      if (addrmap.Find(name, tstaddr))
413
        return args.Quit(string("-E: mapping already defined for '")+name+"'");
414
      if (addrmap.Find(addr, tstname))
415
        return args.Quit(string("-E: mapping already defined for address '") +
416
                         args.PeekArgString(-1) + "'");
417 10 wfjm
      Obj().AddrMapInsert(name, addr);
418
 
419
    } else if (opt == "-erase") {           // amap -erase name
420
      if (!args.GetArg("name", name)) return kERR;
421
      if (!args.AllDone()) return kERR;
422 19 wfjm
      if (!Obj().AddrMapErase(name))
423
        return args.Quit(string("-E: no mapping defined for '") + name + "'");
424 10 wfjm
 
425
    } else if (opt == "-clear") {           // amap -clear
426
      if (!args.AllDone()) return kERR;
427
      Obj().AddrMapClear();
428
 
429
    } else if (opt == "-print") {           // amap -print
430
      if (!args.AllDone()) return kERR;
431
      ostringstream sos;
432
      addrmap.Print(sos);
433
      args.AppendResultLines(sos);
434
    }
435
 
436
  } else {
437
    if (!args.OptValid()) return kERR;
438
    if (!args.GetArg("?name", name)) return kERR;
439
    if (args.NOptMiss()==0) {               // amap name
440
      uint16_t tstaddr;
441
      if(addrmap.Find(name, tstaddr)) {
442
        args.SetResult(int(tstaddr));
443
      } else {
444 19 wfjm
        return args.Quit(string("-E: no mapping defined for '") + name + "'");
445 10 wfjm
      }
446
 
447
    } else {                                // amap
448 22 wfjm
      RtclOPtr plist(Tcl_NewListObj(0, NULL));
449 10 wfjm
      const RlinkAddrMap::amap_t amap = addrmap.Amap();
450
      for (RlinkAddrMap::amap_cit_t it=amap.begin(); it!=amap.end(); it++) {
451
        Tcl_Obj* tpair[2];
452
        tpair[0] = Tcl_NewIntObj(it->first);
453
        tpair[1] = Tcl_NewStringObj((it->second).c_str(),(it->second).length());
454
        Tcl_ListObjAppendElement(NULL, plist, Tcl_NewListObj(2, tpair));
455
      }
456
      args.SetResult(plist);
457
    }
458
  }
459
 
460
  return kOK;
461
}
462
 
463
//------------------------------------------+-----------------------------------
464
//! FIXME_docs
465
 
466
int RtclRlinkConnect::M_errcnt(RtclArgs& args)
467
{
468
  static RtclNameSet optset("-clear");
469
  string opt;
470
  bool fclear = false;
471
 
472
  while (args.NextOpt(opt, optset)) {
473
    if (opt == "-clear") fclear = true;
474
  }
475
  if (!args.AllDone()) return kERR;
476
 
477 19 wfjm
  args.SetResult(int(Obj().Context().ErrorCount()));
478
  if (fclear) Obj().Context().ClearErrorCount();
479 10 wfjm
 
480
  return kOK;
481
}
482
 
483
//------------------------------------------+-----------------------------------
484
//! FIXME_docs
485
 
486
int RtclRlinkConnect::M_wtlam(RtclArgs& args)
487
{
488
  double tout;
489
  if (!args.GetArg("tout", tout, 0.001)) return kERR;
490
  if (!args.AllDone()) return kERR;
491
 
492
  RerrMsg emsg;
493
  double twait = Obj().WaitAttn(tout, emsg);
494
 
495
  if (twait == -2.) {
496 19 wfjm
    return args.Quit(emsg);
497 10 wfjm
  } else if (twait == -1.) {
498 11 wfjm
    if (Obj().GetLogOpts().printlevel >= 1) {
499 19 wfjm
      RlogMsg lmsg(Obj().LogFile());
500
      lmsg << "-- wtlam to=" << RosPrintf(tout, "f", 0,3)
501
           << " FAIL timeout" << endl;
502
      Obj().Context().IncErrorCount();
503 10 wfjm
      args.SetResult(tout);
504
      return kOK;
505
    }
506
  }
507
 
508 11 wfjm
  if (Obj().GetLogOpts().printlevel >= 3) {
509 19 wfjm
    RlogMsg lmsg(Obj().LogFile());
510
    lmsg << "-- wtlam to=" << RosPrintf(tout, "f", 0,3)
511
         << "  T=" << RosPrintf(twait, "f", 0,3)
512
         << "  OK" << endl;
513 10 wfjm
  }
514
 
515
  args.SetResult(twait);
516
  return kOK;
517
}
518
 
519
//------------------------------------------+-----------------------------------
520
//! FIXME_docs
521
 
522
int RtclRlinkConnect::M_oob(RtclArgs& args)
523
{
524
  static RtclNameSet optset("-rlmon|-rbmon|-sbcntl|-sbdata");
525
 
526
  string opt;
527
  uint16_t addr;
528
  uint16_t data;
529
  RerrMsg emsg;
530
 
531
  if (args.NextOpt(opt, optset)) {
532
    if        (opt == "-rlmon") {           // oob -rlmon (0|1)
533
      if (!args.GetArg("val", data, 1)) return kERR;
534
      if (!args.AllDone()) return kERR;
535
      addr = 15;                              // rlmon on bit 15
536 19 wfjm
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) return args.Quit(emsg);
537 10 wfjm
 
538
    } else if (opt == "-rbmon") {           // oob -rbmon (0|1)
539
      if (!args.GetArg("val", data, 1)) return kERR;
540
      if (!args.AllDone()) return kERR;
541
      addr = 14;                              // rbmon on bit 14
542 19 wfjm
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) return args.Quit(emsg);
543 10 wfjm
 
544
    } else if (opt == "-sbcntl") {          // oob -sbcntl bit (0|1)
545
      if (!args.GetArg("bit", addr, 15)) return kERR;
546
      if (!args.GetArg("val", data,  1)) return kERR;
547
      if (!args.AllDone()) return kERR;
548 19 wfjm
      if (!Obj().SndOob(0x00, (addr<<8)+data, emsg)) return args.Quit(emsg);
549 10 wfjm
 
550
    } else if (opt == "-sbdata") {          // oob -sbdata addr val
551
      if (!args.GetArg("bit", addr, 0x0ff)) return kERR;
552
      if (!args.GetArg("val", data)) return kERR;
553
      if (!args.AllDone()) return kERR;
554 19 wfjm
      if (!Obj().SndOob(addr, data, emsg)) return args.Quit(emsg);
555 10 wfjm
    }
556
  } else {
557 19 wfjm
    return args.Quit(
558
      "-E: missing option, one of -rlmon,-rbmon,-sbcntl,-sbdata");
559 10 wfjm
  }
560
 
561
  return kOK;
562
}
563
 
564
//------------------------------------------+-----------------------------------
565
//! FIXME_docs
566
 
567 19 wfjm
int RtclRlinkConnect::M_rawio(RtclArgs& args)
568
{
569
  size_t errcnt = 0;
570
  int rc = RtclRlinkPort::DoRawio(args, Obj().Port(), errcnt);
571
  Obj().Context().IncErrorCount(errcnt);
572
  return rc;
573
}
574
 
575
//------------------------------------------+-----------------------------------
576
//! FIXME_docs
577
 
578 10 wfjm
int RtclRlinkConnect::M_stats(RtclArgs& args)
579
{
580
  RtclStats::Context cntx;
581
  if (!RtclStats::GetArgs(args, cntx)) return kERR;
582 19 wfjm
  if (!RtclStats::Collect(args, cntx, Obj().Stats())) return kERR;
583 10 wfjm
  if (Obj().Port()) {
584 19 wfjm
    if (!RtclStats::Collect(args, cntx, Obj().Port()->Stats())) return kERR;
585 10 wfjm
  }
586
  return kOK;
587
}
588
 
589
//------------------------------------------+-----------------------------------
590
//! FIXME_docs
591
 
592
int RtclRlinkConnect::M_log(RtclArgs& args)
593
{
594
  string msg;
595
  if (!args.GetArg("msg", msg)) return kERR;
596
  if (!args.AllDone()) return kERR;
597
  if (Obj().GetLogOpts().printlevel != 0 ||
598
      Obj().GetLogOpts().dumplevel  != 0 ||
599
      Obj().GetLogOpts().tracelevel != 0) {
600 19 wfjm
    Obj().LogFile().Write(string("# ") + msg);
601 10 wfjm
  }
602
  return kOK;
603
}
604
 
605
//------------------------------------------+-----------------------------------
606
//! FIXME_docs
607
 
608
int RtclRlinkConnect::M_print(RtclArgs& args)
609
{
610
  if (!args.AllDone()) return kERR;
611
 
612
  ostringstream sos;
613
  Obj().Print(sos);
614
  args.SetResult(sos);
615
  return kOK;
616
}
617
 
618
//------------------------------------------+-----------------------------------
619
//! FIXME_docs
620
 
621
int RtclRlinkConnect::M_dump(RtclArgs& args)
622
{
623
  if (!args.AllDone()) return kERR;
624
 
625
  ostringstream sos;
626
  Obj().Dump(sos, 0);
627
  args.SetResult(sos);
628
  return kOK;
629
}
630
 
631
//------------------------------------------+-----------------------------------
632
//! FIXME_docs
633
 
634
int RtclRlinkConnect::M_config(RtclArgs& args)
635
{
636
  static RtclNameSet optset("-baseaddr|-basedata|-basestat|"
637
                            "-logfile|-logprintlevel|-logdumplevel|"
638
                            "-logtracelevel");
639
 
640
  RlinkConnect::LogOpts logopts = Obj().GetLogOpts();
641
 
642
  if (args.NDone() == (size_t)args.Objc()) {
643
    ostringstream sos;
644
    sos << "-baseaddr " << RosPrintf(logopts.baseaddr, "d")
645
        << " -basedata " << RosPrintf(logopts.basedata, "d")
646
        << " -basestat " << RosPrintf(logopts.basestat, "d")
647 19 wfjm
        << " -logfile {" << Obj().LogFile().Name() << "}"
648 10 wfjm
        << " -logprintlevel " << RosPrintf(logopts.printlevel, "d")
649
        << " -logdumplevel " << RosPrintf(logopts.dumplevel, "d")
650
        << " -logtracelevel " << RosPrintf(logopts.tracelevel, "d");
651
    args.AppendResult(sos);
652
    return kOK;
653
  }
654
 
655
  string opt;
656
  while (args.NextOpt(opt, optset)) {
657
    if        (opt == "-baseaddr") {        // -baseaddr ?base -----------------
658
      if (!ConfigBase(args, logopts.baseaddr)) return kERR;
659
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
660
 
661
    } else if (opt == "-basedata") {        // -basedata ?base -----------------
662
      if (!ConfigBase(args, logopts.basedata)) return kERR;
663
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
664
 
665
    } else if (opt == "-basestat") {        // -basestat ?base -----------------
666
      if (!ConfigBase(args, logopts.basestat)) return kERR;
667
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
668
 
669
    } else if (opt == "-logfile") {         // -logfile ?name ------------------
670 19 wfjm
      string name;
671
      if (!args.Config("??name", name)) return false;
672 10 wfjm
      if (args.NOptMiss() == 0) {             // new filename ?
673 19 wfjm
        if (name == "-" || name == "<cout>") {
674
          Obj().LogUseStream(&cout, "<cout>");
675 10 wfjm
        } else {
676 19 wfjm
          if (!Obj().LogOpen(name)) {
677
            Obj().LogUseStream(&cout, "<cout>");
678
            return args.Quit(string("-E: open failed for '") + name +
679
                             "', using stdout");
680 10 wfjm
          }
681
        }
682
      }
683
 
684
    } else if (opt == "-logprintlevel") {   // -logprintlevel ?loglevel --------
685
      if (!args.Config("??loglevel", logopts.printlevel, 3)) return false;
686
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
687
 
688
    } else if (opt == "-logdumplevel") {    // -logdumplevel ?loglevel ---------
689
      if (!args.Config("??loglevel", logopts.dumplevel, 3)) return false;
690
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
691
 
692
    } else if (opt == "-logtracelevel") {   // -logtracelevel ?loglevel --------
693
      if (!args.Config("??loglevel", logopts.tracelevel, 3)) return false;
694
      if (args.NOptMiss() == 0) Obj().SetLogOpts(logopts);
695
    }
696
  }
697
 
698
  if (!args.AllDone()) return kERR;
699
  return kOK;
700
}
701
 
702
//------------------------------------------+-----------------------------------
703
//! FIXME_docs
704
 
705
int RtclRlinkConnect::M_default(RtclArgs& args)
706
{
707
  if (!args.AllDone()) return kERR;
708
  ostringstream sos;
709
  const RlinkConnect::LogOpts& logopts = Obj().GetLogOpts();
710
 
711
  sos << "print base:  " << "addr " << RosPrintf(logopts.baseaddr, "d", 2)
712
      << "  data " << RosPrintf(logopts.basedata, "d", 2)
713
      << "  stat " << RosPrintf(logopts.basestat, "d", 2) << endl;
714 19 wfjm
  sos << "logfile:     " << Obj().LogFile().Name()
715 10 wfjm
      << "   printlevel " << logopts.printlevel
716
      << "   dumplevel " << logopts.dumplevel;
717
 
718
  args.AppendResultLines(sos);
719
  return kOK;
720
}
721
 
722
//------------------------------------------+-----------------------------------
723
//! FIXME_docs
724
 
725
bool RtclRlinkConnect::GetAddr(RtclArgs& args, RlinkConnect& conn,
726
                               uint16_t& addr)
727
{
728
  Tcl_Obj* pobj=0;
729
  if (!args.GetArg("addr", pobj)) return kERR;
730
 
731
  int tstint;
732
  // if a number is given..
733
  if (Tcl_GetIntFromObj(NULL, pobj, &tstint) == kOK) {
734
    if (tstint >= 0 && tstint <= 0x00ff) {
735
      addr = (uint16_t)tstint;
736
    } else {
737 19 wfjm
      args.AppendResult("-E: value '", Tcl_GetString(pobj),
738
                        "' for 'addr' out of range 0...0x00ff", NULL);
739 10 wfjm
      return false;
740
    }
741
  // if a name is given 
742
  } else {
743
    string name(Tcl_GetString(pobj));
744
    uint16_t tstaddr;
745
    if (Obj().AddrMap().Find(name, tstaddr)) {
746
      addr = tstaddr;
747
    } else {
748 19 wfjm
      args.AppendResult("-E: no address mapping known for '",
749
                        Tcl_GetString(pobj), "'", NULL);
750 10 wfjm
      return false;
751
    }
752
  }
753
 
754
  return true;
755
}
756
 
757
//------------------------------------------+-----------------------------------
758
//! FIXME_docs
759
 
760
bool RtclRlinkConnect::GetVarName(RtclArgs& args, const char* argname,
761
                                  size_t nind,
762
                                  std::vector<std::string>& varname)
763
{
764
  while (varname.size() < nind+1) varname.push_back(string());
765
  string name;
766
  if (!args.GetArg(argname, name)) return false;
767
  if (name.length()) {                      // if variable defined
768
    char c = name[0];
769
    if (isdigit(c) || c=='+' || c=='-' ) {  // check for mistaken number
770 19 wfjm
      args.AppendResult("-E: invalid variable name '", name.c_str(),
771
                        "': looks like a number", NULL);
772 10 wfjm
      return false;
773
    }
774
  }
775
 
776
  varname[nind] = name;
777
  return true;
778
}
779
 
780
//------------------------------------------+-----------------------------------
781
//! FIXME_docs
782
 
783 15 wfjm
bool RtclRlinkConnect::ConfigBase(RtclArgs& args, uint32_t& base)
784 10 wfjm
{
785 15 wfjm
  uint32_t tmp = base;
786 10 wfjm
  if (!args.Config("??base", tmp, 16, 2)) return false;
787
  if (tmp != base && tmp != 2 && tmp !=8 && tmp != 16) {
788 19 wfjm
    args.AppendResult("-E: base must be 2, 8, or 16, found '",
789
                      args.PeekArgString(-1), "'", NULL);
790
    return false;
791 10 wfjm
  }
792
  base = tmp;
793
  return true;
794
}
795
 
796
 
797
//------------------------------------------+-----------------------------------
798
//! FIXME_docs
799
 
800
bool RtclRlinkConnect::ClistNonEmpty(RtclArgs& args,
801
                                     const RlinkCommandList& clist)
802
{
803
  if (clist.Size() == 0) {
804 19 wfjm
    args.AppendResult("-E: -edata, -estat, or -volatile "
805
                      "not allowed on empty command list", NULL);
806 10 wfjm
    return false;
807
  }
808
  return true;
809
}
810
 
811 19 wfjm
} // end namespace Retro

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.