00001
00055 #define _EXPORT_CCL_
00056
00057 #include "CigiArtPartCtrlV1.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 CigiArtPartCtrlV1::CigiArtPartCtrlV1()
00086 {
00087
00088 PacketID = CIGI_ART_PART_CTRL_PACKET_ID_V1;
00089 PacketSize = CIGI_ART_PART_CTRL_PACKET_SIZE_V1;
00090 Version = 1;
00091 MinorVersion = 0;
00092
00093 EntityID = 0;
00094 ArtPartIDV1 = 0;
00095 ArtPartIDV3 = 0;
00096 ArtPartEn = false;
00097 XOffEn = false;
00098 YOffEn = false;
00099 ZOffEn = false;
00100 RollEn = false;
00101 PitchEn = false;
00102 YawEn = false;
00103 XOff = 0.0;
00104 YOff = 0.0;
00105 ZOff = 0.0;
00106 Roll = 0.0;
00107 Pitch = 0.0;
00108 Yaw = 0.0;
00109
00110 }
00111
00112
00113
00114
00115 CigiArtPartCtrlV1::~CigiArtPartCtrlV1()
00116 {
00117
00118 }
00119
00120
00121
00122
00123
00124
00125
00126
00127 int CigiArtPartCtrlV1::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00128 {
00129 double DBuf[6];
00130
00131 Cigi_int16 tsCnvt;
00132 Cigi_int32 tlCnvt;
00133 double tdCnvt;
00134
00135 union Conversion_short
00136 {
00137 Cigi_uint16 u;
00138 Cigi_int16 s;
00139 } tuCnvt;
00140
00141 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00142
00143 PackPointer CDta;
00144
00145 CigiBaseArtPartCtrl * Data = ( CigiBaseArtPartCtrl *)Base;
00146
00147 CDta.d = DBuf;
00148
00149 *CDta.c++ = PacketID;
00150 *CDta.c++ = PacketSize;
00151
00152 CIGI_SCOPY2(CDta.s++, &Data->EntityID);
00153 *CDta.c++ = Data->ArtPartIDV1;
00154
00155 Cigi_uint8 HDta = 0;
00156
00157 if(Data->ArtPartEn)
00158 HDta = 0x80;
00159
00160 if(Data->XOffEn)
00161 HDta |= 0x40;
00162
00163 if(Data->YOffEn)
00164 HDta |= 0x20;
00165
00166 if(Data->ZOffEn)
00167 HDta |= 0x10;
00168
00169 if(Data->RollEn)
00170 HDta |= 0x08;
00171
00172 if(Data->PitchEn)
00173 HDta |= 0x04;
00174
00175 if(Data->YawEn)
00176 HDta |= 0x02;
00177
00178 *CDta.c++ = HDta;
00179
00180 *CDta.s++ = 0;
00181
00182
00183 tsCnvt = CIGI_FLOAT_TO_B6((double)Data->XOff);
00184 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00185
00186 tsCnvt = CIGI_FLOAT_TO_B6((double)Data->YOff);
00187 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00188
00189 tsCnvt = CIGI_FLOAT_TO_B6((double)Data->ZOff);
00190 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00191
00192 tdCnvt = (double)Data->Roll;
00193 if(tdCnvt < 0.0)
00194 tdCnvt += 360.0;
00195 tlCnvt = CIGI_FLOAT_TO_BA(tdCnvt);
00196 if((tlCnvt > 65535)||(tlCnvt < 0))
00197 tsCnvt = 0;
00198 else
00199 {
00200 tuCnvt.u = (Cigi_uint16)tlCnvt;
00201 tsCnvt = tuCnvt.s;
00202 }
00203 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00204
00205 tdCnvt = (double)Data->Pitch;
00206 if(tdCnvt < 0.0)
00207 tdCnvt += 360.0;
00208 tlCnvt = CIGI_FLOAT_TO_BA(tdCnvt);
00209 if((tlCnvt > 65535)||(tlCnvt < 0))
00210 tsCnvt = 0;
00211 else
00212 {
00213 tuCnvt.u = (Cigi_uint16)tlCnvt;
00214 tsCnvt = tuCnvt.s;
00215 }
00216 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00217
00218 tlCnvt = CIGI_FLOAT_TO_BA((double)Data->Yaw);
00219 if((tlCnvt > 65535)||(tlCnvt < 0))
00220 tsCnvt = 0;
00221 else
00222 {
00223 tuCnvt.u = (Cigi_uint16)tlCnvt;
00224 tsCnvt = tuCnvt.s;
00225 }
00226 CIGI_SCOPY2(CDta.s++, &tsCnvt);
00227
00228 memcpy(Buff,tBuf,CIGI_ART_PART_CTRL_PACKET_SIZE_V1);
00229
00230 return(PacketSize);
00231
00232 }
00233
00234
00235
00236
00237 int CigiArtPartCtrlV1::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00238 {
00239 union ArtPartConv
00240 {
00241 Cigi_uint8 uc;
00242 Cigi_int8 c;
00243 } ArtC;
00244
00245 double DBuf[6];
00246
00247 Cigi_int16 tsCnvt;
00248
00249 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00250
00251 PackPointer CDta;
00252
00253 memcpy(tBuf,Buff,CIGI_ART_PART_CTRL_PACKET_SIZE_V1);
00254
00255 CDta.d = DBuf;
00256
00257 CDta.c += 2;
00258
00259 CIGI_SCOPY2(&EntityID, CDta.s++);
00260 ArtPartIDV1 = *CDta.c++;
00261
00262 Cigi_uint16 HDta = *CDta.c++;
00263
00264 ArtPartEn = ((HDta & 0x80) != 0);
00265 XOffEn = ((HDta & 0x40) != 0);
00266 ZOffEn = ((HDta & 0x10) != 0);
00267 YOffEn = ((HDta & 0x20) != 0);
00268 RollEn = ((HDta & 0x08) != 0);
00269 PitchEn = ((HDta & 0x04) != 0);
00270 YawEn = ((HDta & 0x02) != 0);
00271
00272 CDta.s++;
00273
00274
00275 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00276 XOff = (float)CIGI_B6_TO_FLOAT(tsCnvt);
00277
00278 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00279 YOff = (float)CIGI_B6_TO_FLOAT(tsCnvt);
00280
00281 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00282 ZOff = (float)CIGI_B6_TO_FLOAT(tsCnvt);
00283
00284 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00285 Roll = (float)CIGI_BA_TO_FLOAT(tsCnvt);
00286 if(Roll > 180.0)
00287 Roll -= 360.0;
00288
00289 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00290 Pitch = (float)CIGI_BA_TO_FLOAT(tsCnvt);
00291 if(Pitch > 180.0)
00292 Pitch -= 360.0;
00293
00294 CIGI_SCOPY2(&tsCnvt, CDta.s++);
00295 Yaw = (float)CIGI_BA_TO_FLOAT(tsCnvt);
00296
00297 ArtC.c = ArtPartIDV1;
00298 ArtPartIDV3 = ArtC.uc;
00299
00300 return(PacketSize);
00301
00302 }
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 int CigiArtPartCtrlV1::SetArtPartID(const Cigi_int8 ArtPartIDIn, bool bndchk)
00315 {
00316 union ArtPartConv
00317 {
00318 Cigi_uint8 uc;
00319 Cigi_int8 c;
00320 } ArtC;
00321
00322 ArtPartIDV1 = ArtPartIDIn;
00323
00324 ArtC.c = ArtPartIDV1;
00325 ArtPartIDV3 = ArtC.uc;
00326
00327 return(CIGI_SUCCESS);
00328 }
00329
00330
00331
00332