CigiEnvCtrlV2.cpp

Go to the documentation of this file.
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 // Construction/Destruction
00084 // ====================================================================
00085 
00086 
00087 // ================================================
00088 // CigiEnvCtrlV2
00089 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // ~CigiEnvCtrlV2
00123 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00124 CigiEnvCtrlV2::~CigiEnvCtrlV2()
00125 {
00126 
00127 }
00128 
00129 // ====================================================================
00130 // Pack and Unpack
00131 // ====================================================================
00132 
00133 // ================================================
00134 // Pack
00135 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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    // Determine date
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 // Unpack
00181 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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;  // Step over packet id and size
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    // Determine date
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 // Filling the Hold object
00238 // ====================================================================
00239 
00240 // ================================================
00241 // FillHold
00242 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Accessors
00269 // ====================================================================
00270 
00271 
00272 // ================================================
00273 // Hour
00274 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Minute
00296 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Humidity
00318 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Month
00340 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Day
00362 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Aerosol
00384 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // Visibility
00406 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // HorizWindSp
00428 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // WindDir
00450 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 // BaroPress
00472 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
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 

Generated on Wed Apr 29 08:59:58 2009 for CCL by  doxygen 1.4.7