Files
maps-saas/packages/tactical_app/lib/controllers/artillery_controller.dart
T

91 lines
3.5 KiB
Dart

import 'package:get/get.dart';
import 'package:intaleq_maps/intaleq_maps.dart';
import '../models/military_operations_models.dart';
import '../services/artillery_ballistics_engine.dart';
/// ============================================================================
/// [ArtilleryController] - وحدة التحكم برماية المدفعية وقوس القذيفة
/// ============================================================================
/// English:
/// GetX Controller managing artillery firing mission parameters, ballistic
/// trajectory calculations, weapon profiles, and crest clearance checks.
///
/// العربية:
/// متحكم GetX لإدارة معايير رماية المدفعية الميدانية، حلول الرماية البالستية،
/// اختيار أنظمة السلاح، وفحص سلامة المسار من الاصطدام بقمم الجبال (Crest Clearance).
/// ============================================================================
class ArtilleryController extends GetxController {
// ── Observables / الحالات التفاعلية ──────────────────────────────────────
final Rx<LatLng?> gunPosition = Rx<LatLng?>(null);
final Rx<LatLng?> targetPosition = Rx<LatLng?>(null);
final Rx<ArtilleryWeaponSystem> selectedWeapon =
Rx<ArtilleryWeaponSystem>(ArtilleryWeaponSystem.standardSystems.first);
final RxBool highAngle = false.obs;
final RxBool isLoading = false.obs;
final Rx<ArtilleryFiringSolution?> firingSolution =
Rx<ArtilleryFiringSolution?>(null);
/// Set Battery Gun Position / تعيين موقع مربض المدفعية
void setGunPosition(LatLng pos) {
gunPosition.value = pos;
calculateFiringSolution();
}
/// Set Enemy Target Position / تعيين موقع الهدف المعادي
void setTargetPosition(LatLng pos) {
targetPosition.value = pos;
calculateFiringSolution();
}
/// Swap Gun and Target Positions / تبديل مربض المدفعية مع الهدف
void swapPositions() {
final temp = gunPosition.value;
gunPosition.value = targetPosition.value;
targetPosition.value = temp;
calculateFiringSolution();
}
/// Select Weapon Profile / اختيار نوع نظام المدفعية أو الهاون
void selectWeapon(ArtilleryWeaponSystem weapon) {
selectedWeapon.value = weapon;
calculateFiringSolution();
}
/// Toggle High-Angle Trajectory / التبديل بين قوس الرماية المنخفض والعالي
void toggleHighAngle(bool value) {
highAngle.value = value;
calculateFiringSolution();
}
/// Calculate Ballistic Firing Solution / احتساب الحل البالستي الشامل
Future<void> calculateFiringSolution() async {
if (gunPosition.value == null || targetPosition.value == null) {
firingSolution.value = null;
return;
}
try {
isLoading.value = true;
final sol = await ArtilleryBallisticsEngine.calculateFireMission(
weapon: selectedWeapon.value,
gunPos: gunPosition.value!,
targetPos: targetPosition.value!,
highAngle: highAngle.value,
);
firingSolution.value = sol;
} catch (e) {
firingSolution.value = null;
} finally {
isLoading.value = false;
}
}
/// Clear artillery state / إعادة ضبط رماية المدفعية
void reset() {
gunPosition.value = null;
targetPosition.value = null;
firingSolution.value = null;
highAngle.value = false;
}
}