8
8
* Documentation: https://nyxspace.com/
9
9
*/
10
10
11
- use anise:: astro:: Occultation ;
11
+ use anise:: astro:: { AzElRange , Occultation } ;
12
12
use anise:: constants:: celestial_objects:: { EARTH , VENUS } ;
13
13
use anise:: constants:: frames:: {
14
14
EARTH_ITRF93 , EARTH_J2000 , IAU_EARTH_FRAME , IAU_MOON_FRAME , MOON_J2000 , SUN_J2000 , VENUS_J2000 ,
@@ -317,6 +317,14 @@ fn validate_gh_283_multi_barycenter_and_los(almanac: Almanac) {
317
317
let obsrvr = "-85" ;
318
318
319
319
let mut prev_occult: Option < Occultation > = None ;
320
+ let mut prev_aer: Option < AzElRange > = None ;
321
+ let mut access_count = 0 ;
322
+ let mut access_start: Option < Epoch > = None ;
323
+
324
+ let access_times = [
325
+ Unit :: Minute * 4 + Unit :: Second * 1 ,
326
+ Unit :: Hour * 1 + Unit :: Minute * 6 + 49 * Unit :: Second ,
327
+ ] ;
320
328
321
329
for epoch in TimeSeries :: inclusive ( epoch, epoch + period, 1 . seconds ( ) ) {
322
330
// Rebuild the ground station at this new epoch
@@ -335,8 +343,33 @@ fn validate_gh_283_multi_barycenter_and_los(almanac: Almanac) {
335
343
. unwrap ( ) ;
336
344
337
345
let aer = almanac
338
- . azimuth_elevation_range_sez ( rx_lro, tx_madrid, Some ( MOON_J2000 ) , None )
346
+ . azimuth_elevation_range_sez ( rx_lro, tx_madrid, Some ( IAU_MOON_FRAME ) , None )
339
347
. unwrap ( ) ;
348
+
349
+ if let Some ( prev_aer) = prev_aer {
350
+ if prev_aer. is_obstructed ( ) && !aer. is_obstructed ( ) {
351
+ // New access
352
+ access_count += 1 ;
353
+ access_start = Some ( aer. epoch ) ;
354
+ } else if !prev_aer. is_obstructed ( ) && aer. is_obstructed ( ) {
355
+ // End of access
356
+ if let Some ( access_start) = access_start {
357
+ // We've had a full access strand.
358
+ let access_end = aer. epoch ;
359
+ let access_duration = ( access_end - access_start) . round ( Unit :: Second * 1 ) ;
360
+ println ! (
361
+ "#{access_count}\t {access_start} - {access_end}\t {}" ,
362
+ access_duration
363
+ ) ;
364
+ assert_eq ! ( access_times[ access_count] , access_duration) ;
365
+ }
366
+ }
367
+ // dbg!(prev_aer.is_obstructed(), aer.is_obstructed());
368
+ } else if !aer. is_obstructed ( ) {
369
+ access_start = Some ( aer. epoch ) ;
370
+ }
371
+ prev_aer = Some ( aer) ;
372
+
340
373
if aer. obstructed_by . is_some ( ) {
341
374
obstructions += 1 ;
342
375
} else {
@@ -417,6 +450,17 @@ fn validate_gh_283_multi_barycenter_and_los(almanac: Almanac) {
417
450
prev_occult = Some ( occult)
418
451
}
419
452
453
+ if let Some ( access_start) = access_start {
454
+ // We've had a full access strand.
455
+ let access_end = epoch + period;
456
+ let access_duration = ( access_end - access_start) . round ( Unit :: Second * 1 ) ;
457
+ println ! (
458
+ "#{access_count}\t {access_start} - {access_end}\t {}" ,
459
+ access_duration
460
+ ) ;
461
+ assert_eq ! ( access_times[ access_count] , access_duration) ;
462
+ }
463
+
420
464
assert_eq ! ( obstructions, 2762 ) ;
421
465
assert_eq ! ( no_obstructions, 4250 ) ;
422
466
}
0 commit comments