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

Subversion Repositories w11

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 wfjm
// $Id: RtclRlinkServer.cpp 662 2015-04-05 08:02:54Z mueller $
2 19 wfjm
//
3 30 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 30 wfjm
// 2015-04-04   662   1.1    add M_get, M_set; remove 'server -trace'
17 27 wfjm
// 2014-08-22   584   1.0.6  use nullptr
18 21 wfjm
// 2013-05-01   513   1.0.5  TraceLevel now uint32_t
19 20 wfjm
// 2013-04-26   510   1.0.4  change M_attn, now -info instead of -show
20
// 2013-04-21   509   1.0.3  add server -resume
21 19 wfjm
// 2013-02-05   483   1.0.2  ClassCmdConfig: use RtclArgs
22
// 2013-02-05   482   1.0.1  add shared_ptr to RlinkConnect object
23
// 2013-01-12   474   1.0    Initial version
24
// ---------------------------------------------------------------------------
25
 
26
/*!
27
  \file
28 30 wfjm
  \version $Id: RtclRlinkServer.cpp 662 2015-04-05 08:02:54Z mueller $
29 19 wfjm
  \brief   Implemenation of class RtclRlinkServer.
30
 */
31
 
32
#include <ctype.h>
33
 
34
#include <stdexcept>
35
#include <iostream>
36
#include <vector>
37
#include <string>
38
#include <memory>
39
 
40
#include "boost/bind.hpp"
41
 
42
#include "librtools/RosPrintBvi.hpp"
43
#include "librtcltools/Rtcl.hpp"
44
#include "librtcltools/RtclOPtr.hpp"
45
#include "librtcltools/RtclStats.hpp"
46
#include "librtcltools/RtclContext.hpp"
47
#include "RtclRlinkConnect.hpp"
48
 
49
#include "RtclRlinkServer.hpp"
50
 
51
using namespace std;
52
 
53
/*!
54
  \class Retro::RtclRlinkServer
55
  \brief FIXME_docs
56
*/
57
 
