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/rangesensor/rangesensor.h"
00041
00042
00043 using namespace JAUS;
00044
00045
00046 const std::string RangeSensor::Name = "urn:jaus:jss:jpp:extras:RangeSensor";
00047
00048
00054 RangeSensor::RangeSensor() : Events::Child(Service::ID(RangeSensor::Name), Service::ID(Events::Name))
00055 {
00056 }
00057
00058
00064 RangeSensor::~RangeSensor()
00065 {
00066 }
00067
00068
00080 void RangeSensor::AddRangeDevice(const RangeSensorConfig& configuration)
00081 {
00082 Mutex::ScopedLock lock(&mRangeSensorMutex);
00083 mRangeSensors[configuration.mID] = configuration;
00084 mRangeScans[configuration.mID] = ReportLocalRangeScan();
00085 mRangeScans[configuration.mID].SetSourceID(GetComponentID());
00086 if(GetComponent())
00087 {
00088 SignalEvent(REPORT_RANGE_SENSOR_CONFIGURATION);
00089 }
00090 }
00091
00092
00113 void RangeSensor::SetLocalRangeScan(const Byte deviceID,
00114 const Point3D &deviceLocation,
00115 const Point3D &deviceOrientation,
00116 const std::vector<UShort>& scan,
00117 const Time& timestamp)
00118 {
00119 Mutex::ScopedLock lock(&mRangeSensorMutex);
00120
00121 std::map<Byte, ReportLocalRangeScan>::iterator s;
00122 s = mRangeScans.find(deviceID);
00123 if(s != mRangeScans.end())
00124 {
00125 s->second.SetSensorID(deviceID);
00126 s->second.SetSensorLocation(deviceLocation);
00127 s->second.SetSensorOrientation(deviceOrientation);
00128 RangeSensorConfig::Map::iterator config;
00129 config = mRangeSensors.find(deviceID);
00130 ReportLocalRangeScan::Scan* ptr = s->second.GetScan();
00131 ptr->Clear();
00132 ptr->Reserve((unsigned int)scan.size());
00133
00134 std::vector<UShort>::const_iterator r;
00135 for(r = scan.begin();
00136 r != scan.end();
00137 r++)
00138 {
00139 ptr->PushBack((UShort)(*r));
00140 }
00141
00142 SignalEvent(REPORT_LOCAL_RANGE_SCAN);
00143 }
00144 }
00145
00146
00165 void RangeSensor::SetLocalRangeScan(const Byte deviceID,
00166 const Point3D &deviceLocation,
00167 const Point3D &deviceOrientation,
00168 const std::vector<double>& scan,
00169 const Time& timestamp)
00170 {
00171 Mutex::ScopedLock lock(&mRangeSensorMutex);
00172
00173 std::map<Byte, ReportLocalRangeScan>::iterator s;
00174 s = mRangeScans.find(deviceID);
00175 if(s != mRangeScans.end())
00176 {
00177 s->second.SetSensorID(deviceID);
00178 s->second.SetSensorLocation(deviceLocation);
00179 s->second.SetSensorOrientation(deviceOrientation);
00180 RangeSensorConfig::Map::iterator config;
00181 config = mRangeSensors.find(deviceID);
00182 ReportLocalRangeScan::Scan* ptr = s->second.GetScan();
00183 ptr->Clear();
00184 ptr->Reserve((unsigned int)scan.size());
00185
00186 std::vector<double>::const_iterator r;
00187 double multiplier = 1000.0;
00188 if(config->second.mUnitType == RangeSensorConfig::CM)
00189 {
00190 multiplier = 100.0;
00191 }
00192 for(r = scan.begin();
00193 r != scan.end();
00194 r++)
00195 {
00196 ptr->PushBack((UShort)(multiplier*(*r)));
00197 }
00198
00199 SignalEvent(REPORT_LOCAL_RANGE_SCAN);
00200 }
00201 }
00202
00203
00222 void RangeSensor::SetLocalRangeScan(const Byte deviceID,
00223 const Point3D &deviceLocation,
00224 const Point3D &deviceOrientation,
00225 const Point3D::List& scan,
00226 const Time& timestamp)
00227 {
00228 Mutex::ScopedLock lock(&mRangeSensorMutex);
00229
00230 std::map<Byte, ReportLocalRangeScan>::iterator s;
00231 s = mRangeScans.find(deviceID);
00232 if(s != mRangeScans.end())
00233 {
00234 s->second.SetSensorID(deviceID);
00235 s->second.SetSensorLocation(deviceLocation);
00236 s->second.SetSensorOrientation(deviceOrientation);
00237 RangeSensorConfig::Map::iterator config;
00238 config = mRangeSensors.find(deviceID);
00239 ReportLocalRangeScan::Scan* ptr = s->second.GetScan();
00240 ptr->Clear();
00241 ptr->Reserve((unsigned int)scan.size());
00242
00243 Point3D::List::const_iterator r;
00244 double multiplier = 1000.0;
00245 if(config->second.mUnitType == RangeSensorConfig::CM)
00246 {
00247 multiplier = 100.0;
00248 }
00249 for(r = scan.begin();
00250 r != scan.end();
00251 r++)
00252 {
00253 ptr->PushBack((UShort)(multiplier*(r->mX)));
00254 }
00255
00256 SignalEvent(REPORT_LOCAL_RANGE_SCAN);
00257 }
00258 }
00259
00260
00270 bool RangeSensor::GenerateEvent(const Events::Subscription& info) const
00271 {
00272 if(info.mpQueryMessage->GetMessageCode() == QUERY_RANGE_SENSOR_CONFIGURATION)
00273 {
00274 ReportRangeSensorConfiguration report;
00275 RangeSensorConfig::Map::const_iterator config;
00276
00277 {
00278 Mutex::ScopedLock lock(&mRangeSensorMutex);
00279 for(config = mRangeSensors.begin();
00280 config != mRangeSensors.end();
00281 config++)
00282 {
00283 report.GetConfiguration()->push_back(config->second);
00284 }
00285 }
00286 SendEvent(info, &report);
00287 return true;
00288 }
00289 else if(info.mpQueryMessage->GetMessageCode() == QUERY_LOCAL_RANGE_SCAN)
00290 {
00291 std::map<Byte, ReportLocalRangeScan>::const_iterator scan;
00292 ReportLocalRangeScan report;
00293 bool haveScan = false;
00294
00295 {
00296 Mutex::ScopedLock lock(&mRangeSensorMutex);
00297 scan = mRangeScans.find( ((QueryLocalRangeScan *)info.mpQueryMessage)->GetSensorID() );
00298 if(scan != mRangeScans.end())
00299 {
00300 report = scan->second;
00301 haveScan = true;
00302 }
00303 }
00304
00305 if(haveScan)
00306 {
00307 SendEvent(info, &report);
00308 return true;
00309 }
00310 }
00311 return false;
00312 }
00313
00314
00330 bool RangeSensor::IsEventSupported(const Events::Type type,
00331 const double requestedPeriodicRate,
00332 const Message* queryMessage,
00333 double& confirmedPeriodicRate,
00334 std::string& errorMessage) const
00335 {
00336 if(queryMessage->GetMessageCode() == QUERY_RANGE_SENSOR_CONFIGURATION ||
00337 queryMessage->GetMessageCode() == QUERY_LOCAL_RANGE_SCAN )
00338 {
00339 confirmedPeriodicRate = requestedPeriodicRate;
00340 return true;
00341 }
00342
00343 return false;
00344 }
00345
00346
00358 void RangeSensor::Receive(const JAUS::Message *message)
00359 {
00360 switch(message->GetMessageCode())
00361 {
00362 case QUERY_LOCAL_RANGE_SCAN:
00363
00364 break;
00365 case QUERY_RANGE_SENSOR_CONFIGURATION:
00366 {
00367 ReportRangeSensorConfiguration report(message->GetSourceID(), GetComponentID());
00368 Mutex::ScopedLock lock(&mRangeSensorMutex);
00369 RangeSensorConfig::Map::iterator config;
00370 for(config = mRangeSensors.begin();
00371 config != mRangeSensors.end();
00372 config++)
00373 {
00374 report.GetConfiguration()->push_back(config->second);
00375 }
00376 Send(&report);
00377 }
00378 break;
00379 default:
00380 break;
00381 }
00382 }
00383
00384
00396 Message* RangeSensor::CreateMessage(const UShort messageCode) const
00397 {
00398 Message* message = NULL;
00399 switch(messageCode)
00400 {
00401 case QUERY_LOCAL_RANGE_SCAN:
00402 message = new QueryLocalRangeScan();
00403 break;
00404 case QUERY_RANGE_SENSOR_CONFIGURATION:
00405 message = new QueryRangeSensorConfiguration();
00406 break;
00407 case REPORT_RANGE_SENSOR_CONFIGURATION:
00408 message = new ReportRangeSensorConfiguration();
00409 break;
00410 case REPORT_LOCAL_RANGE_SCAN:
00411 message = new ReportLocalRangeScan();
00412 break;
00413 default:
00414 message = NULL;
00415 break;
00416 };
00417 return message;
00418 }
00419
00420