From fe45d1852bcb6fc97b42b0a8524ac3a58bb42fdd Mon Sep 17 00:00:00 2001 From: Boyan Date: Tue, 20 Jun 2023 01:40:19 +0300 Subject: [PATCH] =?UTF-8?q?Satellite=20tracking=20works.=20Added=20two=20n?= =?UTF-8?q?ew=20=F0=9F=93=A1=20in=20json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.py | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tle.json | 10 +++++ 2 files changed, 120 insertions(+) create mode 100644 src/main.py create mode 100644 tle.json diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..fb76d51 --- /dev/null +++ b/src/main.py @@ -0,0 +1,110 @@ +from rtlsdr.rtlsdrtcp import RtlSdrTcpClient +from configparser import ConfigParser +import predict +from json import loads +from logging import getLogger, basicConfig, INFO, info, warning +from datetime import datetime +from multiprocessing.pool import Pool +from time import sleep + +basicConfig(level=INFO) +logger = getLogger(__name__) + +config = ConfigParser() +config.read("config.ini") + +def predict_satellite_passes(): + # Predicts satellite passes and returns value until next + qth = (config.getfloat("LOCATION", "LAT"), config.getfloat("LOCATION", "LON"), config.getfloat("LOCATION", "ALT")) + with open("tle.json", "r") as f: + tle = loads(f.read()) + + passes = [] + for i in tle: + observation = predict.observe(tle[i]["tle"], qth) + info(f"Observing {observation['name']}, ID: {observation['norad_id']}") + transit= predict.transits(tle[i]["tle"], qth) + transit = next(transit) + + delta = datetime.now().fromtimestamp(transit.start) - datetime.now() + passes.append({ + "name": observation["name"], + "freq": int(float(tle[i]["freq"])*10**6), + "start": datetime.now().fromtimestamp(transit.start).isoformat(), + "duration": round(transit.duration()/60, 2) , + "max_elevation": round(transit.peak()["elevation"], 2), + "passing_soon": delta.seconds if delta.seconds < 10*60 else False + }) + + + return passes + +def upload_to_discord(): + # Uploads the image to discord + pass + +def generate_image(): + # Generates an image for the satellite pass + pass + + +def record_audio(): + # Connect to a remote rtl_tcp server + sdr = RtlSdrTcpClient(hostname=config.get("RADIO", "HOSTNAME"), port=config.getint("RADIO", "PORT")) + + # Configure the SDR + sdr.set_sample_rate(config.getint("RADIO", "SAMPLERATE")) + #TODO: Add bandwidth + sdr.set_center_freq(config.getfloat("RADIO", "FREQUENCY")*10**6) + sdr.set_gain('auto') # Change if you know what you're doing + +def satellite_tracking(satellite): + # Brings all the functions together + if satellite["passing_soon"]: + info(f"Passing soon: {satellite['name']}") + sleeper = satellite["passing_soon"] + while sleeper > 0: + if sleeper % 100 == 0: + warning(f"Passing soon: {satellite['name']}, {sleeper} seconds left") + elif sleeper <= 10: + warning(sleeper) + sleeper -= 1 + sleep(1) + # Everything else goes here + else: + sleeper = datetime.fromisoformat(satellite["start"]).timestamp() - datetime.now().timestamp() + + info(f"{satellite['name']} is not passing soon, sleeping until then :) (sleeping for {str(round(sleeper/(60*60),1)) + ' hours' if sleeper>60*60 else str(round(sleeper/60)) + ' minutes'})") + sleep(sleeper) + +# Example of parallel running function +# Remember to add to pool +# p.apply_async(debugging) +# And to increase process count + # def parallel_func_example(): + # while True: + # print("Hey, I can run right here, forever!") + # sleep(1) + +def main(): + + # Predict passes and get ready to loop + while True: + passes = predict_satellite_passes() + + # Pool to run for all sattelites + p = Pool(processes=len(passes)+1) + + p.map(satellite_tracking, passes) + + # When everything is finished, sleep for 5 seconds and restart + sleep(5) + + ## TODO: + # Record audio + # Generate image + # Upload to discord + # Glue them together + +if __name__ == "__main__": + main() diff --git a/tle.json b/tle.json new file mode 100644 index 0000000..9fc85b4 --- /dev/null +++ b/tle.json @@ -0,0 +1,10 @@ +{ +"Noaa 19": { + "tle":"NOAA 19\n1 33591U 09005A 23170.51864909 .00000231 00000+0 14945-3 0 9991\n2 33591 99.0990 216.4830 0013059 233.6224 126.3743 14.12772246740017", + "freq": 137.100 + }, +"Noaa 17": { + "tle":"NOAA 17\n1 27453U 02032A 23170.53725030 .00000190 00000+0 99394-4 0 9993\n2 27453 98.7163 117.4322 0010669 287.0691 72.9319 14.25314386 91145", + "freq": 137.620 + } +}