cisst-saw
Loading...
Searching...
No Matches
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 Author(s): Peter Kazanzides, Anton Deguet
6 Created on: 2008-11-13
7
8 (C) Copyright 2008-2026 Johns Hopkins University (JHU), All Rights Reserved.
9
10--- begin cisst license - do not edit ---
11
12This software is provided "as is" under an open source license, with
13no warranty. The complete license can be found in license.txt and
14http://www.cisst.org/cisst/license.txt.
15
16--- end cisst license ---
17*/
18
19
20#ifndef _mtsInterfaceRequired_h
21#define _mtsInterfaceRequired_h
22
24
27
29
37
39
40// Always include last
42
47
48
81
83{
85
86 friend class mtsManagerLocal;
88 friend class mtsManagerComponent;
89 // for GetDescription
91 // for MailBox
93
94 protected:
95
98
101
104
107
110
114
117
121
124
125 public:
126
130
144 mtsInterfaceRequired(const std::string & interfaceName, mtsComponent * component,
145 mtsMailBox * mailBox, mtsRequiredType required = MTS_REQUIRED);
146
149
151
162 bool SetMailBoxSize(size_t desiredSize);
163
178 bool SetArgumentQueuesSize(size_t desiredSize);
179
183 bool SetMailBoxAndArgumentQueuesSize(size_t desiredSize);
184
186 { return ConnectionID; }
187
190
193 virtual std::vector<std::string> GetNamesOfFunctions(void) const;
194 virtual std::vector<std::string> GetNamesOfFunctionsVoid(void) const;
195 virtual std::vector<std::string> GetNamesOfFunctionsVoidReturn(void) const;
196 virtual std::vector<std::string> GetNamesOfFunctionsWrite(void) const;
197 virtual std::vector<std::string> GetNamesOfFunctionsWriteReturn(void) const;
198 virtual std::vector<std::string> GetNamesOfFunctionsRead(void) const;
199 virtual std::vector<std::string> GetNamesOfFunctionsQualifiedRead(void) const;
201
204 mtsFunctionVoid * GetFunctionVoid(const std::string & functionName) const;
205 mtsFunctionVoidReturn * GetFunctionVoidReturn(const std::string & functionName) const;
206 mtsFunctionWrite * GetFunctionWrite(const std::string & functionName) const;
207 mtsFunctionWriteReturn * GetFunctionWriteReturn(const std::string & functionName) const;
208 mtsFunctionRead * GetFunctionRead(const std::string & functionName) const;
209 mtsFunctionQualifiedRead * GetFunctionQualifiedRead(const std::string & functionName) const;
211
214 virtual std::vector<std::string> GetNamesOfEventHandlersVoid(void) const;
215 virtual std::vector<std::string> GetNamesOfEventHandlersWrite(void) const;
217
220 virtual mtsCommandVoid * GetEventHandlerVoid(const std::string & eventName) const;
221 virtual mtsCommandWriteBase * GetEventHandlerWrite(const std::string & eventName) const;
223
224 /* adeguet - seems deprecated or at least not used anywhere?
225 inline bool CouldConnectTo(mtsInterfaceProvided * CMN_UNUSED(interfaceProvidedOrOutput)) {
226 return true;
227 } */
228
229 bool ConnectTo(mtsInterfaceProvided * interfaceProvided); // used by mtsManagerComponent.cpp
230 // bool Disconnect(void) { return DetachCommands(); } // Should be deprecated -- adeguet1 OrOutput
231
234
241
243
244 private:
245 void BlockingCommandExecutedHandler(void);
246 void BlockingCommandReturnExecutedHandler(void);
247
248 bool BindCommands(const mtsInterfaceProvided * interfaceProvided);
249 bool DetachCommands(void); // used by mtsManagerComponent
250
251 void GetEventList(mtsEventHandlerList & eventList);
252 bool CheckEventList(mtsEventHandlerList & eventList) const;
253 public:
254
256
257 void EnableAllEvents(void);
258
260 size_t ProcessMailBoxes(void);
261
263 void ToStream(std::ostream & outputStream) const override;
264
265 protected:
266 public: // adeguet1 todo fix -- this has been added for ostream << operator
267#ifndef SWIG // SWIG cannot deal with this
268 template <class _PointerType>
270 {
272 protected:
273 _PointerType * Pointer;
275 public:
276 FunctionOrReceiverInfo(_PointerType & func_or_recv, mtsRequiredType required):
277 Pointer(&func_or_recv),
278 Required(required)
279 {}
280
282
283 inline void Detach(void) {
284 Pointer->Detach();
285 }
286
287 void ToStream(std::ostream & outputStream) const
288 {
289 outputStream << *Pointer;
290 if (Required == MTS_OPTIONAL) {
291 outputStream << " (optional)";
292 } else {
293 outputStream << " (required)";
294 }
295 }
296 };
297
301
302#endif // !SWIG
303 protected:
304
310 const std::string & methodName,
311 const std::string & eventName);
312
313 bool AddEventHandlerToReceiver(const std::string & eventName, mtsCommandVoid * handler) const;
314 bool AddEventHandlerToReceiver(const std::string & eventName, mtsCommandWriteBase * handler) const;
315
317
320
322 FunctionInfoMapType FunctionsVoidReturn; // Void return (command)
323
326
328 FunctionInfoMapType FunctionsWriteReturn; // Write return (command)
329
331 FunctionInfoMapType FunctionsRead; // Read (state read)
332
334 FunctionInfoMapType FunctionsQualifiedRead; // Qualified Read (conversion, read at time index, ...)
335
338
341
344
350
352 void GetDescription(mtsInterfaceRequiredDescription & requiredInterfaceDescription) const;
353
354 public:
355
356 bool AddFunction(const std::string & functionName, mtsFunctionVoid & function, mtsRequiredType required = MTS_REQUIRED);
357
358 bool AddFunction(const std::string & functionName, mtsFunctionVoidReturn & function, mtsRequiredType required = MTS_REQUIRED);
359
360 bool AddFunction(const std::string & functionName, mtsFunctionWrite & function, mtsRequiredType required = MTS_REQUIRED);
361
362 bool AddFunction(const std::string & functionName, mtsFunctionWriteReturn & function, mtsRequiredType required = MTS_REQUIRED);
363
364 bool AddFunction(const std::string & functionName, mtsFunctionRead & function, mtsRequiredType required = MTS_REQUIRED);
365
366 bool AddFunction(const std::string & functionName, mtsFunctionQualifiedRead & function, mtsRequiredType required = MTS_REQUIRED);
367
368 bool AddEventReceiver(const std::string & eventName, mtsEventReceiverVoid & receiver, mtsRequiredType required = MTS_REQUIRED);
369
370 bool AddEventReceiver(const std::string & eventName, mtsEventReceiverWrite & receiver, mtsRequiredType required = MTS_REQUIRED);
371
373 const std::string & eventName,
375 template <class __classType>
376 inline mtsCommandVoid * AddEventHandlerVoid(void (__classType::*method)(void),
377 __classType * classInstantiation,
378 const std::string & eventName,
380 mtsCallableVoidBase * callable = new mtsCallableVoidMethod<__classType>(method, classInstantiation);
381 return this->AddEventHandlerVoid(callable, eventName, queueingPolicy);
382 }
383
384 inline mtsCommandVoid * AddEventHandlerVoid(void (*function)(void),
385 const std::string & eventName,
387 mtsCallableVoidBase * callable = new mtsCallableVoidFunction(function);
388 return this->AddEventHandlerVoid(callable, eventName, queueingPolicy);
389 }
390
391 template <class __classType, class __argumentType>
392 inline mtsCommandWriteBase * AddEventHandlerWrite(void (__classType::*method)(const __argumentType &),
393 __classType * classInstantiation,
394 const std::string & eventName,
396
397 template <class __classType>
398 inline mtsCommandWriteBase * AddEventHandlerWriteGeneric(void (__classType::*method)(const mtsGenericObject &),
399 __classType * classInstantiation,
400 const std::string & eventName,
402 mtsGenericObject *argumentPrototype = 0);
403
404 bool RemoveEventHandlerVoid(const std::string & eventName);
405 bool RemoveEventHandlerWrite(const std::string & eventName);
406};
407
408
409#ifndef SWIG
410template <class __classType, class __argumentType>
411inline mtsCommandWriteBase * mtsInterfaceRequired::AddEventHandlerWrite(void (__classType::*method)(const __argumentType &),
412 __classType * classInstantiation,
413 const std::string & eventName,
414 mtsEventQueueingPolicy queueingPolicy)
415{
416 bool queued = this->UseQueueBasedOnInterfacePolicy(queueingPolicy, "AddEventHandlerWrite", eventName);
417 mtsCommandWriteBase * actualCommand =
418 new mtsCommandWrite<__classType, __argumentType>(method, classInstantiation, eventName, __argumentType());
419 if (queued) {
420 if (MailBox)
421 EventHandlersWrite.AddItem(eventName, new mtsCommandQueuedWrite<__argumentType>(MailBox, actualCommand, this->ArgumentQueuesSize));
422 else
423 CMN_LOG_CLASS_INIT_ERROR << "No mailbox for queued event handler write \"" << eventName << "\"" << std::endl;
424 } else {
425 EventHandlersWrite.AddItem(eventName, actualCommand);
426 }
427 mtsCommandWriteBase *handler = EventHandlersWrite.GetItem(eventName);
428 AddEventHandlerToReceiver(eventName, handler); // does nothing if event receiver does not exist
429 return handler;
430}
431
432
433template <class __classType>
435 __classType * classInstantiation,
436 const std::string & eventName,
437 mtsEventQueueingPolicy queueingPolicy,
438 mtsGenericObject *argumentPrototype)
439{
440 bool queued = this->UseQueueBasedOnInterfacePolicy(queueingPolicy, "AddEventHandlerWriteGeneric", eventName);
441 mtsCommandWriteBase * actualCommand =
442 new mtsCommandWriteGeneric<__classType>(method, classInstantiation, eventName, argumentPrototype);
443 if (queued) {
444 // PK: check for MailBox overlaps with code in UseQueueBasedOnInterfacePolicy
445 if (MailBox) {
446 mtsCommandQueuedWriteGeneric *tmp = new mtsCommandQueuedWriteGeneric(MailBox, actualCommand, this->ArgumentQueuesSize);
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
462inline 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
Definition cmnNamedMap.h:54
bool AddItem(const std::string &name, _elementType *item, cmnLogLevel lod=CMN_LOG_LEVEL_RUN_ERROR)
Definition cmnNamedMap.h:232
_elementType * GetItem(const std::string &name, cmnLogLevel lod=CMN_LOG_LEVEL_RUN_DEBUG) const
Definition cmnNamedMap.h:251
Definition mtsCallableVoidBase.h:40
mtsCallableVoidFunction()
Definition mtsCallableVoidFunction.h:56
mtsCallableVoidMethod(void)
Definition mtsCallableVoidMethod.h:74
Definition mtsCommandQueuedWrite.h:210
Definition mtsCommandQueuedWrite.h:43
Definition mtsCommandVoid.h:44
Definition mtsCommandWriteBase.h:40
friend class mtsCommandQueuedWriteGeneric
Definition mtsCommandWriteBase.h:43
Definition mtsCommandWrite.h:189
Definition mtsCommandWrite.h:41
Definition mtsComponent.h:150
Definition mtsParameterTypesOld.h:41
Definition mtsEventReceiver.h:184
Definition mtsEventReceiver.h:221
Definition mtsFunctionQualifiedRead.h:37
Definition mtsFunctionRead.h:37
Definition mtsFunctionVoid.h:36
Definition mtsFunctionVoidReturn.h:38
Definition mtsFunctionWrite.h:37
Definition mtsFunctionWriteReturn.h:38
Base class for data object in cisstMultiTask.
Definition mtsGenericObject.h:52
mtsInterface(const std::string &interfaceName, mtsComponent *component)
Definition mtsInterfaceProvided.h:98
Definition mtsInterfaceRequired.h:270
~FunctionOrReceiverInfo()
Definition mtsInterfaceRequired.h:281
mtsRequiredType Required
Definition mtsInterfaceRequired.h:274
FunctionOrReceiverInfo(_PointerType &func_or_recv, mtsRequiredType required)
Definition mtsInterfaceRequired.h:276
void ToStream(std::ostream &outputStream) const
Definition mtsInterfaceRequired.h:287
void Detach(void)
Definition mtsInterfaceRequired.h:283
friend class mtsInterfaceRequired
Definition mtsInterfaceRequired.h:271
mtsFunctionBase * Pointer
Definition mtsInterfaceRequired.h:273
Definition mtsInterfaceCommon.h:1007
Definition mtsInterfaceRequired.h:83
ConnectionIDType GetConnectionID(void) const
Definition mtsInterfaceRequired.h:185
mtsFunctionWriteReturn * GetFunctionWriteReturn(const std::string &functionName) const
@ DEFAULT_MAIL_BOX_AND_ARGUMENT_QUEUES_SIZE
Definition mtsInterfaceRequired.h:129
FunctionInfoMapType FunctionsVoidReturn
Definition mtsInterfaceRequired.h:322
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:434
FunctionInfoMapType FunctionsRead
Definition mtsInterfaceRequired.h:331
void EnableAllEvents(void)
void GetDescription(mtsInterfaceRequiredDescription &requiredInterfaceDescription) const
mtsCommandVoid * AddEventHandlerVoid(void(__classType::*method)(void), __classType *classInstantiation, const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
Definition mtsInterfaceRequired.h:376
bool AddFunction(const std::string &functionName, mtsFunctionRead &function, mtsRequiredType required=MTS_REQUIRED)
bool SetArgumentQueuesSize(size_t desiredSize)
cmnNamedMap< mtsCommandVoid > EventHandlerVoidMapType
Definition mtsInterfaceRequired.h:346
virtual std::vector< std::string > GetNamesOfFunctions(void) const
friend class mtsSocketProxyClient
Definition mtsInterfaceRequired.h:90
friend class mtsEventReceiverBase
Definition mtsInterfaceRequired.h:87
friend class mtsManagerLocal
Definition mtsInterfaceRequired.h:86
virtual std::vector< std::string > GetNamesOfFunctionsQualifiedRead(void) const
bool RemoveEventHandlerWrite(const std::string &eventName)
mtsFunctionVoid * GetFunctionVoid(const std::string &functionName) const
friend class mtsManagerComponent
Definition mtsInterfaceRequired.h:88
size_t ProcessMailBoxes(void)
virtual std::vector< std::string > GetNamesOfFunctionsVoid(void) const
virtual std::vector< std::string > GetNamesOfEventHandlersVoid(void) const
EventHandlerWriteMapType EventHandlersWrite
Definition mtsInterfaceRequired.h:349
mtsMailBox * MailBox
Definition mtsInterfaceRequired.h:100
virtual mtsCommandWriteBase * GetEventHandlerWrite(const std::string &eventName) const
virtual std::vector< std::string > GetNamesOfFunctionsVoidReturn(void) const
size_t ArgumentQueuesSize
Definition mtsInterfaceRequired.h:109
bool UseQueueBasedOnInterfacePolicy(mtsEventQueueingPolicy queueingPolicy, const std::string &methodName, const std::string &eventName)
cmnNamedMap< FunctionInfo > FunctionInfoMapType
Definition mtsInterfaceRequired.h:316
bool SetMailBoxAndArgumentQueuesSize(size_t desiredSize)
FunctionInfoMapType FunctionsWriteReturn
Definition mtsInterfaceRequired.h:328
mtsFunctionRead * GetFunctionRead(const std::string &functionName) const
cmnNamedMap< ReceiverVoidInfo > EventReceiverVoidMapType
Definition mtsInterfaceRequired.h:336
mtsCommandWriteBase * AddEventHandlerWrite(void(__classType::*method)(const __argumentType &), __classType *classInstantiation, const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
Definition mtsInterfaceRequired.h:411
virtual std::vector< std::string > GetNamesOfFunctionsWriteReturn(void) const
void ToStream(std::ostream &outputStream) const override
cmnNamedMap< ReceiverWriteInfo > EventReceiverWriteMapType
Definition mtsInterfaceRequired.h:337
virtual mtsCommandVoid * GetEventHandlerVoid(const std::string &eventName) const
bool AddEventHandlerToReceiver(const std::string &eventName, mtsCommandWriteBase *handler) const
mtsInterfaceRequired(const std::string &interfaceName, mtsComponent *component, mtsMailBox *mailBox, mtsRequiredType required=MTS_REQUIRED)
FunctionOrReceiverInfo< mtsEventReceiverWrite > ReceiverWriteInfo
Definition mtsInterfaceRequired.h:300
mtsRequiredType IsRequired(void) const
void DisableAllEvents(void)
FunctionOrReceiverInfo< mtsEventReceiverVoid > ReceiverVoidInfo
Definition mtsInterfaceRequired.h:299
mtsCommandVoid * AddEventHandlerVoid(mtsCallableVoidBase *callable, const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
size_t MailBoxSize
Definition mtsInterfaceRequired.h:106
osaThreadSignal * GetThreadSignal(void)
virtual std::vector< std::string > GetNamesOfFunctionsRead(void) const
bool AddFunction(const std::string &functionName, mtsFunctionWrite &function, mtsRequiredType required=MTS_REQUIRED)
bool AddSystemEventHandlers(void)
EventReceiverVoidMapType EventReceiversVoid
Definition mtsInterfaceRequired.h:340
EventHandlerVoidMapType EventHandlersVoid
Definition mtsInterfaceRequired.h:348
const mtsInterfaceProvided * GetConnectedInterface(void) const
cmnNamedMap< mtsCommandWriteBase > EventHandlerWriteMapType
Definition mtsInterfaceRequired.h:347
virtual std::vector< std::string > GetNamesOfFunctionsWrite(void) const
osaThreadSignal ThreadSignalForBlockingCommands
Definition mtsInterfaceRequired.h:120
const mtsInterfaceProvided * InterfaceProvided
Definition mtsInterfaceRequired.h:103
mtsFunctionVoidReturn * GetFunctionVoidReturn(const std::string &functionName) const
bool AddEventHandlerToReceiver(const std::string &eventName, mtsCommandVoid *handler) const
bool AddEventReceiver(const std::string &eventName, mtsEventReceiverVoid &receiver, mtsRequiredType required=MTS_REQUIRED)
bool ConnectTo(mtsInterfaceProvided *interfaceProvided)
bool RemoveEventHandlerVoid(const std::string &eventName)
FunctionInfoMapType FunctionsVoid
Definition mtsInterfaceRequired.h:319
bool SetMailBoxSize(size_t desiredSize)
FunctionInfoMapType FunctionsQualifiedRead
Definition mtsInterfaceRequired.h:334
virtual ~mtsInterfaceRequired()
bool AddFunction(const std::string &functionName, mtsFunctionQualifiedRead &function, mtsRequiredType required=MTS_REQUIRED)
bool AddFunction(const std::string &functionName, mtsFunctionVoidReturn &function, mtsRequiredType required=MTS_REQUIRED)
bool AddFunction(const std::string &functionName, mtsFunctionVoid &function, mtsRequiredType required=MTS_REQUIRED)
mtsInterfaceRequiredDescription GetDescription() const
friend class mtsSocketProxyServer
Definition mtsInterfaceRequired.h:92
FunctionOrReceiverInfo< mtsFunctionBase > FunctionInfo
Definition mtsInterfaceRequired.h:298
mtsFunctionWrite * GetFunctionWrite(const std::string &functionName) const
bool AddFunction(const std::string &functionName, mtsFunctionWriteReturn &function, mtsRequiredType required=MTS_REQUIRED)
FunctionInfoMapType FunctionsWrite
Definition mtsInterfaceRequired.h:325
mtsFunctionQualifiedRead * GetFunctionQualifiedRead(const std::string &functionName) const
EventReceiverWriteMapType EventReceiversWrite
Definition mtsInterfaceRequired.h:343
mtsCommandVoid * AddEventHandlerVoid(void(*function)(void), const std::string &eventName, mtsEventQueueingPolicy queueingPolicy=MTS_INTERFACE_EVENT_POLICY)
Definition mtsInterfaceRequired.h:384
virtual std::vector< std::string > GetNamesOfEventHandlersWrite(void) const
mtsRequiredType Required
Definition mtsInterfaceRequired.h:97
ConnectionIDType ConnectionID
Definition mtsInterfaceRequired.h:113
bool AddEventReceiver(const std::string &eventName, mtsEventReceiverWrite &receiver, mtsRequiredType required=MTS_REQUIRED)
Definition mtsMailBox.h:36
Definition osaThreadSignal.h:41
#define CMN_DECLARE_SERVICES_INSTANTIATION(className)
Definition cmnClassRegisterMacros.h:199
const int CMN_NO_DYNAMIC_CREATION
Definition cmnClassRegisterMacros.h:325
#define CISST_EXPORT
Definition cmnExportMacros.h:50
#define CMN_LOG_ALLOW_DEFAULT
Definition cmnLogLoD.h:76
#define CMN_LOG_CLASS_INIT_ERROR
Definition cmnLogger.h:113
Declaration of cmnNamedMap.
Defines a command with no argument.
Defines a command with no argument.
Defines a base class for a command.
Defines base class for a queued void command.
Define an internal command for cisstMultiTask.
Defines a command with no argument.
Defines a command with one argument.
Rules of exporting.
mtsEventQueueingPolicy
Definition mtsForwardDeclarations.h:48
@ MTS_INTERFACE_EVENT_POLICY
Definition mtsForwardDeclarations.h:48
mtsRequiredType
Definition mtsForwardDeclarations.h:51
@ MTS_OPTIONAL
Definition mtsForwardDeclarations.h:51
@ MTS_REQUIRED
Definition mtsForwardDeclarations.h:51
unsigned int ConnectionIDType
Definition mtsForwardDeclarations.h:149
Defines a base function object to allow heterogeneous containers of functions.
Declaration of mtsInterface.
std::ostream & operator<<(std::ostream &output, const mtsInterfaceRequired::FunctionInfo &functionInfo)
Definition mtsInterfaceRequired.h:462
Declaration of osaThread.