00001
00055 #define _EXPORT_CCL_
00056
00057 #include "CigiCelestialCtrl.h"
00058 #include "CigiSwapping.h"
00059 #include "CigiExceptions.h"
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 CigiCelestialCtrlV3::CigiCelestialCtrlV3()
00071 {
00072
00073 PacketID = CIGI_CELESTIAL_CTRL_PACKET_ID_V3;
00074 PacketSize = CIGI_CELESTIAL_CTRL_PACKET_SIZE_V3;
00075 Version = 3;
00076 MinorVersion = 0;
00077
00078 Hour = 0;
00079 Minute = 0;
00080 Month = 1;
00081 Day = 1;
00082 Year = 2000;
00083 StarInt = 0.0;
00084 EphemerisEn = false;
00085 SunEn = false;
00086 MoonEn = false;
00087 StarEn = false;
00088 DateVld = false;
00089 AtmosEn = false;
00090 Aerosol = 0.0;
00091 Humidity = 30;
00092 AirTemp = 0.0;
00093 Visibility = 64373.76f;
00094 HorizWindSp = 0.0;
00095 VertWindSp = 0.0;
00096 WindDir = 0.0;
00097 BaroPress = 1013.25;
00098
00099
00100 }
00101
00102
00103
00104
00105 CigiCelestialCtrlV3::~CigiCelestialCtrlV3()
00106 {
00107
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117 int CigiCelestialCtrlV3::Pack(CigiBasePacket * Base, Cigi_uint8 * Buff, void *Spec) const
00118 {
00119 PackPointer CDta;
00120
00121 CigiBaseEnvCtrl * Data;
00122 if(Spec == NULL)
00123 Data = ( CigiBaseEnvCtrl *)Base;
00124 else
00125 Data = ( CigiBaseEnvCtrl *)Spec;
00126
00127
00128 CDta.c = Buff;
00129
00130 *CDta.c++ = PacketID;
00131 *CDta.c++ = PacketSize;
00132
00133 *CDta.c++ = Data->Hour;
00134 *CDta.c++ = Data->Minute;
00135
00136 Cigi_uint8 HDta = (Data->EphemerisEn) ? 0x01 : 0;
00137 HDta |= (Data->SunEn) ? 0x02 : 0;
00138 HDta |= (Data->MoonEn) ? 0x04 : 0;
00139 HDta |= (Data->StarEn) ? 0x08 : 0;
00140 HDta |= (Data->DateVld) ? 0x10 : 0;
00141 *CDta.c++ = HDta;
00142
00143 *CDta.c++ = 0;
00144 *CDta.s++ = 0;
00145
00146
00147 Cigi_uint32 date = ((Cigi_uint32)Data->Month * 1000000) +
00148 ((Cigi_uint32)Data->Day * 10000) + (Cigi_uint32)Data->Year;
00149 *CDta.l++ = date;
00150
00151 *CDta.f++ = Data->StarInt;
00152
00153
00154 return(PacketSize);
00155
00156 }
00157
00158
00159
00160
00161 int CigiCelestialCtrlV3::Unpack(Cigi_uint8 * Buff, bool Swap, void *Spec)
00162 {
00163 PackPointer CDta;
00164
00165 Cigi_uint32 date;
00166
00167 CDta.c = Buff;
00168
00169 CDta.c += 2;
00170
00171 if(!Swap)
00172 {
00173 Hour = *CDta.c++;
00174 Minute = *CDta.c++;
00175
00176 Cigi_uint8 HDta = *CDta.c++;
00177 EphemerisEn = ((HDta & 0x01) != 0);
00178 SunEn = ((HDta & 0x02) != 0);
00179 MoonEn = ((HDta & 0x04) != 0);
00180 StarEn = ((HDta & 0x08) != 0);
00181 DateVld = ((HDta & 0x10) != 0);
00182
00183 CDta.c += 3;
00184
00185 date = *CDta.l++;
00186
00187 StarInt = *CDta.f++;
00188 }
00189 else
00190 {
00191 Hour = *CDta.c++;
00192 Minute = *CDta.c++;
00193
00194 Cigi_uint8 HDta = *CDta.c++;
00195 EphemerisEn = ((HDta & 0x01) != 0);
00196 SunEn = ((HDta & 0x02) != 0);
00197 MoonEn = ((HDta & 0x04) != 0);
00198 StarEn = ((HDta & 0x08) != 0);
00199 DateVld = ((HDta & 0x10) != 0);
00200
00201 CDta.c += 3;
00202
00203 CigiSwap4(&date, CDta.l++);
00204 CigiSwap4(&StarInt, CDta.f++);
00205 }
00206
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
00218 if(Spec != NULL)
00219 {
00220
00221 CigiBaseEnvCtrl * Data = (CigiBaseEnvCtrl *)Spec;
00222
00223 Data->Hour = Hour;
00224 Data->Minute = Minute;
00225
00226 Data->EphemerisEn = EphemerisEn;
00227 Data->SunEn = SunEn;
00228 Data->MoonEn = MoonEn;
00229 Data->StarEn = StarEn;
00230 Data->DateVld = DateVld;
00231
00232 Data->StarInt = StarInt;
00233
00234 Data->Month = Month;
00235 Data->Day = Day;
00236 Data->Year = Year;
00237
00238 }
00239
00240
00241
00242 return(PacketSize);
00243
00244 }
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 void CigiCelestialCtrlV3::FillHold(CigiBaseEnvCtrl * Hold) const
00256 {
00257 Hold->Hour = Hour;
00258 Hold->Minute = Minute;
00259 Hold->EphemerisEn = EphemerisEn;
00260 Hold->SunEn = SunEn;
00261 Hold->MoonEn = MoonEn;
00262 Hold->StarEn = StarEn;
00263 Hold->DateVld = DateVld;
00264 Hold->Month = Month;
00265 Hold->Day = Day;
00266 Hold->Year = Year;
00267 Hold->StarInt = StarInt;
00268 }
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 int CigiCelestialCtrlV3::SetHour(const Cigi_uint8 HourIn, bool bndchk)
00282 {
00283
00284 #ifndef CIGI_NO_BND_CHK
00285 if(bndchk && ((HourIn < 0)||(HourIn > 23)))
00286 {
00287 #ifndef CIGI_NO_EXCEPT
00288 throw CigiValueOutOfRangeException("Hour",(Cigi_uint8)HourIn,0,23);
00289 #endif
00290 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00291 }
00292 #endif
00293
00294 Hour = HourIn;
00295 return(CIGI_SUCCESS);
00296
00297 }
00298
00299
00300
00301
00302
00303 int CigiCelestialCtrlV3::SetMinute(const Cigi_uint8 MinuteIn, bool bndchk)
00304 {
00305
00306 #ifndef CIGI_NO_BND_CHK
00307 if(bndchk && ((MinuteIn < 0)||(MinuteIn > 59)))
00308 {
00309 #ifndef CIGI_NO_EXCEPT
00310 throw CigiValueOutOfRangeException("Minute",(Cigi_uint8)MinuteIn,0,59);
00311 #endif
00312 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00313 }
00314 #endif
00315
00316 Minute = MinuteIn;
00317 return(CIGI_SUCCESS);
00318
00319 }
00320
00321
00322
00323
00324
00325 int CigiCelestialCtrlV3::SetMonth(const Cigi_uint8 MonthIn, bool bndchk)
00326 {
00327
00328 #ifndef CIGI_NO_BND_CHK
00329 if(bndchk && ((MonthIn < 1)||(MonthIn > 12)))
00330 {
00331 #ifndef CIGI_NO_EXCEPT
00332 throw CigiValueOutOfRangeException("Month",(Cigi_uint8)MonthIn,1,12);
00333 #endif
00334 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00335 }
00336 #endif
00337
00338 Month = MonthIn;
00339 return(CIGI_SUCCESS);
00340
00341 }
00342
00343
00344
00345
00346
00347 int CigiCelestialCtrlV3::SetDay(const Cigi_uint8 DayIn, bool bndchk)
00348 {
00349
00350 #ifndef CIGI_NO_BND_CHK
00351 if(bndchk && ((DayIn < 1)||(DayIn > 31)))
00352 {
00353 #ifndef CIGI_NO_EXCEPT
00354 throw CigiValueOutOfRangeException("Day",(Cigi_uint8)DayIn,1,31);
00355 #endif
00356 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00357 }
00358 #endif
00359
00360 Day = DayIn;
00361 return(CIGI_SUCCESS);
00362
00363 }
00364
00365
00366
00367
00368
00369
00370 int CigiCelestialCtrlV3::SetStarInt(const float StarIntIn, bool bndchk)
00371 {
00372
00373 #ifndef CIGI_NO_BND_CHK
00374 if(bndchk && ((StarIntIn < 0.0)||(StarIntIn > 100.0)))
00375 {
00376 #ifndef CIGI_NO_EXCEPT
00377 throw CigiValueOutOfRangeException("StarInt",StarIntIn,0.0,100.0);
00378 #endif
00379 return(CIGI_ERROR_VALUE_OUT_OF_RANGE);
00380 }
00381 #endif
00382
00383 StarInt = StarIntIn;
00384 return(CIGI_SUCCESS);
00385
00386 }
00387