30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
from app.core.geo import GeoPoint, sample_path
|
|
from app.core.propagation import manual_link_budget
|
|
from app.models.link import LinkBudgetRequest, LinkBudgetResponse
|
|
from app.services.vegetation import vegetation_loss_along
|
|
|
|
|
|
def link_budget(request: LinkBudgetRequest) -> LinkBudgetResponse:
|
|
if request.model != "manual":
|
|
raise NotImplementedError(f"{request.model} link model is implemented in a later stage")
|
|
|
|
tx = GeoPoint(lat=request.tx.lat, lon=request.tx.lon)
|
|
rx = GeoPoint(lat=request.rx.lat, lon=request.rx.lon)
|
|
points = sample_path(tx, rx, 256)
|
|
vegetation_db = vegetation_loss_along(
|
|
points,
|
|
freq_hz=request.frequency_mhz * 1_000_000,
|
|
include_vegetation=request.include_vegetation,
|
|
)
|
|
budget = manual_link_budget(
|
|
tx=tx,
|
|
rx=rx,
|
|
tx_power_dbm=request.tx.power_dbm,
|
|
tx_gain_dbi=request.tx.gain_dbi,
|
|
rx_gain_dbi=request.rx.gain_dbi,
|
|
sensitivity_dbm=request.rx.sensitivity_dbm,
|
|
frequency_mhz=request.frequency_mhz,
|
|
vegetation_db=vegetation_db,
|
|
)
|
|
return LinkBudgetResponse(**budget.__dict__)
|