00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <config.h>
00025 #include "NM_Classes.hh"
00026 #include "RTIA.hh"
00027 #include "ObjectClassAttribute.hh"
00028 #include "Interaction.hh"
00029 #include "InteractionSet.hh"
00030 #include "ObjectClass.hh"
00031 #include "ObjectClassSet.hh"
00032 #include <assert.h>
00033
00034 namespace certi {
00035 namespace rtia {
00036
00037 static pdCDebug D("RTIA", "(RTIA net) ");
00038 static PrettyDebug G("GENDOC",__FILE__);
00039
00040
00042 void
00043 RTIA::processNetworkMessage(NetworkMessage *msg)
00044 {
00045 NetworkMessage::Type msgType = msg->getType();
00046
00047 G.Out(pdGendoc,"enter RTIA::processNetworkMessage");
00048
00049 switch(msgType) {
00050
00051 case NetworkMessage::MESSAGE_NULL:
00052 {
00053 D.Out(pdTrace,
00054 "Receving Message from RTIG, type NetworkMessage::MESSAGE_NULL(%f).",
00055 msg->getDate().getTime());
00056
00057 tm->update(msg->federate, msg->getDate());
00058 delete msg ;
00059 break ;
00060 }
00061
00062 case NetworkMessage::SET_TIME_REGULATING:
00063 {
00064
00065 D.Out(pdTrace,
00066 "Receving Message from RTIG, type NetworkMessage::SET_TIME_REGULATING.");
00067
00068 if (static_cast<NM_Set_Time_Regulating*>(msg)->isRegulator())
00069 tm->insert(msg->federate, msg->getDate());
00070 else
00071 tm->remove(msg->federate);
00072 delete msg ;
00073 break ;
00074 }
00075
00076 case NetworkMessage::SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:
00077 D.Out(pdTrace, "Receiving Message from RTIG, type NetworkMessage::SYNCHRONIZATION_"
00078 "POINT_REGISTRATION_SUCCEEDED.");
00079
00080 queues->insertLastCommand(msg);
00081 break ;
00082 case NetworkMessage::ANNOUNCE_SYNCHRONIZATION_POINT:
00083 D.Out(pdTrace, "Receiving Message from RTIG, type NetworkMessage::ANNOUCE_"
00084 "SYNCHRONIZATION_POINT.");
00085
00086 queues->insertLastCommand(msg);
00087 break ;
00088 case NetworkMessage::FEDERATION_SYNCHRONIZED:
00089 D.Out(pdTrace,
00090 "Receiving Message from RTIG, type NetworkMessage::FEDERATION_SYNCHRONIZED.");
00091 queues->insertLastCommand(msg);
00092 break ;
00093
00094 case NetworkMessage::DISCOVER_OBJECT:
00095 {
00096 D.Out(pdTrace, "Receving Message from RTIG, "
00097 "type NetworkMessage::DISCOVER_OBJECT.");
00098 queues->insertFifoMessage(msg);
00099 }
00100 break;
00101
00102 case NetworkMessage::REFLECT_ATTRIBUTE_VALUES:
00103 {
00104 OrderType updateOrder ;
00105
00106 D.Out(pdTrace,
00107 "Receving Message from RTIG, "
00108 "type NetworkMessage::REFLECT_ATTRIBUTE_VALUES.");
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 if ( !msg->isDated())
00122 {
00123
00124 updateOrder = RECEIVE ;
00125 }
00126 else
00127 {
00128
00129 updateOrder = TIMESTAMP;
00130
00131 for (UShort i=0; i< msg->handleArraySize; ++i)
00132 {
00133 if (rootObject->ObjectClasses->getObjectFromHandle( msg->objectClass)
00134 ->getAttribute(msg->handleArray[i])->order != TIMESTAMP)
00135 {
00136 updateOrder = RECEIVE;
00137 break;
00138 }
00139 }
00140 }
00141
00142
00143 if(updateOrder == TIMESTAMP && tm->requestContraintState())
00144 {
00145
00146 queues->insertTsoMessage(msg);
00147 }
00148 else
00149 {
00150
00151 queues->insertFifoMessage(msg);
00152 }
00153
00154 break ;
00155 }
00156
00157 case NetworkMessage::RECEIVE_INTERACTION:
00158 {
00159 OrderType interactionOrder ;
00160
00161 D.Out(pdTrace,
00162 "Receving Message from RTIG, type NetworkMessage::RECEIVE_INTERACTION.");
00163
00164
00165 if ( !msg->isDated())
00166 {
00167
00168 interactionOrder = RECEIVE ;
00169 }
00170 else
00171 {
00172
00173 interactionOrder = rootObject->Interactions->
00174 getObjectFromHandle(msg->interactionClass)->order;
00175 }
00176
00177
00178 if (interactionOrder == TIMESTAMP && tm->requestContraintState())
00179 {
00180
00181 queues->insertTsoMessage(msg);
00182 }
00183 else
00184 {
00185
00186 queues->insertFifoMessage(msg);
00187 }
00188
00189 break ;
00190 }
00191
00192 case NetworkMessage::REMOVE_OBJECT:
00193 {
00194 D.Out(pdTrace, "Receving Message from RTIG, \
00195 type NetworkMessage::REMOVE_OBJECT.");
00196
00197 if (tm->requestContraintState() && msg->isDated()) {
00198
00199
00200 queues->insertTsoMessage(msg);
00201 }
00202 else {
00203 queues->insertFifoMessage(msg);
00204 }
00205
00206 break ;
00207 }
00208
00209 case NetworkMessage::INFORM_ATTRIBUTE_OWNERSHIP:
00210 {
00211 D.Out(pdTrace,
00212 "Receving Message from RTIG, "
00213 "type NetworkMessage::INFORM_ATTRIBUTE_OWNERSHIP.");
00214 queues->insertFifoMessage(msg);
00215 break ;
00216 }
00217
00218 case NetworkMessage::ATTRIBUTE_IS_NOT_OWNED:
00219 {
00220 D.Out(pdTrace,
00221 "Receving Message from RTIG, type NetworkMessage::ATTRIBUTE_IS_NOT_OWNED.");
00222 queues->insertFifoMessage(msg);
00223 break ;
00224 }
00225
00226
00227 case NetworkMessage::REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:
00228 {
00229 D.Out(pdTrace, "Receving Message from RTIG, "
00230 "type NetworkMessage::REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION.");
00231 queues->insertFifoMessage(msg);
00232 break ;
00233 }
00234
00235 case NetworkMessage::ATTRIBUTE_OWNERSHIP_UNAVAILABLE:
00236 {
00237 D.Out(pdTrace, "Receving Message from RTIG, "
00238 "type NetworkMessage::ATTRIBUTE_OWNERSHIP_UNAVAILABLE.");
00239 queues->insertFifoMessage(msg);
00240 break ;
00241 }
00242
00243 case NetworkMessage::ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:
00244 {
00245 D.Out(pdTrace, "Receving Message from RTIG, "
00246 "type NetworkMessage::ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION.");
00247 queues->insertFifoMessage(msg);
00248 break ;
00249 }
00250
00251 case NetworkMessage::ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:
00252 {
00253 D.Out(pdTrace, "Receving Message from RTIG, "
00254 "type NetworkMessage::ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION.");
00255 queues->insertFifoMessage(msg);
00256 break ;
00257 }
00258
00259 case NetworkMessage::REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:
00260 {
00261 D.Out(pdTrace, "Receving Message from RTIG, "
00262 "type NetworkMessage::REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE.");
00263 queues->insertFifoMessage(msg);
00264 break ;
00265 }
00266
00267
00268 case NetworkMessage::CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:
00269 {
00270 D.Out(pdTrace, "Receving Message from RTIG, "
00271 "type NetworkMessage::CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION.");
00272 queues->insertFifoMessage(msg);
00273 break ;
00274 }
00275
00276 case NetworkMessage::INITIATE_FEDERATE_SAVE:
00277 D.Out(pdTrace, "Receiving Message from RTIG, "
00278 " type InitiateFederateSave.");
00279 queues->insertBeginCommand(msg);
00280 break ;
00281
00282 case NetworkMessage::FEDERATION_SAVED:
00283 case NetworkMessage::FEDERATION_NOT_SAVED:
00284 D.Out(pdTrace, "Receiving Message from RTIG, "
00285 " type Federation(Not)Saved.");
00286 queues->insertBeginCommand(msg);
00287 break ;
00288
00289 case NetworkMessage::REQUEST_FEDERATION_RESTORE_SUCCEEDED:
00290 D.Out(pdTrace, "Receiving Message from RTIG, "
00291 " type RequestFederationRestoreSucceeded.");
00292 G.Out(pdGendoc,"processNetworkMessage for REQUEST_FEDERATION_RESTORE_SUCCEEDED");
00293 queues->insertLastCommand(msg);
00294 break ;
00295
00296 case NetworkMessage::REQUEST_FEDERATION_RESTORE_FAILED:
00297 D.Out(pdTrace, "Receiving Message from RTIG, "
00298 " type RequestFederationRestoreFailed.");
00299 G.Out(pdGendoc,"processNetworkMessage for REQUEST_FEDERATION_RESTORE_FAILED");
00300 queues->insertLastCommand(msg);
00301 break ;
00302
00303 case NetworkMessage::FEDERATION_RESTORE_BEGUN:
00304 D.Out(pdTrace, "Receiving Message from RTIG, "
00305 " type FederationRestoreBegun.");
00306 queues->insertLastCommand(msg);
00307 break ;
00308
00309 case NetworkMessage::INITIATE_FEDERATE_RESTORE:
00310 D.Out(pdTrace, "Receiving Message from RTIG, "
00311 " type InitiateFederateRestore.");
00312 G.Out(pdGendoc,"processNetworkMessage for INITIATE_FEDERATE_RESTORE");
00313 queues->insertLastCommand(msg);
00314 break ;
00315
00316 case NetworkMessage::FEDERATION_RESTORED:
00317 case NetworkMessage::FEDERATION_NOT_RESTORED:
00318 D.Out(pdTrace, "Receiving Message from RTIG, "
00319 " type Federation(Not)Restored.");
00320 queues->insertLastCommand(msg);
00321 break ;
00322
00323 case NetworkMessage::PROVIDE_ATTRIBUTE_VALUE_UPDATE:
00324 D.Out(pdTrace, "Receiving Message from RTIG, "
00325 " type ProvideAttributeValueUpdate.");
00326 queues->insertFifoMessage(msg);
00327 break ;
00328
00329 case NetworkMessage::TIME_REGULATION_ENABLED:
00330 D.Out(pdTrace, "Receiving Message from RTIG, "
00331 " type TimeRegulationEnabled.");
00332 queues->insertLastCommand(msg);
00333 break ;
00334 case NetworkMessage::TIME_CONSTRAINED_ENABLED:
00335 D.Out(pdTrace, "Receiving Message from RTIG, "
00336 " type TimeConstrainedEnabled.");
00337 queues->insertLastCommand(msg);
00338 break;
00339 case NetworkMessage::SET_CLASS_RELEVANCE_ADVISORY_SWITCH:
00340 D.Out(pdTrace, "Receiving Message from RTIG, "
00341 " type setCRAS.");
00342 break;
00343 case NetworkMessage::SET_INTERACTION_RELEVANCE_ADVISORY_SWITCH:
00344 D.Out(pdTrace, "Receiving Message from RTIG, "
00345 " type setIRAS.");
00346 break;
00347 case NetworkMessage::SET_ATTRIBUTE_RELEVANCE_ADVISORY_SWITCH:
00348 D.Out(pdTrace, "Receiving Message from RTIG, "
00349 " type setARAS.");
00350 break;
00351 case NetworkMessage::SET_ATTRIBUTE_SCOPE_ADVISORY_SWITCH:
00352 D.Out(pdTrace, "Receiving Message from RTIG, "
00353 " type setASAS.");
00354 break;
00355 case NetworkMessage::START_REGISTRATION_FOR_OBJECT_CLASS:
00356 D.Out(pdTrace, "Receiving Message from RTIG, "
00357 " type StartRegForObjClass.");
00358 queues->insertLastCommand(msg);
00359 break;
00360
00361 default:
00362 {
00363 D.Out(pdTrace,
00364 "Receving Message from RTIG, unknown type %d.", msgType);
00365 delete msg ;
00366 throw RTIinternalError("Unknown Message type received from RTIG.");
00367 }
00368 }
00369
00370 stat.rtiService(msgType);
00371 G.Out(pdGendoc,"exit RTIA::processNetworkMessage");
00372 }
00373
00374 }}
00375
00376