00001
00055 #define _EXPORT_CCL_
00056
00057 #include "CigiCollDetSegDefV2.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 CigiCollDetSegDefV2::CigiCollDetSegDefV2()
00086 {
00087
00088 PacketID = CIGI_COLL_DET_SEG_DEF_PACKET_ID_V2;
00089 PacketSize = CIGI_COLL_DET_SEG_DEF_PACKET_SIZE_V2;
00090 Version = 2;
00091 MinorVersion = 0;
00092
00093 EntityID = 0;
00094 SegmentID = 0;
00095 SegmentEn = false;
00096 X1 = 0.0;
00097 Y1 = 0.0;
00098 Z1 = 0.0;
00099 X2 = 0.0;
00100 Y2 = 0.0;
00101 Z2 = 0.0;
00102 Mask = 0;
00103
00104 }
00105
00106
00107
00108
00109 CigiCollDetSegDefV2::~CigiCollDetSegDefV2()
00110 {
00111
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121 int CigiCollDetSegDefV2::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00122 {
00123 double DBuf[6];
00124
00125 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00126
00127 PackPointer CDta;
00128
00129 CigiBaseCollDetSegDef * Data = ( CigiBaseCollDetSegDef *)Base;
00130
00131 CDta.d = DBuf;
00132
00133 *CDta.c++ = PacketID;
00134 *CDta.c++ = PacketSize;
00135
00136 CIGI_SCOPY2(CDta.s++, &Data->EntityID);
00137
00138 Cigi_uint8 HDta = Data->SegmentID;
00139 if(HDta > 127)
00140 HDta = 127;
00141
00142 HDta |= (Data->SegmentEn) ? 0x80 : 0x00;
00143
00144 *CDta.c++ = HDta;
00145
00146 *CDta.c++ = 0;
00147 *CDta.s++ = 0;
00148
00149 CIGI_SCOPY4(CDta.l++, &Data->Mask);
00150
00151 float tpt;
00152 Cigi_int16 stpt;
00153
00154 tpt = Data->X1 / 0.015625f;
00155 if(tpt > 32767.0f)
00156 stpt = 32767;
00157 else if(tpt < -32768.0f)
00158 stpt = -32768;
00159 else
00160 stpt = (Cigi_int16)tpt;
00161
00162 CIGI_SCOPY2(CDta.s++, &stpt);
00163
00164 tpt = Data->Y1 / 0.015625f;
00165 if(tpt > 32767.0f)
00166 stpt = 32767;
00167 else if(tpt < -32768.0f)
00168 stpt = -32768;
00169 else
00170 stpt = (Cigi_int16)tpt;
00171
00172 CIGI_SCOPY2(CDta.s++, &stpt);
00173
00174 tpt = Data->Z1 / 0.015625f;
00175 if(tpt > 32767.0f)
00176 stpt = 32767;
00177 else if(tpt < -32768.0f)
00178 stpt = -32768;
00179 else
00180 stpt = (Cigi_int16)tpt;
00181
00182 CIGI_SCOPY2(CDta.s++, &stpt);
00183
00184 tpt = Data->X2 / 0.015625f;
00185 if(tpt > 32767.0f)
00186 stpt = 32767;
00187 else if(tpt < -32768.0f)
00188 stpt = -32768;
00189 else
00190 stpt = (Cigi_int16)tpt;
00191
00192 CIGI_SCOPY2(CDta.s++, &stpt);
00193
00194 tpt = Data->Y2 / 0.015625f;
00195 if(tpt > 32767.0f)
00196 stpt = 32767;
00197 else if(tpt < -32768.0f)
00198 stpt = -32768;
00199 else
00200 stpt = (Cigi_int16)tpt;
00201
00202 CIGI_SCOPY2(CDta.s++, &stpt);
00203
00204 tpt = Data->Z2 / 0.015625f;
00205 if(tpt > 32767.0f)
00206 stpt = 32767;
00207 else if(tpt < -32768.0f)
00208 stpt = -32768;
00209 else
00210 stpt = (Cigi_int16)tpt;
00211
00212 CIGI_SCOPY2(CDta.s++, &stpt);
00213
00214
00215 memcpy(Buff,tBuf,CIGI_COLL_DET_SEG_DEF_PACKET_SIZE_V2);
00216
00217 return(PacketSize);
00218
00219 }
00220
00221
00222
00223
00224 int CigiCollDetSegDefV2::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00225 {
00226 double DBuf[6];
00227
00228 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00229
00230 PackPointer CDta;
00231
00232 memcpy(tBuf,Buff,CIGI_COLL_DET_SEG_DEF_PACKET_SIZE_V2);
00233
00234 CDta.d = DBuf;
00235
00236 CDta.c += 2;
00237
00238 CIGI_SCOPY2(&EntityID, CDta.s++);
00239
00240 Cigi_uint8 HDta = *CDta.c++;
00241 SegmentID = HDta & 0x7f;
00242 SegmentEn = ((HDta & 0x80) != 0);
00243
00244 CDta.c += 3;
00245
00246 CIGI_SCOPY4(&Mask, CDta.l++);
00247
00248 Cigi_int16 stpt;
00249 float tpt;
00250
00251 CIGI_SCOPY2(&stpt, CDta.s++);
00252 tpt = (float)stpt;
00253 X1 = tpt * 0.015625f;
00254
00255 CIGI_SCOPY2(&stpt, CDta.s++);
00256 tpt = (float)stpt;
00257 Y1 = tpt * 0.015625f;
00258
00259 CIGI_SCOPY2(&stpt, CDta.s++);
00260 tpt = (float)stpt;
00261 Z1 = tpt * 0.015625f;
00262
00263 CIGI_SCOPY2(&stpt, CDta.s++);
00264 tpt = (float)stpt;
00265 X2 = tpt * 0.015625f;
00266
00267 CIGI_SCOPY2(&stpt, CDta.s++);
00268 tpt = (float)stpt;
00269 Y2 = tpt * 0.015625f;
00270
00271 CIGI_SCOPY2(&stpt, CDta.s++);
00272 tpt = (float)stpt;
00273 Z2 = tpt * 0.015625f;
00274
00275 return(PacketSize);
00276
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289 int CigiCollDetSegDefV2::SetSegmentID(const Cigi_uint8 SegmentIDIn, bool bndchk)
00290 {
00291
00292 #ifndef CIGI_NO_BND_CHK
00293 if(bndchk && ((SegmentIDIn < 0)||(SegmentIDIn > 127)))
00294 {
00295 #ifndef CIGI_NO_EXCEPT
00296 throw CigiValueOutOfRangeException("SegmentID",(Cigi_uint8)SegmentIDIn,0,127);
00297 #endif
00298 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00299 }
00300 #endif
00301
00302 SegmentID = SegmentIDIn;
00303 return(CIGI_SUCCESS);
00304
00305 }
00306
00307