00001
00055 #define _EXPORT_CCL_
00056
00057 #include "CigiViewCtrlV1.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 CigiViewCtrlV1::CigiViewCtrlV1()
00086 {
00087
00088 PacketID = CIGI_VIEW_CTRL_PACKET_ID_V1;
00089 PacketSize = CIGI_VIEW_CTRL_PACKET_SIZE_V1;
00090 Version = 1;
00091 MinorVersion = 0;
00092
00093 EntityID = 0;
00094 ViewID = 0;
00095 GroupID = 0;
00096 XOffEn = true;
00097 YOffEn = true;
00098 ZOffEn = true;
00099 RollEn = true;
00100 PitchEn = true;
00101 YawEn = true;
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 CigiViewCtrlV1::~CigiViewCtrlV1()
00115 {
00116
00117 }
00118
00119
00120
00121
00122
00123
00124
00125
00126 int CigiViewCtrlV1::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 *CDta.c++ = 0;
00157 *CDta.c++ = 0;
00158 *CDta.c++ = 0;
00159
00160 CIGI_SCOPY4(CDta.f++, &Data->XOff);
00161 CIGI_SCOPY4(CDta.f++, &Data->YOff);
00162 CIGI_SCOPY4(CDta.f++, &Data->ZOff);
00163 CIGI_SCOPY4(CDta.f++, &Data->Roll);
00164 CIGI_SCOPY4(CDta.f++, &Data->Pitch);
00165 CIGI_SCOPY4(CDta.f++, &Data->Yaw);
00166
00167 memcpy(Buff,tBuf,CIGI_VIEW_CTRL_PACKET_SIZE_V1);
00168
00169 return(PacketSize);
00170
00171
00172
00173 }
00174
00175
00176
00177
00178 int CigiViewCtrlV1::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00179 {
00180 double DBuf[6];
00181
00182 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00183
00184 PackPointer CDta;
00185
00186 memcpy(tBuf,Buff,CIGI_VIEW_CTRL_PACKET_SIZE_V1);
00187
00188 CDta.d = DBuf;
00189
00190 CDta.c += 2;
00191
00192 CIGI_SCOPY2(&EntityID, CDta.s++);
00193
00194 Cigi_uint8 HDta = *CDta.c++;
00195
00196 ViewID = (Cigi_uint16)((HDta >> 3) & 0x1f);
00197 GroupID = (Cigi_uint8)(HDta & 0x07);
00198
00199 CDta.c += 3;
00200
00201 CIGI_SCOPY4(&XOff, CDta.f++);
00202 CIGI_SCOPY4(&YOff, CDta.f++);
00203 CIGI_SCOPY4(&ZOff, CDta.f++);
00204 CIGI_SCOPY4(&Roll, CDta.f++);
00205 CIGI_SCOPY4(&Pitch, CDta.f++);
00206 CIGI_SCOPY4(&Yaw, CDta.f++);
00207
00208 return(PacketSize);
00209
00210 }
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 int CigiViewCtrlV1::SetViewID(const Cigi_uint8 ViewIDIn, bool bndchk)
00223 {
00224
00225 #ifndef CIGI_NO_BND_CHK
00226 if(bndchk && ((ViewIDIn < 0)||(ViewIDIn > 31)))
00227 {
00228 #ifndef CIGI_NO_EXCEPT
00229 throw CigiValueOutOfRangeException("ViewID",(Cigi_uint16)ViewIDIn,0,31);
00230 #endif
00231 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00232 }
00233 #endif
00234
00235 ViewID = (Cigi_uint16)ViewIDIn;
00236 return(CIGI_SUCCESS);
00237
00238 }
00239
00240
00241
00242
00243
00244 int CigiViewCtrlV1::SetGroupID(const Cigi_uint8 GroupIDIn, bool bndchk)
00245 {
00246
00247 #ifndef CIGI_NO_BND_CHK
00248 if(bndchk && ((GroupIDIn < 0)||(GroupIDIn > 7)))
00249 {
00250 #ifndef CIGI_NO_EXCEPT
00251 throw CigiValueOutOfRangeException("GroupID",(Cigi_uint8)GroupIDIn,0,7);
00252 #endif
00253 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00254 }
00255 #endif
00256
00257 GroupID = GroupIDIn;
00258 return(CIGI_SUCCESS);
00259
00260 }
00261
00262