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

Subversion Repositories w11

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

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

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

powered by: WebSVN 2.1.0

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