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

Subversion Repositories w11

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

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

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

powered by: WebSVN 2.1.0

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