CigiWeatherCtrlV2.cpp

Go to the documentation of this file.
00001 
00055 #define _EXPORT_CCL_
00056 
00057 #include "CigiWeatherCtrlV2.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 // Construction/Destruction
00079 // ====================================================================
00080 
00081 
00082 // ================================================
00083 // CigiWeatherCtrlV2
00084 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00085 CigiWeatherCtrlV2::CigiWeatherCtrlV2()
00086 {
00087 
00088    PacketID = CIGI_WEATHER_CTRL_PACKET_ID_V2;
00089    PacketSize = CIGI_WEATHER_CTRL_PACKET_SIZE_V2;
00090    Version = 2;
00091    MinorVersion = 0;
00092 
00093    EntityID = 0;
00094    RegionID = 0;
00095    LayerID = 0;
00096    Humidity = 0;
00097    PhenomenonType = 0;
00098    WeatherEn = false;
00099    ScudEn = false;
00100    RandomWindsEn = false;
00101    RandomLightningEn = false;
00102    CloudType = None;
00103    Scope = Global;
00104    Severity = 0;
00105    AirTemp = 0.0;
00106    VisibilityRng = 0.0;
00107    Opacity = 0.0;
00108    ScudFreq = 0.0;
00109    Coverage = 0.0;
00110    BaseElev = 0.0;
00111    Thickness = 0.0;
00112    Transition = 0.0;
00113    HorizWindSp = 0.0;
00114    VertWindSp = 0.0;
00115    WindDir = 0.0;
00116    BaroPress = 1013.25;
00117    Aerosol = 0.0;
00118 
00119 }
00120 
00121 // ================================================
00122 // ~CigiWeatherCtrlV2
00123 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00124 CigiWeatherCtrlV2::~CigiWeatherCtrlV2()
00125 {
00126 
00127 }
00128 
00129 // ====================================================================
00130 // Pack and Unpack
00131 // ====================================================================
00132 
00133 // ================================================
00134 // Pack
00135 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00136 int CigiWeatherCtrlV2::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    CigiBaseWeatherCtrl * Data = ( CigiBaseWeatherCtrl *)Base;
00145 
00146    CDta.d = DBuf;
00147 
00148    *CDta.c++ = PacketID;
00149    *CDta.c++ = PacketSize;
00150 
00151    CIGI_SCOPY2(CDta.s++, &Data->EntityID);
00152 
00153    Cigi_uint8 HDta = (Data->WeatherEn) ? 0x80 : 0x00;
00154    HDta |= (Data->ScudEn) ? 0x40 : 0x00;
00155    HDta |= (Data->RandomWindsEn) ? 0x20 : 0x00;
00156    HDta |= (Data->Severity << 2) & 0x1c;
00157 
00158    *CDta.c++ = HDta;
00159    *CDta.c++ = 0x00;
00160 
00161 
00162    Cigi_uint16 tType = 0;
00163    if(Data->Version <= 2)
00164       tType = Data->PhenomenonType;
00165    else
00166    {
00167       if(Data->Scope == CigiBaseWeatherCtrl::Entity)
00168          tType = 0;
00169       else
00170       {
00171          tType = (Cigi_uint16)Data->LayerID;
00172          if(tType == 0)
00173             tType = 3;
00174       }
00175    }
00176    CIGI_SCOPY2(CDta.s++, &tType);
00177 
00178 
00179    CIGI_SCOPY4(CDta.f++, &Data->AirTemp);
00180 
00181    if(Data->PhenomenonType == 3)
00182       CIGI_SCOPY4(CDta.f++, &Data->VisibilityRng);
00183    else
00184       CIGI_SCOPY4(CDta.f++, &Data->Opacity);
00185 
00186    CIGI_SCOPY4(CDta.f++, &Data->ScudFreq);
00187    CIGI_SCOPY4(CDta.f++, &Data->Coverage);
00188    CIGI_SCOPY4(CDta.f++, &Data->BaseElev);
00189    CIGI_SCOPY4(CDta.f++, &Data->Thickness);
00190    CIGI_SCOPY4(CDta.f++, &Data->Transition);
00191    CIGI_SCOPY4(CDta.f++, &Data->HorizWindSp);
00192 
00193    float Wndir = Data->WindDir;
00194    if(Wndir < 0.0f)
00195       Wndir += 360.0;
00196    CIGI_SCOPY4(CDta.f++, &Wndir);
00197 
00198    memcpy(Buff,tBuf,CIGI_WEATHER_CTRL_PACKET_SIZE_V2);
00199 
00200    return(PacketSize);
00201 
00202 }
00203 
00204 // ================================================
00205 // Unpack
00206 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00207 int CigiWeatherCtrlV2::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00208 {
00209    double DBuf[6];
00210 
00211    Cigi_uint8 *tBuf = (Cigi_uint8 *)DBuf;
00212 
00213    PackPointer CDta;
00214 
00215    Cigi_uint16 LayerTbl[7] = { 1,1,2,0,4,5,8 };
00216 
00217 
00218    memcpy(tBuf,Buff,CIGI_WEATHER_CTRL_PACKET_SIZE_V2);
00219 
00220    CDta.d = DBuf;
00221 
00222    CDta.c += 2;  // Step over packet id and size
00223 
00224    CIGI_SCOPY2(&EntityID, CDta.s++);
00225 
00226    Cigi_uint8 HDta = *CDta.c++;
00227    WeatherEn = ((HDta & 0x80) != 0);
00228    ScudEn = ((HDta & 0x40) != 0);
00229    RandomWindsEn = ((HDta & 0x20) != 0);
00230    Severity = (HDta >> 2) & 0x07;
00231 
00232    CDta.c++;
00233 
00234    CIGI_SCOPY2(&PhenomenonType, CDta.s++);
00235 
00236    CIGI_SCOPY4(&AirTemp, CDta.f++);
00237 
00238    if(PhenomenonType == 3)
00239    {
00240       CIGI_SCOPY4(&VisibilityRng, CDta.f++);
00241       Opacity = ((VisibilityRng/70000.0f)*100.0f);
00242    }
00243    else
00244    {
00245       CIGI_SCOPY4(&Opacity, CDta.f++);
00246       VisibilityRng = ((Opacity/100.0f)*70000.0f);
00247    }
00248 
00249    CIGI_SCOPY4(&ScudFreq, CDta.f++);
00250    CIGI_SCOPY4(&Coverage, CDta.f++);
00251    CIGI_SCOPY4(&BaseElev, CDta.f++);
00252    CIGI_SCOPY4(&Thickness, CDta.f++);
00253    CIGI_SCOPY4(&Transition, CDta.f++);
00254    CIGI_SCOPY4(&HorizWindSp, CDta.f++);
00255    CIGI_SCOPY4(&WindDir, CDta.f++);
00256 
00257    RegionID = 0;
00258    Humidity = 0;
00259    RandomLightningEn = false;
00260    CloudType = None;
00261 
00262    if(PhenomenonType == 0)
00263    {
00264       LayerID = 1;
00265       Scope = Entity;
00266    }
00267    else
00268    {
00269       Scope = Global;
00270 
00271       if(PhenomenonType < 7)
00272          LayerID = (Cigi_uint8)LayerTbl[PhenomenonType];
00273       else if(PhenomenonType < 256)
00274          LayerID = (Cigi_uint8)PhenomenonType;
00275       else
00276          LayerID = 255;
00277    }
00278 
00279    VertWindSp = 0.0f;
00280    BaroPress = 1013.25f;
00281    Aerosol = 0.0f;
00282 
00283    return(PacketSize);
00284 
00285 }
00286 
00287 
00288 
00289 // ====================================================================
00290 // Accessors
00291 // ====================================================================
00292 
00293 
00294 // ================================================
00295 // Phenomenon Type
00296 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00297 int CigiWeatherCtrlV2::SetPhenomenonType(const Cigi_uint16 PhenomenonTypeIn, bool bndchk)
00298 {
00299    Cigi_uint16 LayerTbl[7] = { 1,1,2,0,4,5,8 };
00300 
00301    PhenomenonType = PhenomenonTypeIn;
00302 
00303    if(PhenomenonType == 0)
00304    {
00305       LayerID = 1;
00306       Scope = Entity;
00307    }
00308    else
00309    {
00310       Scope = Global;
00311 
00312       if(PhenomenonType < 7)
00313          LayerID = (Cigi_uint8)LayerTbl[PhenomenonType];
00314       else if(PhenomenonType < 256)
00315          LayerID = (Cigi_uint8)PhenomenonType;
00316       else
00317          LayerID = 255;
00318    }
00319 
00320    return(CIGI_SUCCESS);
00321 }
00322 
00323 
00324 // ================================================
00325 // Opacity
00326 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00327 int CigiWeatherCtrlV2::SetOpacity(const float OpacityIn, bool bndchk)
00328 {
00329 
00330 #ifndef CIGI_NO_BND_CHK
00331    if(bndchk && ((OpacityIn < 0.0)||(OpacityIn > 100.0)))
00332    {
00333 #ifndef CIGI_NO_EXCEPT
00334       throw CigiValueOutOfRangeException("Opacity",(float)OpacityIn,0.0,100.0);
00335 #endif
00336       return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00337    }
00338 #endif
00339 
00340    Opacity = OpacityIn;
00341    VisibilityRng = ((Opacity/100.0f)*70000.0f);
00342 
00343    return(CIGI_SUCCESS);
00344 
00345 }
00346 
00347 
00348 // ================================================
00349 // WindDir
00350 // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
00351 int CigiWeatherCtrlV2::SetWindDir(const float WindDirIn, bool bndchk)
00352 {
00353 
00354 #ifndef CIGI_NO_BND_CHK
00355    if(bndchk && ((WindDirIn < 0.0)||(WindDirIn > 360.0)))
00356    {
00357 #ifndef CIGI_NO_EXCEPT
00358       throw CigiValueOutOfRangeException("WindDir",(float)WindDirIn,0.0,360.0);
00359 #endif
00360       return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00361    }
00362 #endif
00363 
00364    WindDir = WindDirIn;
00365    return(CIGI_SUCCESS);
00366 
00367 }
00368 
00369 

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