91 lines
3.5 KiB
Dart
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;
|
|
}
|
|
}
|