From 0a8af22087504505f4f8e1567c69da148af73aaf Mon Sep 17 00:00:00 2001 From: Logan Cusano Date: Fri, 31 Dec 2021 02:18:23 -0500 Subject: [PATCH] Update: Working on SDR RX --- bot.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/bot.py b/bot.py index a2ae87d..bd69c77 100644 --- a/bot.py +++ b/bot.py @@ -14,8 +14,10 @@ class Bot(commands.Bot): # If there is no custom command prefix (!help, ?help, etc.), use '>!' but also accept @ mentions if 'command_prefix' not in kwargs.keys(): kwargs['command_prefix'] = '>!' - commands.Bot.__init__(self, command_prefix=commands.when_mentioned_or(kwargs['command_prefix']), - activity=discord.Game(name=f"@me"), status=discord.Status.idle) + commands.Bot.__init__(self, command_prefix=commands.when_mentioned_or(kwargs['command_prefix'])) + + # Set the initial activity of the bot + self.set_activity(connected=False) # Init the core bot variables self.DEVICE_ID = kwargs['Device_ID'] @@ -37,6 +39,7 @@ class Bot(commands.Bot): self.sample_rate = "200k" self.play_sample_rate = '32k' self.sample_rate_re = re.compile('(\d+\.?\d*k)') + self.sdr_filters = ["dc"] # Init SDR Variables self.sdr_process = None @@ -113,9 +116,10 @@ class Bot(commands.Bot): "is required\nExample command: '@ chfreq wbfm 104.7M\n" "Example command: '@ chfreq fm 154.785M", brief="Changes radio frequency") - async def chfreq(ctx, mode: str, freq: str, member: discord.Member = None): + async def chfreq(ctx, mode: str, freq: str, sdr_filter: str = None, member: discord.Member = None): # Possible band-types that can be used possible_modes = ['wbfm', 'fm'] + possible_filters = ['dc', 'deemp'] member = member or ctx.author.display_name # Check to make sure the frequency input matches the syntax needed @@ -124,6 +128,12 @@ class Bot(commands.Bot): # Check to make sure the selected mode is valid if mode in possible_modes: self.mode = mode + + if sdr_filter in possible_filters: + self.sdr_filters = [sdr_filter] + else: + self.sdr_filters = ['deemp'] + await ctx.send(f"Ok {str(member).capitalize()}, I'm changing the mode to {str(self.mode).upper()} and frequency to" f" {self.freq}") @@ -235,8 +245,8 @@ class Bot(commands.Bot): elif self.system_os_type == 'Windows': discord.opus.load_opus('./opus/libopus.dll') + # Check to make sure the selected device is still available and has not changed it's index def check_device(self): - # Check to make sure the selected device is still available and has not changed it's index for device, index in self.Devices_List: if int(index) == self.DEVICE_ID and str(device) == self.DEVICE_NAME: return True @@ -249,8 +259,8 @@ class Bot(commands.Bot): else: return False + # Search the ./modules folder for any modules to load def check_for_modules(self): - # Search the ./modules folder for any modules to load # A valid module must be built as a 'cog', refer to the docs for more information for folder_name in os.listdir("modules"): if str(folder_name)[0] == '.': @@ -259,8 +269,8 @@ class Bot(commands.Bot): print(f"Loaded extension: {folder_name}") self.load_extension(f"modules.{folder_name}.cog") + # Reload a selected module for changes def reload_modules(self, module): - # Reload a selected module for changes try: self.unload_extension(f"modules.{module}.cog") print(f"Unloaded {module}") @@ -271,15 +281,15 @@ class Bot(commands.Bot): print(e) return False + # Check and store the OS type of the system for later use def check_os_type(self): - # Check and store the OS type of the system for later use if os.name == 'nt': self.system_os_type = 'Windows' else: self.system_os_type = 'Linux' + # Check to see if there is only one frequency def start_sdr(self): - # Check to see if there is only one frequency if type(self.freq) == str: # Single freq sent # Stop the SDR if it is running @@ -289,8 +299,8 @@ class Bot(commands.Bot): print(f"Starting freq: {self.freq}") # Start the SDR receiver and pipe the output self.sdr_process = Popen(["rtl_fm", "-M", str(self.mode), "-f", str(self.freq), "-g", str(self.gain), - "-l", str(self.squelch), "-s", str(self.sample_rate)], - stdout=PIPE) + "-l", str(self.squelch), "-s", str(self.sample_rate), "-E", + str(self.sdr_filters[0]), "-A", "fast"], stdout=PIPE) # Use the piped output of the SDR receiver to generate audio self.sdr_output_process = Popen(["play", "-t", "raw", "-r", str(self.play_sample_rate), "-es", "-b", "16", "-c", "1", "-V1", "-"], @@ -298,8 +308,8 @@ class Bot(commands.Bot): # Set the started variable for later checks self.sdr_started = True + # Check to see if the SDR is running def stop_sdr(self): - # Check to see if the SDR is running if self.sdr_started: # Wait for the running processes to close while self.sdr_process.poll() is None and self.sdr_output_process.poll() is None: @@ -312,6 +322,7 @@ class Bot(commands.Bot): self.sdr_started = False + # Set the activity of the bot async def set_activity(self, connected=True): if connected: if self.profile_name is None: @@ -326,6 +337,7 @@ class Bot(commands.Bot): elif not connected: await self.change_presence(activity=discord.Game(name=f"@ me"), status=discord.Status.idle) + # Save the current radio settings as a profile async def save_radio_config(self, profile_name): config = configparser.SafeConfigParser() @@ -349,6 +361,7 @@ class Bot(commands.Bot): self.start_sdr() await self.set_activity() + # Load a saved profile into the current settings async def load_radio_config(self, profile_name): config = configparser.ConfigParser() if os.path.exists('./profiles.ini'):