Merge branch 'pr/refactoring2' into 'master'
schedule_single_station.py: 2nd refactoring round See merge request librespacefoundation/satnogs/satnogs-auto-scheduler!56merge-requests/56/merge
commit
45da60d876
|
@ -36,6 +36,17 @@ def overlap(satpass, scheduledpasses, wait_time_seconds):
|
|||
|
||||
return overlap
|
||||
|
||||
def create_observer(lat, lon, alt, min_riseset=0.0):
|
||||
'''
|
||||
Create an observer instance.
|
||||
'''
|
||||
observer = ephem.Observer()
|
||||
observer.lat = str(lat)
|
||||
observer.lon = str(lon)
|
||||
observer.elevation = alt
|
||||
observer.horizon = str(min_riseset)
|
||||
|
||||
return observer
|
||||
|
||||
def find_passes(satellite,
|
||||
observer,
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
#!/usr/bin/env python
|
||||
from __future__ import division
|
||||
import requests
|
||||
import ephem
|
||||
from datetime import datetime, timedelta
|
||||
import os
|
||||
import lxml.html
|
||||
import argparse
|
||||
import logging
|
||||
from utils import read_priorities_transmitters, \
|
||||
get_priority_passes
|
||||
from auto_scheduler import Twolineelement, Satellite
|
||||
from auto_scheduler.pass_predictor import find_passes
|
||||
from utils import get_priority_passes, \
|
||||
read_priorities_transmitters, \
|
||||
satellites_from_transmitters, \
|
||||
print_scheduledpass_summary
|
||||
from auto_scheduler.pass_predictor import create_observer, \
|
||||
find_passes
|
||||
from auto_scheduler.schedulers import ordered_scheduler, \
|
||||
report_efficiency
|
||||
from cache import CacheManager
|
||||
|
@ -163,12 +164,6 @@ def main():
|
|||
settings.MAX_NORAD_CAT_ID)
|
||||
cache.update()
|
||||
|
||||
# Set observer
|
||||
observer = ephem.Observer()
|
||||
observer.lon = str(ground_station['lng'])
|
||||
observer.lat = str(ground_station['lat'])
|
||||
observer.elevation = ground_station['altitude']
|
||||
|
||||
# Set minimum culmination elevation
|
||||
if args.min_culmination is None:
|
||||
min_culmination = ground_station['min_horizon']
|
||||
|
@ -181,19 +176,25 @@ def main():
|
|||
min_culmination = args.min_culmination
|
||||
|
||||
# Set minimum rise/set elevation
|
||||
if args.min_riseset is None:
|
||||
min_riseset = ground_station['min_horizon']
|
||||
else:
|
||||
if args.min_riseset < 0.0:
|
||||
min_riseset = 0.0
|
||||
elif args.min_riseset > 90.0:
|
||||
min_riseset = 90.0
|
||||
else:
|
||||
min_riseset = args.min_riseset
|
||||
|
||||
# Use minimum altitude for computing rise and set times (horizon to horizon otherwise)
|
||||
if not args.horizon:
|
||||
observer.horizon = str(min_riseset)
|
||||
# Use minimum altitude for computing rise and set times (horizon to horizon otherwise)
|
||||
if args.min_riseset is None:
|
||||
min_riseset = ground_station['min_horizon']
|
||||
else:
|
||||
if args.min_riseset < 0.0:
|
||||
min_riseset = 0.0
|
||||
elif args.min_riseset > 90.0:
|
||||
min_riseset = 90.0
|
||||
else:
|
||||
min_riseset = args.min_riseset
|
||||
else:
|
||||
min_riseset = 0.0
|
||||
|
||||
# Set observer
|
||||
observer = create_observer(ground_station['lat'],
|
||||
ground_station['lng'],
|
||||
ground_station['altitude'],
|
||||
min_riseset=min_riseset)
|
||||
|
||||
# Minimum duration of a pass
|
||||
min_pass_duration = settings.MIN_PASS_DURATION
|
||||
|
@ -204,21 +205,13 @@ def main():
|
|||
# Read transmitters
|
||||
transmitters = cache.read_transmitters()
|
||||
|
||||
# Extract satellites from receivable transmitters
|
||||
satellites = []
|
||||
for transmitter in transmitters:
|
||||
for tle in tles:
|
||||
if tle['norad_cat_id'] == transmitter['norad_cat_id']:
|
||||
satellites.append(Satellite(Twolineelement(*tle['lines']),
|
||||
transmitter['uuid'],
|
||||
transmitter['success_rate'],
|
||||
transmitter['good_count'],
|
||||
transmitter['data_count'],
|
||||
transmitter['mode']))
|
||||
# Extract interesting satellites from receivable transmitters
|
||||
satellites = satellites_from_transmitters(transmitters, tles)
|
||||
|
||||
# Find passes
|
||||
passes = []
|
||||
logging.info('Finding all passes for %s satellites:' % len(satellites))
|
||||
|
||||
# Loop over satellites
|
||||
for satellite in tqdm(satellites):
|
||||
passes.extend(find_passes(satellite,
|
||||
|
@ -255,21 +248,10 @@ def main():
|
|||
# Find unique objects
|
||||
satids = sorted(set([satpass['id'] for satpass in passes]))
|
||||
|
||||
schedule_needed = False
|
||||
|
||||
logging.info("GS | Sch | NORAD | Start time | End time | El | " +
|
||||
"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()))
|
||||
if not satpass['scheduled']:
|
||||
schedule_needed = True
|
||||
print_scheduledpass_summary(scheduledpasses, ground_station_id, printer=logging.info)
|
||||
|
||||
# Login and schedule passes
|
||||
schedule_needed = any([satpass['scheduled'] for satpass in scheduledpasses])
|
||||
if schedule and schedule_needed:
|
||||
loginUrl = '{}/accounts/login/'.format(settings.NETWORK_BASE_URL) # login URL
|
||||
session = requests.session()
|
||||
|
|
38
utils.py
38
utils.py
|
@ -2,6 +2,8 @@ import logging
|
|||
import settings
|
||||
import os
|
||||
|
||||
from auto_scheduler import Twolineelement, Satellite
|
||||
|
||||
|
||||
def read_priorities_transmitters(filename):
|
||||
# Priorities and favorite transmitters
|
||||
|
@ -55,3 +57,39 @@ def get_priority_passes(passes, priorities, favorite_transmitters, only_priority
|
|||
if satpass['priority'] >= min_priority:
|
||||
normal.append(satpass)
|
||||
return (priority, normal)
|
||||
|
||||
|
||||
def satellites_from_transmitters(transmitters, tles):
|
||||
'''
|
||||
Extract interesting satellites from receivable transmitters
|
||||
'''
|
||||
satellites = []
|
||||
for transmitter in transmitters:
|
||||
for tle in tles:
|
||||
if tle['norad_cat_id'] == transmitter['norad_cat_id']:
|
||||
satellites.append(Satellite(Twolineelement(*tle['lines']),
|
||||
transmitter['uuid'],
|
||||
transmitter['success_rate'],
|
||||
transmitter['good_count'],
|
||||
transmitter['data_count'],
|
||||
transmitter['mode']))
|
||||
return satellites
|
||||
|
||||
|
||||
def print_scheduledpass_summary(scheduledpasses, ground_station_id, printer=print):
|
||||
printer("GS | Sch | NORAD | Start time | End time | El | " +
|
||||
"Priority | Transmitter UUID | Mode | Satellite name ")
|
||||
|
||||
for satpass in sorted(scheduledpasses, key=lambda satpass: satpass['tr']):
|
||||
printer(
|
||||
"%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.get('priority', 0.0),
|
||||
satpass.get('uuid', ''),
|
||||
satpass.get('mode', ''),
|
||||
satpass['name'].rstrip()))
|
||||
|
|
Loading…
Reference in New Issue