Skip to content
Snippets Groups Projects
UAS.cc 124 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
    * @param abs_pressure Absolute Pressure (hPa)
    * @param diff_pressure Differential Pressure  (hPa)
    */
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
    Lorenz Meier's avatar
    Lorenz Meier committed
    void UAS::sendHilSensors(quint64 time_us, float xacc, float yacc, float zacc, float rollspeed, float pitchspeed, float yawspeed,
    
                                        float xmag, float ymag, float zmag, float abs_pressure, float diff_pressure, float pressure_alt, float temperature, quint32 fields_changed)
    
    Lorenz Meier's avatar
    Lorenz Meier committed
    {
    
        if (this->base_mode & MAV_MODE_FLAG_HIL_ENABLED)
    
    Lorenz Meier's avatar
    Lorenz Meier committed
        {
    
            float xacc_corrupt = addZeroMeanNoise(xacc, xacc_var);
            float yacc_corrupt = addZeroMeanNoise(yacc, yacc_var);
            float zacc_corrupt = addZeroMeanNoise(zacc, zacc_var);
            float rollspeed_corrupt = addZeroMeanNoise(rollspeed,rollspeed_var);
            float pitchspeed_corrupt = addZeroMeanNoise(pitchspeed,pitchspeed_var);
            float yawspeed_corrupt = addZeroMeanNoise(yawspeed,yawspeed_var);
            float xmag_corrupt = addZeroMeanNoise(xmag, xmag_var);
            float ymag_corrupt = addZeroMeanNoise(ymag, ymag_var);
            float zmag_corrupt = addZeroMeanNoise(zmag, zmag_var);
            float abs_pressure_corrupt = addZeroMeanNoise(abs_pressure,abs_pressure_var);
            float diff_pressure_corrupt = addZeroMeanNoise(diff_pressure, diff_pressure_var);
            float pressure_alt_corrupt = addZeroMeanNoise(pressure_alt, pressure_alt_var);
            float temperature_corrupt = addZeroMeanNoise(temperature,temperature_var);
    
    Lorenz Meier's avatar
    Lorenz Meier committed
            mavlink_message_t msg;
    
            mavlink_msg_hil_sensor_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg,
    
                                       time_us, xacc_corrupt, yacc_corrupt, zacc_corrupt, rollspeed_corrupt, pitchspeed_corrupt,
                                        yawspeed_corrupt, xmag_corrupt, ymag_corrupt, zmag_corrupt, abs_pressure_corrupt, 
                                        diff_pressure_corrupt, pressure_alt_corrupt, temperature_corrupt, fields_changed);
    
            _vehicle->sendMessage(msg);
    
            lastSendTimeSensors = QGC::groundTimeMilliseconds();
    
    Lorenz Meier's avatar
    Lorenz Meier committed
        }
        else
        {
            // Attempt to set HIL mode
    
            setMode(base_mode | MAV_MODE_FLAG_HIL_ENABLED, custom_mode);
    
    Lorenz Meier's avatar
    Lorenz Meier committed
            qDebug() << __FILE__ << __LINE__ << "HIL is onboard not enabled, trying to enable.";
        }
    }
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
    void UAS::sendHilOpticalFlow(quint64 time_us, qint16 flow_x, qint16 flow_y, float flow_comp_m_x,
                        float flow_comp_m_y, quint8 quality, float ground_distance)
    {
    
    Don Gagne's avatar
    Don Gagne committed
        // FIXME: This needs to be updated for new mavlink_msg_hil_optical_flow_pack api
    
    Don Gagne's avatar
    Don Gagne committed
        Q_UNUSED(time_us);
        Q_UNUSED(flow_x);
        Q_UNUSED(flow_y);
        Q_UNUSED(flow_comp_m_x);
        Q_UNUSED(flow_comp_m_y);
        Q_UNUSED(quality);
        Q_UNUSED(ground_distance);
    
        if (this->base_mode & MAV_MODE_FLAG_HIL_ENABLED)
        {
    
    Don Gagne's avatar
    Don Gagne committed
    #if 0
    
            mavlink_message_t msg;
            mavlink_msg_hil_optical_flow_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg,
    
    Don Gagne's avatar
    Don Gagne committed
                                       time_us, 0, 0 /* hack */, flow_x, flow_y, 0.0f /* hack */, 0.0f /* hack */, 0.0f /* hack */, 0 /* hack */, quality, ground_distance);
    
            _vehicle->sendMessage(msg);
    
            lastSendTimeOpticalFlow = QGC::groundTimeMilliseconds();
    
    Don Gagne's avatar
    Don Gagne committed
    #endif
    
        }
        else
        {
            // Attempt to set HIL mode
            setMode(base_mode | MAV_MODE_FLAG_HIL_ENABLED, custom_mode);
            qDebug() << __FILE__ << __LINE__ << "HIL is onboard not enabled, trying to enable.";
        }
    
    }
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
    void UAS::sendHilGps(quint64 time_us, double lat, double lon, double alt, int fix_type, float eph, float epv, float vel, float vn, float ve, float vd, float cog, int satellites)
    
    Lorenz Meier's avatar
    Lorenz Meier committed
    {
    
        // Only send at 10 Hz max rate
        if (QGC::groundTimeMilliseconds() - lastSendTimeGPS < 100)
            return;
    
    
        if (this->base_mode & MAV_MODE_FLAG_HIL_ENABLED)
    
    Lorenz Meier's avatar
    Lorenz Meier committed
        {
    
    Lorenz Meier's avatar
    Lorenz Meier committed
            float course = cog;
            // map to 0..2pi
            if (course < 0)
    
    Don Gagne's avatar
    Don Gagne committed
                course += 2.0f * static_cast<float>(M_PI);
    
    Lorenz Meier's avatar
    Lorenz Meier committed
            // scale from radians to degrees
            course = (course / M_PI) * 180.0f;
    
    
    Lorenz Meier's avatar
    Lorenz Meier committed
            mavlink_message_t msg;
    
            mavlink_msg_hil_gps_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg,
                                       time_us, fix_type, lat*1e7, lon*1e7, alt*1e3, eph*1e2, epv*1e2, vel*1e2, vn*1e2, ve*1e2, vd*1e2, course*1e2, satellites);
    
            lastSendTimeGPS = QGC::groundTimeMilliseconds();
    
            _vehicle->sendMessage(msg);
    
    Lorenz Meier's avatar
    Lorenz Meier committed
        }
        else
        {
            // Attempt to set HIL mode
    
            setMode(base_mode | MAV_MODE_FLAG_HIL_ENABLED, custom_mode);
    
    Lorenz Meier's avatar
    Lorenz Meier committed
            qDebug() << __FILE__ << __LINE__ << "HIL is onboard not enabled, trying to enable.";
        }
    }
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    /**
    * Connect flight gear link.
    **/
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
    void UAS::startHil()
    {
        if (hilEnabled) return;
        hilEnabled = true;
    
        sensorHil = false;
    
        setMode(base_mode | MAV_MODE_FLAG_HIL_ENABLED, custom_mode);
    
        qDebug() << __FILE__ << __LINE__ << "HIL is onboard not enabled, trying to enable.";
    
        // Connect HIL simulation link
        simulation->connectSimulation();
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    dogmaphobic's avatar
    dogmaphobic committed
    #ifndef __mobile__
    
        if (simulation && simulation->isConnected()) {
    
            setMode(base_mode & ~MAV_MODE_FLAG_HIL_ENABLED, custom_mode);
            qDebug() << __FILE__ << __LINE__ << "HIL is onboard not enabled, trying to disable.";
        }
    
        sensorHil = false;
    
    dogmaphobic's avatar
    dogmaphobic committed
    #endif
    
    Don Gagne's avatar
    Don Gagne committed
        QMessageBox::StandardButton button = QGCMessageBox::question(tr("Shutting down the UAS"),
                                                                     tr("Do you want to shut down the onboard computer?"),
                                                                     QMessageBox::Yes | QMessageBox::Cancel,
                                                                     QMessageBox::Cancel);
        if (button == QMessageBox::Yes)
    
        {
            // If the active UAS is set, execute command
            mavlink_message_t msg;
            mavlink_msg_command_long_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, uasId, MAV_COMP_ID_ALL, MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN, 1, 0, 2, 0, 0, 0, 0, 0);
    
            _vehicle->sendMessage(msg);
    
        }
    }
    
    /**
    * @param x position
    * @param y position
    * @param z position
    * @param yaw
    */
    void UAS::setTargetPosition(float x, float y, float z, float yaw)
    {
        mavlink_message_t msg;
        mavlink_msg_command_long_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, uasId, MAV_COMP_ID_ALL, MAV_CMD_NAV_PATHPLANNING, 1, 1, 1, 0, yaw, x, y, z);
    
        _vehicle->sendMessage(msg);
    
    }
    
    /**
     * @return The name of this system as string in human-readable form
     */
    QString UAS::getUASName(void) const
    {
        QString result;
        if (name == "")
        {
            result = tr("MAV ") + result.sprintf("%03d", getUASID());
        }
        else
        {
            result = name;
        }
        return result;
    }
    
    /**
    * @return the state of the uas as a short text.
    */
    const QString& UAS::getShortState() const
    {
        return shortStateText;
    }
    
    const QString& UAS::getShortMode() const
    {
        return shortModeText;
    }
    
    /**
    * @rerturn the map of the components
    */
    QMap<int, QString> UAS::getComponents()
    {
        return components;
    }
    
    /**
    * Set the battery specificaitons: empty voltage, warning voltage, and full voltage.
    * @param specifications of the battery
    */
    void UAS::setBatterySpecs(const QString& specs)
    {
    
        batteryRemainingEstimateEnabled = false;
        bool ok;
        QString percent = specs;
        percent = percent.remove("%");
        float temp = percent.toFloat(&ok);
        if (ok)
    
            warnLevelPercent = temp;
    
            emit textMessageReceived(0, 0, MAV_SEVERITY_WARNING, "Could not set battery options, format is wrong");
    
        }
    }
    
    /**
    * @return the battery specifications(empty voltage, warning voltage, full voltage)
    */
    QString UAS::getBatterySpecs()
    {
    
        return QString("%1%").arg(warnLevelPercent);
    
    }
    
    /**
    * @return the time remaining.
    */
    int UAS::calculateTimeRemaining()
    {
    
        // XXX needs fixing
        return 0;
    
    }
    
    /**
     * @return charge level in percent - 0 - 100
     */
    float UAS::getChargeLevel()
    {
        return chargeLevel;
    }
    
    void UAS::startLowBattAlarm()
    {
        if (!lowBattAlarm)
        {
    
            GAudioOutput::instance()->alert(tr("System %1 has low battery").arg(getUASID()));
    
            lowBattAlarm = true;
        }
    }
    
    void UAS::stopLowBattAlarm()
    {
        if (lowBattAlarm)
        {
            lowBattAlarm = false;
        }
    }
    
    void UAS::sendMapRCToParam(QString param_id, float scale, float value0, quint8 param_rc_channel_index, float valueMin, float valueMax)
    
    {
        mavlink_message_t message;
    
    
        char param_id_cstr[MAVLINK_MSG_PARAM_MAP_RC_FIELD_PARAM_ID_LEN] = {};
        // Copy string into buffer, ensuring not to exceed the buffer size
        for (unsigned int i = 0; i < sizeof(param_id_cstr); i++)
        {
            if ((int)i < param_id.length())
            {
                param_id_cstr[i] = param_id.toLatin1()[i];
            }
        }
    
    
        mavlink_msg_param_map_rc_pack(mavlink->getSystemId(),
                                      mavlink->getComponentId(),
                                      &message,
                                      this->uasId,
                                      0,
    
                                      -1,
                                      param_rc_channel_index,
    
                                      value0,
                                      scale,
                                      valueMin,
                                      valueMax);
    
        _vehicle->sendMessage(message);
    
        qDebug() << "Mavlink message sent";
    }
    
    void UAS::unsetRCToParameterMap()
    {
    
        char param_id_cstr[MAVLINK_MSG_PARAM_MAP_RC_FIELD_PARAM_ID_LEN] = {};
    
    
        for (int i = 0; i < 3; i++) {
            mavlink_message_t message;
            mavlink_msg_param_map_rc_pack(mavlink->getSystemId(),
                                          mavlink->getComponentId(),
                                          &message,
                                          this->uasId,
                                          0,
    
                                          0.0f,
                                          0.0f,
    
            _vehicle->sendMessage(message);