FreeDATA/freedata_server/api/config.py

163 lines
5.4 KiB
Python

from fastapi import APIRouter, Depends
from freedata_server.api.common import api_abort
from freedata_server import api_validations as validations
from freedata_server.context import AppContext, get_ctx
router = APIRouter()
@router.get(
"/",
summary="Get Modem Configuration",
tags=["Configuration"],
responses={
200: {
"description": "Current modem configuration settings.",
"content": {
"application/json": {
"example": {
"AUDIO": {
"input_device": "2fc0",
"output_device": "3655",
"rx_audio_level": 0,
"tx_audio_level": 2,
},
"MESSAGES": {"enable_auto_repeat": True},
"MODEM": {
"enable_morse_identifier": False,
"enable_socket_interface": False,
"maximum_bandwidth": 2438,
"tx_delay": 200,
},
"NETWORK": {"modemaddress": "", "modemport": 5000},
"RADIO": {
"control": "rigctld",
"data_bits": 8,
"model_id": 1001,
"ptt_port": "ignore",
"ptt_type": "USB",
"serial_dcd": "NONE",
"serial_dtr": "OFF",
"serial_handshake": "ignore",
"serial_port": "/dev/cu.Bluetooth-Incoming-Port",
"serial_speed": 38400,
"stop_bits": 1,
},
"RIGCTLD": {
"arguments": "",
"command": "",
"ip": "127.0.0.1",
"path": "",
"port": 4532,
},
"SOCKET_INTERFACE": {
"cmd_port": 0,
"data_port": 0,
"enable": False,
"host": "",
},
"STATION": {
"enable_explorer": True,
"enable_stats": True,
"mycall": "LA3QMA",
"mygrid": "JP20ql",
"myssid": 0,
"ssid_list": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"respond_to_cq": True,
},
}
}
},
},
404: {
"description": "The requested resource was not found.",
"content": {"application/json": {"example": {"error": "Resource not found."}}},
},
},
)
async def get_config(ctx: AppContext = Depends(get_ctx)):
"""
Retrieve the current modem configuration.
Returns:
dict: The modem configuration settings.
"""
cfg = ctx.config_manager.config
if cfg is None:
api_abort("Configuration not found", 404)
return cfg
@router.post(
"/",
summary="Update Modem Configuration",
tags=["Configuration"],
responses={
200: {
"description": "Modem configuration updated successfully.",
"content": {
"application/json": {
"example": {
"AUDIO": {
"input_device": "2fc0",
"output_device": "3655",
"rx_audio_level": 0,
"tx_audio_level": 2,
},
# ...
}
}
},
},
400: {
"description": "Invalid configuration data.",
"content": {"application/json": {"example": {"error": "Invalid config"}}},
},
500: {
"description": "Error writing configuration.",
"content": {"application/json": {"example": {"error": "Error writing config"}}},
},
404: {
"description": "The requested resource was not found.",
"content": {"application/json": {"example": {"error": "Resource not found."}}},
},
},
)
async def post_config(
new_cfg: dict,
ctx: AppContext = Depends(get_ctx),
):
"""
Update the modem configuration with new settings.
Parameters:
new_cfg (dict): The new configuration payload.
ctx (AppContext): Injected application context.
Returns:
dict: The updated modem configuration.
Raises:
HTTPException via api_abort on validation or write errors.
"""
# Validate incoming data
if not validations.validate_remote_config(new_cfg):
api_abort("Invalid configuration", 400)
# Read and compare
old_cfg = ctx.config_manager.read()
if old_cfg == new_cfg:
return old_cfg
# Write new config
print(ctx.config_manager.write(new_cfg))
if not ctx.config_manager.write(new_cfg):
api_abort("Error writing configuration", 500)
# Trigger modem restart
ctx.modem_service.put("restart")
# Return updated configuration
updated = ctx.config_manager.read()
return updated