Added /configure endpoint, moved to class structure for Radio

This commit is contained in:
Jono Targett 2023-05-11 12:46:28 +09:30
parent b3dece82f2
commit 9206cb6f08
2 changed files with 74 additions and 18 deletions

View File

@ -1,6 +1,7 @@
#! /usr/bin/env python3
import SoapySDR as soapy
from radio import Radio
from flask import Flask, request, jsonify
from flasgger import Swagger
@ -8,7 +9,7 @@ from flasgger import Swagger
app = Flask(__name__)
swag = Swagger(app)
sdrs = {}
radios = {}
@app.route('/radio/report')
def report():
@ -40,19 +41,19 @@ def connect(radio):
500:
description: Failed to connect to radio.
"""
if radio in sdrs:
if radio in radios:
return "Radio device already connected", 400
devices = [dict(device) for device in soapy.Device.enumerate()]
for device in devices:
if radio in device.values():
sdrs[radio] = {'device': soapy.Device(device)}
if sdrs[radio]['device'] is None:
sdrs.pop(radio)
return "Failed to open device", 500
else:
try:
radios[radio] = Radio(device)
return "", 200
except Exception as e:
radios.pop(radio)
return str(e), 500
return "Radio device not found", 400
@ -74,20 +75,42 @@ def disconnect(radio):
500:
description: An unknown error occurred.
"""
if radio in sdrs:
if 'stream' in sdrs[radio] and sdrs[radio]['stream'] is not None:
return "Radio is currently streaming, cannot disconnect", 400
else:
sdrs.pop(radio)
if radio in radios:
radios.pop(radio)
return "", 200
else:
return "Radio not connected", 400
'''
@app.route('/radio/<radio>/configure/<frequency>')
def configure(radio):
pass
@app.route('/radio/<radio>/configure/<frequency>')
def configure(radio, frequency):
"""Tune the radio to a frequency.
You must connect to the radio before attempting to configure it.
The radio must be configured before streaming can be started.
---
parameters:
- name: radio
description: Radio device driver name, or serial number.
in: path
type: string
required: true
- name: frequency
description: Frequency (in Hz) to tune the radio to.
in: path
type: string
required: true
responses:
200:
description: JSON
400:
description: The specified radio is not connected.
"""
if radio in radios:
return jsonify(radios[radio].configure(frequency))
else:
return "Radio not connected", 400
'''
@app.route('/radio/<radio>/start')
def start_stream(radio):
pass

33
radio.py Normal file
View File

@ -0,0 +1,33 @@
import SoapySDR as soapy
import prefixed
class Radio:
def __init__(self, device_info):
self.device_info = device_info
self.stream = None
self.buffer = None
self.device = soapy.Device(device_info)
if self.device is None:
raise RuntimeError("Failed to connect to radio device")
def configure(self, frequency):
frequency = int(prefixed.Float(frequency))
sample_rate = 384000
bandwidth = 200000
self.device.setFrequency(soapy.SOAPY_SDR_RX, 0, frequency)
self.device.setSampleRate(soapy.SOAPY_SDR_RX, 0, sample_rate)
self.device.setBandwidth(soapy.SOAPY_SDR_RX, 0, bandwidth)
# Set automatic gain
self.device.setGainMode(soapy.SOAPY_SDR_RX, 0, True)
return {
'frequency': self.device.getFrequency(soapy.SOAPY_SDR_RX, 0),
'sample-rate': self.device.getSampleRate(soapy.SOAPY_SDR_RX, 0),
'bandwidth': self.device.getBandwidth(soapy.SOAPY_SDR_RX, 0),
'gain-mode': 'auto' if self.device.getGainMode(soapy.SOAPY_SDR_RX, 0) else 'manual',
}