/*
    Author: Brazilian Armed Forces
    File: fn_flirControls.sqf

    Purpose:
      - Update azimuth and elevation indicators for the FLIR pod relative to the air vehicle body
      - Update the true-north compass indicator relative to the camera center
      - Update platform flight data shown in the optics overlay
*/

#define IGUI_GROUP 170
#define BRAF_ELEV_ARROW 1901
#define BRAF_ELEV_TXT 1902
#define BRAF_AZ_ARROW 1903
#define BRAF_AZ_TXT 1904
#define BRAF_NORTH_ARROW 1905

#define BRAF_HDG_VALUE 1907
#define BRAF_IAS_VALUE 1909
#define BRAF_GS_VALUE 1911
#define BRAF_RALT_VALUE 1913
#define BRAF_BARO_VALUE 1915
#define BRAF_ROLL_VALUE 1917
#define BRAF_PTCH_VALUE 1919

#define BRAF_MIN_TURN -180
#define BRAF_MAX_TURN 180
#define BRAF_MIN_ELEV -120
#define BRAF_MAX_ELEV 30
#define BRAF_AZ_BEG (0.04 * safeZoneW)
#define BRAF_AZ_DIS (0.5375 * safeZoneW)
#define BRAF_AZ_NUM_OFFSET (0.5 * safeZoneW)
#define BRAF_AZ_TXT_Y_OFFSET (-1 * 0.025 * safeZoneH)
#define BRAF_EZ_BEG (0.215 * safeZoneH)
#define BRAF_EZ_DIS (0.52 * safeZoneH)
#define BRAF_EZ_NUM_OFFSET (0 * safeZoneH)

disableSerialization;

params ["_display"];

if (isNull _display) exitWith {};
if (cameraView != "GUNNER") exitWith {};

private _veh = vehicle player;
if (isNull _veh) exitWith {};

if (isNull (_display displayCtrl BRAF_ELEV_ARROW)) exitWith {
    systemChat "[BRAF FLIR] ERROR: Elevation arrow control (IDC 1901) not found.";
};
if (isNull (_display displayCtrl BRAF_AZ_ARROW)) exitWith {
    systemChat "[BRAF FLIR] ERROR: Azimuth arrow control (IDC 1903) not found.";
};
if (isNull (_display displayCtrl BRAF_ELEV_TXT)) exitWith {
    systemChat "[BRAF FLIR] ERROR: Elevation text control (IDC 1902) not found.";
};
if (isNull (_display displayCtrl BRAF_AZ_TXT)) exitWith {
    systemChat "[BRAF FLIR] ERROR: Azimuth text control (IDC 1904) not found.";
};
if (isNull (_display displayCtrl BRAF_NORTH_ARROW)) exitWith {
    systemChat "[BRAF FLIR] ERROR: North compass control (IDC 1905) not found.";
};
if (isNull (_display displayCtrl BRAF_HDG_VALUE)) exitWith {
    systemChat "[BRAF FLIR] ERROR: HDG control (IDC 1907) not found.";
};
if (isNull (_display displayCtrl BRAF_IAS_VALUE)) exitWith {
    systemChat "[BRAF FLIR] ERROR: IAS control (IDC 1909) not found.";
};
if (isNull (_display displayCtrl BRAF_GS_VALUE)) exitWith {
    systemChat "[BRAF FLIR] ERROR: GS control (IDC 1911) not found.";
};
if (isNull (_display displayCtrl BRAF_RALT_VALUE)) exitWith {
    systemChat "[BRAF FLIR] ERROR: RALT control (IDC 1913) not found.";
};
if (isNull (_display displayCtrl BRAF_BARO_VALUE)) exitWith {
    systemChat "[BRAF FLIR] ERROR: BARO control (IDC 1915) not found.";
};
if (isNull (_display displayCtrl BRAF_ROLL_VALUE)) exitWith {
    systemChat "[BRAF FLIR] ERROR: ROLL control (IDC 1917) not found.";
};
if (isNull (_display displayCtrl BRAF_PTCH_VALUE)) exitWith {
    systemChat "[BRAF FLIR] ERROR: PTCH control (IDC 1919) not found.";
};

private _p0 = positionCameraToWorld [0, 0, 0];
private _p1 = positionCameraToWorld [0, 0, 1];
private _vW = _p1 vectorDiff _p0;

private _lenW = vectorMagnitude _vW;
if (_lenW < 0.0001) exitWith {};
_vW = _vW vectorMultiply (1 / _lenW);

private _absDir_rad = (_vW select 0) atan2 (_vW select 1);
if (_absDir_rad < 0) then {
    _absDir_rad = _absDir_rad + (2 * pi);
};

private _vM = _veh vectorWorldToModel _vW;
private _lenM = vectorMagnitude _vM;
if (_lenM < 0.0001) exitWith {};
_vM = _vM vectorMultiply (1 / _lenM);

private _x = _vM select 0;
private _y = _vM select 1;
private _z = _vM select 2;

private _azimuth = (_x atan2 _y);
if (_azimuth > 180) then {
    _azimuth = _azimuth - 360;
};
if (_azimuth < -180) then {
    _azimuth = _azimuth + 360;
};

