From 5df8a2fcbb92fdd1aa45f1efe2e47338f2fc7a07 Mon Sep 17 00:00:00 2001 From: lu7did Date: Thu, 15 Aug 2019 14:31:55 -0300 Subject: [PATCH] AzWindow --- schedule_single_station.py | 105 ++++++++++++++++++++++++++++++++----- utils.py | 5 +- 2 files changed, 96 insertions(+), 14 deletions(-) diff --git a/schedule_single_station.py b/schedule_single_station.py index 9567876..bf0f7f6 100755 --- a/schedule_single_station.py +++ b/schedule_single_station.py @@ -72,8 +72,28 @@ def _log_level_string_to_int(log_level_string): return log_level_int +#*----------------------------------------------------------------------------------- +#* checkAz +#* Function to compute if Az is within a given Azimuth window +#*----------------------------------------------------------------------------------- +def checkAz(Az,Azmin,Azmax): + if Az == 0: + return True + + if Azmin>Azmax: + if(Az>=Azmin) or (Az<=Azmax): + return True + else: + return False + else: + if (Az>=Azmin) and (Az<=Azmax): + return True + else: + return False +#*------------------------------------------------------------------------------- def main(): + # Parse arguments parser = argparse.ArgumentParser( description="Automatically schedule observations on a SatNOGS station.") @@ -97,6 +117,20 @@ def main(): help="Minimum rise/set elevation [degrees; ground station default, minimum: 0, maximum: 90]", type=float, default=None) +#*------------------------------------------------------------------------------------------------- +#* define two new arguments to specify Az (min,max) window +#*------------------------------------------------------------------------------------------------- + parser.add_argument("-a", + "--azmin", + help="Minimum Az window [degrees; ground station default=0,maximum: 359]", + type=float, + default=None) + parser.add_argument("-A", + "--azmax", + help="Maximum Az window [degrees; ground station default=0,maximum: 359]", + type=float, + default=None) +#*-------------------------------------------------------------------------------------------------- parser.add_argument("-z", "--horizon", help="Force rise/set elevation to 0 degrees (overrided -r).", @@ -157,6 +191,7 @@ def main(): format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") # Settings + ground_station_id = args.station if args.duration > 0.0: length_hours = args.duration @@ -174,6 +209,18 @@ def main(): min_priority = 1.0 else: min_priority = args.min_priority + + if (args.azmin >= 0) and (args.azmin <= 360): + azmin=args.azmin + else: + azmin=0 + + if (args.azmax>=0) and (args.azmax<=360): + azmax=args.azmax + else: + azmax=365 + + cache_dir = "/tmp/cache" schedule = not args.dryrun only_priority = args.only_priority @@ -193,6 +240,9 @@ def main(): if not os.path.isdir(cache_dir): os.mkdir(cache_dir) + # Printing Az window + logging.info('Az window set as Min(%3.0f) Max(%3.0f)' % (azmin,azmax)) + # Update logic update = update_needed(tnow, ground_station_id, cache_dir) @@ -322,6 +372,7 @@ def main(): # Priority scheduler prioritypasses = sorted(prioritypasses, key=lambda satpass: -satpass['priority']) scheduledpasses = ordered_scheduler(prioritypasses, scheduledpasses, wait_time_seconds) + for satpass in passes: logging.debug(satpass) @@ -337,15 +388,20 @@ def main(): schedule_needed = False - logging.info("GS | Sch | NORAD | Start time | End time | El | " + - "Priority | Transmitter UUID | Mode | Satellite name ") +#*----- Modify to add AzR and AzS + + logging.info("GS | Sch | NORAD | Start time | End time | El | AzR | AzS | Priority | Transmitter UUID | Mode | Satellite name ") + for satpass in sorted(scheduledpasses, key=lambda satpass: satpass['tr']): - logging.info( - "%3d | %3.d | %05d | %s | %s | %3.0f | %4.6f | %s | %-10s | %s" % - (ground_station_id, satpass['scheduled'], int( - satpass['id']), satpass['tr'].strftime("%Y-%m-%dT%H:%M:%S"), - satpass['ts'].strftime("%Y-%m-%dT%H:%M:%S"), float(satpass['altt']) if satpass['altt'] - else 0., satpass['priority'], satpass['uuid'], satpass['mode'], satpass['name'].rstrip())) + +#*----- Modify to add AzR and AzS + + logging.info("%3d | %3.d | %05d | %s | %s | %3.0f | %3.0f | %3.0f | %4.6f | %s | %-10s | %s" % + (ground_station_id, satpass['scheduled'], int(satpass['id']), satpass['tr'].strftime("%Y-%m-%dT%H:%M:%S"), + satpass['ts'].strftime("%Y-%m-%dT%H:%M:%S"), float(satpass['altt']),float(satpass['azr']),float(satpass['azs']), + float(satpass['priority']), satpass['uuid'], satpass['mode'], satpass['name'].rstrip())) + +#Aqui es la intervencion para evitar scheduling, se le pasa schedule_needed=False y a otra cosa if not satpass['scheduled']: schedule_needed = True @@ -379,15 +435,38 @@ def main(): logging.info('Checking and scheduling passes as needed.') for satpass in tqdm(scheduledpasses_sorted): if not satpass['scheduled']: - logging.debug("Scheduling %05d %s %s %3.0f %4.3f %s %s" % - (int(satpass['id']), satpass['tr'].strftime("%Y-%m-%dT%H:%M:%S"), - satpass['ts'].strftime("%Y-%m-%dT%H:%M:%S"), float(satpass['altt']), - satpass['priority'], satpass['uuid'], satpass['name'].rstrip())) - schedule_observation(session, int(satpass['id']), satpass['uuid'], + #logging.debug("Scheduling %05d %s %s %3.0f %4.3f %s %s" % + #logging.info("Scheduling %05d %s %s %3.0f %4.3f %s %s" % + # (int(satpass['id']), satpass['tr'].strftime("%Y-%m-%dT%H:%M:%S"), + # satpass['ts'].strftime("%Y-%m-%dT%H:%M:%S"), float(satpass['altt']), + # satpass['priority'], satpass['uuid'], satpass['name'].rstrip())) + +#*------ Filter passes based on Az Window + + + if (checkAz(float(satpass['azr']),azmin,azmax)) or (checkAz(float(satpass['azs']),azmin,azmax)): + logging.info("\n") + + logging.info("scheduling Sat(%d) UUID(%s) Rise(%s) Set(%s)" % (int(satpass['id']),satpass['uuid'], + satpass['tr'].strftime("%Y-%m-%d %H:%M:%S") + ".000", + satpass['ts'].strftime("%Y-%m-%d %H:%M:%S") + ".000")) + + schedule_observation(session, int(satpass['id']), satpass['uuid'], ground_station_id, satpass['tr'].strftime("%Y-%m-%d %H:%M:%S") + ".000", satpass['ts'].strftime("%Y-%m-%d %H:%M:%S") + ".000") + logging.info("\n") + else: + logging.info("\n") + + logging.info("rejecting Sat(%d) UUID(%s) Rise(%s) Set(%s)" % (int(satpass['id']),satpass['uuid'], + satpass['tr'].strftime("%Y-%m-%d %H:%M:%S") + ".000", + satpass['ts'].strftime("%Y-%m-%d %H:%M:%S") + ".000")) + logging.info("\n") + + +#*------------------------------------------------------------------------------------------------------------------------ logging.info("All passes are scheduled. Exiting!") diff --git a/utils.py b/utils.py index 0a2c0ca..26548b8 100644 --- a/utils.py +++ b/utils.py @@ -116,6 +116,7 @@ def get_scheduled_passes_from_network(ground_station, tmin, tmax): break # r.json() is a list of dicts/observations + # added empty azr and azs keys in order to properly merge later with values from computed pass and be able to filter based on az window for o in r.json(): satpass = { "id": o['norad_cat_id'], @@ -126,7 +127,9 @@ def get_scheduled_passes_from_network(ground_station, tmin, tmax): "priority": 1, "uuid": o['transmitter'], "name": '', - "mode": '' + "mode": '', + "azr":0, + "azs":0 } if satpass['ts'] > tmin and satpass['tr'] < tmax: