00001
00052 #define _EXPORT_CCL_
00053
00054 #include "CigiAtmosCtrl.h"
00055 #include "CigiSwapping.h"
00056 #include "CigiExceptions.h"
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 CigiAtmosCtrlV3::CigiAtmosCtrlV3()
00068 {
00069
00070 PacketID = CIGI_ATMOS_CTRL_PACKET_ID_V3;
00071 PacketSize = CIGI_ATMOS_CTRL_PACKET_SIZE_V3;
00072 Version = 3;
00073 MinorVersion = 0;
00074
00075 Hour = 0;
00076 Minute = 0;
00077 Month = 1;
00078 Day = 1;
00079 Year = 2000;
00080 StarInt = 0.0;
00081 EphemerisEn = false;
00082 SunEn = false;
00083 MoonEn = false;
00084 StarEn = false;
00085 DateVld = false;
00086 AtmosEn = false;
00087 Aerosol = 0.0;
00088 Humidity = 30;
00089 AirTemp = 0.0;
00090 Visibility = 64373.76f;
00091 HorizWindSp = 0.0;
00092 VertWindSp = 0.0;
00093 WindDir = 0.0;
00094 BaroPress = 1013.25;
00095
00096
00097 }
00098
00099
00100
00101
00102 CigiAtmosCtrlV3::~CigiAtmosCtrlV3()
00103 {
00104
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114 int CigiAtmosCtrlV3::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00115 {
00116 PackPointer CDta;
00117
00118 CigiBaseEnvCtrl * Data;
00119 if(Spec == NULL)
00120 Data = ( CigiBaseEnvCtrl *)Base;
00121 else
00122 Data = ( CigiBaseEnvCtrl *)Spec;
00123
00124 CDta.c = Buff;
00125
00126 *CDta.c++ = PacketID;
00127 *CDta.c++ = PacketSize;
00128
00129 *CDta.c++ = (Data->AtmosEn) ? 0x01 : 0;
00130
00131 *CDta.c++ = Data->Humidity;
00132 *CDta.f++ = Data->AirTemp;
00133 *CDta.f++ = Data->Visibility;
00134 *CDta.f++ = Data->HorizWindSp;
00135 *CDta.f++ = Data->VertWindSp;
00136 *CDta.f++ = Data->WindDir;
00137 *CDta.f++ = Data->BaroPress;
00138 *CDta.l++ = 0;
00139
00140 return(PacketSize);
00141
00142 }
00143
00144
00145
00146
00147 int CigiAtmosCtrlV3::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00148 {
00149 PackPointer CDta;
00150
00151 CDta.c = Buff;
00152
00153 CDta.c += 2;
00154
00155 if(!Swap)
00156 {
00157 AtmosEn = (*CDta.c++ != 0);
00158
00159 Humidity = *CDta.c++;
00160 AirTemp = *CDta.f++;
00161 Visibility = *CDta.f++;
00162 HorizWindSp = *CDta.f++;
00163 VertWindSp = *CDta.f++;
00164 WindDir = *CDta.f++;
00165 BaroPress = *CDta.f++;
00166 }
00167 else
00168 {
00169 AtmosEn = (*CDta.c++ != 0);
00170
00171 Humidity = *CDta.c++;
00172 CigiSwap4(&AirTemp, CDta.f++);
00173 CigiSwap4(&Visibility, CDta.f++);
00174 CigiSwap4(&HorizWindSp, CDta.f++);
00175 CigiSwap4(&VertWindSp, CDta.f++);
00176 CigiSwap4(&WindDir, CDta.f++);
00177 CigiSwap4(&BaroPress, CDta.f++);
00178 }
00179
00180 if(Spec != NULL)
00181 {
00182
00183 CigiBaseEnvCtrl * Data = (CigiBaseEnvCtrl *)Spec;
00184
00185 Data->AtmosEn = AtmosEn;
00186
00187 Data->Humidity = Humidity;
00188 Data->AirTemp = AirTemp;
00189 Data->Visibility = Visibility;
00190 Data->HorizWindSp = HorizWindSp;
00191 Data->VertWindSp = VertWindSp;
00192 Data->WindDir = WindDir;
00193 Data->BaroPress = BaroPress;
00194 }
00195
00196 return(PacketSize);
00197
00198 }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 void CigiAtmosCtrlV3::FillHold(CigiBaseEnvCtrl * Hold) const
00210 {
00211 Hold->AtmosEn = AtmosEn;
00212 Hold->Humidity = Humidity;
00213 Hold->AirTemp = AirTemp;
00214 Hold->Visibility = Visibility;
00215 Hold->HorizWindSp = HorizWindSp;
00216 Hold->VertWindSp = VertWindSp;
00217 Hold->WindDir = WindDir;
00218 Hold->BaroPress = BaroPress;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 int CigiAtmosCtrlV3::SetHumidity(const Cigi_uint8 HumidityIn, bool bndchk)
00233 {
00234
00235 #ifndef CIGI_NO_BND_CHK
00236 if(bndchk && ((HumidityIn < 0)||(HumidityIn > 100)))
00237 {
00238 #ifndef CIGI_NO_EXCEPT
00239 throw CigiValueOutOfRangeException("Humidity",(Cigi_uint8)HumidityIn,0,100);
00240 #endif
00241 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00242 }
00243 #endif
00244
00245 Humidity = HumidityIn;
00246 return(CIGI_SUCCESS);
00247
00248 }
00249
00250
00251
00252
00253
00254 int CigiAtmosCtrlV3::SetVisibility(const float VisibilityIn, bool bndchk)
00255 {
00256
00257 #ifndef CIGI_NO_BND_CHK
00258 if(bndchk && (VisibilityIn < 0.0))
00259 {
00260 #ifndef CIGI_NO_EXCEPT
00261 throw CigiValueOutOfRangeException("Visibility",(float)VisibilityIn,">",0.0);
00262 #endif
00263 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00264 }
00265 #endif
00266
00267 Visibility = VisibilityIn;
00268 return(CIGI_SUCCESS);
00269
00270 }
00271
00272
00273
00274
00275
00276 int CigiAtmosCtrlV3::SetHorizWindSp(const float HorizWindSpIn, bool bndchk)
00277 {
00278
00279 #ifndef CIGI_NO_BND_CHK
00280 if(bndchk && (HorizWindSpIn < 0.0))
00281 {
00282 #ifndef CIGI_NO_EXCEPT
00283 throw CigiValueOutOfRangeException("HorizWindSp",(float)HorizWindSpIn,">",0.0);
00284 #endif
00285 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00286 }
00287 #endif
00288
00289 HorizWindSp = HorizWindSpIn;
00290 return(CIGI_SUCCESS);
00291
00292 }
00293
00294
00295
00296
00297
00298 int CigiAtmosCtrlV3::SetWindDir(const float WindDirIn, bool bndchk)
00299 {
00300
00301 #ifndef CIGI_NO_BND_CHK
00302 if(bndchk && ((WindDirIn < 0.0)||(WindDirIn > 360.0)))
00303 {
00304 #ifndef CIGI_NO_EXCEPT
00305 throw CigiValueOutOfRangeException("WindDir",(float)WindDirIn,0.0,360.0);
00306 #endif
00307 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00308 }
00309 #endif
00310
00311 WindDir = WindDirIn;
00312 return(CIGI_SUCCESS);
00313
00314 }
00315
00316
00317
00318
00319
00320 int CigiAtmosCtrlV3::SetBaroPress(const float BaroPressIn, bool bndchk)
00321 {
00322
00323 #ifndef CIGI_NO_BND_CHK
00324 if(bndchk && (BaroPressIn < 0.0))
00325 {
00326 #ifndef CIGI_NO_EXCEPT
00327 throw CigiValueOutOfRangeException("BaroPress",(float)BaroPressIn,">",0.0);
00328 #endif
00329 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00330 }
00331 #endif
00332
00333 BaroPress = BaroPressIn;
00334 return(CIGI_SUCCESS);
00335
00336 }
00337
00338