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
00079
00080
00081
00082
00083
00084
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
00123
00124 CigiWeatherCtrlV2::~CigiWeatherCtrlV2()
00125 {
00126
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
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
00206
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;
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
00291
00292
00293
00294
00295
00296
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
00326
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
00350
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