cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
mtsInterfaceRequired.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3 
4 /*
5 
6  Author(s): Peter Kazanzides, Anton Deguet
7  Created on: 2008-11-13
8 
9  (C) Copyright 2008-2013 Johns Hopkins University (JHU), All Rights Reserved.
10 
11 --- begin cisst license - do not edit ---
12 
13 This software is provided "as is" under an open source license, with
14 no warranty. The complete license can be found in license.txt and
15 http://www.cisst.org/cisst/license.txt.
16 
17 --- end cisst license ---
18 */
19 
20 
21 #ifndef _mtsInterfaceRequired_h
22 #define _mtsInterfaceRequired_h
23 
25 
28 
30 
38 
40 
41 // Always include last
43 
45 
86 {
88 
89  friend class mtsComponentProxy;
90  friend class mtsComponentInterfaceProxyClient;
91  friend class mtsManagerLocal;
92  friend class mtsManagerLocalTest;
93  friend class mtsEventReceiverBase;
95  // for GetDescription
96  friend class mtsSocketProxyClient;
97  // for MailBox
98  friend class mtsSocketProxyServer;
99 
100  protected:
101 
104 
107 
110 
112  size_t MailBoxSize;
113 
116 
118  mtsInterfaceRequired(void);
119 
123 
125  osaThreadSignal * GetThreadSignal(void);
126 
127  public:
128 
131  enum {DEFAULT_MAIL_BOX_AND_ARGUMENT_QUEUES_SIZE = 64};
132 
146  mtsInterfaceRequired(const std::string & interfaceName, mtsComponent * component,
147  mtsMailBox * mailBox, mtsRequiredType required = MTS_REQUIRED);
148 
150  virtual ~mtsInterfaceRequired();
151 
152  const mtsInterfaceProvided * GetConnectedInterface(void) const;
153 
164  bool SetMailBoxSize(size_t desiredSize);
165 
180  bool SetArgumentQueuesSize(size_t desiredSize);
181 
185  bool SetMailBoxAndArgumentQueuesSize(size_t desiredSize);
186 
189  virtual std::vector<std::string> GetNamesOfFunctions(void) const;
190  virtual std::vector<std::string> GetNamesOfFunctionsVoid(void) const;
191  virtual std::vector<std::string> GetNamesOfFunctionsVoidReturn(void) const;
192  virtual std::vector<std::string> GetNamesOfFunctionsWrite(void) const;
193  virtual std::vector<std::string> GetNamesOfFunctionsWriteReturn(void) const;
194  virtual std::vector<std::string> GetNamesOfFunctionsRead(void) const;
195  virtual std::vector<std::string> GetNamesOfFunctionsQualifiedRead(void) const;
197 
200  mtsFunctionVoid * GetFunctionVoid(const std::string & functionName) const;
201  mtsFunctionVoidReturn * GetFunctionVoidReturn(const std::string & functionName) const;
202  mtsFunctionWrite * GetFunctionWrite(const std::string & functionName) const;
203  mtsFunctionWriteReturn * GetFunctionWriteReturn(const std::string & functionName) const;
204  mtsFunctionRead * GetFunctionRead(const std::string & functionName) const;
205  mtsFunctionQualifiedRead * GetFunctionQualifiedRead(const std::string & functionName) const;
207 
210  virtual std::vector<std::string> GetNamesOfEventHandlersVoid(void) const;
211  virtual std::vector<std::string> GetNamesOfEventHandlersWrite(void) const;
213 
216  virtual mtsCommandVoid * GetEventHandlerVoid(const std::string & eventName) const;
217  virtual mtsCommandWriteBase * GetEventHandlerWrite(const std::string & eventName) const;
219 
220  /* adeguet - seems deprecated or at least not used anywhere?
221  inline bool CouldConnectTo(mtsInterfaceProvided * CMN_UNUSED(interfaceProvidedOrOutput)) {
222  return true;
223  } */
224 
225  bool ConnectTo(mtsInterfaceProvided * interfaceProvided); // used by mtsManagerComponentClient.cpp
226  // bool Disconnect(void) { return DetachCommands(); } // Should be deprecated -- adeguet1 OrOutput
227 
229  mtsRequiredType IsRequired(void) const;
230 
238  bool AddSystemEventHandlers(void);
239 
240  private:
241  void BlockingCommandExecutedHandler(void);
242  void BlockingCommandReturnExecutedHandler(void);
243 
244  bool BindCommands(const mtsInterfaceProvided * interfaceProvided);
245  bool DetachCommands(void); // used by mtsManagerComponentClient
246 
247  void GetEventList(mtsEventHandlerList & eventList);
248  bool CheckEventList(mtsEventHandlerList & eventList) const;
249  public:
250 
251  void DisableAllEvents(void);
252 
253  void EnableAllEvents(void);
254 
256  size_t ProcessMailBoxes(void);
257 
259  void ToStream(std::ostream & outputStream) const;
260 
261  protected:
262  public: // adeguet1 todo fix -- this has been added for ostream << operator
263 #ifndef SWIG // SWIG cannot deal with this
264  template <class _PointerType>
266  {
267  // For GCM UI
268  friend class mtsManagerLocal;
269  friend class mtsInterfaceRequired;
270  protected:
271  _PointerType * Pointer;
273  public:
274  FunctionOrReceiverInfo(_PointerType & func_or_recv, mtsRequiredType required):
275  Pointer(&func_or_recv),
276  Required(required)
277  {}
278 
280 
281  inline void Detach(void) {
282  Pointer->Detach();
283  }
284 
285  void ToStream(std::ostream & outputStream) const
286  {
287  outputStream << *Pointer;
288  if (Required == MTS_OPTIONAL) {
289  outputStream << " (optional)";
290  } else {
291  outputStream << " (required)";
292  }
293  }
294  };
295 
299 
300 #endif // !SWIG
301  protected:
302 
308  const std::string & methodName,
309  const std::string & eventName);
310 
311  bool AddEventHandlerToReceiver(const std::string & eventName, mtsCommandVoid * handler) const;
312  bool AddEventHandlerToReceiver(const std::string & eventName, mtsCommandWriteBase * handler) const;
313 
315 
318 
320  FunctionInfoMapType FunctionsVoidReturn; // Void return (command)
321 
324 
326  FunctionInfoMapType FunctionsWriteReturn; // Write return (command)
327 
329  FunctionInfoMapType FunctionsRead; // Read (state read)
330 
332  FunctionInfoMapType FunctionsQualifiedRead; // Qualified Read (conversion, read at time index, ...)
333 
336 
339 
342 
348 
350  void GetDescription(mtsInterfaceRequiredDescription & requiredInterfaceDescription);
351 
352  public:
353 
354  bool AddFunction(const std::string & functionName, mtsFunctionVoid & function, mtsRequiredType required = MTS_REQUIRED);
355 
356  bool AddFunction(const std::string & functionName, mtsFunctionVoidReturn & function, mtsRequiredType required = MTS_REQUIRED);
357 
358  bool AddFunction(const std::string & functionName, mtsFunctionWrite & function, mtsRequiredType required = MTS_REQUIRED);
359 
360  bool AddFunction(const std::string & functionName, mtsFunctionWriteReturn & function, mtsRequiredType required = MTS_REQUIRED);
361 
362  bool AddFunction(const std::string & functionName, mtsFunctionRead & function, mtsRequiredType required = MTS_REQUIRED);
363 
364  bool AddFunction(const std::string & functionName, mtsFunctionQualifiedRead & function, mtsRequiredType required = MTS_REQUIRED);
365 
366  bool AddEventReceiver(const std::string & eventName, mtsEventReceiverVoid & receiver, mtsRequiredType required = MTS_REQUIRED);
367 
368  bool AddEventReceiver(const std::string & eventName, mtsEventReceiverWrite & receiver, mtsRequiredType required = MTS_REQUIRED);
369 
371  const std::string & eventName,
373  template <class __classType>
374  inline mtsCommandVoid * AddEventHandlerVoid(void (__classType::*method)(void),
375  __classType * classInstantiation,
376  const std::string & eventName,
378  mtsCallableVoidBase * callable = new mtsCallableVoidMethod<__classType>(method, classInstantiation);
379  return this->AddEventHandlerVoid(callable, eventName, queueingPolicy);
380  }
381 
382  inline mtsCommandVoid * AddEventHandlerVoid(void (*function)(void),
383  const std::string & eventName,
385  mtsCallableVoidBase * callable = new mtsCallableVoidFunction(function);
386  return this->AddEventHandlerVoid(callable, eventName, queueingPolicy);
387  }
388 
389  template <class __classType, class __argumentType>
390  inline mtsCommandWriteBase * AddEventHandlerWrite(void (__classType::*method)(const __argumentType &),
391  __classType * classInstantiation,
392  const std::string & eventName,
394 
395  template <class __classType>
396  inline mtsCommandWriteBase * AddEventHandlerWriteGeneric(void (__classType::*method)(const mtsGenericObject &),
397  __classType * classInstantiation,
398  const std::string & eventName,
400  mtsGenericObject *argumentPrototype = 0);
401 
402  bool RemoveEventHandlerVoid(const std::string & eventName);
403  bool RemoveEventHandlerWrite(const std::string & eventName);
404 };
405 
406 
407 #ifndef SWIG
408 template <class __classType, class __argumentType>
409 inline mtsCommandWriteBase * mtsInterfaceRequired::AddEventHandlerWrite(void (__classType::*method)(const __argumentType &),
410  __classType * classInstantiation,
411  const std::string & eventName,
412  mtsEventQueueingPolicy queueingPolicy)
413 {
414  bool queued = this->UseQueueBasedOnInterfacePolicy(queueingPolicy, "AddEventHandlerWrite", eventName);
415  mtsCommandWriteBase * actualCommand =
416  new mtsCommandWrite<__classType, __argumentType>(method, classInstantiation, eventName, __argumentType());
417  if (queued) {
418  if (MailBox)
420  else
421  CMN_LOG_CLASS_INIT_ERROR << "No mailbox for queued event handler write \"" << eventName << "\"" << std::endl;
422  } else {
423  EventHandlersWrite.AddItem(eventName, actualCommand);
424  }
425  mtsCommandWriteBase *handler = EventHandlersWrite.GetItem(eventName);
426  AddEventHandlerToReceiver(eventName, handler); // does nothing if event receiver does not exist
427  return handler;
428 }
429 
430 
431 template <class __classType>
433  __classType * classInstantiation,
434  const std::string & eventName,
435  mtsEventQueueingPolicy queueingPolicy,
436  mtsGenericObject *argumentPrototype)
437 {
438  bool queued = this->UseQueueBasedOnInterfacePolicy(queueingPolicy, "AddEventHandlerWriteGeneric", eventName);
439  mtsCommandWriteBase * actualCommand =
440  new mtsCommandWriteGeneric<__classType>(method, classInstantiation, eventName, argumentPrototype);
441  if (queued) {
442  // PK: check for MailBox overlaps with code in UseQueueBasedOnInterfacePolicy
443  if (MailBox) {
445  if (argumentPrototype)
446  tmp->SetArgumentPrototype(argumentPrototype);
447  EventHandlersWrite.AddItem(eventName, tmp);
448  } else {
449  CMN_LOG_CLASS_INIT_ERROR << "No mailbox for queued event handler write generic \"" << eventName << "\"" << std::endl;
450  }
451  } else {
452  EventHandlersWrite.AddItem(eventName, actualCommand);
453  }
454  mtsCommandWriteBase *handler = EventHandlersWrite.GetItem(eventName);
455  AddEventHandlerToReceiver(eventName, handler); // does nothing if event receiver does not exist
456  return handler;
457 }
458 #endif // !SWIG
459 
460 
462 inline std::ostream & operator << (std::ostream & output,
463  const mtsInterfaceRequired::FunctionInfo & functionInfo) {
464  functionInfo.ToStream(output);
465  return output;
466 }
467 
469 
470 
471 #endif // _mtsInterfaceRequired_h
#define CISST_EXPORT
Definition: cmnExportMacros.h:50
Definition: mtsEventReceiver.h:143
Defines base class for a queued void command.
FunctionInfoMapType FunctionsQualifiedRead
Definition: mtsInterfaceRequired.h:332
Definition: mtsParameterTypesOld.h:41
void ToStream(std::ostream &outputStream) const
Definition: mtsInterfaceRequired.h:285
Definition: mtsFunctionRead.h:37
EventHandlerVoidMapType EventHandlersVoid
Definition: mtsInterfaceRequired.h:346
FunctionInfoMapType FunctionsVoidReturn
Definition: mtsInterfaceRequired.h:320
Definition: mtsSocketProxyClient.h:72
FunctionInfoMapType FunctionsWriteReturn
Definition: mtsInterfaceRequired.h:326
_PointerType * Pointer
Definition: mtsInterfaceRequired.h:271
Definition: mtsCommandVoid.h:44
Definition: mtsForwardDeclarations.h:49
FunctionOrReceiverInfo< mtsFunctionBase > FunctionInfo
Definition: mtsInterfaceRequired.h:296
mtsCommandVoid * AddEventHandlerVoid(void(*function)(void), const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
Definition: mtsInterfaceRequired.h:382
bool AddEventHandlerToReceiver(const std::string &eventName, mtsCommandVoid *handler) const
Definition: mtsForwardDeclarations.h:52
Definition: mtsCallableVoidBase.h:39
Definition: mtsFunctionQualifiedRead.h:37
cmnNamedMap< ReceiverWriteInfo > EventReceiverWriteMapType
Definition: mtsInterfaceRequired.h:335
Definition: mtsInterfaceRequired.h:85
Definition: mtsInterfaceRequired.h:265
FunctionInfoMapType FunctionsVoid
Definition: mtsInterfaceRequired.h:317
~FunctionOrReceiverInfo()
Definition: mtsInterfaceRequired.h:279
Declaration of cmnNamedMap.
size_t ProcessMailBoxes(InterfacesProvidedMapType &interfaces)
Definition: mtsCommandWrite.h:189
Definition: mtsEventReceiver.h:98
Definition: mtsInterfaceCommon.h:1046
Definition: mtsInterface.h:41
Definition: mtsFunctionVoidReturn.h:38
Definition: mtsFunctionVoid.h:36
void GetDescription(mtsInterfaceRequiredDescription &requiredInterfaceDescription)
Declaration of osaThread.
EventReceiverVoidMapType EventReceiversVoid
Definition: mtsInterfaceRequired.h:338
Base class for data object in cisstMultiTask.
Definition: mtsGenericObject.h:56
cmnNamedMap< mtsCommandWriteBase > EventHandlerWriteMapType
Definition: mtsInterfaceRequired.h:345
std::ostream & operator<<(std::ostream &output, const mtsInterfaceRequired::FunctionInfo &functionInfo)
Definition: mtsInterfaceRequired.h:462
size_t ArgumentQueuesSize
Definition: mtsInterfaceRequired.h:115
osaThreadSignal ThreadSignalForBlockingCommands
Definition: mtsInterfaceRequired.h:122
Definition: mtsManagerLocal.h:89
Defines a base function object to allow heterogeneous containers of functions.
virtual void SetArgumentPrototype(const mtsGenericObject *argumentPrototype)
Definition: mtsCommandQueuedWrite.h:252
Declaration of Manager Component ClientThis class defines the manager component client which is manag...
Definition: mtsManagerComponentClient.h:41
Definition: mtsEventReceiver.h:180
mtsEventQueueingPolicy
Definition: mtsForwardDeclarations.h:49
bool UseQueueBasedOnInterfacePolicy(mtsEventQueueingPolicy queueingPolicy, const std::string &methodName, const std::string &eventName)
mtsRequiredType
Definition: mtsForwardDeclarations.h:52
Definition: mtsCommandWriteBase.h:40
Definition: mtsCommandQueuedWrite.h:209
bool AddItem(const std::string &name, _elementType *item, cmnLogLevel lod=CMN_LOG_LEVEL_RUN_ERROR)
Definition: cmnNamedMap.h:232
cmnNamedMap< FunctionInfo > FunctionInfoMapType
Definition: mtsInterfaceRequired.h:314
virtual void ToStream(std::ostream &outputStream) const
Definition: mtsComponent.h:150
Defines a command with no argument.
FunctionOrReceiverInfo(_PointerType &func_or_recv, mtsRequiredType required)
Definition: mtsInterfaceRequired.h:274
EventHandlerWriteMapType EventHandlersWrite
Definition: mtsInterfaceRequired.h:347
FunctionInfoMapType FunctionsWrite
Definition: mtsInterfaceRequired.h:323
bool AddFunction(const std::string &functionName, mtsFunctionVoid &function, mtsRequiredType required=MTS_REQUIRED)
Define an internal command for cisstMultiTask.
#define CMN_DECLARE_SERVICES(hasDynamicCreation, lod)
Definition: cmnClassRegisterMacros.h:116
bool RemoveEventHandlerVoid(const std::string &eventName)
Declaration of mtsInterface.
cmnNamedMap< ReceiverVoidInfo > EventReceiverVoidMapType
Definition: mtsInterfaceRequired.h:334
_elementType * GetItem(const std::string &name, cmnLogLevel lod=CMN_LOG_LEVEL_RUN_DEBUG) const
Definition: cmnNamedMap.h:251
Definition: mtsInterfaceProvided.h:96
EventReceiverWriteMapType EventReceiversWrite
Definition: mtsInterfaceRequired.h:341
mtsCommandVoid * AddEventHandlerVoid(void(__classType::*method)(void), __classType *classInstantiation, const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
Definition: mtsInterfaceRequired.h:374
const mtsInterfaceProvided * InterfaceProvided
Definition: mtsInterfaceRequired.h:109
Defines a command with no argument.
Definition: mtsForwardDeclarations.h:52
mtsRequiredType Required
Definition: mtsInterfaceRequired.h:272
mtsRequiredType Required
Definition: mtsInterfaceRequired.h:103
FunctionOrReceiverInfo< mtsEventReceiverVoid > ReceiverVoidInfo
Definition: mtsInterfaceRequired.h:297
mtsCommandWriteBase * AddEventHandlerWrite(void(__classType::*method)(const __argumentType &), __classType *classInstantiation, const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
Definition: mtsInterfaceRequired.h:409
bool AddEventReceiver(const std::string &eventName, mtsEventReceiverVoid &receiver, mtsRequiredType required=MTS_REQUIRED)
mtsMailBox * MailBox
Definition: mtsInterfaceRequired.h:106
size_t MailBoxSize
Definition: mtsInterfaceRequired.h:112
#define CMN_LOG_CLASS_INIT_ERROR
Definition: cmnLogger.h:113
FunctionOrReceiverInfo< mtsEventReceiverWrite > ReceiverWriteInfo
Definition: mtsInterfaceRequired.h:298
Definition: mtsCallableVoidFunction.h:35
Rules of exporting.
mtsCommandVoid * AddEventHandlerVoid(mtsCallableVoidBase *callable, const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
Definition: mtsCallableVoidMethod.h:45
bool RemoveEventHandlerWrite(const std::string &eventName)
Definition: osaThreadSignal.h:40
Definition: mtsFunctionWrite.h:37
void Detach(void)
Definition: mtsInterfaceRequired.h:281
mtsCommandWriteBase * AddEventHandlerWriteGeneric(void(__classType::*method)(const mtsGenericObject &), __classType *classInstantiation, const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY, mtsGenericObject *argumentPrototype=0)
Definition: mtsInterfaceRequired.h:432
Definition: mtsCommandWrite.h:41
Defines a command with one argument.
const int CMN_NO_DYNAMIC_CREATION
Definition: cmnClassRegisterMacros.h:328
Definition: mtsMailBox.h:36
#define CMN_DECLARE_SERVICES_INSTANTIATION(className)
Definition: cmnClassRegisterMacros.h:202
FunctionInfoMapType FunctionsRead
Definition: mtsInterfaceRequired.h:329
Defines a command with no argument.
#define CMN_LOG_ALLOW_DEFAULT
Definition: cmnLogLoD.h:76
Definition: mtsFunctionWriteReturn.h:38
Defines a base class for a command.
Definition: mtsSocketProxyServer.h:81
cmnNamedMap< mtsCommandVoid > EventHandlerVoidMapType
Definition: mtsInterfaceRequired.h:344
Definition: mtsCommandQueuedWrite.h:42