00001
00055 #define _EXPORT_CCL_
00056
00057 #include "CigiSensorCtrlV1.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 CigiSensorCtrlV1::CigiSensorCtrlV1()
00086 {
00087
00088 PacketID = CIGI_SENSOR_CTRL_PACKET_ID_V1;
00089 PacketSize = CIGI_SENSOR_CTRL_PACKET_SIZE_V1;
00090 Version = 1;
00091 MinorVersion = 0;
00092
00093 ViewID = 0;
00094 SensorID = 0;
00095 SensorOn = false;
00096 Polarity = WhiteHot;
00097 LineDropEn = false;
00098 TrackMode = TrackOff;
00099 AutoGainEn = false;
00100 TrackPolarity = TrackWhite;
00101 ResponseType = GatePos;
00102 Gain = 0.0;
00103 Level = 0.0;
00104 ACCoupling = 0.0;
00105 Noise = 0.0;
00106
00107 }
00108
00109
00110
00111
00112 CigiSensorCtrlV1::~CigiSensorCtrlV1()
00113 {
00114
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124 int CigiSensorCtrlV1::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00125 {
00126 double DBuf[6];
00127 Cigi_uint16 tViewID;
00128 float tGain;
00129
00130 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00131
00132 PackPointer CDta;
00133
00134 CigiBaseSensorCtrl * Data = ( CigiBaseSensorCtrl *)Base;
00135
00136 CDta.d = DBuf;
00137
00138 *CDta.c++ = PacketID;
00139 *CDta.c++ = PacketSize;
00140
00141 tViewID = Data->ViewID;
00142
00143 if(tViewID > 31)
00144 tViewID = 31;
00145
00146 Cigi_uint8 HDta = (Cigi_uint8)tViewID << 3;
00147
00148 if(Data->SensorOn)
00149 HDta |= 0x04;
00150
00151 if(Data->Polarity == BlackHot)
00152 HDta |= 0x02;
00153
00154 if(Data->LineDropEn)
00155 HDta |= 0x01;
00156
00157 *CDta.c++ = HDta;
00158
00159 *CDta.c++ = Data->SensorID;
00160
00161 HDta = (Cigi_uint8)(Data->TrackMode << 4);
00162
00163 if(Data->AutoGainEn)
00164 HDta |= 0x08;
00165
00166 if(Data->TrackPolarity == TrackBlack)
00167 HDta |= 0x04;
00168
00169 *CDta.c++ = HDta;
00170
00171 *CDta.c++ = 0;
00172 *CDta.s++ = 0;
00173
00174 tGain = 100.0f * Data->Gain;
00175 CIGI_SCOPY4(CDta.f++, &tGain);
00176 CIGI_SCOPY4(CDta.f++, &Data->Level);
00177 CIGI_SCOPY4(CDta.f++, &Data->ACCoupling);
00178 CIGI_SCOPY4(CDta.f++, &Data->Noise);
00179
00180 memcpy(Buff,tBuf,CIGI_SENSOR_CTRL_PACKET_SIZE_V1);
00181
00182 return(PacketSize);
00183
00184 }
00185
00186
00187
00188
00189 int CigiSensorCtrlV1::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00190 {
00191 double DBuf[6];
00192 float tGain;
00193
00194 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00195
00196 PackPointer CDta;
00197
00198 memcpy(tBuf,Buff,CIGI_SENSOR_CTRL_PACKET_SIZE_V1);
00199
00200 CDta.d = DBuf;
00201
00202 CDta.c += 2;
00203
00204 Cigi_uint8 HDta = *CDta.c++;
00205
00206 ViewID = (Cigi_uint8)((HDta >> 3) & 0x1f);
00207 SensorOn = ((HDta & 0x04) != 0);
00208 Polarity = (PolarityGrp)((HDta >> 1) & 0x01);
00209 LineDropEn = ((HDta & 0x01) != 0);
00210
00211 SensorID = *CDta.c++;
00212
00213 HDta = *CDta.c++;
00214 TrackMode = (TrackModeGrp)((HDta >> 4) & 0x0f);
00215 AutoGainEn = ((HDta & 0x08) != 0);
00216 TrackPolarity = (TrackPolarityGrp)((HDta >> 2) & 0x01);
00217
00218 CDta.c += 3;
00219
00220 CIGI_SCOPY4(&tGain, CDta.f++);
00221 Gain = tGain / 100.0f;
00222
00223 CIGI_SCOPY4(&Level, CDta.f++);
00224 CIGI_SCOPY4(&ACCoupling, CDta.f++);
00225 CIGI_SCOPY4(&Noise, CDta.f++);
00226
00227 ResponseType = GatePos;
00228
00229 return(PacketSize);
00230
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 int CigiSensorCtrlV1::SetViewID(const Cigi_uint16 ViewIDIn, bool bndchk)
00244 {
00245
00246 #ifndef CIGI_NO_BND_CHK
00247 if(bndchk && ((ViewIDIn < 0)||(ViewIDIn > 31)))
00248 {
00249 #ifndef CIGI_NO_EXCEPT
00250 throw CigiValueOutOfRangeException("ViewID",(Cigi_uint16)ViewIDIn,0,31);
00251 #endif
00252 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00253 }
00254 #endif
00255
00256 ViewID = ViewIDIn;
00257 return(CIGI_SUCCESS);
00258
00259 }
00260
00261
00262
00263
00264
00265 int CigiSensorCtrlV1::SetGain(const float GainIn, bool bndchk)
00266 {
00267
00268 #ifndef CIGI_NO_BND_CHK
00269 if(bndchk && ((GainIn < 0.0)||(GainIn > 100.0)))
00270 {
00271 #ifndef CIGI_NO_EXCEPT
00272 throw CigiValueOutOfRangeException("Gain",(float)GainIn,0.0,100.0);
00273 #endif
00274 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00275 }
00276 #endif
00277
00278
00279 Gain = GainIn / 100.0f;
00280
00281 return(CIGI_SUCCESS);
00282
00283 }
00284
00285