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 20

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

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

powered by: WebSVN 2.1.0

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