58
// all method definitions in namespace Retro
59
namespace Retro {
60
 
61
//------------------------------------------+-----------------------------------
62
//! Default constructor
63
 
64
RtclRlinkServer::RtclRlinkServer(Tcl_Interp* interp, const char* name)
65
  : RtclProxyOwned<RlinkServer>("RlinkServer", interp, name,
66
                                new RlinkServer()),
67 30 wfjm
    fspConn(),
68
    fGets(),
69
    fSets()
70 19 wfjm
{
71
  AddMeth("server",   boost::bind(&RtclRlinkServer::M_server,  this, _1));
72
  AddMeth("attn",     boost::bind(&RtclRlinkServer::M_attn,    this, _1));
73
  AddMeth("stats",    boost::bind(&RtclRlinkServer::M_stats,   this, _1));
74
  AddMeth("print",    boost::bind(&RtclRlinkServer::M_print,   this, _1));
75
  AddMeth("dump",     boost::bind(&RtclRlinkServer::M_dump,    this, _1));
76 30 wfjm
  AddMeth("get",      boost::bind(&RtclRlinkServer::M_get,     this, _1));
77
  AddMeth("set",      boost::bind(&RtclRlinkServer::M_set,     this, _1));
78 19 wfjm
  AddMeth("$default", boost::bind(&RtclRlinkServer::M_default, this, _1));
79 30 wfjm
 
80
  // attributes of RlinkConnect
81
  RlinkServer* pobj  = &Obj();
82
  fGets.Add<uint32_t>  ("tracelevel",
83
                        boost::bind(&RlinkServer::TraceLevel, pobj));
84
 
85
  fSets.Add<uint32_t>  ("tracelevel",
86
                        boost::bind(&RlinkServer::SetTraceLevel, pobj, _1));
87
 
88
  // attributes of buildin RlinkContext
89
  RlinkContext* pcntx = &Obj().Context();
90
  fGets.Add<bool>      ("statchecked",
91
                        boost::bind(&RlinkContext::StatusIsChecked, pcntx));
92
  fGets.Add<uint8_t>   ("statvalue",
93
                        boost::bind(&RlinkContext::StatusValue, pcntx));
94
  fGets.Add<uint8_t>   ("statmask",
95
                        boost::bind(&RlinkContext::StatusMask, pcntx));
96
 
97
  fSets.Add<uint8_t>   ("statvalue",
98
                        boost::bind(&RlinkContext::SetStatusValue, pcntx, _1));
99
  fSets.Add<uint8_t>   ("statmask",
100
                        boost::bind(&RlinkContext::SetStatusMask, pcntx, _1));
101 19 wfjm
}
102
 
103
//------------------------------------------+-----------------------------------
104
//! Destructor
105
 
106
RtclRlinkServer::~RtclRlinkServer()
107
{
108
  for (alist_it_t it = fAttnHdl.begin(); it != fAttnHdl.end(); it++) {
109
    delete (*it);
110
  }
111
}
112
 
113
//------------------------------------------+-----------------------------------
114
//! FIXME_docs
115
 
116
int RtclRlinkServer::ClassCmdConfig(RtclArgs& args)
117
{
118
  string parent;
119
  if (!args.GetArg("parent", parent)) return kERR;
120
 
121
  // locate RlinkConnect proxy and object -> setup Server->Connect linkage
122
  RtclProxyBase* pprox = RtclContext::Find(args.Interp()).FindProxy(
123
                            "RlinkConnect", parent);
124 29 wfjm
  if (pprox == nullptr)
125 19 wfjm
    return args.Quit(string("-E: object '") + parent +
126
                     "' not found or not type RlinkConnect");
127
 
128
  // make RtclRlinkServer object be co-owner of RlinkConnect object
129
  fspConn = dynamic_cast<RtclRlinkConnect*>(pprox)->ObjSPtr();
130
  // set RlinkConnect in RlinkServer (make RlinkServer also co-owner)
131
  Obj().SetConnect(fspConn);
132
 
133
  return kOK;
134
}
135
 
136
//------------------------------------------+-----------------------------------
137
//! FIXME_docs
138
 
139
int RtclRlinkServer::M_server(RtclArgs& args)
140
{
141 30 wfjm
  static RtclNameSet optset("-start|-stop|-resume|-test");
142 19 wfjm
  string opt;
143
  if (args.NextOpt(opt, optset)) {
144
    if        (opt == "-start") {           // server -start
145
      if (!args.AllDone()) return kERR;
146
      Obj().Start();
147
    } else if (opt == "-stop") {            // server -stop
148
      if (!args.AllDone()) return kERR;
149
      Obj().Stop();
150 20 wfjm
    } else if (opt == "-resume") {          // server -resume
151
      if (!args.AllDone()) return kERR;
152
      Obj().Resume();
153 19 wfjm
    } else if (opt == "-test") {            // server -test
154
      if (!args.AllDone()) return kERR;
155
      args.SetResult(Obj().IsActive());
156
    }
157
 
158
  } else {                                  // server
159
    if (!args.OptValid()) return kERR;
160
    if (!args.AllDone()) return kERR;
161
    args.SetResult(Obj().IsActive());
162
  }
163
 
164
  return kOK;
165
}
166
 
167
//------------------------------------------+-----------------------------------
168
//! FIXME_docs
169
 
170
int RtclRlinkServer::M_attn(RtclArgs& args)
171
{
172 20 wfjm
  static RtclNameSet optset("-add|-remove|-info|-test|-list");
173 19 wfjm
 
174
  Tcl_Interp* interp = args.Interp();
175
 
176
  string opt;
177
 
178
  if (args.NextOpt(opt, optset)) {
179
    if        (opt == "-add") {             // attn -add mask script
180
      uint16_t mask=0;
181
      Tcl_Obj* script=0;
182
      if (!args.GetArg("mask", mask,0xff,1)) return kERR;
183
      if (!args.GetArg("script", script)) return kERR;
184
      if (!args.AllDone()) return kERR;
185
 
186
      unique_ptr<RtclAttnShuttle> p(new RtclAttnShuttle(mask, script));
187
      try {
188
        p->Add(&Obj(), interp);
189
      } catch (exception& e) {
190
        return args.Quit(string("-E: handler rejected: ")+e.what());
191
      }
192
      fAttnHdl.push_back(p.release());
193
      return kOK;
194
 
195
    } else if (opt == "-remove") {            // attn -remove mask
196
      uint16_t mask=0;
197
      if (!args.GetArg("mask", mask)) return kERR;
198
      if (!args.AllDone()) return kERR;
199
      for (alist_it_t it = fAttnHdl.end(); it != fAttnHdl.begin(); ) {
200
        it--;
201
        if ((*it)->Mask() == mask) {
202
          fAttnHdl.erase(it);
203
          delete (*it);
204
          return kOK;
205
        }
206
      }
207
      return args.Quit(string("-E: no handler defined for '") +
208
                       args.PeekArgString(-1) + "'");
209
 
210 20 wfjm
    } else if (opt == "-info") {            // attn -info mask
211 19 wfjm
      uint16_t mask=0;
212
      if (!args.GetArg("mask", mask)) return kERR;
213
      if (!args.AllDone()) return kERR;
214 29 wfjm
      RtclOPtr pres(Tcl_NewListObj(0,nullptr));
215 20 wfjm
      for (alist_it_t it = fAttnHdl.begin(); it != fAttnHdl.end(); it++) {
216
        if ((*it)->Mask() & mask) {
217 29 wfjm
          RtclOPtr pele(Tcl_NewListObj(0,nullptr));
218 27 wfjm
          Tcl_ListObjAppendElement(nullptr, pele,
219
                                   Tcl_NewIntObj((*it)->Mask()) );
220
          Tcl_ListObjAppendElement(nullptr, pele, (*it)->Script() );
221
          Tcl_ListObjAppendElement(nullptr, pres, pele);
222 20 wfjm
        }
223
      }
224
      args.SetResult(pres);
225
      return kOK;
226
 
227
    } else if (opt == "-test") {            // attn -test mask
228
      uint16_t mask=0;
229
      if (!args.GetArg("mask", mask)) return kERR;
230
      if (!args.AllDone()) return kERR;
231 19 wfjm
      int nhdl = 0;
232
      for (alist_it_t it = fAttnHdl.begin(); it != fAttnHdl.end(); it++) {
233
        if ((*it)->Mask() & mask) {
234
          nhdl += 1;
235 20 wfjm
          int rc = Tcl_EvalObjEx(interp, (*it)->Script(), TCL_EVAL_GLOBAL);
236
          if (rc != kOK) return rc;
237 19 wfjm
        }
238
      }
239
      if (nhdl) return kOK;
240
      return args.Quit(string("-E: no handler defined for '") +
241
                       args.PeekArgString(-1) + "'");
242
 
243
    } else if (opt == "-list") {            // attn -list
244
      if (!args.AllDone()) return kERR;
245
      vector<uint16_t> vres;
246
      for (alist_it_t it = fAttnHdl.begin(); it != fAttnHdl.end(); it++) {
247
        vres.push_back((*it)->Mask());
248
      }
249
      args.SetResult(Rtcl::NewListIntObj(vres));
250
    }
251
 
252
  } else {                                  // attn
253
    if (!args.OptValid()) return kERR;
254
    if (!args.AllDone()) return kERR;
255
    uint16_t mask=0;
256
    for (alist_it_t it = fAttnHdl.begin(); it != fAttnHdl.end(); it++) {
257
      mask |= (*it)->Mask();
258
    }
259
    args.SetResult(mask);
260
  }
261
 
262
  return kOK;
263
}
264
 
265
//------------------------------------------+-----------------------------------
266
//! FIXME_docs
267
 
268
int RtclRlinkServer::M_stats(RtclArgs& args)
269
{
270
  RtclStats::Context cntx;
271
  if (!RtclStats::GetArgs(args, cntx)) return kERR;
272
  if (!RtclStats::Collect(args, cntx, Obj().Stats())) return kERR;
273
  return kOK;
274
}
275
 
276
//------------------------------------------+-----------------------------------
277
//! FIXME_docs
278
 
279
int RtclRlinkServer::M_print(RtclArgs& args)
280
{
281
  if (!args.AllDone()) return kERR;
282
 
283
  ostringstream sos;
284
  Obj().Print(sos);
285
  args.SetResult(sos);
286
  return kOK;
287
}
288
 
289
//------------------------------------------+-----------------------------------
290
//! FIXME_docs
291
 
292
int RtclRlinkServer::M_dump(RtclArgs& args)
293
{
294
  if (!args.AllDone()) return kERR;
295
 
296
  ostringstream sos;
297
  Obj().Dump(sos, 0);
298
  args.SetResult(sos);
299
  return kOK;
300
}
301
 
302
//------------------------------------------+-----------------------------------
303
//! FIXME_docs
304
 
305 30 wfjm
int RtclRlinkServer::M_get(RtclArgs& args)
306
{
307
  // synchronize with server thread (really needed ??)
308
  boost::lock_guard<RlinkConnect> lock(Obj().Connect());
309
  return fGets.M_get(args);
310
}
311
 
312
//------------------------------------------+-----------------------------------
313
//! FIXME_docs
314
 
315
int RtclRlinkServer::M_set(RtclArgs& args)
316
{
317
  // synchronize with server thread (really needed ??)
318
  boost::lock_guard<RlinkConnect> lock(Obj().Connect());
319
  return fSets.M_set(args);
320
}
321
 
322
//------------------------------------------+-----------------------------------
323
//! FIXME_docs
324
 
325 19 wfjm
int RtclRlinkServer::M_default(RtclArgs& args)
326
{
327
  if (!args.AllDone()) return kERR;
328
  ostringstream sos;
329
  sos << "no default output defined yet...\n";
330
  args.AppendResultLines(sos);
331
  return kOK;
332
}
333
 
334
} // end namespace Retro

powered by: WebSVN 2.1.0

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