Satellite tracking works. Added two new 📡 in json

This commit is contained in:
Boyan 2023-06-20 01:40:19 +03:00
parent bc59545f4b
commit fe45d1852b
2 changed files with 120 additions and 0 deletions

110
src/main.py Normal file
View File

@ -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()

10
tle.json Normal file
View File

@ -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
}
}