00001
00055 #define _EXPORT_CCL_
00056
00057 #include "CigiViewCtrlV2.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 CigiViewCtrlV2::CigiViewCtrlV2()
00086 {
00087
00088 PacketID = CIGI_VIEW_CTRL_PACKET_ID_V2;
00089 PacketSize = CIGI_VIEW_CTRL_PACKET_SIZE_V2;
00090 Version = 2;
00091 MinorVersion = 0;
00092
00093 EntityID = 0;
00094 ViewID = 0;
00095 GroupID = 0;
00096 XOffEn = false;
00097 YOffEn = false;
00098 ZOffEn = false;
00099 RollEn = false;
00100 PitchEn = false;
00101 YawEn = false;
00102 XOff = 0.0;
00103 YOff = 0.0;
00104 ZOff = 0.0;
00105 Roll = 0.0;
00106 Pitch = 0.0;
00107 Yaw = 0.0;
00108
00109 }
00110
00111
00112
00113
00114 CigiViewCtrlV2::~CigiViewCtrlV2()
00115 {
00116
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126 int CigiViewCtrlV2::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00127 {
00128 double DBuf[6];
00129
00130 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00131
00132 PackPointer CDta;
00133
00134 CigiBaseViewCtrl * Data = ( CigiBaseViewCtrl *)Base;
00135
00136 CDta.d = DBuf;
00137
00138 *CDta.c++ = PacketID;
00139 *CDta.c++ = PacketSize;
00140
00141 CIGI_SCOPY2(CDta.s++, &Data->EntityID);
00142
00143 Cigi_uint8 HDta = 0;
00144
00145 if(Data->ViewID < 32)
00146 HDta = (Cigi_uint8)((Data->ViewID << 3) & 0xf8);
00147 else
00148 HDta = (Cigi_uint8)0xf8;
00149
00150 if(Data->GroupID < 8)
00151 HDta |= (Cigi_uint8)(Data->GroupID & 0x07);
00152 else
00153 HDta |= (Cigi_uint8)0x07;
00154
00155 *CDta.c++ = HDta;
00156
00157 HDta = 0;
00158
00159 if(Data->XOffEn)
00160 HDta |= 0x80;
00161
00162 if(Data->YOffEn)
00163 HDta |= 0x40;
00164
00165 if(Data->ZOffEn)
00166 HDta |= 0x20;
00167
00168 if(Data->RollEn)
00169 HDta |= 0x10;
00170
00171 if(Data->PitchEn)
00172 HDta |= 0x08;
00173
00174 if(Data->YawEn)
00175 HDta |= 0x04;
00176
00177 *CDta.c++ = HDta;
00178
00179 *CDta.c++ = 0;
00180 *CDta.c++ = 0;
00181
00182 CIGI_SCOPY4(CDta.f++, &Data->XOff);
00183 CIGI_SCOPY4(CDta.f++, &Data->YOff);
00184 CIGI_SCOPY4(CDta.f++, &Data->ZOff);
00185 CIGI_SCOPY4(CDta.f++, &Data->Roll);
00186 CIGI_SCOPY4(CDta.f++, &Data->Pitch);
00187 CIGI_SCOPY4(CDta.f++, &Data->Yaw);
00188
00189 memcpy(Buff,tBuf,CIGI_VIEW_CTRL_PACKET_SIZE_V2);
00190
00191 return(PacketSize);
00192
00193 }
00194
00195
00196
00197
00198 int CigiViewCtrlV2::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00199 {
00200 double DBuf[6];
00201
00202 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00203
00204 PackPointer CDta;
00205
00206 memcpy(tBuf,Buff,CIGI_VIEW_CTRL_PACKET_SIZE_V2);
00207
00208 CDta.d = DBuf;
00209
00210 CDta.c += 2;
00211
00212 CIGI_SCOPY2(&EntityID, CDta.s++);
00213
00214 Cigi_uint8 HDta = *CDta.c++;
00215
00216 ViewID = (Cigi_uint16)((HDta >> 3) & 0x1f);
00217 GroupID = (Cigi_uint8)(HDta & 0x07);
00218
00219 HDta = *CDta.c++;
00220
00221 XOffEn = ((HDta & 0x80) != 0);
00222 YOffEn = ((HDta & 0x40) != 0);
00223 ZOffEn = ((HDta & 0x20) != 0);
00224 RollEn = ((HDta & 0x10) != 0);
00225 PitchEn = ((HDta & 0x08) != 0);
00226 YawEn = ((HDta & 0x04) != 0);
00227
00228 CDta.c += 2;
00229
00230 CIGI_SCOPY4(&XOff, CDta.f++);
00231 CIGI_SCOPY4(&YOff, CDta.f++);
00232 CIGI_SCOPY4(&ZOff, CDta.f++);
00233 CIGI_SCOPY4(&Roll, CDta.f++);
00234 CIGI_SCOPY4(&Pitch, CDta.f++);
00235 CIGI_SCOPY4(&Yaw, CDta.f++);
00236
00237 return(PacketSize);
00238
00239 }
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251 int CigiViewCtrlV2::SetViewID(const Cigi_uint8 ViewIDIn, bool bndchk)
00252 {
00253
00254 #ifndef CIGI_NO_BND_CHK
00255 if(bndchk && ((ViewIDIn < 0)||(ViewIDIn > 31)))
00256 {
00257 #ifndef CIGI_NO_EXCEPT
00258 throw CigiValueOutOfRangeException("ViewID",(Cigi_uint16)ViewIDIn,0,31);
00259 #endif
00260 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00261 }
00262 #endif
00263
00264 ViewID = (Cigi_uint16)ViewIDIn;
00265 return(CIGI_SUCCESS);
00266
00267 }
00268
00269
00270
00271
00272
00273 int CigiViewCtrlV2::SetGroupID(const Cigi_uint8 GroupIDIn, bool bndchk)
00274 {
00275
00276 #ifndef CIGI_NO_BND_CHK
00277 if(bndchk && ((GroupIDIn < 0)||(GroupIDIn > 7)))
00278 {
00279 #ifndef CIGI_NO_EXCEPT
00280 throw CigiValueOutOfRangeException("GroupID",(Cigi_uint8)GroupIDIn,0,7);
00281 #endif
00282 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00283 }
00284 #endif
00285
00286 GroupID = GroupIDIn;
00287 return(CIGI_SUCCESS);
00288
00289 }
00290
00291