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