DABC (Data Acquisition Backbone Core)  2.9.9
Parameter.cxx
Go to the documentation of this file.
1 // $Id: Parameter.cxx 4476 2020-04-15 14:12:38Z linev $
2 
3 /************************************************************
4  * The Data Acquisition Backbone Core (DABC) *
5  ************************************************************
6  * Copyright (C) 2009 - *
7  * GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
8  * Planckstr. 1, 64291 Darmstadt, Germany *
9  * Contact: http://dabc.gsi.de *
10  ************************************************************
11  * This software can be used under the GPL license *
12  * agreements as stated in LICENSE.txt file *
13  * which is part of the distribution. *
14  ************************************************************/
15 
16 #include "dabc/Parameter.h"
17 
18 #include <cstdio>
19 #include <cstdlib>
20 
21 #include "dabc/Manager.h"
22 
23 dabc::ParameterContainer::ParameterContainer(Reference worker, const std::string &name, const std::string &parkind, bool hidden) :
24  dabc::RecordContainer(worker, name, flIsOwner | (hidden ? flHidden : 0)),
25  fKind(parkind),
26  fLastChangeTm(),
27  fInterval(1.),
28  fAsynchron(false),
29  fStatistic(kindNone),
30  fRateValueSum(0.),
31  fRateTimeSum(0.),
32  fRateNumSum(0.),
33  fMonitored(false),
34  fRecorded(false),
35  fWaitWorker(false),
36  fAttrModified(false),
37  fDeliverAllEvents(false),
38  fRateWidth(5),
39  fRatePrec(1)
40 {
41  #ifdef DABC_EXTRA_CHECKS
42  DebugObject("Parameter", this, 10);
43  #endif
44 }
45 
47 {
48  #ifdef DABC_EXTRA_CHECKS
49  DebugObject("Parameter", this, -10);
50  #endif
51 }
52 
53 
55 {
56  std::string units = GetField("units").AsStr();
57 
58  LockGuard lock(ObjectMutex());
59  if (fStatistic==kindRate) {
60  if (units.empty()) units = "1/s";
61  else units += "/s";
62  }
63  return units;
64 }
65 
66 
68 {
69  LockGuard lock(ObjectMutex());
70  return fDeliverAllEvents;
71 }
72 
73 
75 {
76  return xmlValueAttr;
77 }
78 
79 
81 {
82  LockGuard lock(ObjectMutex());
83 
84  std::string n = name.empty() ? DefaultFiledName() : name;
85 
86  if (Fields().HasField(n)) return Fields().Field(n);
87 
88  return dabc::RecordField();
89 }
90 
91 
92 bool dabc::ParameterContainer::SetField(const std::string &_name, const RecordField &value)
93 {
94  bool res(false), fire(false), doworker(false);
95  double ratevalue(0.);
96  std::string svalue;
97 
98  std::string name = _name.empty() ? DefaultFiledName() : _name;
99  bool is_dflt_name = (name == DefaultFiledName());
100 
101  DOUT4("ParameterContainer::SetField %s dflt %s", name.c_str(), DBOOL(is_dflt_name));
102 
103  {
104  LockGuard lock(ObjectMutex());
105 
106  if (!_CanChangeField(name)) return false;
107 
108  doworker = fMonitored || fRecorded;
109 
110  // remember parameter kind
111 
112  if ((fStatistic!=kindNone) && is_dflt_name && !value.null()) {
113 
114  fRateValueSum += value.AsDouble();
115  fRateNumSum += 1.;
116 
117  // if rate calculated asynchron, do rest in timeout processing
118  if (fAsynchron) return true;
119 
120  TimeStamp tm = dabc::Now();
121 
122  if (fLastChangeTm.null()) fLastChangeTm = tm;
123 
124  fRateTimeSum = tm - fLastChangeTm;
125 
126  fire = _CalcRate(ratevalue, svalue);
127 
128  if (fire) {
129  fLastChangeTm = tm;
130  res = Fields().Field(name).SetDouble(ratevalue);
131  }
132 
133  } else {
134 
135  res = Fields().Field(name).SetValue(value);
136 
137  if (is_dflt_name) {
138  TimeStamp tm = dabc::Now();
139 
140  if (!fAsynchron)
141  if (fLastChangeTm.null() || (fInterval<=0.) || (tm > fLastChangeTm+fInterval)) {
142  fire = true;
143  svalue = Fields().Field(name).AsStr();
144  }
145 
146  if (fire) fLastChangeTm = tm;
147  }
148  }
149 
150  if (res && !is_dflt_name) {
151  // indicate that not only central value, but also parameter attributes were modified
152  fAttrModified = true;
153  }
154 
155  // we submit any signal to worker only when previous is processed
156  if ((fMonitored || fRecorded) && res && fire && !fWaitWorker) {
157  fWaitWorker = true;
158  doworker = true;
159  }
160  }
161 
162  // inform worker that parameter is changed
163  if (doworker) {
164  Worker* w = GetWorker();
165  if (w)
166  w->WorkerParameterChanged(false, this, svalue);
167  else
168  ConfirmFromWorker();
169  }
170 
171  if (fire && res) FireModified(svalue);
172 
173  DOUT4("ParameterContainer::SetField %s = %s res %s fire %s",
174  name.c_str(), value.AsStr().c_str(), DBOOL(res), DBOOL(fire));
175 
176  return res;
177 }
178 
180 {
181  LockGuard lock(ObjectMutex());
182 
183  fWaitWorker = false;
184 
185  unsigned res = 0;
186  if (fRecorded) res = res | 1;
187  if (fMonitored) res = res | 2;
188  return res;
189 }
190 
191 void dabc::ParameterContainer::FireModified(const std::string &svalue)
192 {
193  FireParEvent(parModified);
194 
195  int doout = GetDebugLevel();
196 
197  if (doout>=0)
198  dabc::Logger::Debug(doout, __FILE__, __LINE__, __func__, dabc::format("%s = %s %s", GetName(), svalue.c_str(), GetActualUnits().c_str()).c_str() );
199 }
200 
201 
203 {
204  if (!dabc::mgr.null())
205  dabc::mgr()->ProduceParameterEvent(this, id);
206 }
207 
208 
210 {
211  FireParEvent(parDestroy);
212 
214 }
215 
217 {
218  bool fire(false), res(false), doworker(false);
219  double value(0);
220  std::string svalue;
221 
222 // DOUT0("Par %s Process timeout !!!", GetName());
223 
224  {
225  LockGuard lock(ObjectMutex());
226 
227  if ((fStatistic!=kindNone) && fAsynchron) {
228  fRateTimeSum += last_dif;
229  fire = _CalcRate(value, svalue);
230  if (fire) {
231  fLastChangeTm = dabc::Now();
232  res = Fields().Field(DefaultFiledName()).SetDouble(value);
233  }
234  } else
235 
236  if (fAsynchron) {
237  fRateTimeSum += last_dif;
238 
239  if (!fLastChangeTm.null() && (fRateTimeSum>fInterval)) {
240  fire = true;
241  fLastChangeTm.Reset();
242  fRateTimeSum = 0.;
243  svalue = Fields().Field(DefaultFiledName()).AsStr();
244  }
245  }
246 
247  if ((fMonitored || fRecorded) && res && fire && !fWaitWorker) {
248  fWaitWorker = true;
249  doworker = true;
250  }
251  }
252 
253  if (doworker) {
254  Worker* w = GetWorker();
255  if (w) w->WorkerParameterChanged(false, this, svalue);
256  else ConfirmFromWorker();
257  }
258 
259  if (fire)
260  FireModified(svalue);
261 }
262 
263 bool dabc::ParameterContainer::_CalcRate(double& value, std::string& svalue)
264 {
265  if ((fRateTimeSum < fInterval) || (fRateTimeSum<1e-6)) return false;
266 
267  if (fStatistic==kindRate)
268  value = fRateValueSum / fRateTimeSum;
269  else
270  if ((fStatistic==kindAverage) && (fRateNumSum>0))
271  value = fRateValueSum / fRateNumSum;
272 
273  fRateValueSum = 0.;
274  fRateTimeSum = 0.;
275  fRateNumSum = 0.;
276 
277  dabc::formats(svalue, "%*.*f", fRateWidth, fRatePrec, value);
278 
279  return true;
280 }
281 
282 
283 void dabc::ParameterContainer::SetSynchron(bool on, double interval, bool everyevnt)
284 {
285  LockGuard lock(ObjectMutex());
286 
287  fAsynchron = !on;
288 
289  fInterval = interval > 0 ? interval : 0.;
290 
291  fDeliverAllEvents = everyevnt;
292 }
293 
295 {
296  Object *prnt = GetParent();
297  while (prnt) {
298  Worker* w = dynamic_cast<Worker*> (prnt);
299  if (w) return w;
300  prnt = prnt->GetParent();
301  }
302  return nullptr;
303 }
304 
305 const std::string &dabc::ParameterContainer::Kind() const
306 {
307  LockGuard lock(ObjectMutex());
308  return fKind;
309 }
310 
312 {
313  LockGuard lock(ObjectMutex());
314 
315  bool force_value_modified = false;
316 
317  // mark that we are producing rate
318  if (fStatistic == ParameterContainer::kindRate) {
319  cont->Field(dabc::prop_kind).SetStr("rate");
320  force_value_modified = true;
321  } else if (fKind == "cmddef") {
322  cont->Field(dabc::prop_kind).SetStr("DABC.Command");
323  cont->Field("_parcmddef").SetBool(true);
324  } else if (fKind == "info") {
325  cont->Field(dabc::prop_kind).SetStr("log");
326  } else if (Fields().HasField("#record")) {
327  force_value_modified = true;
328  }
329 
330  // just copy all fields, including value
331  cont->CopyFrom(Fields());
332 
333  if (force_value_modified && cont->HasField("value"))
334  cont->Field("value").SetModified(true);
335 }
336 
337 // --------------------------------------------------------------------------------
338 
340 {
341  LockGuard lock(ObjectMutex());
342 
343  return GetObject() ? GetObject()->fAsynchron : false;
344 }
345 
347 {
348  LockGuard lock(ObjectMutex());
349 
350  bool res = false;
351 
352  if (GetObject()) {
353  res = GetObject()->fAttrModified;
354  GetObject()->fAttrModified = false;
355  }
356 
357  return res;
358 }
359 
361 {
362  return GetObject() ? GetObject()->GetDebugLevel() : -1;
363 }
364 
365 dabc::Parameter& dabc::Parameter::SetRatemeter(bool synchron, double interval)
366 {
367 
368  if (GetObject()==0) return *this;
369 
370  GetObject()->fRateWidth = GetField("width").AsInt(GetObject()->fRateWidth);
371  GetObject()->fRatePrec = GetField("prec").AsInt(GetObject()->fRatePrec);
372 
373  {
374  LockGuard lock(ObjectMutex());
375 
376  GetObject()->fStatistic = ParameterContainer::kindRate;
377 
378  GetObject()->fInterval = interval;
379 
380  GetObject()->fAsynchron = !synchron;
381 
382  DOUT3("Asynchron = %s", DBOOL(GetObject()->fAsynchron));
383 
384  GetObject()->fRateValueSum = 0.;
385  GetObject()->fRateTimeSum = 0.;
386  GetObject()->fRateNumSum = 0.;
387  }
388 
389  FireConfigured();
390 
391  return *this;
392 }
393 
395 {
396  if (GetObject()==0) return *this;
397 
398  {
399  LockGuard lock(ObjectMutex());
400 
401  GetObject()->fStatistic = ParameterContainer::kindNone;
402 
403  GetObject()->fAsynchron = false;
404  }
405 
406  FireConfigured();
407 
408  return *this;
409 }
410 
412 {
413  if (GetObject()==0) return false;
414 
415  LockGuard lock(ObjectMutex());
416 
417  return GetObject()->fStatistic == ParameterContainer::kindRate;
418 }
419 
421 {
422  SetField("width", width);
423  SetField("prec", prec);
424 
425  if (GetObject()) {
426  LockGuard lock(ObjectMutex());
427  GetObject()->fRateWidth = width;
428  GetObject()->fRatePrec = prec;
429  }
430  return *this;
431 }
432 
433 
434 dabc::Parameter& dabc::Parameter::SetAverage(bool synchron, double interval)
435 {
436  if (GetObject()==0) return *this;
437 
438  GetObject()->fRateWidth = GetField("width").AsInt(GetObject()->fRateWidth);
439  GetObject()->fRatePrec = GetField("prec").AsInt(GetObject()->fRatePrec);
440 
441  {
442  LockGuard lock(ObjectMutex());
443 
444  GetObject()->fStatistic = ParameterContainer::kindAverage;
445 
446  GetObject()->fInterval = interval;
447 
448  GetObject()->fAsynchron = !synchron;
449 
450  DOUT3("Asynchron = %s", DBOOL(GetObject()->fAsynchron));
451 
452  GetObject()->fRateValueSum = 0.;
453  GetObject()->fRateTimeSum = 0.;
454  GetObject()->fRateNumSum = 0.;
455  }
456 
457  FireConfigured();
458 
459  return *this;
460 }
461 
463 {
464  if (GetObject()==0) return *this;
465 
466  {
467  LockGuard lock(ObjectMutex());
468 
469  GetObject()->fStatistic = ParameterContainer::kindNone;
470 
471  GetObject()->fAsynchron = false;
472  }
473 
474  FireConfigured();
475 
476  return *this;
477 
478 }
479 
480 
482 {
483  if (GetObject()==0) return false;
484 
485  LockGuard lock(ObjectMutex());
486 
487  return GetObject()->fStatistic == ParameterContainer::kindAverage;
488 }
489 
490 
491 dabc::Parameter &dabc::Parameter::SetSynchron(bool on, double interval, bool everyevnt)
492 {
493  if (GetObject()!=0)
494  GetObject()->SetSynchron(on, interval, everyevnt);
495 
496  FireConfigured();
497 
498  return *this;
499 }
500 
501 
503 {
504  return GetObject() ? GetObject()->GetWorker() : 0;
505 }
506 
507 
509 {
510  bool res = SetField("", cmd.GetField(CmdSetParameter::ParValue()));
511 
512  return res ? cmd_true : cmd_false;
513 }
514 
516 {
517  if (GetObject()==0) return false;
518 
519  LockGuard lock(ObjectMutex());
520 
521  return GetObject()->fMonitored;
522 }
523 
525 {
526  if (GetObject()!=0) {
527 
528  LockGuard lock(ObjectMutex());
529 
530  GetObject()->fMonitored = on;
531  }
532 
533  return *this;
534 }
535 
536 const std::string dabc::Parameter::Kind() const
537 {
538  if (GetObject()==0) return std::string();
539 
540  return GetObject()->Kind();
541 }
542 
543 const std::string dabc::Parameter::GetActualUnits() const
544 {
545  if (GetObject()==0) return std::string();
546 
547  return GetObject()->GetActualUnits();
548 }
549 
551 {
552  if (GetObject()) GetObject()->FireParEvent(parConfigured);
553 }
554 
556 {
557  if (GetObject())
558  GetObject()->FireModified(Value().AsStr());
559 }
560 
562 {
563  WorkerRef w = GetWorker();
564  if (w.null()) return SetValue(v);
565 
566  CmdSetParameter cmd(GetName(), v);
567 
568  return w.Submit(cmd);
569 }
570 
571 
572 // ========================================================================================
573 
575 {
576  return GetField("numargs").AsInt(0);
577 }
578 
579 std::string dabc::CommandDefinition::ArgName(int n) const
580 {
581  return GetField(dabc::format("arg%d",n)).AsStr();
582 }
583 
584 int dabc::CommandDefinition::FindArg(const std::string &name) const
585 {
586  int num = NumArgs();
587 
588  for (int n=0;n<num;n++)
589  if (ArgName(n)==name) return n;
590  return -1;
591 }
592 
593 dabc::CommandDefinition& dabc::CommandDefinition::AddArg(const std::string &name, const std::string &kind, bool required, const RecordField& dflt)
594 {
595  if (name.empty() || null()) return *this;
596 
597  int id = FindArg(name);
598 
599  if (id<0) {
600  id = NumArgs();
601  SetField("numargs", id+1);
602  }
603 
604  std::string prefix = dabc::format("arg%d",id);
605  SetField(prefix, name);
606 
607  if (!dflt.null())
608  SetField(prefix+"_dflt", dflt);
609 
610  SetField(prefix+"_kind", kind);
611 
612  if (required)
613  SetField(prefix+"_req", required);
614 
615  return *this;
616 }
617 
619 {
620  int id = FindArg(name);
621  if (id<0) return *this;
622 
623  std::string prefix = dabc::format("arg%d",id);
624 
625  SetField(prefix+"_min", min);
626  SetField(prefix+"_max", max);
627 
628  return *this;
629 }
630 
631 
632 bool dabc::CommandDefinition::GetArg(int n, std::string& name, std::string& kind, bool& required, std::string& dflt) const
633 {
634 
635  if ((n<0) || (n>=NumArgs())) return false;
636 
637  std::string prefix = dabc::format("arg%d",n);
638 
639  name = GetField(prefix).AsStr();
640 
641  kind = GetField(prefix+"_kind").AsStr();
642 
643  if (HasField(prefix+"_dflt"))
644  dflt = GetField(prefix+"_dflt").AsStr();
645  else
646  dflt = "";
647 
648  if (HasField(prefix+"_req"))
649  required = GetField(prefix+"_req").AsBool();
650  else
651  required = false;
652 
653  return true;
654 }
655 
657 {
658  dabc::Command cmd(GetName());
659 
660  int num = NumArgs();
661 
662  for (int n=0;n<num;n++) {
663  std::string name, kind, dflt;
664  bool required(false);
665  if (GetArg(n,name,kind,required, dflt))
666  if (required || !dflt.empty()) cmd.SetStr(name, dflt);
667  }
668 
669  return cmd;
670 }
671 
static const char * ParValue()
Definition: Manager.h:221
Command definition class.
Definition: Parameter.h:333
int FindArg(const std::string &name) const
Definition: Parameter.cxx:584
CommandDefinition & SetArgMinMax(const std::string &name, const RecordField &min, const RecordField &max)
Definition: Parameter.cxx:618
std::string ArgName(int n) const
Definition: Parameter.cxx:579
Command MakeCommand() const
Create command according command definition, all default and required parameters will be specified.
Definition: Parameter.cxx:656
bool GetArg(int n, std::string &name, std::string &kind, bool &required, std::string &dflt) const
Definition: Parameter.cxx:632
CommandDefinition & AddArg(const std::string &name, const std::string &kind="string", bool required=true, const RecordField &dflt=RecordField())
Definition: Parameter.cxx:593
Represents command with its arguments.
Definition: Command.h:99
bool SetStr(const std::string &name, const char *value)
Definition: Command.h:134
Lock guard for posix mutex.
Definition: threads.h:127
static void Debug(int level, const char *filename, unsigned linenumber, const char *funcname, const char *message)
Definition: logging.h:106
Base class for most of the DABC classes.
Definition: Object.h:116
Object * GetParent() const
Returns pointer on parent object, thread safe
Definition: Object.h:286
virtual void ObjectCleanup()
User method to cleanup object content before it will be destroyed Main motivation is to release any r...
Definition: Object.cxx:532
void SetSynchron(bool on, double interval=1., bool everyevnt=false)
Specifies that parameter produce 'modified' events synchronous with changes of parameter.
Definition: Parameter.cxx:283
virtual void ObjectCleanup()
User method to cleanup object content before it will be destroyed Main motivation is to release any r...
Definition: Parameter.cxx:209
unsigned ConfirmFromWorker()
Get confirmation from worker, which monitor parameters changes.
Definition: Parameter.cxx:179
const std::string GetActualUnits() const
Definition: Parameter.cxx:54
virtual void BuildFieldsMap(RecordFieldsMap *cont)
Save parameter attributes into container.
Definition: Parameter.cxx:311
void ProcessTimeout(double last_dif)
Method called from manager thread when parameter configured as asynchronous.
Definition: Parameter.cxx:216
virtual ~ParameterContainer()
Definition: Parameter.cxx:46
ParameterContainer(Reference worker, const std::string &name, const std::string &parkind="", bool hidden=false)
Definition: Parameter.cxx:23
Worker * GetWorker() const
Definition: Parameter.cxx:294
bool IsDeliverAllEvents() const
If true, all events must be delivered to the consumer.
Definition: Parameter.cxx:67
void FireModified(const std::string &svalue)
Internal method, used to inform system that parameter is modified If configured, also debug output wi...
Definition: Parameter.cxx:191
virtual std::string DefaultFiledName() const
Definition: Parameter.cxx:74
const std::string & Kind() const
Definition: Parameter.cxx:305
virtual RecordField GetField(const std::string &name) const
Definition: Parameter.cxx:80
void FireParEvent(int id)
Definition: Parameter.cxx:202
virtual bool SetField(const std::string &name, const RecordField &v)
Definition: Parameter.cxx:92
bool _CalcRate(double &value, std::string &svalue)
Definition: Parameter.cxx:263
Parameter class
Definition: Parameter.h:163
bool TakeAttrModified()
Returns true if any parameter attribute was modified since last call to this method.
Definition: Parameter.cxx:346
Parameter & SetMonitored(bool on=true)
Specify if parameter event should be delivered to the worker.
Definition: Parameter.cxx:524
Parameter & DisableRatemeter()
Disable ratemeter functionality.
Definition: Parameter.cxx:394
void FireConfigured()
Fire parConfigured event for parameter.
Definition: Parameter.cxx:550
Parameter & SetWidthPrecision(unsigned width, unsigned prec)
Set parameter to convert double values to the string - used for ratemeter.
Definition: Parameter.cxx:420
Parameter & SetAverage(bool synchron=false, double interval=1.0)
Converts parameter in statistic variable.
Definition: Parameter.cxx:434
int ExecuteChange(Command cmd)
Specifies that parameter produce 'modified' events synchronous with changes of parameter.
Definition: Parameter.cxx:508
bool SubmitSetValue(const RecordField &v)
Definition: Parameter.cxx:561
bool IsAverage() const
Returns true if average calculation is active.
Definition: Parameter.cxx:481
bool IsMonitored()
Returns true when parameter event should be delivered to the worker.
Definition: Parameter.cxx:515
const std::string GetActualUnits() const
Return actual units of parameter value, taking into account rate (1/s) unit when enabled.
Definition: Parameter.cxx:543
bool IsRatemeter() const
Returns true if rate measurement is activated.
Definition: Parameter.cxx:411
bool NeedTimeout()
Returns true if parameter object requires timeout processing.
Definition: Parameter.cxx:339
int GetDebugLevel() const
Definition: Parameter.cxx:360
Parameter & SetRatemeter(bool synchron=false, double interval=1.0)
Converts parameter in ratemeter - all values will be summed up and divided on specified interval.
Definition: Parameter.cxx:365
Parameter & DisableAverage()
Disables averaging functionality.
Definition: Parameter.cxx:462
Reference GetWorker() const
Returns reference on the worker.
Definition: Parameter.cxx:502
const std::string Kind() const
Definition: Parameter.cxx:536
Parameter & SetSynchron(bool on, double interval=1., bool everyevnt=false)
Indicate if parameter is should generate events synchron with code which modified it.
Definition: Parameter.cxx:491
void FireModified()
Can be called by user to signal framework that parameter was modified.
Definition: Parameter.cxx:555
Container for records fields.
Definition: Record.h:440
bool SetStr(const std::string &v)
Definition: Record.cxx:1127
bool SetBool(bool v)
Definition: Record.cxx:1060
std::string AsStr(const std::string &dflt="") const
Definition: Record.cxx:749
double AsDouble(double dflt=0.) const
Definition: Record.cxx:549
bool null() const
Definition: Record.h:302
void SetModified(bool on=true)
Definition: Record.h:305
void CopyFrom(const RecordFieldsMap &src, bool overwrite=true)
Copy fields from source map.
Definition: Record.cxx:1543
bool HasField(const std::string &name) const
Definition: Record.cxx:1382
RecordField & Field(const std::string &name)
Direct access to the fields.
Definition: Record.h:401
RecordField GetField(const std::string &name) const
Definition: Record.h:510
Reference on the arbitrary object
Definition: Reference.h:73
bool null() const
Returns true if reference contains nullptr.
Definition: Reference.h:151
Reference on dabc::Worker
Definition: Worker.h:466
bool Submit(Command cmd)
Definition: Worker.cxx:1139
Active object, which is working inside dabc::Thread.
Definition: Worker.h:116
void WorkerParameterChanged(bool forcecall, ParameterContainer *par, const std::string &value)
Method called by parameter object which is belong to the worker.
Definition: Worker.cxx:620
#define DOUT3(args ...)
Definition: logging.h:176
#define DBOOL(arg)
Definition: logging.h:191
#define DOUT4(args ...)
Definition: logging.h:182
XMLNodePointer_t GetParent(XMLNodePointer_t xmlnode)
Definition: XmlEngine.cxx:917
Event manipulation API.
Definition: api.h:23
const char * xmlValueAttr
Definition: ConfigBase.cxx:46
TimeStamp Now()
Definition: timing.h:260
void formats(std::string &sbuf, const char *fmt,...)
Definition: string.cxx:26
ManagerRef mgr
Definition: Manager.cxx:42
std::string format(const char *fmt,...)
Definition: string.cxx:49
@ parConfigured
event only for manager, used to react on reconfiguration of parameter
Definition: Parameter.h:42
@ parModified
produced when parameter value modified. Either every change or after time interval (default = 1 sec)
Definition: Parameter.h:43
@ parDestroy
produced once when parameter is destroyed
Definition: Parameter.h:44
const char * prop_kind
Definition: Hierarchy.cxx:29
@ cmd_false
Definition: Command.h:37
@ cmd_true
Definition: Command.h:38
Class for acquiring and holding timestamps.
Definition: timing.h:40