Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "jaus/extras/command/subsystemcommand.h"
00041 #include "jaus/mobility/sensors/globalposesensor.h"
00042 #include "jaus/mobility/sensors/velocitystatesensor.h"
00043 #include <cmath>
00044 #include <tinyxml/tinyxml.h>
00045
00046 using namespace JAUS;
00047
00048 const std::string SubsystemCommand::Name = "urn:jaus:jss:jpp:extras:SubsystemCommand";
00049
00050
00056 SubsystemCommand::SubsystemCommand(const Service::ID& id) : Management::Child(id,
00057 Service::ID(Management::Name))
00058 {
00059 mOnChangeEventsFlag = false;
00060 mDesiredPeriodicRateHz = 25;
00061 mpGlobalPoseCallback = NULL;
00062 }
00063
00064
00070 SubsystemCommand::~SubsystemCommand()
00071 {
00072 if(mpGlobalPoseCallback)
00073 {
00074 delete mpGlobalPoseCallback;
00075 mpGlobalPoseCallback = NULL;
00076 }
00077 }
00078
00079
00086 void SubsystemCommand::Initialize()
00087 {
00088 DiscoveryService()->RegisterCallback(this, true);
00089 }
00090
00091
00103 void SubsystemCommand::SetGlobalPoseSubscriptionType(const bool everyChange,
00104 const double desiredPeriodicRate)
00105 {
00106 if(GetComponent() && GetComponent()->IsInitialized() == false)
00107 {
00108 mOnChangeEventsFlag = everyChange;
00109 mDesiredPeriodicRateHz = desiredPeriodicRate;
00110 }
00111 }
00112
00113
00119 const Discovery* SubsystemCommand::DiscoveryService() const
00120 {
00121 return GetComponent()->DiscoveryService();
00122 }
00123
00124
00130 Discovery* SubsystemCommand::DiscoveryService()
00131 {
00132 return GetComponent()->DiscoveryService();
00133 }
00134
00135
00141 const AccessControl* SubsystemCommand::AccessControlService() const
00142 {
00143 return GetComponent()->AccessControlService();
00144 }
00145
00146
00152 AccessControl* SubsystemCommand::AccessControlService()
00153 {
00154 return GetComponent()->AccessControlService();
00155 }
00156
00157
00172 bool SubsystemCommand::SendCommand(const Message* commandMessage,
00173 const bool sendResumeFlag,
00174 const unsigned int waitTimeMs)
00175 {
00176 Address dest = commandMessage->GetDestinationID();
00177
00178 RequestComponentControl(dest, sendResumeFlag, true, waitTimeMs);
00179 return Send(commandMessage);
00180 }
00181
00182
00188 void SubsystemCommand::Receive(const Message* message)
00189 {
00190 }
00191
00192
00198 Message* SubsystemCommand::CreateMessage(const UShort messageCode) const
00199 {
00200 Message* message = NULL;
00201 switch(messageCode)
00202 {
00203 case REPORT_GLOBAL_POSE:
00204 message = new ReportGlobalPose();
00205 break;
00206 case REPORT_VELOCITY_STATE:
00207 message = new ReportVelocityState();
00208 break;
00209 default:
00210 message = NULL;
00211 break;
00212 }
00213 return message;
00214 }
00215
00216
00223 void SubsystemCommand::CheckServiceStatus(const unsigned int timeSinceLastCheckMs)
00224 {
00225 }
00226
00227
00233 void SubsystemCommand::PrintStatus() const
00234 {
00235 Vehicle::Map vehicles;
00236
00237 GetComponent()->DiscoveryService()->GetVehicles(vehicles);
00238
00239 Vehicle::Map::const_iterator subsystem;
00240 for(subsystem = vehicles.begin();
00241 subsystem != vehicles.end();
00242 subsystem++)
00243 {
00244 std::cout << "========================================================================\n";
00245 std::cout << "Vehicle [" << subsystem->first << "] - " << subsystem->second->mIdentification << std::endl;
00246 Subsystem::Configuration::const_iterator node;
00247 for(node = subsystem->second->mConfiguration.begin();
00248 node != subsystem->second->mConfiguration.end();
00249 node++)
00250 {
00251 Subsystem::Component::Set::const_iterator component;
00252 for(component = node->second.begin();
00253 component != node->second.end();
00254 component++)
00255 {
00256 if(GetComponent()->AccessControlService()->HaveControl(component->mID))
00257 {
00258 std::cout << " Controlling: " << component->mIdentification << " - " << component->mID.ToString() << std::endl;
00259 }
00260 else
00261 {
00262 std::cout << " " << component->mIdentification << " - " << component->mID.ToString() << std::endl;
00263 }
00264 }
00265 }
00266 std::cout << " ";
00267 subsystem->second->mPosition.Print();
00268 double x, y, z;
00269 x = fabs(subsystem->second->mAttitude.mX) < .001 ? 0.0 : subsystem->second->mAttitude.mX;
00270 y = fabs(subsystem->second->mAttitude.mY) < .001 ? 0.0 : subsystem->second->mAttitude.mY;
00271 z = fabs(subsystem->second->mAttitude.mZ) < .001 ? 0.0 : subsystem->second->mAttitude.mZ;
00272 std::cout << " A <" << x << ", " << y << ", " << z << ">\n ";
00273 x = fabs(subsystem->second->mLinearVelocity.mX) < .001 ? 0.0 : subsystem->second->mLinearVelocity.mX;
00274 y = fabs(subsystem->second->mLinearVelocity.mY) < .001 ? 0.0 : subsystem->second->mLinearVelocity.mY;
00275 z = fabs(subsystem->second->mLinearVelocity.mZ) < .001 ? 0.0 : subsystem->second->mLinearVelocity.mZ;
00276 std::cout << " V <" << x << ", " << y << ", " << z << ">\n ";
00277 std::cout << subsystem->second->mUpdateTime.ToString() << std::endl;
00278 }
00279
00280 Vehicle::DeleteVehicleMap(vehicles);
00281 }
00282
00283
00290 void SubsystemCommand::ProcessSystemState(const Subsystem::Map& system)
00291 {
00292 if(mpGlobalPoseCallback == NULL)
00293 {
00294 mpGlobalPoseCallback = new GlobalPoseCallback();
00295 mpGlobalPoseCallback->mpComponent = GetComponent();
00296 GetComponent()->TransportService()->RegisterCallback(REPORT_GLOBAL_POSE, mpGlobalPoseCallback);
00297 }
00298
00299 Subsystem::Map::const_iterator s;
00300 for(s = system.begin();
00301 s != system.end();
00302 s++)
00303 {
00304 Address id;
00305 if(s->second->HaveService(GlobalPoseSensor::Name, &id))
00306 {
00307 if(EventsService()->HaveSubscription(REPORT_GLOBAL_POSE, id) == false)
00308 {
00309 QueryGlobalPose query;
00310 query.SetPresenceVector(query.GetPresenceVectorMask());
00311 if(mOnChangeEventsFlag)
00312 {
00313 EventsService()->RequestEveryChangeEvent(id, &query);
00314 }
00315 else
00316 {
00317 EventsService()->RequestPeriodicEvent(id, &query, mDesiredPeriodicRateHz);
00318 }
00319 }
00320 }
00321 if(s->second->HaveService(VelocityStateSensor::Name, &id))
00322 {
00323 if(EventsService()->HaveSubscription(REPORT_VELOCITY_STATE, id) == false)
00324 {
00325 QueryVelocityState query;
00326 query.SetPresenceVector(query.GetPresenceVectorMask());
00327 if(mOnChangeEventsFlag)
00328 {
00329 EventsService()->RequestEveryChangeEvent(id, &query);
00330 }
00331 else
00332 {
00333 EventsService()->RequestPeriodicEvent(id, &query, mDesiredPeriodicRateHz);
00334 }
00335 }
00336 }
00337 }
00338 }
00339
00340
00347 void SubsystemCommand::GlobalPoseCallback::ProcessMessage(const Message* message)
00348 {
00349 if(mpComponent == NULL)
00350 {
00351 return;
00352 }
00353 switch(message->GetMessageCode())
00354 {
00355 case REPORT_GLOBAL_POSE:
00356 {
00357 const ReportGlobalPose* report = dynamic_cast<const ReportGlobalPose*>(message);
00358 if(report)
00359 {
00360 Wgs wgs;
00361 Attitude att;
00362 Time timestamp;
00363
00364 wgs = mpComponent->DiscoveryService()->GetVehicle(report->GetSourceID().mSubsystem)->mPosition;
00365 att = mpComponent->DiscoveryService()->GetVehicle(report->GetSourceID().mSubsystem)->mAttitude;
00366
00367
00368
00369 if(report->IsFieldPresent(ReportGlobalPose::PresenceVector::Latitude))
00370 {
00371 wgs.mLatitude = report->GetLatitude();
00372 }
00373 if(report->IsFieldPresent(ReportGlobalPose::PresenceVector::Longitude))
00374 {
00375 wgs.mLongitude = report->GetLongitude();
00376 }
00377 if(report->IsFieldPresent(ReportGlobalPose::PresenceVector::Altitude))
00378 {
00379 wgs.mElevation = report->GetAltitude();
00380 }
00381 if(report->IsFieldPresent(ReportGlobalPose::PresenceVector::Roll))
00382 {
00383 att.mX = report->GetRoll();
00384 }
00385 if(report->IsFieldPresent(ReportGlobalPose::PresenceVector::Pitch))
00386 {
00387 att.mY = report->GetPitch();
00388 }
00389 if(report->IsFieldPresent(ReportGlobalPose::PresenceVector::Yaw))
00390 {
00391 att.mZ = report->GetYaw();
00392 }
00393 if(report->IsFieldPresent(ReportGlobalPose::PresenceVector::TimeStamp))
00394 {
00395 timestamp = report->GetTimeStamp();
00396 }
00397 else
00398 {
00399 timestamp.SetCurrentTime();
00400 }
00401
00402
00403 mpComponent->DiscoveryService()->GetVehicle(report->GetSourceID().mSubsystem)->Update(wgs, att, timestamp);
00404
00405
00406 mpComponent->DiscoveryService()->TriggerDiscoveryCallbacks();
00407 }
00408 }
00409 break;
00410 case REPORT_VELOCITY_STATE:
00411 {
00412 const ReportVelocityState* report = dynamic_cast<const ReportVelocityState*>(message);
00413 if(report)
00414 {
00415 Point3D linearVelocity;
00416 linearVelocity.Set(report->GetVelocityX(),
00417 report->GetVelocityY(),
00418 report->GetVelocityZ());
00419
00420 mpComponent->DiscoveryService()->GetVehicle(report->GetSourceID().mSubsystem)->Update(linearVelocity, Time(true));
00421
00422 mpComponent->DiscoveryService()->TriggerDiscoveryCallbacks();
00423 }
00424 }
00425 break;
00426 default:
00427 break;
00428 }
00429 }
00430
00431
00432