00001
00060 #define _EXPORT_CCL_
00061
00062 #include "CigiEnvCtrlV2.h"
00063 #include "CigiSwapping.h"
00064 #include "CigiExceptions.h"
00065
00066 #include <memory.h>
00067
00068
00069 #ifdef CIGI_LITTLE_ENDIAN
00070 #define CIGI_SCOPY2 CigiSwap2
00071 #define CIGI_SCOPY4 CigiSwap4
00072 #define CIGI_SCOPY8 CigiSwap8
00073 #else
00074 #define CIGI_SCOPY2 CigiCopy2
00075 #define CIGI_SCOPY4 CigiCopy4
00076 #define CIGI_SCOPY8 CigiCopy8
00077 #endif
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 CigiEnvCtrlV2::CigiEnvCtrlV2()
00091 {
00092
00093 PacketID = CIGI_ENV_CTRL_PACKET_ID_V2;
00094 PacketSize = CIGI_ENV_CTRL_PACKET_SIZE_V2;
00095 Version = 2;
00096 MinorVersion = 0;
00097
00098 Hour = 0;
00099 Minute = 0;
00100 Month = 1;
00101 Day = 1;
00102 Year = 2000;
00103 StarInt = 0.0;
00104 EphemerisEn = false;
00105 SunEn = false;
00106 MoonEn = false;
00107 StarEn = false;
00108 DateVld = true;
00109 AtmosEn = false;
00110 Aerosol = 0.0;
00111 Humidity = 30;
00112 AirTemp = 0.0;
00113 Visibility = 64373.76f;
00114 HorizWindSp = 0.0;
00115 VertWindSp = 0.0;
00116 WindDir = 0.0;
00117 BaroPress = 1013.25;
00118
00119 }
00120
00121
00122
00123
00124 CigiEnvCtrlV2::~CigiEnvCtrlV2()
00125 {
00126
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136 int CigiEnvCtrlV2::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00137 {
00138 double DBuf[6];
00139
00140 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00141
00142 PackPointer CDta;
00143
00144 CigiBaseEnvCtrl * Data = ( CigiBaseEnvCtrl *)Base;
00145
00146 CDta.d = DBuf;
00147
00148 *CDta.c++ = PacketID;
00149 *CDta.c++ = PacketSize;
00150
00151 *CDta.c++ = Data->Hour;
00152 *CDta.c++ = Data->Minute;
00153
00154 *CDta.c++ = ((Data->Humidity) & 0x7f) | ((Data->EphemerisEn) ? 0x80 : 0);
00155
00156 *CDta.c++ = (Data->AtmosEn) ? 0x80 : 0;
00157
00158 *CDta.s++ = 0;
00159
00160
00161 Cigi_uint32 date = ((Cigi_uint32)Data->Month * 1000000) +
00162 ((Cigi_uint32)Data->Day * 10000) + (Cigi_uint32)Data->Year;
00163 CIGI_SCOPY4(CDta.l++, &date);
00164
00165 CIGI_SCOPY4(CDta.f++, &Data->AirTemp);
00166 CIGI_SCOPY4(CDta.f++, &Data->Visibility);
00167 CIGI_SCOPY4(CDta.f++, &Data->HorizWindSp);
00168 CIGI_SCOPY4(CDta.f++, &Data->WindDir);
00169 CIGI_SCOPY4(CDta.f++, &Data->BaroPress);
00170 CIGI_SCOPY4(CDta.f++, &Data->Aerosol);
00171
00172
00173 memcpy(Buff,tBuf,CIGI_ENV_CTRL_PACKET_SIZE_V2);
00174
00175 return(PacketSize);
00176
00177 }
00178
00179
00180
00181
00182 int CigiEnvCtrlV2::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00183 {
00184 double DBuf[6];
00185
00186 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00187
00188 PackPointer CDta;
00189
00190 memcpy(tBuf,Buff,CIGI_ENV_CTRL_PACKET_SIZE_V2);
00191
00192 CDta.d = DBuf;
00193
00194 CDta.c += 2;
00195
00196 Hour = *CDta.c++;
00197 Minute = *CDta.c++;
00198
00199 Cigi_uint8 HDta = *CDta.c++;
00200 EphemerisEn = ((HDta & 0x80) != 0);
00201 Humidity = HDta & 0x7f;
00202
00203 SunEn = MoonEn = StarEn = DateVld = EphemerisEn;
00204
00205 AtmosEn = (*CDta.c++ != 0);
00206
00207 CDta.s++;
00208
00209
00210 Cigi_uint32 date;
00211 CIGI_SCOPY4(&date, CDta.l++);
00212
00213 Month = (Cigi_uint8)(date / 1000000);
00214 date -= ((Cigi_uint32)Month * 1000000);
00215
00216 Day = (Cigi_uint8)(date / 10000);
00217 date -= ((Cigi_uint32)Day * 10000);
00218
00219 Year = (Cigi_uint16)date;
00220
00221
00222 CIGI_SCOPY4(&AirTemp, CDta.f++);
00223 CIGI_SCOPY4(&Visibility, CDta.f++);
00224 CIGI_SCOPY4(&HorizWindSp, CDta.f++);
00225 CIGI_SCOPY4(&WindDir, CDta.f++);
00226 CIGI_SCOPY4(&BaroPress, CDta.f++);
00227 CIGI_SCOPY4(&Aerosol, CDta.f++);
00228
00229
00230 return(PacketSize);
00231
00232 }
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 void CigiEnvCtrlV2::FillHold(CigiBaseEnvCtrl * Hold) const
00244 {
00245 Hold->Hour = Hour;
00246 Hold->Minute = Minute;
00247 Hold->EphemerisEn = EphemerisEn;
00248 Hold->SunEn = SunEn;
00249 Hold->MoonEn = MoonEn;
00250 Hold->StarEn = StarEn;
00251 Hold->DateVld = DateVld;
00252 Hold->AtmosEn = AtmosEn;
00253 Hold->Humidity = Humidity;
00254 Hold->Month = Month;
00255 Hold->Day = Day;
00256 Hold->Year = Year;
00257 Hold->AirTemp = AirTemp;
00258 Hold->Visibility = Visibility;
00259 Hold->HorizWindSp = HorizWindSp;
00260 Hold->WindDir = WindDir;
00261 Hold->BaroPress = BaroPress;
00262 Hold->Aerosol = Aerosol;
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 int CigiEnvCtrlV2::SetHour(const Cigi_uint8 HourIn, bool bndchk)
00276 {
00277
00278 #ifndef CIGI_NO_BND_CHK
00279 if(bndchk && ((HourIn < 0)||(HourIn > 23)))
00280 {
00281 #ifndef CIGI_NO_EXCEPT
00282 throw CigiValueOutOfRangeException("Hour",(Cigi_uint8)HourIn,0,23);
00283 #endif
00284 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00285 }
00286 #endif
00287
00288 Hour = HourIn;
00289 return(CIGI_SUCCESS);
00290
00291 }
00292
00293
00294
00295
00296
00297 int CigiEnvCtrlV2::SetMinute(const Cigi_uint8 MinuteIn, bool bndchk)
00298 {
00299
00300 #ifndef CIGI_NO_BND_CHK
00301 if(bndchk && ((MinuteIn < 0)||(MinuteIn > 59)))
00302 {
00303 #ifndef CIGI_NO_EXCEPT
00304 throw CigiValueOutOfRangeException("Minute",(Cigi_uint8)MinuteIn,0,59);
00305 #endif
00306 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00307 }
00308 #endif
00309
00310 Minute = MinuteIn;
00311 return(CIGI_SUCCESS);
00312
00313 }
00314
00315
00316
00317
00318
00319 int CigiEnvCtrlV2::SetHumidity(const Cigi_uint8 HumidityIn, bool bndchk)
00320 {
00321
00322 #ifndef CIGI_NO_BND_CHK
00323 if(bndchk && ((HumidityIn < 0)||(HumidityIn > 100)))
00324 {
00325 #ifndef CIGI_NO_EXCEPT
00326 throw CigiValueOutOfRangeException("Humidity",(Cigi_uint8)HumidityIn,0,100);
00327 #endif
00328 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00329 }
00330 #endif
00331
00332 Humidity = HumidityIn;
00333 return(CIGI_SUCCESS);
00334
00335 }
00336
00337
00338
00339
00340
00341 int CigiEnvCtrlV2::SetMonth(const Cigi_uint8 MonthIn, bool bndchk)
00342 {
00343
00344 #ifndef CIGI_NO_BND_CHK
00345 if(bndchk && ((MonthIn < 1)||(MonthIn > 12)))
00346 {
00347 #ifndef CIGI_NO_EXCEPT
00348 throw CigiValueOutOfRangeException("Month",(Cigi_uint8)MonthIn,1,12);
00349 #endif
00350 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00351 }
00352 #endif
00353
00354 Month = MonthIn;
00355 return(CIGI_SUCCESS);
00356
00357 }
00358
00359
00360
00361
00362
00363 int CigiEnvCtrlV2::SetDay(const Cigi_uint8 DayIn, bool bndchk)
00364 {
00365
00366 #ifndef CIGI_NO_BND_CHK
00367 if(bndchk && ((DayIn < 1)||(DayIn > 31)))
00368 {
00369 #ifndef CIGI_NO_EXCEPT
00370 throw CigiValueOutOfRangeException("Day",(Cigi_uint8)DayIn,1,31);
00371 #endif
00372 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00373 }
00374 #endif
00375
00376 Day = DayIn;
00377 return(CIGI_SUCCESS);
00378
00379 }
00380
00381
00382
00383
00384
00385 int CigiEnvCtrlV2::SetAerosol(const float AerosolIn, bool bndchk)
00386 {
00387
00388 #ifndef CIGI_NO_BND_CHK
00389 if(bndchk && (AerosolIn < 0.0))
00390 {
00391 #ifndef CIGI_NO_EXCEPT
00392 throw CigiValueOutOfRangeException("Aerosol",(float)AerosolIn,">",0.0);
00393 #endif
00394 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00395 }
00396 #endif
00397
00398 Aerosol = AerosolIn;
00399 return(CIGI_SUCCESS);
00400
00401 }
00402
00403
00404
00405
00406
00407 int CigiEnvCtrlV2::SetVisibility(const float VisibilityIn, bool bndchk)
00408 {
00409
00410 #ifndef CIGI_NO_BND_CHK
00411 if(bndchk && (VisibilityIn < 0.0))
00412 {
00413 #ifndef CIGI_NO_EXCEPT
00414 throw CigiValueOutOfRangeException("Visibility",(float)VisibilityIn,">",0.0);
00415 #endif
00416 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00417 }
00418 #endif
00419
00420 Visibility = VisibilityIn;
00421 return(CIGI_SUCCESS);
00422
00423 }
00424
00425
00426
00427
00428
00429 int CigiEnvCtrlV2::SetHorizWindSp(const float HorizWindSpIn, bool bndchk)
00430 {
00431
00432 #ifndef CIGI_NO_BND_CHK
00433 if(bndchk && (HorizWindSpIn < 0.0))
00434 {
00435 #ifndef CIGI_NO_EXCEPT
00436 throw CigiValueOutOfRangeException("HorizWindSp",(float)HorizWindSpIn,">",0.0);
00437 #endif
00438 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00439 }
00440 #endif
00441
00442 HorizWindSp = HorizWindSpIn;
00443 return(CIGI_SUCCESS);
00444
00445 }
00446
00447
00448
00449
00450
00451 int CigiEnvCtrlV2::SetWindDir(const float WindDirIn, bool bndchk)
00452 {
00453
00454 #ifndef CIGI_NO_BND_CHK
00455 if(bndchk && ((WindDirIn < 0.0)||(WindDirIn > 360.0)))
00456 {
00457 #ifndef CIGI_NO_EXCEPT
00458 throw CigiValueOutOfRangeException("WindDir",(float)WindDirIn,0.0,360.0);
00459 #endif
00460 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00461 }
00462 #endif
00463
00464 WindDir = WindDirIn;
00465 return(CIGI_SUCCESS);
00466
00467 }
00468
00469
00470
00471
00472
00473 int CigiEnvCtrlV2::SetBaroPress(const float BaroPressIn, bool bndchk)
00474 {
00475
00476 #ifndef CIGI_NO_BND_CHK
00477 if(bndchk && (BaroPressIn < 0.0))
00478 {
00479 #ifndef CIGI_NO_EXCEPT
00480 throw CigiValueOutOfRangeException("BaroPress",(float)BaroPressIn,">",0.0);
00481 #endif
00482 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00483 }
00484 #endif
00485
00486 BaroPress = BaroPressIn;
00487 return(CIGI_SUCCESS);
00488
00489 }
00490
00491