[feat](trx-server): add latitude/longitude config and propagation

Add latitude and longitude Option<f64> fields to [general] config
section and propagate through ResolvedConfig, RigTaskConfig, and
build_initial_state into the RigState/RigSnapshot pipeline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
This commit is contained in:
2026-02-08 21:44:43 +01:00
parent df409a2cd3
commit 6e34323cb1
3 changed files with 30 additions and 2 deletions
+8
View File
@@ -41,6 +41,10 @@ pub struct GeneralConfig {
pub callsign: Option<String>, pub callsign: Option<String>,
/// Log level (trace, debug, info, warn, error) /// Log level (trace, debug, info, warn, error)
pub log_level: Option<String>, pub log_level: Option<String>,
/// Receiver latitude (decimal degrees, WGS84)
pub latitude: Option<f64>,
/// Receiver longitude (decimal degrees, WGS84)
pub longitude: Option<f64>,
} }
impl Default for GeneralConfig { impl Default for GeneralConfig {
@@ -48,6 +52,8 @@ impl Default for GeneralConfig {
Self { Self {
callsign: Some("N0CALL".to_string()), callsign: Some("N0CALL".to_string()),
log_level: None, log_level: None,
latitude: None,
longitude: None,
} }
} }
} }
@@ -244,6 +250,8 @@ impl ServerConfig {
general: GeneralConfig { general: GeneralConfig {
callsign: Some("N0CALL".to_string()), callsign: Some("N0CALL".to_string()),
log_level: Some("info".to_string()), log_level: Some("info".to_string()),
latitude: None,
longitude: None,
}, },
rig: RigConfig { rig: RigConfig {
model: Some("ft817".to_string()), model: Some("ft817".to_string()),
+14 -2
View File
@@ -108,6 +108,8 @@ struct ResolvedConfig {
rig: String, rig: String,
access: RigAccess, access: RigAccess,
callsign: Option<String>, callsign: Option<String>,
latitude: Option<f64>,
longitude: Option<f64>,
} }
fn resolve_config(cli: &Cli, cfg: &ServerConfig) -> DynResult<ResolvedConfig> { fn resolve_config(cli: &Cli, cfg: &ServerConfig) -> DynResult<ResolvedConfig> {
@@ -173,14 +175,20 @@ fn resolve_config(cli: &Cli, cfg: &ServerConfig) -> DynResult<ResolvedConfig> {
.clone() .clone()
.or_else(|| cfg.general.callsign.clone()); .or_else(|| cfg.general.callsign.clone());
let latitude = cfg.general.latitude;
let longitude = cfg.general.longitude;
Ok(ResolvedConfig { Ok(ResolvedConfig {
rig, rig,
access, access,
callsign, callsign,
latitude,
longitude,
}) })
} }
fn build_initial_state(cfg: &ServerConfig, callsign: &Option<String>) -> RigState { fn build_initial_state(cfg: &ServerConfig, resolved: &ResolvedConfig) -> RigState {
let callsign = &resolved.callsign;
RigState { RigState {
rig_info: None, rig_info: None,
status: RigStatus { status: RigStatus {
@@ -211,6 +219,8 @@ fn build_initial_state(cfg: &ServerConfig, callsign: &Option<String>) -> RigStat
}, },
server_callsign: callsign.clone(), server_callsign: callsign.clone(),
server_version: Some(env!("CARGO_PKG_VERSION").to_string()), server_version: Some(env!("CARGO_PKG_VERSION").to_string()),
server_latitude: resolved.latitude,
server_longitude: resolved.longitude,
} }
} }
@@ -234,6 +244,8 @@ fn build_rig_task_config(
initial_mode: cfg.rig.initial_mode.clone(), initial_mode: cfg.rig.initial_mode.clone(),
server_callsign: resolved.callsign.clone(), server_callsign: resolved.callsign.clone(),
server_version: Some(env!("CARGO_PKG_VERSION").to_string()), server_version: Some(env!("CARGO_PKG_VERSION").to_string()),
server_latitude: resolved.latitude,
server_longitude: resolved.longitude,
} }
} }
@@ -284,7 +296,7 @@ async fn main() -> DynResult<()> {
} }
let (tx, rx) = mpsc::channel::<RigRequest>(RIG_TASK_CHANNEL_BUFFER); let (tx, rx) = mpsc::channel::<RigRequest>(RIG_TASK_CHANNEL_BUFFER);
let initial_state = build_initial_state(&cfg, &resolved.callsign); let initial_state = build_initial_state(&cfg, &resolved);
let (state_tx, state_rx) = watch::channel(initial_state); let (state_tx, state_rx) = watch::channel(initial_state);
// Keep receivers alive so channels don't close prematurely // Keep receivers alive so channels don't close prematurely
let _state_rx = state_rx; let _state_rx = state_rx;
+8
View File
@@ -35,6 +35,8 @@ pub struct RigTaskConfig {
pub initial_mode: RigMode, pub initial_mode: RigMode,
pub server_callsign: Option<String>, pub server_callsign: Option<String>,
pub server_version: Option<String>, pub server_version: Option<String>,
pub server_latitude: Option<f64>,
pub server_longitude: Option<f64>,
} }
impl Default for RigTaskConfig { impl Default for RigTaskConfig {
@@ -51,6 +53,8 @@ impl Default for RigTaskConfig {
initial_mode: RigMode::USB, initial_mode: RigMode::USB,
server_callsign: None, server_callsign: None,
server_version: None, server_version: None,
server_latitude: None,
server_longitude: None,
} }
} }
} }
@@ -86,6 +90,8 @@ pub async fn run_rig_task(
let emitter = RigEventEmitter::new(); let emitter = RigEventEmitter::new();
let server_callsign = config.server_callsign.clone(); let server_callsign = config.server_callsign.clone();
let server_version = config.server_version.clone(); let server_version = config.server_version.clone();
let server_latitude = config.server_latitude;
let server_longitude = config.server_longitude;
let mut state = RigState { let mut state = RigState {
rig_info: None, rig_info: None,
status: RigStatus { status: RigStatus {
@@ -114,6 +120,8 @@ pub async fn run_rig_task(
}, },
server_callsign, server_callsign,
server_version, server_version,
server_latitude,
server_longitude,
}; };
// Polling configuration // Polling configuration