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/mobility/drivers/reportglobalpathsegment.h"
00041 #include "jaus/core/scaledinteger.h"
00042 #include <cxutils/math/cxmath.h>
00043
00044 const double JAUS::ReportGlobalPathSegment::Limits::MinLatitude = -90.0;
00045 const double JAUS::ReportGlobalPathSegment::Limits::MaxLatitude = 90.0;
00046 const double JAUS::ReportGlobalPathSegment::Limits::MinLongitude = -180.0;
00047 const double JAUS::ReportGlobalPathSegment::Limits::MaxLongitude = 180.0;
00048 const double JAUS::ReportGlobalPathSegment::Limits::MinElevation = -10000;
00049 const double JAUS::ReportGlobalPathSegment::Limits::MaxElevation = 35000;
00050 const double JAUS::ReportGlobalPathSegment::Limits::MinWeightingFactor = 0.0;
00051 const double JAUS::ReportGlobalPathSegment::Limits::MaxWeightingFactor = 500.0;
00052 const double JAUS::ReportGlobalPathSegment::Limits::MinPathTolerance = 0.0;
00053 const double JAUS::ReportGlobalPathSegment::Limits::MaxPathTolerance = 100000.0;
00054
00055 using namespace JAUS;
00056
00057
00066 ReportGlobalPathSegment::ReportGlobalPathSegment(const Address& dest, const Address& src) : Message(REPORT_GLOBAL_PATH_SEGMENT, dest, src)
00067 {
00068 mPresenceVector = 0;
00069 mP1Latitude = 0;
00070 mP1Longitude = 0;
00071 mP1Altitude = 0;
00072 mP2Latitude = 0;
00073 mP2Longitude = 0;
00074 mP2Altitude = 0;
00075 mWeightingFactor = 0;
00076 mPathTolerance = 0;
00077 }
00078
00079
00085 ReportGlobalPathSegment::ReportGlobalPathSegment(const ReportGlobalPathSegment& message) : Message(REPORT_GLOBAL_PATH_SEGMENT)
00086 {
00087 *this = message;
00088 }
00089
00090
00096 ReportGlobalPathSegment::~ReportGlobalPathSegment()
00097 {
00098 }
00099
00100
00110 bool ReportGlobalPathSegment::SetP1Latitude(const double degrees)
00111 {
00112 if(degrees >= Limits::MinLatitude && degrees <= Limits::MaxLatitude)
00113 {
00114 mP1Latitude = degrees;
00115 return true;
00116 }
00117 return false;
00118 }
00119
00120
00130 bool ReportGlobalPathSegment::SetP1Longitude(const double degrees)
00131 {
00132 if(degrees >= Limits::MinLongitude && degrees <= Limits::MaxLongitude)
00133 {
00134 mP1Longitude = degrees;
00135 return true;
00136 }
00137 return false;
00138 }
00139
00140
00151 bool ReportGlobalPathSegment::SetP1Altitude(const double value)
00152 {
00153 if(value >= Limits::MinElevation && value <= Limits::MaxElevation)
00154 {
00155 mP1Altitude = value;
00156 mPresenceVector |= PresenceVector::P1Altitude;
00157 return true;
00158 }
00159 return false;
00160 }
00161
00162
00172 bool ReportGlobalPathSegment::SetP2Latitude(const double degrees)
00173 {
00174 if(degrees >= Limits::MinLatitude && degrees <= Limits::MaxLatitude)
00175 {
00176 mP2Latitude = degrees;
00177 return true;
00178 }
00179 return false;
00180 }
00181
00182
00192 bool ReportGlobalPathSegment::SetP2Longitude(const double degrees)
00193 {
00194 if(degrees >= Limits::MinLongitude && degrees <= Limits::MaxLongitude)
00195 {
00196 mP2Longitude = degrees;
00197 return true;
00198 }
00199 return false;
00200 }
00201
00202
00213 bool ReportGlobalPathSegment::SetP2Altitude(const double value)
00214 {
00215 if(value >= Limits::MinElevation && value <= Limits::MaxElevation)
00216 {
00217 mP2Altitude = value;
00218 mPresenceVector |= PresenceVector::P2Altitude;
00219 return true;
00220 }
00221 return false;
00222 }
00223
00224
00235 bool ReportGlobalPathSegment::SetWeightingFactor(const double value)
00236 {
00237 if(value >= Limits::MinWeightingFactor && value <= Limits::MaxWeightingFactor)
00238 {
00239 mWeightingFactor = value;
00240 return true;
00241 }
00242 return false;
00243 }
00244
00245
00256 bool ReportGlobalPathSegment::SetPathTolerance(const double value)
00257 {
00258 if(value >= Limits::MinPathTolerance && value <= Limits::MaxPathTolerance)
00259 {
00260 mPathTolerance= value;
00261 mPresenceVector |= PresenceVector::PathTolerance;
00262 return true;
00263 }
00264 return false;
00265 }
00266
00267
00279 int ReportGlobalPathSegment::WriteMessageBody(Packet& packet) const
00280 {
00281 int expected = BYTE_SIZE;
00282 int written = 0;
00283
00284 written += packet.Write(mPresenceVector);
00285
00286 expected += UINT_SIZE;
00287 written += ScaledInteger::Write(packet, mP1Latitude, Limits::MaxLatitude, Limits::MinLatitude, ScaledInteger::UInt);
00288
00289 expected += UINT_SIZE;
00290 written += ScaledInteger::Write(packet, mP1Longitude, Limits::MaxLongitude, Limits::MinLongitude, ScaledInteger::UInt);
00291
00292 if((mPresenceVector & PresenceVector::P1Altitude) > 0)
00293 {
00294 expected += UINT_SIZE;
00295 written += ScaledInteger::Write(packet, mP1Altitude, Limits::MaxElevation, Limits::MinElevation, ScaledInteger::UInt);
00296 }
00297
00298 expected += UINT_SIZE;
00299 written += ScaledInteger::Write(packet, mP2Latitude, Limits::MaxLatitude, Limits::MinLatitude, ScaledInteger::UInt);
00300
00301 expected += UINT_SIZE;
00302 written += ScaledInteger::Write(packet, mP2Longitude, Limits::MaxLongitude, Limits::MinLongitude, ScaledInteger::UInt);
00303
00304 if((mPresenceVector & PresenceVector::P2Altitude) > 0)
00305 {
00306 expected += UINT_SIZE;
00307 written += ScaledInteger::Write(packet, mP2Altitude, Limits::MaxElevation, Limits::MinElevation, ScaledInteger::UInt);
00308 }
00309
00310 expected += USHORT_SIZE;
00311 written += ScaledInteger::Write(packet, mWeightingFactor, Limits::MaxWeightingFactor, Limits::MinWeightingFactor, ScaledInteger::UShort);
00312
00313 if((mPresenceVector & PresenceVector::PathTolerance) > 0)
00314 {
00315 expected += UINT_SIZE;
00316 written += ScaledInteger::Write(packet, mPathTolerance, Limits::MaxPathTolerance, Limits::MinPathTolerance, ScaledInteger::UInt);
00317 }
00318
00319 return expected == written ? written : -1;
00320 }
00321
00322
00334 int ReportGlobalPathSegment::ReadMessageBody(const Packet& packet)
00335 {
00336 int expected = BYTE_SIZE;
00337 int read = 0;
00338
00339 read += packet.Read(mPresenceVector);
00340
00341 expected += UINT_SIZE;
00342 read += ScaledInteger::Read(packet, mP1Latitude, Limits::MaxLatitude, Limits::MinLatitude, ScaledInteger::UInt);
00343
00344 expected += UINT_SIZE;
00345 read += ScaledInteger::Read(packet, mP1Longitude, Limits::MaxLongitude, Limits::MinLongitude, ScaledInteger::UInt);
00346
00347 if((mPresenceVector & PresenceVector::P1Altitude) > 0)
00348 {
00349 expected += UINT_SIZE;
00350 read += ScaledInteger::Read(packet, mP1Altitude, Limits::MaxElevation, Limits::MinElevation, ScaledInteger::UInt);
00351 }
00352
00353 expected += UINT_SIZE;
00354 read += ScaledInteger::Read(packet, mP2Latitude, Limits::MaxLatitude, Limits::MinLatitude, ScaledInteger::UInt);
00355
00356 expected += UINT_SIZE;
00357 read += ScaledInteger::Read(packet, mP2Longitude, Limits::MaxLongitude, Limits::MinLongitude, ScaledInteger::UInt);
00358
00359 if((mPresenceVector & PresenceVector::P2Altitude) > 0)
00360 {
00361 expected += UINT_SIZE;
00362 read += ScaledInteger::Read(packet, mP2Altitude, Limits::MaxElevation, Limits::MinElevation, ScaledInteger::UInt);
00363 }
00364
00365 expected += USHORT_SIZE;
00366 read += ScaledInteger::Read(packet, mWeightingFactor, Limits::MaxWeightingFactor, Limits::MinWeightingFactor, ScaledInteger::UShort);
00367
00368 if((mPresenceVector & PresenceVector::PathTolerance) > 0)
00369 {
00370 expected += UINT_SIZE;
00371 read += ScaledInteger::Read(packet, mPathTolerance, Limits::MaxPathTolerance, Limits::MinPathTolerance, ScaledInteger::UInt);
00372 }
00373
00374 return expected == read ? read : -1;
00375 }
00376
00377
00383 void ReportGlobalPathSegment::ClearMessageBody()
00384 {
00385 mPresenceVector = 0;
00386 mP1Latitude = 0;
00387 mP1Longitude = 0;
00388 mP1Altitude = 0;
00389 mP2Latitude = 0;
00390 mP2Longitude = 0;
00391 mP2Altitude = 0;
00392 mWeightingFactor = 0;
00393 mPathTolerance = 0;
00394 }
00395
00396
00404 int ReportGlobalPathSegment::RunTestCase() const
00405 {
00406 int result = 0;
00407
00408 Packet packet;
00409
00410 ReportGlobalPathSegment msg1, msg2;
00411
00412 msg1.SetP1Altitude(60);
00413 msg1.SetP2Altitude(30);
00414
00415 if((msg1.WriteMessageBody(packet) != -1) &&
00416 (msg2.ReadMessageBody(packet) != -1))
00417 {
00418 if(msg2.AreFieldsPresent(PresenceVector::P1Altitude | PresenceVector::P2Altitude) )
00419 {
00420 result = 1;
00421 }
00422 }
00423
00424 return result;
00425 }
00426
00427
00433 ReportGlobalPathSegment& ReportGlobalPathSegment::operator=(const ReportGlobalPathSegment& message)
00434 {
00435 if(this != &message)
00436 {
00437 CopyHeaderData(&message);
00438 mPresenceVector = message.mPresenceVector;
00439 mP1Latitude = message.mP1Latitude;
00440 mP1Longitude = message.mP1Longitude;
00441 mP1Altitude = message.mP1Altitude;
00442 mP2Latitude = message.mP2Latitude;
00443 mP2Longitude = message.mP2Longitude;
00444 mP2Altitude = message.mP2Altitude;
00445 mWeightingFactor = message.mWeightingFactor;
00446 mPathTolerance = message.mPathTolerance;
00447
00448 }
00449 return *this;
00450 }
00451
00452
00453