00001
00060 #define _EXPORT_CCL_
00061
00062 #include "CigiSOFV3_2.h"
00063 #include "CigiExceptions.h"
00064 #include "CigiSwapping.h"
00065 #include "CigiVersionID.h"
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 CigiSOFV3_2::CigiSOFV3_2()
00076 {
00077
00078 PacketID = CIGI_SOF_PACKET_ID_V3_2;
00079 PacketSize = CIGI_SOF_PACKET_SIZE_V3_2;
00080 Version = 3;
00081 MinorVersion = 2;
00082
00083 BSwapEn = false;
00084 DatabaseID = 0;
00085 FrameCntr = 0;
00086 TimeStampV2 = 0.0f;
00087 TimeStampV3 = 0;
00088 ByteSwap = 0x8000;
00089 IGMode = Standby;
00090 TimestampValid = false;
00091 EarthRefModel = WGS84;
00092 LastRcvdHostFrame = 0;
00093
00094 }
00095
00096
00097
00098
00099 CigiSOFV3_2::~CigiSOFV3_2()
00100 {
00101
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 int CigiSOFV3_2::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00116 {
00117 PackPointer CDta;
00118 CigiVersionID PackingVer = *((CigiVersionID *)Spec);
00119
00120 CigiBaseSOF *Data = ( CigiBaseSOF *) Base;
00121
00122 if(PackingVer.GetCombinedCigiVersion() < 0x0302)
00123 PackingVer.SetCigiVersion(3,2);
00124
00125 CDta.c = Buff;
00126
00127 *CDta.c++ = PacketID;
00128 *CDta.c++ = PacketSize;
00129 *CDta.c++ = PackingVer.CigiMajorVersion;
00130
00131 *CDta.b++ = Data->DatabaseID;
00132 *CDta.c++ = Data->IGStatus;
00133
00134 Cigi_uint8 HDta = (PackingVer.CigiMinorVersion << 4) & 0xf0;
00135 HDta |= (Data->TimestampValid) ? 0x04 : 0;
00136 HDta |= (Cigi_uint8)(Data->IGMode & 0x03);
00137 HDta |= (Cigi_uint8)((Data->EarthRefModel << 3) & 0x08);
00138
00139 *CDta.c++ = HDta;
00140
00141 *CDta.s++ = 0x8000;
00142 *CDta.l++ = Data->FrameCntr;
00143 *CDta.l++ = Data->TimeStampV3;
00144 *CDta.l++ = Data->LastRcvdHostFrame;
00145 *CDta.l++ = 0;
00146
00147
00148 return(PacketSize);
00149
00150 }
00151
00152
00153
00154
00155
00156 int CigiSOFV3_2::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00157 {
00158
00159 PackPointer CDta;
00160
00161 CDta.c = Buff;
00162
00163 CDta.c += 3;
00164
00165 DatabaseID = *CDta.b++;
00166 IGStatus = *CDta.c++;
00167
00168 Cigi_uint8 HDta = *CDta.c++;
00169
00170 IGMode = (IGModeGrp)(HDta & 0x03);
00171 EarthRefModel = (EarthRefModelGrp)((HDta >> 3) & 0x01);
00172 TimestampValid = ((HDta & 0x04) != 0);
00173
00174 ByteSwap = *CDta.s++;
00175
00176 BSwapEn = (ByteSwap == 0x0080);
00177
00178 if(!BSwapEn)
00179 {
00180 FrameCntr = *CDta.l++;
00181 TimeStampV3 = *CDta.l++;
00182 LastRcvdHostFrame = *CDta.l++;
00183 }
00184 else
00185 {
00186 CigiSwap4(&FrameCntr,CDta.l++);
00187 CigiSwap4(&TimeStampV3,CDta.l++);
00188 CigiSwap4(&LastRcvdHostFrame,CDta.l++);
00189 }
00190
00191 TimeStampV2 = ((float)TimeStampV3) * 10.0f;
00192
00193
00194 return(CIGI_SUCCESS);
00195
00196 }
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 int CigiSOFV3_2::SetTimeStamp(const Cigi_uint32 TimeStamp, bool bndchk)
00211 {
00212
00213 TimeStampV3 = TimeStamp;
00214 TimeStampV2 = ((float)TimeStampV3) * 10.0f;
00215
00216 return(CIGI_SUCCESS);
00217
00218 }
00219
00220
00221
00222
00223 int CigiSOFV3_2::SetEarthRefModel(const EarthRefModelGrp EarthRefModelIn,
00224 bool bndchk)
00225 {
00226
00227 #ifndef CIGI_NO_BND_CHK
00228 if(bndchk && ((EarthRefModelIn < 0)||(EarthRefModelIn > 1)))
00229 {
00230 #ifndef CIGI_NO_EXCEPT
00231 throw CigiValueOutOfRangeException("EarthRefModel",EarthRefModelIn,0,1);
00232 #endif
00233 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00234 }
00235 #endif
00236
00237 EarthRefModel = EarthRefModelIn;
00238
00239 return(CIGI_SUCCESS);
00240
00241 }
00242