|
1 | 1 | // AzimuthConsole/Commands/CommandRegistration.cs |
| 2 | +using AZMLib; |
2 | 3 | using System.Globalization; |
3 | 4 |
|
4 | 5 | namespace AzimuthConsole.Commands |
@@ -277,21 +278,42 @@ private static void RegisterPositionCommands(CommandRouter router, ApplicationRu |
277 | 278 | Id = "LHOV", |
278 | 279 | Category = "Position", |
279 | 280 | Sources = "T,R,W", |
280 | | - Parameters = "lat=N,lon=N,hdg=N", |
| 281 | + Parameters = "hdg=N,[lat=N],[lon=N]", |
281 | 282 | Response = "LHOV,OK", |
282 | | - Description = "Override location and heading (empty params = disable override)" |
| 283 | + Description = "Override heading and optionally location (empty params = disable override)" |
283 | 284 | }, async (args, ctx) => |
284 | 285 | { |
285 | | - if (args.Count == 0 || (!args.ContainsKey("lat") && !args.ContainsKey("lon") && !args.ContainsKey("hdg"))) |
| 286 | + if (args.Count == 0 || !args.ContainsKey("hdg")) |
286 | 287 | { |
287 | 288 | runtime.DisableLocationOverride(); |
288 | 289 | return CommandResult.Ok(); |
289 | 290 | } |
290 | | - var lat = double.Parse(args.GetValueOrDefault("lat", "NaN"), CultureInfo.InvariantCulture); |
291 | | - var lon = double.Parse(args.GetValueOrDefault("lon", "NaN"), CultureInfo.InvariantCulture); |
292 | | - var hdg = double.Parse(args.GetValueOrDefault("hdg", "NaN"), CultureInfo.InvariantCulture); |
293 | | - if (double.IsNaN(lat) || double.IsNaN(lon) || double.IsNaN(hdg)) |
294 | | - return CommandResult.Error("lat, lon, hdg required"); |
| 291 | + |
| 292 | + var hdg = double.Parse(args["hdg"], CultureInfo.InvariantCulture); |
| 293 | + if (!AZM.IsHdnDeg(hdg)) |
| 294 | + return CommandResult.Error("hdg: invalid heading"); |
| 295 | + |
| 296 | + double lat = double.NaN; |
| 297 | + double lon = double.NaN; |
| 298 | + |
| 299 | + if (args.ContainsKey("lat")) |
| 300 | + { |
| 301 | + lat = double.Parse(args["lat"], CultureInfo.InvariantCulture); |
| 302 | + if (!AZM.IsLatDeg(lat)) |
| 303 | + return CommandResult.Error("lat: invalid latitude"); |
| 304 | + } |
| 305 | + |
| 306 | + if (args.ContainsKey("lon")) |
| 307 | + { |
| 308 | + lon = double.Parse(args["lon"], CultureInfo.InvariantCulture); |
| 309 | + if (!AZM.IsLonDeg(lon)) |
| 310 | + return CommandResult.Error("lon: invalid longitude"); |
| 311 | + } |
| 312 | + |
| 313 | + // Если задан только один из lat/lon — ошибка |
| 314 | + if (!double.IsNaN(lat) != !double.IsNaN(lon)) |
| 315 | + return CommandResult.Error("lat and lon must be specified together"); |
| 316 | + |
295 | 317 | runtime.OverrideLocation(lat, lon, hdg); |
296 | 318 | return CommandResult.Ok(); |
297 | 319 | }); |
|
0 commit comments