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

Subversion Repositories w11

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 22 wfjm
// $Id: RtclRlinkPort.cpp 521 2013-05-20 22:16:45Z mueller $
2 19 wfjm
//
3
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
//
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
// 2013-02-23   492   1.0.2  use RlogFile.Name();
17
// 2013-02-22   491   1.0.1  use new RlogFile/RlogMsg interfaces
18
// 2013-01-27   478   1.0    Initial version
19
// ---------------------------------------------------------------------------
20
 
21
/*!
22
  \file
23 22 wfjm
  \version $Id: RtclRlinkPort.cpp 521 2013-05-20 22:16:45Z mueller $
24 19 wfjm
  \brief   Implemenation of class RtclRlinkPort.
25
 */
26
 
27
#include <ctype.h>
28
 
29
#include <iostream>
30
 
31
#include "boost/bind.hpp"
32
 
33
#include "librtcltools/Rtcl.hpp"
34
#include "librtcltools/RtclOPtr.hpp"
35
#include "librtcltools/RtclNameSet.hpp"
36
#include "librtcltools/RtclStats.hpp"
37
#include "librtools/RosPrintf.hpp"
38
#include "librtools/RlogFile.hpp"
39
#include "librlink/RlinkPortFactory.hpp"
40
 
41
#include "RtclRlinkPort.hpp"
42
 
43
using namespace std;
44
 
45
/*!
46
  \class Retro::RtclRlinkPort
47
  \brief FIXME_docs
48
*/
49
 
