using Plane.Geography;
using System;

namespace Plane.Copters
{
    /// <summary>
    /// 定义用于获取飞行器状态的属性。
    /// </summary>
    public partial interface ICopterStatus : IVisibleStatus
    {
        /// <summary>
        /// 获取当前空速，单位为 m/s。
        /// </summary>
        float AirSpeed { get; }

        /// <summary>
        /// 获取剩余电量百分比，其范围为 [0, 100]。
        /// </summary>
        byte BatteryPer { get; }

        /// <summary>
        /// 获取通道 1 的值。该值在飞控中用于改变飞行器横滚姿态，从而控制其左右方向的移动。有效范围为 [1100, 1900]。小于 1500 时使飞行器向左倾斜，大于 1500 时使飞行器向右倾斜。
        /// </summary>
        ushort Channel1 { get; }

        /// <summary>
        /// 获取通道 2 的值。该值在飞控中用于改变飞行器俯仰姿态，从而控制其前后方向的移动。有效范围为 [1100, 1900]。小于 1500 时使飞行器向前倾斜，大于 1500 时使飞行器向后倾斜。
        /// </summary>
        ushort Channel2 { get; }

        /// <summary>
        /// 获取通道 3 的值。该值在飞控中用于改变飞行器油门，从而控制其上下方向的移动。有效范围为 [1100, 1900]。在能够定高的模式（如 ALT_HOLD、LOITER）下，小于 1500 时使飞行器下降，大于 1500 时使飞行器上升。
        /// </summary>
        ushort Channel3 { get; }

        /// <summary>
        /// 获取通道 4 的值。该值在飞控中用于使飞行器改变机头方向。有效范围为 [1100, 1900]。小于 1500 时使飞行器逆时针旋转，大于 1500 时使飞行器顺时针旋转。
        /// </summary>
        ushort Channel4 { get; }

        /// <summary>
        /// 获取通道 5 的值。其作用未定义。
        /// </summary>
        ushort Channel5 { get; }

        /// <summary>
        /// 获取通道 6 的值。该值在飞控中用于控制相机正对的方向。有效范围为 [1100, 1900]。小于 1500 时使相机逆时针旋转，大于 1500 时使相机顺时针旋转。
        /// </summary>
        ushort Channel6 { get; }

        /// <summary>
        /// 获取通道 7 的值。该值在飞控中用于控制相机俯仰姿态。有效范围为 [1100, 1900]。小于 1500 时使相机向后旋转，大于 1500 时使相机向前旋转。
        /// </summary>
        ushort Channel7 { get; }

        /// <summary>
        /// 获取通道 8 的值。其作用未定义。
        /// </summary>
        ushort Channel8 { get; }

        /// <summary>
        /// 获取海拔。
        /// </summary>
        float Elevation { get; }

        /// <summary>
        /// 获取固件版本。
        /// </summary>
        int? FirmwareVersion { get; }

        /// <summary>
        /// 获取固件版本的文本形式。
        /// </summary>
        string FirmwareVersionText { get; }

        /// <summary>
        /// 获取在三维空间中的飞行距离。
        /// </summary>
        double FlightDistance { get; }

        /// <summary>
        /// 获取在水平面上的飞行距离。
        /// </summary>
        double FlightDistance2D { get; }

        /// <summary>
        /// 获取飞行时间。
        /// </summary>
        TimeSpan FlightTimeSpan { get; }

        /// <summary>
        /// 获取 GPS 锁定状态。
        /// </summary>
        GpsFixType GpsFixType { get; }

        /// <summary>
        /// 获取 GPS HDOP（horizontal dilution of position），单位为米。
        /// </summary>
        float GpsHdop { get; }

        /// <summary>
        /// 获取当前地速，单位为 m/s。
        /// </summary>
        float GroundSpeed { get; }

        /// <summary>
        /// 获取一个值，指示是否切过 GPS 模式。
        /// </summary>
        bool HasSwitchedToGpsMode { get; }

        /// <summary>
        /// 获取收到心跳的总数。
        /// </summary>
        ulong HeartbeatCount { get; }

        /// <summary>
        /// 获取飞行器的标识。
        /// </summary>
        string Id { get; }

        /// <summary>
        /// 获取一个值，指示是否确定飞行器与地面站正常连接。在实现中，一般根据对心跳包的接收情况判断。
        /// </summary>
        bool IsAbsolutelyConnected { get; }

        /// <summary>
        /// 获取一个值，指示是否正在检查飞行器与地面站的连接以确定通信正常。在实现中，一般在建立连接后设为 true，在收到飞行器发回的数据后设为 false。
        /// </summary>
        bool IsCheckingConnection { get; set; }

        /// <summary>
        /// 获取一个值，指示飞行器与地面站之间的连接是否正常。
        /// </summary>
        bool IsConnected { get; }

        /// <summary>
        /// 获取一个值，指示当前的 GPS 定位是否足够精确。
        /// </summary>
        bool IsGpsAccurate { get; }

        /// <summary>
        /// 获取一个值，指示飞行器是否已解锁。
        /// </summary>
        bool IsUnlocked { get; }

        /// <summary>
        /// 获取任务总数。
        /// </summary>
        ushort? MissionCount { get; }

        /// <summary>
        /// 获取飞行器的 GPS 卫星数。
        /// </summary>
        byte SatCount { get; }

        /// <summary>
        /// 获取当前所处状态。
        /// </summary>
        CopterState State { get; }

        /// <summary>
        /// 获取飞控发回的消息，如起飞失败原因。
        /// </summary>
        string StatusText { get; }

        /// <summary>
        /// 获取起飞点。
        /// </summary>
        ILocation TakeOffPoint { get; }

        /// <summary>
        /// 获取当前电池电压，单位为伏特。
        /// </summary>
        float Voltage { get; }
    }
}
