00001
00060 #define _EXPORT_CCL_
00061
00062 #include "CigiEnvCtrlV1.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 CigiEnvCtrlV1::CigiEnvCtrlV1()
00091 {
00092
00093 PacketID = CIGI_ENV_CTRL_PACKET_ID_V1;
00094 PacketSize = CIGI_ENV_CTRL_PACKET_SIZE_V1;
00095 Version = 1;
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 CigiEnvCtrlV1::~CigiEnvCtrlV1()
00125 {
00126
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136 int CigiEnvCtrlV1::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++ = 0;
00157 *CDta.s++ = 0;
00158
00159
00160 Cigi_uint32 date = ((Cigi_uint32)Data->Month * 1000000) +
00161 ((Cigi_uint32)Data->Day * 10000) + (Cigi_uint32)Data->Year;
00162 CIGI_SCOPY4(CDta.l++, &date);
00163
00164 CIGI_SCOPY4(CDta.f++, &Data->AirTemp);
00165 CIGI_SCOPY4(CDta.f++, &Data->Visibility);
00166 CIGI_SCOPY4(CDta.f++, &Data->HorizWindSp);
00167 CIGI_SCOPY4(CDta.f++, &Data->WindDir);
00168
00169
00170 memcpy(Buff,tBuf,CIGI_ENV_CTRL_PACKET_SIZE_V1);
00171
00172 return(PacketSize);
00173
00174 }
00175
00176
00177
00178
00179 int CigiEnvCtrlV1::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00180 {
00181 double DBuf[6];
00182
00183 Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00184
00185 PackPointer CDta;
00186
00187 memcpy(tBuf,Buff,CIGI_ENV_CTRL_PACKET_SIZE_V1);
00188
00189 CDta.d = DBuf;
00190
00191 CDta.c += 2;
00192
00193 Hour = *CDta.c++;
00194 Minute = *CDta.c++;
00195
00196 Cigi_uint8 HDta = *CDta.c++;
00197 EphemerisEn = ((HDta & 0x80) != 0);
00198 Humidity = HDta & 0x7f;
00199
00200 SunEn = MoonEn = StarEn = DateVld = EphemerisEn;
00201
00202 CDta.c += 3;
00203
00204
00205 Cigi_uint32 date;
00206 CIGI_SCOPY4(&date, CDta.l++);
00207
00208 Month = (Cigi_uint8)(date / 1000000);
00209 date -= ((Cigi_uint32)Month * 1000000);
00210
00211 Day = (Cigi_uint8)(date / 10000);
00212 date -= ((Cigi_uint32)Day * 10000);
00213
00214 Year = (Cigi_uint16)date;
00215
00216
00217 CIGI_SCOPY4(&AirTemp, CDta.f++);
00218 CIGI_SCOPY4(&Visibility, CDta.f++);
00219 CIGI_SCOPY4(&HorizWindSp, CDta.f++);
00220 CIGI_SCOPY4(&WindDir, CDta.f++);
00221
00222
00223
00224 return(PacketSize);
00225
00226 }
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237 void CigiEnvCtrlV1::FillHold(CigiBaseEnvCtrl * Hold) const
00238 {
00239 Hold->Hour = Hour;
00240 Hold->Minute = Minute;
00241 Hold->EphemerisEn = EphemerisEn;
00242 Hold->SunEn = SunEn;
00243 Hold->MoonEn = MoonEn;
00244 Hold->StarEn = StarEn;
00245 Hold->DateVld = DateVld;
00246 Hold->AtmosEn = AtmosEn;
00247 Hold->Humidity = Humidity;
00248 Hold->Month = Month;
00249 Hold->Day = Day;
00250 Hold->Year = Year;
00251 Hold->AirTemp = AirTemp;
00252 Hold->Visibility = Visibility;
00253 Hold->HorizWindSp = HorizWindSp;
00254 Hold->WindDir = WindDir;
00255 Hold->BaroPress = BaroPress;
00256 Hold->Aerosol = Aerosol;
00257 }
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 int CigiEnvCtrlV1::SetHour(const Cigi_uint8 HourIn, bool bndchk)
00270 {
00271
00272 #ifndef CIGI_NO_BND_CHK
00273 if(bndchk && ((HourIn < 0)||(HourIn > 23)))
00274 {
00275 #ifndef CIGI_NO_EXCEPT
00276 throw CigiValueOutOfRangeException("Hour",(Cigi_uint8)HourIn,0,23);
00277 #endif
00278 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00279 }
00280 #endif
00281
00282 Hour = HourIn;
00283 return(CIGI_SUCCESS);
00284
00285 }
00286
00287
00288
00289
00290
00291 int CigiEnvCtrlV1::SetMinute(const Cigi_uint8 MinuteIn, bool bndchk)
00292 {
00293
00294 #ifndef CIGI_NO_BND_CHK
00295 if(bndchk && ((MinuteIn < 0)||(MinuteIn > 59)))
00296 {
00297 #ifndef CIGI_NO_EXCEPT
00298 throw CigiValueOutOfRangeException("Minute",(Cigi_uint8)MinuteIn,0,59);
00299 #endif
00300 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00301 }
00302 #endif
00303
00304 Minute = MinuteIn;
00305 return(CIGI_SUCCESS);
00306
00307 }
00308
00309
00310
00311
00312
00313 int CigiEnvCtrlV1::SetHumidity(const Cigi_uint8 HumidityIn, bool bndchk)
00314 {
00315
00316 #ifndef CIGI_NO_BND_CHK
00317 if(bndchk && ((HumidityIn < 0)||(HumidityIn > 100)))
00318 {
00319 #ifndef CIGI_NO_EXCEPT
00320 throw CigiValueOutOfRangeException("Humidity",(Cigi_uint8)HumidityIn,0,100);
00321 #endif
00322 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00323 }
00324 #endif
00325
00326 Humidity = HumidityIn;
00327 return(CIGI_SUCCESS);
00328
00329 }
00330
00331
00332
00333
00334
00335 int CigiEnvCtrlV1::SetMonth(const Cigi_uint8 MonthIn, bool bndchk)
00336 {
00337
00338 #ifndef CIGI_NO_BND_CHK
00339 if(bndchk && ((MonthIn < 1)||(MonthIn > 12)))
00340 {
00341 #ifndef CIGI_NO_EXCEPT
00342 throw CigiValueOutOfRangeException("Month",(Cigi_uint8)MonthIn,1,12);
00343 #endif
00344 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00345 }
00346 #endif
00347
00348 Month = MonthIn;
00349 return(CIGI_SUCCESS);
00350
00351 }
00352
00353
00354
00355
00356
00357 int CigiEnvCtrlV1::SetDay(const Cigi_uint8 DayIn, bool bndchk)
00358 {
00359
00360 #ifndef CIGI_NO_BND_CHK
00361 if(bndchk && ((DayIn < 1)||(DayIn > 31)))
00362 {
00363 #ifndef CIGI_NO_EXCEPT
00364 throw CigiValueOutOfRangeException("Day",(Cigi_uint8)DayIn,1,31);
00365 #endif
00366 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00367 }
00368 #endif
00369
00370 Day = DayIn;
00371 return(CIGI_SUCCESS);
00372
00373 }
00374
00375
00376
00377
00378
00379 int CigiEnvCtrlV1::SetVisibility(const float VisibilityIn, bool bndchk)
00380 {
00381
00382 #ifndef CIGI_NO_BND_CHK
00383 if(bndchk && (VisibilityIn < 0.0))
00384 {
00385 #ifndef CIGI_NO_EXCEPT
00386 throw CigiValueOutOfRangeException("Visibility",(float)VisibilityIn,">",0.0);
00387 #endif
00388 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00389 }
00390 #endif
00391
00392 Visibility = VisibilityIn;
00393 return(CIGI_SUCCESS);
00394
00395 }
00396
00397
00398
00399
00400
00401 int CigiEnvCtrlV1::SetHorizWindSp(const float HorizWindSpIn, bool bndchk)
00402 {
00403
00404 #ifndef CIGI_NO_BND_CHK
00405 if(bndchk && (HorizWindSpIn < 0.0))
00406 {
00407 #ifndef CIGI_NO_EXCEPT
00408 throw CigiValueOutOfRangeException("HorizWindSp",(float)HorizWindSpIn,">",0.0);
00409 #endif
00410 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00411 }
00412 #endif
00413
00414 HorizWindSp = HorizWindSpIn;
00415 return(CIGI_SUCCESS);
00416
00417 }
00418
00419
00420
00421
00422
00423 int CigiEnvCtrlV1::SetWindDir(const float WindDirIn, bool bndchk)
00424 {
00425
00426 #ifndef CIGI_NO_BND_CHK
00427 if(bndchk && ((WindDirIn < 0.0)||(WindDirIn > 360.0)))
00428 {
00429 #ifndef CIGI_NO_EXCEPT
00430 throw CigiValueOutOfRangeException("WindDir",(float)WindDirIn,0.0,360.0);
00431 #endif
00432 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00433 }
00434 #endif
00435
00436 WindDir = WindDirIn;
00437 return(CIGI_SUCCESS);
00438
00439 }
00440
00441