00001
00053 #define _EXPORT_CCL_
00054
00055 #include "CigiLosXRespV3_2.h"
00056 #include "CigiSwapping.h"
00057 #include "CigiExceptions.h"
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 CigiLosXRespV3_2::CigiLosXRespV3_2()
00069 {
00070
00071 PacketID = CIGI_LOS_XRESP_PACKET_ID_V3_2;
00072 PacketSize = CIGI_LOS_XRESP_PACKET_SIZE_V3_2;
00073 Version = 3;
00074 MinorVersion = 2;
00075
00076 LosID = 0;
00077 Valid = false;
00078 EntityIDValid = false;
00079 RangeValid = false;
00080 Visible = false;
00081 IntersectionCoordSys = Geodetic;
00082 HostFrame = 0;
00083 RespCount = 0;
00084 EntityID = 0;
00085 Range = 0.0;
00086 LatOrXoff = 0.0;
00087 LonOrYoff = 0.0;
00088 AltOrZoff = 0.0;
00089 Red = 0;
00090 Green = 0;
00091 Blue = 0;
00092 Alpha = 0;
00093 Material = 0;
00094 NormalAz = 0.0;
00095 NormalEl = 0.0;
00096 ValidV1or2 = true;
00097
00098 }
00099
00100
00101
00102
00103 CigiLosXRespV3_2::~CigiLosXRespV3_2()
00104 {
00105
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115 int CigiLosXRespV3_2::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00116 {
00117 PackPointer CDta;
00118
00119 CigiBaseLosResp * Data = ( CigiBaseLosResp *)Base;
00120
00121 CDta.c = Buff;
00122
00123 *CDta.c++ = PacketID;
00124 *CDta.c++ = PacketSize;
00125
00126 *CDta.s++ = Data->LosID;
00127
00128 Cigi_uint8 HDta = (Data->Valid) ? 0x01 : 0x00;
00129 HDta |= (Data->EntityIDValid) ? 0x02 : 0x00;
00130 HDta |= (Data->RangeValid) ? 0x04 : 0x00;
00131 HDta |= (Data->Visible) ? 0x08 : 0x00;
00132 HDta |= (Data->HostFrame << 4) & 0xf0;
00133 *CDta.c++ = HDta;
00134
00135 *CDta.c++ = Data->RespCount;
00136 *CDta.s++ = Data->EntityID;
00137 *CDta.d++ = Data->Range;
00138 *CDta.d++ = Data->LatOrXoff;
00139 *CDta.d++ = Data->LonOrYoff;
00140 *CDta.d++ = Data->AltOrZoff;
00141 *CDta.c++ = Data->Red;
00142 *CDta.c++ = Data->Green;
00143 *CDta.c++ = Data->Blue;
00144 *CDta.c++ = Data->Alpha;
00145 *CDta.l++ = Data->Material;
00146 *CDta.f++ = Data->NormalAz;
00147 *CDta.f++ = Data->NormalEl;
00148
00149 return(PacketSize);
00150
00151 }
00152
00153
00154
00155
00156 int CigiLosXRespV3_2::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00157 {
00158 PackPointer CDta;
00159
00160 CDta.c = Buff;
00161
00162 CDta.c += 2;
00163
00164 if(!Swap)
00165 {
00166 LosID = *CDta.s++;
00167
00168 Cigi_uint8 HDta = *CDta.c++;
00169 Valid = ((HDta & 0x01) != 0);
00170 EntityIDValid = ((HDta & 0x02) != 0);
00171 RangeValid = ((HDta & 0x04) != 0);
00172 Visible = ((HDta & 0x08) != 0);
00173 HostFrame = (Cigi_uint8)((HDta >> 4) & 0x0f);
00174
00175 RespCount = *CDta.c++;
00176 EntityID = *CDta.s++;
00177 Range = *CDta.d++;
00178 LatOrXoff = *CDta.d++;
00179 LonOrYoff = *CDta.d++;
00180 AltOrZoff = *CDta.d++;
00181 Red = *CDta.c++;
00182 Green = *CDta.c++;
00183 Blue = *CDta.c++;
00184 Alpha = *CDta.c++;
00185 Material = *CDta.l++;
00186 NormalAz = *CDta.f++;
00187 NormalEl = *CDta.f++;
00188
00189 }
00190 else
00191 {
00192 CigiSwap2(&LosID, CDta.s++);
00193
00194 Cigi_uint8 HDta = *CDta.c++;
00195 Valid = ((HDta & 0x01) != 0);
00196 EntityIDValid = ((HDta & 0x02) != 0);
00197 RangeValid = ((HDta & 0x04) != 0);
00198 Visible = ((HDta & 0x08) != 0);
00199 HostFrame = (Cigi_uint8)((HDta >> 4) & 0x0f);
00200
00201 RespCount = *CDta.c++;
00202 CigiSwap2(&EntityID, CDta.s++);
00203 CigiSwap8(&Range, CDta.d++);
00204 CigiSwap8(&LatOrXoff, CDta.d++);
00205 CigiSwap8(&LonOrYoff, CDta.d++);
00206 CigiSwap8(&AltOrZoff, CDta.d++);
00207 Red = *CDta.c++;
00208 Green = *CDta.c++;
00209 Blue = *CDta.c++;
00210 Alpha = *CDta.c++;
00211 CigiSwap4(&Material, CDta.l++);
00212 CigiSwap4(&NormalAz, CDta.f++);
00213 CigiSwap4(&NormalEl, CDta.f++);
00214
00215 }
00216
00217 if(EntityIDValid)
00218 {
00219 ValidV1or2 = false;
00220 IntersectionCoordSys = Entity;
00221 }
00222 else
00223 {
00224 ValidV1or2 = true;
00225 IntersectionCoordSys = Geodetic;
00226 }
00227
00228 return(PacketSize);
00229
00230 }
00231
00232
00233
00234
00235
00236 int CigiLosXRespV3_2::GetCnvt(CigiVersionID &CnvtVersion,
00237 CigiCnvtInfoType::Type &CnvtInfo)
00238 {
00239 CnvtInfo.ProcID = CigiProcessType::ProcStd;
00240
00241
00242
00243
00244
00245
00246 if(CnvtVersion.CigiMajorVersion < 3)
00247 CnvtInfo.CnvtPacketID = CIGI_LOS_RESP_PACKET_ID_V2;
00248 else
00249 CnvtInfo.CnvtPacketID = CIGI_LOS_XRESP_PACKET_ID_V3;
00250
00251 return(CIGI_SUCCESS);
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 int CigiLosXRespV3_2::SetNormalAz(const float NormalAzIn, bool bndchk)
00265 {
00266
00267 #ifndef CIGI_NO_BND_CHK
00268 if(bndchk && ((NormalAzIn < -180.0)||(NormalAzIn > 180.0)))
00269 {
00270 #ifndef CIGI_NO_EXCEPT
00271 throw CigiValueOutOfRangeException("NormalAz",(float)NormalAzIn,-180.0,180.0);
00272 #endif
00273 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00274 }
00275 #endif
00276
00277 NormalAz = NormalAzIn;
00278 return(CIGI_SUCCESS);
00279
00280 }
00281
00282
00283
00284
00285
00286 int CigiLosXRespV3_2::SetNormalEl(const float NormalElIn, bool bndchk)
00287 {
00288
00289 #ifndef CIGI_NO_BND_CHK
00290 if(bndchk && ((NormalElIn < -90.0)||(NormalElIn > 90.0)))
00291 {
00292 #ifndef CIGI_NO_EXCEPT
00293 throw CigiValueOutOfRangeException("NormalEl",(float)NormalElIn,-90.0,90.0);
00294 #endif
00295 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00296 }
00297 #endif
00298
00299 NormalEl = NormalElIn;
00300 return(CIGI_SUCCESS);
00301
00302 }
00303
00304