px4sim 0.1.6

A wrapper to simplify creating a custom PX4 SITL simulator.
Documentation
use crate::data::DroneData;
use crate::util::time_since_epoch;
use mavlink::{
    common::{
        HilSensorUpdatedFlags, MavAutopilot, MavMessage, MavModeFlag, MavState, MavType,
        HEARTBEAT_DATA, HIL_GPS_DATA, HIL_SENSOR_DATA, HIL_STATE_QUATERNION_DATA, SYSTEM_TIME_DATA,
    },
    MavHeader,
};

pub fn make_header(id: u8) -> MavHeader {
    MavHeader {
        system_id: id,
        component_id: 1,
        sequence: 1,
    }
}

pub fn make_heartbeat() -> MavMessage {
    MavMessage::HEARTBEAT(HEARTBEAT_DATA {
        custom_mode: 0,
        mavtype: MavType::MAV_TYPE_QUADROTOR,
        autopilot: MavAutopilot::MAV_AUTOPILOT_PX4,
        base_mode: MavModeFlag::empty(),
        system_status: MavState::MAV_STATE_STANDBY,
        mavlink_version: 3,
    })
}

pub fn make_system_time(boot_time: u32) -> MavMessage {
    MavMessage::SYSTEM_TIME(SYSTEM_TIME_DATA {
        time_unix_usec: time_since_epoch(),
        time_boot_ms: boot_time,
    })
}

pub fn make_hil_gps(data: &DroneData) -> MavMessage {
    let (lat, lon) = data.coordinates;
    let (vn, ve, vd) = data.gps_velocity;
    let (eph, epv) = data.position_error;
    MavMessage::HIL_GPS(HIL_GPS_DATA {
        lat,
        lon,
        vn,
        ve,
        vd,
        eph,
        epv,
        alt: data.altitude,
        cog: data.course_over_ground,
        vel: data.ground_velocity,
        fix_type: 3,
        time_usec: time_since_epoch(),
        satellites_visible: 10,
    })
}

pub fn make_hil_state_quaternion(data: &DroneData) -> MavMessage {
    let (lat, lon) = data.coordinates;
    let (rollspeed, pitchspeed, yawspeed) = data.angular_velocity;
    let (vx, vy, vz) = data.linear_velocity;
    let (xacc, yacc, zacc) = data.linear_acceleration;
    MavMessage::HIL_STATE_QUATERNION(HIL_STATE_QUATERNION_DATA {
        lat,
        lon,
        rollspeed,
        pitchspeed,
        yawspeed,
        vx,
        vy,
        vz,
        xacc,
        yacc,
        zacc,
        alt: data.altitude,
        attitude_quaternion: data.attitude_quaternion,
        ind_airspeed: data.indicated_airspeed,
        true_airspeed: data.true_airspeed,
        time_usec: time_since_epoch(),
    })
}

pub fn make_hil_sensor(data: &DroneData) -> MavMessage {
    let (xacc, yacc, zacc) = data.measured_acceleration;
    let (xgyro, ygyro, zgyro) = data.measured_angular_velocity;
    let (xmag, ymag, zmag) = data.measured_magnetic_field;
    MavMessage::HIL_SENSOR(HIL_SENSOR_DATA {
        xacc,
        yacc,
        zacc,
        xgyro,
        ygyro,
        zgyro,
        xmag,
        ymag,
        zmag,
        abs_pressure: data.absolute_pressure,
        diff_pressure: data.differential_pressure,
        pressure_alt: data.altitude_from_pressure,
        temperature: data.measured_temperature,
        fields_updated: HilSensorUpdatedFlags::all(),
        time_usec: time_since_epoch(),
    })
}