private _h = sqrt (_x * _x + _y * _y);
private _signY = if (_y < 0) then { -1 } else { 1 };
private _yPrime = _h * _signY;
private _elevation = (_z atan2 _yPrime);

_azimuth = _azimuth max BRAF_MIN_TURN min BRAF_MAX_TURN;
_elevation = _elevation max BRAF_MIN_ELEV min BRAF_MAX_ELEV;

private _turretAZcarrotCtrlPos = ctrlPosition (_display displayCtrl BRAF_AZ_ARROW);
private _turretAZtextCtrlPos = ctrlPosition (_display displayCtrl BRAF_AZ_TXT);
private _azPosX = BRAF_AZ_BEG + (((_azimuth + 180) / 360) * BRAF_AZ_DIS);

(_display displayCtrl BRAF_AZ_ARROW) ctrlSetPosition [
    _azPosX,
    _turretAZcarrotCtrlPos select 1,
    _turretAZcarrotCtrlPos select 2,
    _turretAZcarrotCtrlPos select 3
];
(_display displayCtrl BRAF_AZ_ARROW) ctrlCommit 0;

(_display displayCtrl BRAF_AZ_TXT) ctrlSetText str (round _azimuth);

private _azArrowW = _turretAZcarrotCtrlPos select 2;
private _azTextW = _turretAZtextCtrlPos select 2;

(_display displayCtrl BRAF_AZ_TXT) ctrlSetPosition [
    _azPosX + ((_azArrowW - _azTextW) / 2),
    (_turretAZcarrotCtrlPos select 1) + BRAF_AZ_TXT_Y_OFFSET,
    _azTextW,
    _turretAZtextCtrlPos select 3
];
(_display displayCtrl BRAF_AZ_TXT) ctrlCommit 0;

private _turretEZcarrotCtrlPos = ctrlPosition (_display displayCtrl BRAF_ELEV_ARROW);
private _turretEZtextCtrlPos = ctrlPosition (_display displayCtrl BRAF_ELEV_TXT);
private _tEl = (BRAF_MAX_ELEV - _elevation) / (BRAF_MAX_ELEV - BRAF_MIN_ELEV);

if (_tEl < 0) then {
    _tEl = 0;
};
if (_tEl > 1) then {
    _tEl = 1;
};

private _elevPos = BRAF_EZ_BEG + (_tEl * BRAF_EZ_DIS);

(_display displayCtrl BRAF_ELEV_ARROW) ctrlSetPosition [
    _turretEZcarrotCtrlPos select 0,
    _elevPos,
    _turretEZcarrotCtrlPos select 2,
    _turretEZcarrotCtrlPos select 3
];
(_display displayCtrl BRAF_ELEV_ARROW) ctrlCommit 0;

(_display displayCtrl BRAF_ELEV_TXT) ctrlSetText str (round _elevation);
(_display displayCtrl BRAF_ELEV_TXT) ctrlSetPosition [
    _turretEZtextCtrlPos select 0,
    _elevPos + BRAF_EZ_NUM_OFFSET,
    _turretEZtextCtrlPos select 2,
    _turretEZtextCtrlPos select 3
];
(_display displayCtrl BRAF_ELEV_TXT) ctrlCommit 0;

private _hdg = round (getDir _veh);
private _ias = round (speed _veh);
private _gs = round ((vectorMagnitude (velocity _veh)) * 3.6);
private _ralt = round ((getPosATL _veh) select 2);
private _baro = round ((getPosASL _veh) select 2);
private _pitchBank = _veh call BIS_fnc_getPitchBank;
private _ptch = round (_pitchBank select 0);
private _roll = round (_pitchBank select 1);

private _ctrlHDG = _display displayCtrl BRAF_HDG_VALUE;
private _ctrlIAS = _display displayCtrl BRAF_IAS_VALUE;
private _ctrlGS = _display displayCtrl BRAF_GS_VALUE;
private _ctrlRALT = _display displayCtrl BRAF_RALT_VALUE;
private _ctrlBARO = _display displayCtrl BRAF_BARO_VALUE;
private _ctrlROLL = _display displayCtrl BRAF_ROLL_VALUE;
private _ctrlPTCH = _display displayCtrl BRAF_PTCH_VALUE;

if (!isNull _ctrlHDG) then {
    _ctrlHDG ctrlSetText format ["%1", _hdg];
};
if (!isNull _ctrlIAS) then {
    _ctrlIAS ctrlSetText format ["%1", _ias];
};
if (!isNull _ctrlGS) then {
    _ctrlGS ctrlSetText format ["%1", _gs];
};
if (!isNull _ctrlRALT) then {
    _ctrlRALT ctrlSetText format ["%1", _ralt];
};
if (!isNull _ctrlBARO) then {
    _ctrlBARO ctrlSetText format ["%1", _baro];
};
if (!isNull _ctrlROLL) then {
    _ctrlROLL ctrlSetText format ["%1", _roll];
};
if (!isNull _ctrlPTCH) then {
    _ctrlPTCH ctrlSetText format ["%1", _ptch];
};

(_display displayCtrl BRAF_NORTH_ARROW) ctrlSetAngle [-_absDir_rad, 0.5, 0.5];
