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

Subversion Repositories w11

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

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

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