from pyorbital.orbital import Orbital from datetime import datetime, timedelta import time from operator import itemgetter import puller def plan(lat, lon, alt, tle, transmitter, receiver, priority, name, delta = timedelta(seconds=1800), predictH = 12, horizon = 5): #prevent plan same obsevation last = datetime.utcnow() plans = [] for ob in puller.watingJobs: last = max(ob["start"], last) orb = Orbital(name, line1=tle["line1"], line2=tle["line2"]) passes = orb.get_next_passes( datetime.utcnow() + delta, predictH, lon, lat, alt, tol = 0.001, horizon = horizon ) for ob in passes: start = ob[0] end = ob[1] if start <= last: print(f"[INFO] alredy planed {name} at {start}") continue plans.append({ "transmitter": transmitter, "receiver": receiver, "start": start, "end": end, "priority": priority }) return plans def planAll(location): planeble = puller.getPlaneble() plans = [] for transmitter in planeble: plans += plan( location["lat"], location["lon"], location["alt"], transmitter["locator"]["tle"], transmitter["transmitter"], transmitter["receiver"], transmitter["priority"], transmitter["name"] ) plans = sorted(plans, key=itemgetter('start')) i = 0 while i + 1 < len(plans): if plans[i]["end"] < plans[i + 1]["start"]: puller.plan(plans[i]["transmitter"], plans[i]["receiver"], plans[i]["start"], plans[i]["end"]) i += 1 elif plans[i]["priority"] > plans[i + 1]["priority"]: plans.pop(i + 1) else: i += 1