50
// all method definitions in namespace Retro
51
namespace Retro {
52
 
53
//------------------------------------------+-----------------------------------
54
//! Default constructor
55
 
56
RtclRlinkPort::RtclRlinkPort(Tcl_Interp* interp, const char* name)
57
  : RtclProxyBase("RlinkPort"),
58
    fpObj(0),
59
    fspLog(new RlogFile(&cout, "<cout>")),
60
    fTraceLevel(0),
61
    fErrCnt(0)
62
{
63
  CreateObjectCmd(interp, name);
64
  AddMeth("open",     boost::bind(&RtclRlinkPort::M_open,    this, _1));
65
  AddMeth("close",    boost::bind(&RtclRlinkPort::M_close,   this, _1));
66
  AddMeth("errcnt",   boost::bind(&RtclRlinkPort::M_errcnt,  this, _1));
67
  AddMeth("rawio",    boost::bind(&RtclRlinkPort::M_rawio,   this, _1));
68
  AddMeth("stats",    boost::bind(&RtclRlinkPort::M_stats,   this, _1));
69
  AddMeth("log",      boost::bind(&RtclRlinkPort::M_log,     this, _1));
70
  AddMeth("dump",     boost::bind(&RtclRlinkPort::M_dump,    this, _1));
71
  AddMeth("config",   boost::bind(&RtclRlinkPort::M_config,  this, _1));
72
  AddMeth("$default", boost::bind(&RtclRlinkPort::M_default, this, _1));
73
}
74
 
75
//------------------------------------------+-----------------------------------
76
//! Destructor
77
 
78
RtclRlinkPort::~RtclRlinkPort()
79
{
80
  delete fpObj;
81
}
82
 
83
//------------------------------------------+-----------------------------------
84
//! FIXME_docs
85
 
86
int RtclRlinkPort::M_open(RtclArgs& args)
87
{
88
  string path;
89
 
90
  if (!args.GetArg("?path", path)) return kERR;
91
  if (!args.AllDone()) return kERR;
92
 
93
  RerrMsg emsg;
94
  if (args.NOptMiss() == 0) {               // open path
95
    delete fpObj;
96
    fpObj = RlinkPortFactory::Open(path, emsg);
97
    if (!fpObj) return args.Quit(emsg);
98
    fpObj->SetLogFile(fspLog);
99
    fpObj->SetTraceLevel(fTraceLevel);
100
  } else {                                  // open
101
    string name = (fpObj && fpObj->IsOpen()) ? fpObj->Url().Url() : string();
102
    args.SetResult(name);
103
  }
104
  return kOK;
105
}
106
 
107
//------------------------------------------+-----------------------------------
108
//! FIXME_docs
109
 
110
int RtclRlinkPort::M_close(RtclArgs& args)
111
{
112
  if (!args.AllDone()) return kERR;
113
  if (!TestOpen(args)) return kERR;
114
  delete fpObj;
115
  return kOK;
116
}
117
 
118
//------------------------------------------+-----------------------------------
119
//! FIXME_docs
120
 
121
int RtclRlinkPort::M_errcnt(RtclArgs& args)
122
{
123
  static RtclNameSet optset("-clear");
124
  string opt;
125
  bool fclear = false;
126
 
127
  while (args.NextOpt(opt, optset)) {
128
    if (opt == "-clear") fclear = true;
129
  }
130
  if (!args.AllDone()) return kERR;
131
 
132
  args.SetResult(int(fErrCnt));
133
  if (fclear) fErrCnt = 0;
134
 
135
  return kOK;
136
}
137
 
138
//------------------------------------------+-----------------------------------
139
//! FIXME_docs
140
 
141
int RtclRlinkPort::M_rawio(RtclArgs& args)
142
{
143
  return DoRawio(args, fpObj, fErrCnt);
144
}
145
 
146
//------------------------------------------+-----------------------------------
147
//! FIXME_docs
148
 
149
int RtclRlinkPort::M_stats(RtclArgs& args)
150
{
151
  RtclStats::Context cntx;
152
 
153
  if (!TestOpen(args)) return kERR;
154
  if (!RtclStats::GetArgs(args, cntx)) return kERR;
155
  if (!RtclStats::Collect(args, cntx, fpObj->Stats())) return kERR;
156
  return kOK;
157
}
158
 
159
//------------------------------------------+-----------------------------------
160
//! FIXME_docs
161
 
162
int RtclRlinkPort::M_log(RtclArgs& args)
163
{
164
  string msg;
165
  if (!args.GetArg("msg", msg)) return kERR;
166
  if (!args.AllDone()) return kERR;
167
  if (fTraceLevel != 0) fspLog->Write(string("# ") + msg);
168
  return kOK;
169
}
170
 
171
//------------------------------------------+-----------------------------------
172
//! FIXME_docs
173
 
174
int RtclRlinkPort::M_dump(RtclArgs& args)
175
{
176
  if (!args.AllDone()) return kERR;
177
  if (!TestOpen(args)) return kERR;
178
 
179
  ostringstream sos;
180
  fpObj->Dump(sos, 0);
181
  args.SetResult(sos);
182
  return kOK;
183
}
184
 
185
//------------------------------------------+-----------------------------------
186
//! FIXME_docs
187
 
188
int RtclRlinkPort::M_config(RtclArgs& args)
189
{
190
  static RtclNameSet optset("-logfile|-logtracelevel");
191
 
192
  if (args.NDone() == (size_t)args.Objc()) {
193
    ostringstream sos;
194
    sos << " -logfile {" << fspLog->Name() << "}"
195
        << " -logtracelevel " << RosPrintf(fTraceLevel, "d");
196
    args.AppendResult(sos);
197
    return kOK;
198
  }
199
 
200
  string opt;
201
  while (args.NextOpt(opt, optset)) {
202
    if        (opt == "-logfile") {         // -logfile ?name ------------------
203
      string name;
204
      if (!args.Config("??name", name)) return false;
205
      if (args.NOptMiss() == 0) {             // new filename ?
206
        if (name == "-" || name == "<cout>") {
207
          fspLog->UseStream(&cout, "<cout>");
208
        } else {
209
          if (!fspLog->Open(name)) {
210
            fspLog->UseStream(&cout, "<cout>");
211
            return args.Quit(string("-E: open failed for '") + name +
212
                             "', using stdout");
213
          }
214
        }
215
      }
216
    } else if (opt == "-logtracelevel") {   // -logtracelevel ?loglevel --------
217
      if (!args.Config("??loglevel", fTraceLevel, 3)) return false;
218
      if (fpObj) fpObj->SetTraceLevel(fTraceLevel);
219
    }
220
  }
221
 
222
  if (!args.AllDone()) return kERR;
223
  return kOK;
224
}
225
 
226
//------------------------------------------+-----------------------------------
227
//! FIXME_docs
228
 
229
int RtclRlinkPort::M_default(RtclArgs& args)
230
{
231
  if (!args.AllDone()) return kERR;
232
  ostringstream sos;
233
 
234
  sos << "logfile:     " << fspLog->Name()
235
      << "   tracelevel " << fTraceLevel;
236
 
237
  args.AppendResultLines(sos);
238
  return kOK;
239
}
240
 
241
//------------------------------------------+-----------------------------------
242
//! FIXME_docs
243
 
244
bool RtclRlinkPort::TestOpen(RtclArgs& args)
245
{
246
  if (fpObj) return true;
247
  args.AppendResult("-E: port not open", NULL);
248
  return false;
249
}
250
 
251
//------------------------------------------+-----------------------------------
252
//! FIXME_docs
253
 
254
int RtclRlinkPort::DoRawio(RtclArgs& args, RlinkPort* pport, size_t& errcnt)
255
{
256
  static RtclNameSet optset("-rblk|-wblk|-edata|-timeout");
257
 
258
  if (!pport || !pport->IsOpen()) args.Quit("-E: port not open");
259
 
260
  string opt;
261
  char mode = 0;
262
 
263
  int32_t rsize;
264
  string rvname;
265
  vector<uint8_t> rdata;
266
  vector<uint8_t> wdata;
267
  vector<uint8_t> edata;
268
  vector<uint8_t> emask;
269
  double timeout = 1.;
270
 
271
  while (args.NextOpt(opt, optset)) {
272
    if        (opt == "-rblk") {            // -rblk size ?varData ------------
273
      if (mode) return args.Quit("-E: only one -rblk or -wblk allowed");
274
      mode = 'r';
275
      if (!args.GetArg("bsize", rsize, 1, 256)) return kERR;
276
      if (!args.GetArg("??varData", rvname)) return kERR;
277
 
278
    } else if (opt == "-wblk") {            // -wblk block --------------------
279
      if (mode) return args.Quit("-E: only one -rblk or -wblk allowed");
280
      mode = 'w';
281
      if (!args.GetArg("data", wdata, 1, 256)) return kERR;
282
 
283
    } else if (opt == "-edata") {           // -edata data ?mask --------------
284
      if (mode != 'r') return args.Quit("-E: -edata only allowed after -rblk");
285
      if (!args.GetArg("data", edata, 0, rsize)) return kERR;
286
      if (!args.GetArg("??mask", emask, 0, rsize)) return kERR;
287
 
288
    } else if (opt == "-timeout") {         // -timeout tsec ------------------
289
      if (!args.GetArg("tsec", timeout, 0.)) return kERR;
290
    }
291
  }
292
 
293
  if (!args.AllDone()) return kERR;
294
 
295
  if (!mode) return args.Quit("-E: no -rblk or -wblk given");
296
 
297
  if (mode == 'r') {                        // handle -rblk ------------------
298
    RerrMsg emsg;
299
    double tused = 0.;
300
    rdata.resize(rsize);
301
    int irc = pport->RawRead(rdata.data(), rdata.size(), true, timeout,
302
                             tused, emsg);
303
    if (irc == RlinkPort::kErr) return args.Quit("-E: timeout on -rblk");
304
    if (irc != (int)rdata.size()) return args.Quit(emsg);
305
    if (rvname.length()) {
306 22 wfjm
      RtclOPtr pres(Rtcl::NewListIntObj(rdata));
307 19 wfjm
      if(!Rtcl::SetVar(args.Interp(), rvname, pres)) return kERR;
308
    }
309
    if (edata.size()) {
310
      size_t nerr=0;
311
      for (size_t i=0; i<rdata.size(); i++) {
312
        if (i >= edata.size()) break;
313
        uint8_t eval = edata[i];
314
        uint8_t emsk = (i < emask.size()) ? emask[i] : 0x0000;
315
        if ((rdata[i]|emsk) != (eval|emsk)) nerr += 1;
316
      }
317
      if (nerr) errcnt += 1;
318
    }
319
    args.SetResult(tused);
320
 
321
  } else {                                  // handle -wblk ------------------
322
    RerrMsg emsg;
323
    int irc = pport->RawWrite(wdata.data(), wdata.size(), emsg);
324
    if (irc != (int)wdata.size()) return args.Quit(emsg);
325
  }
326
 
327
  return kOK;
328
}
329
 
330
} // end namespace Retro

powered by: WebSVN 2.1.0

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