mirror of https://github.com/DJ2LS/FreeDATA.git
163 lines
5.4 KiB
Python
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
|