00001
00055 #define _EXPORT_CCL_
00056
00057 #include "CigiSensorRespV1.h"
00058 #include "CigiSwapping.h"
00059 #include "CigiExceptions.h"
00060
00061 #include <memory.h>
00062
00063
00064 #ifdef CIGI_LITTLE_ENDIAN
00065 #define CIGI_SCOPY2 CigiSwap2
00066 #define CIGI_SCOPY4 CigiSwap4
00067 #define CIGI_SCOPY8 CigiSwap8
00068 #else
00069 #define CIGI_SCOPY2 CigiCopy2
00070 #define CIGI_SCOPY4 CigiCopy4
00071 #define CIGI_SCOPY8 CigiCopy8
00072 #endif
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 CigiSensorRespV1::CigiSensorRespV1()
00086 {
00087
00088 PacketID = CIGI_SENSOR_RESP_PACKET_ID_V1;
00089 PacketSize = CIGI_SENSOR_RESP_PACKET_SIZE_V1;
00090 Version = 1;
00091 MinorVersion = 0;
00092
00093 ViewID = 0;
00094 SensorID = 0;
00095 SensorStat = Searching;
00096 EntityTgt = false;
00097 EntityID = 0;
00098 GateSzX = 0;
00099 GateSzY = 0;
00100 GateXoff = 0.0;
00101 GateYoff = 0.0;
00102 FrameCntr = 0;
00103 TrackPntLat = 0.0;
00104 TrackPntLon = 0.0;
00105 TrackPntAlt = 0.0;
00106
00107 }
00108
00109
00110
00111
00112 CigiSensorRespV1::~CigiSensorRespV1()
00113 {
00114
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124 int CigiSensorRespV1::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00125 {
00126 double DBuf[6];
00127
00128 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00129
00130 Cigi_int16 tsCnvt;
00131 Cigi_int32 tlCnvt;
00132 double tdCnvt;
00133
00134 union Conversion_short
00135 {
00136 Cigi_uint16 u;
00137 Cigi_int16 s;
00138 } tuCnvt;
00139
00140 PackPointer CDta;
00141
00142 CigiBaseSensorResp * Data = ( CigiBaseSensorResp *)Base;
00143
00144 CDta.d = DBuf;
00145
00146 *CDta.c++ = PacketID;
00147 *CDta.c++ = PacketSize;
00148
00149 Cigi_uint8 HDta = (Cigi_uint8)((Data->ViewID << 3) & 0x00f8);
00150 HDta |= (Cigi_uint8)((Data->SensorStat << 1) & 0x06);
00151 *CDta.c++ = HDta;
00152
00153 *CDta.c++ = Data->SensorID;
00154
00155 tdCnvt = (double)Data->GateXoff;
00156 if(tdCnvt < 0.0)
00157 tdCnvt += 360.0;
00158 tlCnvt = CIGI_FLOAT_TO_BA(tdCnvt);
00159 if((tlCnvt > 65535)||(tlCnvt < 0))
00160 tsCnvt = 0;
00161 else
00162 {
00163 tuCnvt.u = (Cigi_uint16)tlCnvt;
00164 tsCnvt = tuCnvt.s;
00165 }
00166 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00167
00168 tdCnvt = (double)Data->GateYoff;
00169 if(tdCnvt < 0.0)
00170 tdCnvt += 360.0;
00171 tlCnvt = CIGI_FLOAT_TO_BA(tdCnvt);
00172 if((tlCnvt > 65535)||(tlCnvt < 0))
00173 tsCnvt = 0;
00174 else
00175 {
00176 tuCnvt.u = (Cigi_uint16)tlCnvt;
00177 tsCnvt = tuCnvt.s;
00178 }
00179 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00180
00181 CIGI_SCOPY2(CDta.s++, &Data->GateSzX);
00182 CIGI_SCOPY2(CDta.s++, &Data->GateSzY);
00183
00184 memcpy(Buff,tBuf,CIGI_SENSOR_RESP_PACKET_SIZE_V1);
00185
00186 return(PacketSize);
00187
00188 }
00189
00190
00191
00192
00193 int CigiSensorRespV1::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00194 {
00195 double DBuf[6];
00196
00197 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00198
00199 Cigi_int16 tsCnvt;
00200
00201 PackPointer CDta;
00202
00203 memcpy(tBuf,Buff,CIGI_SENSOR_RESP_PACKET_SIZE_V1);
00204
00205 CDta.d = DBuf;
00206
00207 CDta.c += 2;
00208
00209 Cigi_uint8 HDta = *CDta.c++;
00210 ViewID = (Cigi_uint16)((HDta >> 3) & 0x1f);
00211 SensorStat = (SensorStatGrp)((HDta >> 1) & 0x03);
00212 SensorID = *CDta.c++;
00213
00214 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00215 GateXoff = (float)CIGI_BA_TO_FLOAT(tsCnvt);
00216 if(GateXoff > 180.0)
00217 GateXoff -= 360.0;
00218
00219 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00220 GateYoff = (float)CIGI_BA_TO_FLOAT(tsCnvt);
00221 if(GateYoff > 180.0)
00222 GateYoff -= 360.0;
00223
00224 CIGI_SCOPY2(&GateSzX, CDta.s++);
00225 CIGI_SCOPY2(&GateSzY, CDta.s++);
00226
00227 return(PacketSize);
00228
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 int CigiSensorRespV1::SetViewID(const Cigi_uint16 ViewIDIn, bool bndchk)
00242 {
00243
00244 #ifndef CIGI_NO_BND_CHK
00245 if(bndchk && ((ViewIDIn < 0)||(ViewIDIn > 32)))
00246 {
00247 #ifndef CIGI_NO_EXCEPT
00248 throw CigiValueOutOfRangeException("ViewID",(Cigi_uint16)ViewIDIn,0,32);
00249 #endif
00250 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00251 }
00252 #endif
00253
00254 ViewID = ViewIDIn;
00255 return(CIGI_SUCCESS);
00256
00257 }
00258
00259