00001 #ifndef OMK_INP_EVENTSIGNALEMITTERUTIL_H 00002 #define OMK_INP_EVENTSIGNALEMITTERUTIL_H 00003 00004 #include "OMKInputs.h" 00005 #include "OMKExtensibleSimulatedObject.h" 00006 #include "OMKTransform.h" 00007 #include "OMKBaseType.h" 00008 #include "OMKTransformType.h" 00009 #include "OMKParametersAccessor.inl" 00010 namespace OMK 00011 { 00015 class OMKINPUTS_API EventSignalEmitterUtil 00016 { 00017 protected: 00020 EventSignalEmitterUtil() ; 00021 public: 00022 virtual ~EventSignalEmitterUtil() ; 00023 protected: 00024 virtual bool loadParametersUtil( ExtensibleSimulatedObject* owner, 00025 const ConfigurationParameterDescriptor * node ) ; 00028 bool _signal ; 00030 EventIdentifier _eventId ; 00032 std::vector< Name > _listeners ; 00035 virtual void sendUtil( ExtensibleSimulatedObject* owner ) ; 00036 }; 00037 00038 //============================================================================= 00042 template< typename T, typename ModelType > 00043 class ValuedEventSignalEmitterUtilT: 00044 public EventSignalEmitterUtil 00045 { 00046 protected: 00049 ValuedEventSignalEmitterUtilT() 00050 : EventSignalEmitterUtil(), 00051 _current() 00052 { 00053 } 00054 00055 public: 00056 virtual ~ValuedEventSignalEmitterUtilT() {} 00057 protected: 00058 virtual bool loadParametersUtil( ExtensibleSimulatedObject* owner, 00059 const ConfigurationParameterDescriptor * node ) 00060 { 00061 bool ok = true ; 00062 if( ParametersAccessor::get( node, "AttributeId", _eventId, owner ) ) 00063 { 00064 IAttribute * attribute = owner->getAttribute( _eventId ) ; 00065 ok = ok && attribute ; 00066 if( !attribute ) OMERROR( "Attribute " << _eventId << " cannot be found" ) ; 00067 if( ok ) 00068 { 00069 attribute->activateSetByEventOf() ; 00070 _eventId = EventId::getCurrentValueEventId( _eventId.getCString() ) ; 00071 _listeners.push_back( owner->getName() ) ; 00072 _signal = false ; 00073 } 00074 } 00075 else 00076 { 00077 ok = ok && EventSignalEmitterUtil::loadParametersUtil( owner, node ) ; 00078 } 00079 ok = ok && ParametersAccessor::get( node, "Values", _values, owner ) ; 00080 _current = _values.begin() ; 00081 return ok ; 00082 } 00084 std::vector< T > _values ; 00086 typename std::vector< T >::iterator _current ; 00089 virtual void sendUtil( ExtensibleSimulatedObject* owner ) 00090 { 00091 if( _signal ) 00092 { // Fire the signal 00093 owner->fireValuedSignal< ModelType >( _eventId, ModelType( *_current ) ) ; 00094 } 00095 else 00096 { // Send the event for each listener 00097 for( std::vector< Name >::const_iterator i = _listeners.begin() ; 00098 i != _listeners.end() ; 00099 i++ ) 00100 { 00101 OMTRACEID( OMK_DEBUG_OMK_EVENT, "send value \"" << *_current << "\" to \"" << *i << "\" through event \"" << _eventId << "\"" ) ; 00102 owner->sendValuedEvent< ModelType >( *i, _eventId, ModelType( *_current ) ) ; 00103 } 00104 } 00105 // Next one 00106 _current++ ; 00107 if( _current == _values.end() ) _current = _values.begin() ; 00108 } 00109 } ; 00110 00111 //============================================================================= 00115 template< typename T, typename ModelType > 00116 class MultiValuedEventSignalEmitterUtilT: 00117 public EventSignalEmitterUtil 00118 { 00119 protected: 00122 MultiValuedEventSignalEmitterUtilT() 00123 : EventSignalEmitterUtil(), 00124 _default( 0 ) 00125 { 00126 } 00127 00128 public: 00129 virtual ~MultiValuedEventSignalEmitterUtilT() {} 00130 protected: 00131 virtual bool loadParametersUtil( ExtensibleSimulatedObject* owner, 00132 const ConfigurationParameterDescriptor * node ) 00133 { 00134 bool ok = true ; 00135 if( ParametersAccessor::get( node, "AttributeId", _eventId, owner ) ) 00136 { 00137 IAttribute * attribute = owner->getAttribute( _eventId ) ; 00138 ok = ok && attribute ; 00139 if( !attribute ) OMERROR( "Attribute " << _eventId << " cannot be found" ) ; 00140 if( ok ) 00141 { 00142 attribute->activateSetByEventOf() ; 00143 _eventId = EventId::getCurrentValueEventId( _eventId.getCString() ) ; 00144 _listeners.push_back( owner->getName() ) ; 00145 _signal = false ; 00146 } 00147 } 00148 else 00149 { 00150 ok = ok && EventSignalEmitterUtil::loadParametersUtil( owner, node ) ; 00151 } 00152 ok = ok && ParametersAccessor::get( node, "Values", _values, owner ) ; 00153 ParametersAccessor::get( node, "Default", _default ) ; 00154 return ok ; 00155 } 00157 std::vector< T > _values ; 00160 int _default ; 00163 virtual void sendUtil( ExtensibleSimulatedObject* owner, int index ) 00164 { 00165 // if index out of range then it uses the _default 00166 index = ( index < 0 || (int)_values.size() < index ) ? _default : index ; 00167 if( _signal ) 00168 { // Fire the signal 00169 owner->fireValuedSignal< ModelType >( _eventId, ModelType( _values[ index ] ) ) ; 00170 } 00171 else 00172 { // Send the event for each listener 00173 for( std::vector< Name >::const_iterator i = _listeners.begin() ; 00174 i != _listeners.end() ; 00175 i++ ) 00176 { 00177 OMTRACEID( OMK_DEBUG_OMK_EVENT, "send value[ " << index << " ] \"" << _values[ index ] << "\" to \"" << *i << "\" through event \"" << _eventId << "\"" ) ; 00178 owner->sendValuedEvent< ModelType >( *i, _eventId, ModelType( _values[ index ] ) ) ; 00179 } 00180 } 00181 } 00182 } ; 00183 00184 } // namespace OMK 00185 00186 #endif // OMK_INP_EVENTSIGNALEMITTERUTIL_H
Documentation generated on Mon Jun 9 11:45:56 2008 |
Generated with doxygen by Dimitri van Heesch , 1997-2007 |