/** Request the current config from the board */ void ConfigInputWidget::refreshValues() { UAVDataObject* obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("ManualControlSettings"))); Q_ASSERT(obj); //obj->requestUpdate(); UAVObjectField *field; // Now update all the slider values: UAVObjectField *field_max = obj->getField(QString("ChannelMax")); UAVObjectField *field_min = obj->getField(QString("ChannelMin")); UAVObjectField *field_neu = obj->getField(QString("ChannelNeutral")); Q_ASSERT(field_max); Q_ASSERT(field_min); Q_ASSERT(field_neu); for (int i = 0; i < 8; i++) { QVariant max = field_max->getValue(i); QVariant min = field_min->getValue(i); QVariant neutral = field_neu->getValue(i); inMaxLabels[i]->setText(max.toString()); inMinLabels[i]->setText(min.toString()); if (max.toInt()> min.toInt()) { inRevCheckboxes[i]->setChecked(false); inSliders[i]->setMaximum(max.toInt()); inSliders[i]->setMinimum(min.toInt()); } else { inRevCheckboxes[i]->setChecked(true); inSliders[i]->setMaximum(min.toInt()); inSliders[i]->setMinimum(max.toInt()); } inSliders[i]->setValue(neutral.toInt()); } // Update receiver type field = obj->getField(QString("InputMode")); m_config->receiverType->setText(field->getValue().toString()); // Reset all channel assignement dropdowns: foreach (QComboBox *combo, inChannelAssign) { combo->setCurrentIndex(0); }
/** Refreshes the current value of the SystemSettings which holds the aircraft type Note: The default behavior of ConfigTaskWidget is bypassed. Therefore no automatic synchronization of UAV Objects to UI is done. */ void ConfigVehicleTypeWidget::refreshWidgetsValues(UAVObject *o) { Q_UNUSED(o); if (!allObjectsUpdated()) { return; } bool dirty = isDirty(); // Get the Airframe type from the system settings: UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); Q_ASSERT(system); UAVObjectField *field = system->getField(QString("AirframeType")); Q_ASSERT(field); // At this stage, we will need to have some hardcoded settings in this code, this // is not ideal, but there you go. QString frameType = field->getValue().toString(); qDebug() << "ConfigVehicleTypeWidget::refreshWidgetsValues - frame type:" << frameType; QString category = frameCategory(frameType); setComboCurrentIndex(m_aircraft->aircraftType, m_aircraft->aircraftType->findText(category)); VehicleConfig *vehicleConfig = getVehicleConfigWidget(category); if (vehicleConfig) { vehicleConfig->refreshWidgetsValues(frameType); } updateFeedForwardUI(); setDirty(dirty); qDebug() << "ConfigVehicleTypeWidget::refreshWidgetsValues - end"; }
/** Helper function to refresh the UI widget values */ void ConfigCustomWidget::refreshWidgetsValues(QString frameType) { Q_ASSERT(m_aircraft); setupUI(frameType); UAVDataObject *system = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("SystemSettings"))); Q_ASSERT(system); QPointer<UAVObjectField> field = system->getField(QString("AirframeType")); // Do not allow table edit until AirframeType == Custom // First save set AirframeType to 'Custom' and next modify. if (field->getValue().toString() != "Custom") { m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::NoEditTriggers); } else { m_aircraft->customMixerTable->setEditTriggers(QAbstractItemView::AllEditTriggers); } UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings"))); Q_ASSERT(mixer); getChannelDescriptions(); QList<double> curveValues; getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, &curveValues); // is at least one of the curve values != 0? if (isValidThrottleCurve(&curveValues)) { // yes, use the curve we just read from mixersettings m_aircraft->customThrottle1Curve->initCurve(&curveValues); } else { // no, init a straight curve m_aircraft->customThrottle1Curve->initLinearCurve(curveValues.count(), 1.0); } double Throttle2CurveMin = m_aircraft->customThrottle2Curve->getMin(); if (MixerSettings * mxr = qobject_cast<MixerSettings *>(mixer)) { MixerSettings::DataFields mixerSettingsData = mxr->getData(); if (mixerSettingsData.Curve2Source == MixerSettings::CURVE2SOURCE_THROTTLE && Throttle2CurveMin >= 0) { m_aircraft->customThrottle2Curve->setMixerType(MixerCurve::MIXERCURVE_THROTTLE); } else { m_aircraft->customThrottle2Curve->setMixerType(MixerCurve::MIXERCURVE_PITCH); } } // Setup all Throttle2 curves for all types of airframes getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, &curveValues); if (isValidThrottleCurve(&curveValues)) { m_aircraft->customThrottle2Curve->initCurve(&curveValues); } else { m_aircraft->customThrottle2Curve->initLinearCurve(curveValues.count(), 1.0, m_aircraft->customThrottle2Curve->getMin()); } // Update the mixer table: for (int channel = 0; channel < m_aircraft->customMixerTable->columnCount(); channel++) { UAVObjectField *field = mixer->getField(mixerTypes.at(channel)); if (field) { QComboBox *q = (QComboBox *)m_aircraft->customMixerTable->cellWidget(0, channel); if (q) { QString s = field->getValue().toString(); setComboCurrentIndex(q, q->findText(s)); } m_aircraft->customMixerTable->item(1, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1))); m_aircraft->customMixerTable->item(2, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2))); m_aircraft->customMixerTable->item(3, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL))); m_aircraft->customMixerTable->item(4, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH))); m_aircraft->customMixerTable->item(5, channel)->setText( QString::number(getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW))); } } }
/*! \brief Called by updates to @OPLinkStatus */ void ConfigPipXtremeWidget::updateStatus(UAVObject *object) { // Request and update of the setting object if we haven't received it yet. if (!settingsUpdated) { oplinkSettingsObj->requestUpdate(); } // Update the link state UAVObjectField *linkField = object->getField("LinkState"); m_oplink->LinkState->setText(linkField->getValue().toString()); bool linkConnected = (linkField->getValue() == linkField->getOptions().at(OPLinkStatus::LINKSTATE_CONNECTED)); bool modemEnabled = linkConnected || (linkField->getValue() == linkField->getOptions().at(OPLinkStatus::LINKSTATE_DISCONNECTED)) || (linkField->getValue() == linkField->getOptions().at(OPLinkStatus::LINKSTATE_ENABLED)); UAVObjectField *pairRssiField = object->getField("PairSignalStrengths"); bool bound; bool ok; quint32 boundPairId = m_oplink->CoordID->text().toUInt(&ok, 16); // Update the detected devices. UAVObjectField *pairIdField = object->getField("PairIDs"); quint32 pairid = pairIdField->getValue(0).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID1->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID1->setEnabled(false); m_oplink->Bind1->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind1->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar1->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(0).toInt()); m_oplink->PairSignalStrengthLabel1->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar1->value())); pairid = pairIdField->getValue(1).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID2->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID2->setEnabled(false); m_oplink->Bind2->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind2->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar2->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(1).toInt()); m_oplink->PairSignalStrengthLabel2->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar2->value())); pairid = pairIdField->getValue(2).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID3->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID3->setEnabled(false); m_oplink->Bind3->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind3->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar3->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(2).toInt()); m_oplink->PairSignalStrengthLabel3->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar3->value())); pairid = pairIdField->getValue(3).toUInt(); bound = (pairid == boundPairId); m_oplink->PairID4->setText(QString::number(pairid, 16).toUpper()); m_oplink->PairID4->setEnabled(false); m_oplink->Bind4->setText(bound ? tr("Unbind") : tr("Bind")); m_oplink->Bind4->setEnabled(pairid && modemEnabled); m_oplink->PairSignalStrengthBar4->setValue(((bound && !linkConnected) || !modemEnabled) ? -127 : pairRssiField->getValue(3).toInt()); m_oplink->PairSignalStrengthLabel4->setText(QString("%1dB").arg(m_oplink->PairSignalStrengthBar4->value())); // Update the Description field // TODO use UAVObjectUtilManager::descriptionToStructure() UAVObjectField *descField = object->getField("Description"); if (descField->getValue(0) != QChar(255)) { /* * This looks like a binary with a description at the end: * 4 bytes: header: "OpFw". * 4 bytes: GIT commit tag (short version of SHA1). * 4 bytes: Unix timestamp of compile time. * 2 bytes: target platform. Should follow same rule as BOARD_TYPE and BOARD_REVISION in board define files. * 26 bytes: commit tag if it is there, otherwise branch name. '-dirty' may be added if needed. Zero-padded. * 20 bytes: SHA1 sum of the firmware. * 20 bytes: SHA1 sum of the uavo definitions. * 20 bytes: free for now. */ char buf[OPLinkStatus::DESCRIPTION_NUMELEM]; for (unsigned int i = 0; i < 26; ++i) { buf[i] = descField->getValue(i + 14).toChar().toLatin1(); } buf[26] = '\0'; QString descstr(buf); quint32 gitDate = descField->getValue(11).toChar().toLatin1() & 0xFF; for (int i = 1; i < 4; i++) { gitDate = gitDate << 8; gitDate += descField->getValue(11 - i).toChar().toLatin1() & 0xFF; } QString date = QDateTime::fromTime_t(gitDate).toUTC().toString("yyyy-MM-dd HH:mm"); m_oplink->FirmwareVersion->setText(descstr + " " + date); } else { m_oplink->FirmwareVersion->setText(tr("Unknown")); } // Update the serial number field UAVObjectField *serialField = object->getField("CPUSerial"); char buf[OPLinkStatus::CPUSERIAL_NUMELEM * 2 + 1]; for (unsigned int i = 0; i < OPLinkStatus::CPUSERIAL_NUMELEM; ++i) { unsigned char val = serialField->getValue(i).toUInt() >> 4; buf[i * 2] = ((val < 10) ? '0' : '7') + val; val = serialField->getValue(i).toUInt() & 0xf; buf[i * 2 + 1] = ((val < 10) ? '0' : '7') + val; } buf[OPLinkStatus::CPUSERIAL_NUMELEM * 2] = '\0'; m_oplink->SerialNumber->setText(buf); updateEnableControls(); }
/** * Updates the slider positions and min/max values * */ void ConfigServoWidget::updateChannels(UAVObject* controlCommand) { QString fieldName = QString("Connected"); UAVObjectField *field = controlCommand->getField(fieldName); if (field->getValue().toBool()) m_config->RCInputConnected->setText("RC Receiver Connected"); else m_config->RCInputConnected->setText("RC Receiver Not Connected"); if (m_config->doRCInputCalibration->isChecked()) { if (firstUpdate) { // Increase the data rate from the board so that the sliders // move faster UAVObject::Metadata mdata = controlCommand->getMetadata(); mdata.flightTelemetryUpdateMode = UAVObject::UPDATEMODE_PERIODIC; mccDataRate = mdata.flightTelemetryUpdatePeriod; mdata.flightTelemetryUpdatePeriod = 150; controlCommand->setMetadata(mdata); // Also protect the user by setting all values to zero // and making the ActuatorCommand object readonly UAVDataObject* obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("ActuatorCommand"))); mdata = obj->getMetadata(); mdata.flightAccess = UAVObject::ACCESS_READONLY; obj->setMetadata(mdata); UAVObjectField *field = obj->getField("Channel"); for (int i=0; i< field->getNumElements(); i++) { field->setValue(0,i); } obj->updated(); } field = controlCommand->getField(QString("Channel")); for (int i = 0; i < 8; i++) updateChannelInSlider(inSliders[i], inMinLabels[i], inMaxLabels[i], reversals[i], field->getValue(i).toInt()); firstUpdate = false; } else { if (!firstUpdate) { // Restore original data rate from the board: UAVObject::Metadata mdata = controlCommand->getMetadata(); mdata.flightTelemetryUpdateMode = UAVObject::UPDATEMODE_PERIODIC; mdata.flightTelemetryUpdatePeriod = mccDataRate; controlCommand->setMetadata(mdata); UAVDataObject* obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("ActuatorCommand"))); mdata = obj->getMetadata(); mdata.flightAccess = UAVObject::ACCESS_READWRITE; obj->setMetadata(mdata); } firstUpdate = true; } //Update the Flight mode channel slider UAVObject* obj = getObjectManager()->getObject("ManualControlSettings"); // Find the channel currently assigned to flightmode field = obj->getField("FlightMode"); int chIndex = field->getOptions().indexOf(field->getValue().toString()); if (chIndex < field->getOptions().length() - 1) { float valueScaled; int chMin = inSliders[chIndex]->minimum(); int chMax = inSliders[chIndex]->maximum(); int chNeutral = inSliders[chIndex]->value(); int value = controlCommand->getField("Channel")->getValue(chIndex).toInt(); if ((chMax > chMin && value >= chNeutral) || (chMin > chMax && value <= chNeutral)) { if (chMax != chNeutral) valueScaled = (float)(value - chNeutral) / (float)(chMax - chNeutral); else valueScaled = 0; } else { if (chMin != chNeutral) valueScaled = (float)(value - chNeutral) / (float)(chNeutral - chMin); else valueScaled = 0; } // Bound if (valueScaled > 1.0) valueScaled = 1.0; else if (valueScaled < -1.0) valueScaled = -1.0; m_config->fmsSlider->setValue(valueScaled * 100); } }
/** Request the current config from the board */ void ConfigServoWidget::requestRCInputUpdate() { UAVDataObject* obj = dynamic_cast<UAVDataObject*>(getObjectManager()->getObject(QString("ManualControlSettings"))); Q_ASSERT(obj); obj->requestUpdate(); UAVObjectField *field; // Now update all the slider values: UAVObjectField *field_max = obj->getField(QString("ChannelMax")); UAVObjectField *field_min = obj->getField(QString("ChannelMin")); UAVObjectField *field_neu = obj->getField(QString("ChannelNeutral")); Q_ASSERT(field_max); Q_ASSERT(field_min); Q_ASSERT(field_neu); for (int i = 0; i < 8; i++) { QVariant max = field_max->getValue(i); QVariant min = field_min->getValue(i); QVariant neutral = field_neu->getValue(i); inMaxLabels[i]->setText(max.toString()); inMinLabels[i]->setText(min.toString()); inSliders[i]->setMaximum(max.toInt()); inSliders[i]->setMinimum(min.toInt()); inSliders[i]->setValue(neutral.toInt()); } // Update receiver type field = obj->getField(QString("InputMode")); m_config->receiverType->setCurrentIndex(m_config->receiverType->findText(field->getValue().toString())); // Reset all channel assignement dropdowns: m_config->ch0Assign->setCurrentIndex(0); m_config->ch1Assign->setCurrentIndex(0); m_config->ch2Assign->setCurrentIndex(0); m_config->ch3Assign->setCurrentIndex(0); m_config->ch4Assign->setCurrentIndex(0); m_config->ch5Assign->setCurrentIndex(0); m_config->ch6Assign->setCurrentIndex(0); m_config->ch7Assign->setCurrentIndex(0); // Update all channels assignements QList<UAVObjectField *> fieldList = obj->getFields(); foreach (UAVObjectField *field, fieldList) { if (field->getUnits().contains("channel")) assignChannel(obj, field->getName()); } // Update all the flight mode settingsin the relevant tab field = obj->getField(QString("FlightModePosition")); m_config->fmsModePos1->setCurrentIndex((m_config->fmsModePos1->findText(field->getValue(0).toString()))); m_config->fmsModePos2->setCurrentIndex((m_config->fmsModePos2->findText(field->getValue(1).toString()))); m_config->fmsModePos3->setCurrentIndex((m_config->fmsModePos3->findText(field->getValue(2).toString()))); field = obj->getField(QString("Stabilization1Settings")); m_config->fmsSsPos1Roll->setCurrentIndex(m_config->fmsSsPos1Roll->findText(field->getValue(field->getElementNames().indexOf("Roll")).toString())); m_config->fmsSsPos1Pitch->setCurrentIndex(m_config->fmsSsPos1Pitch->findText(field->getValue(field->getElementNames().indexOf("Pitch")).toString())); m_config->fmsSsPos1Yaw->setCurrentIndex(m_config->fmsSsPos1Yaw->findText(field->getValue(field->getElementNames().indexOf("Yaw")).toString())); field = obj->getField(QString("Stabilization2Settings")); m_config->fmsSsPos2Roll->setCurrentIndex(m_config->fmsSsPos2Roll->findText(field->getValue(field->getElementNames().indexOf("Roll")).toString())); m_config->fmsSsPos2Pitch->setCurrentIndex(m_config->fmsSsPos2Pitch->findText(field->getValue(field->getElementNames().indexOf("Pitch")).toString())); m_config->fmsSsPos2Yaw->setCurrentIndex(m_config->fmsSsPos2Yaw->findText(field->getValue(field->getElementNames().indexOf("Yaw")).toString())); field = obj->getField(QString("Stabilization3Settings")); m_config->fmsSsPos3Roll->setCurrentIndex(m_config->fmsSsPos3Roll->findText(field->getValue(field->getElementNames().indexOf("Roll")).toString())); m_config->fmsSsPos3Pitch->setCurrentIndex(m_config->fmsSsPos3Pitch->findText(field->getValue(field->getElementNames().indexOf("Pitch")).toString())); m_config->fmsSsPos3Yaw->setCurrentIndex(m_config->fmsSsPos3Yaw->findText(field->getValue(field->getElementNames().indexOf("Yaw")).toString())); // Load the arming settings field = obj->getField(QString("Arming")); m_config->armControl->setCurrentIndex(m_config->armControl->findText(field->getValue().toString())); field = obj->getField(QString("ArmedTimeout")); m_config->armTimeout->setValue(field->getValue().toInt()/1000); }
/** Request the current config from the board (RC Output) */ void ConfigServoWidget::requestRCOutputUpdate() { ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectManager *objManager = pm->getObject<UAVObjectManager>(); // Get the Airframe type from the system settings: UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("SystemSettings"))); Q_ASSERT(obj); obj->requestUpdate(); UAVObjectField *field = obj->getField(QString("AirframeType")); m_config->aircraftType->setText(QString("Aircraft type: ") + field->getValue().toString()); // Reset all channel assignements: m_config->ch0Output->setCurrentIndex(0); m_config->ch1Output->setCurrentIndex(0); m_config->ch2Output->setCurrentIndex(0); m_config->ch3Output->setCurrentIndex(0); m_config->ch4Output->setCurrentIndex(0); m_config->ch5Output->setCurrentIndex(0); m_config->ch6Output->setCurrentIndex(0); m_config->ch7Output->setCurrentIndex(0); // Get the channel assignements: obj = dynamic_cast<UAVDataObject*>(objManager->getObject(QString("ActuatorSettings"))); Q_ASSERT(obj); obj->requestUpdate(); QList<UAVObjectField*> fieldList = obj->getFields(); foreach (UAVObjectField* field, fieldList) { if (field->getUnits().contains("channel")) { assignOutputChannel(obj,field->getName()); } } // Get Output rates for both banks field = obj->getField(QString("ChannelUpdateFreq")); m_config->outputRate1->setValue(field->getValue(0).toInt()); m_config->outputRate2->setValue(field->getValue(1).toInt()); // Get Channel ranges: for (int i=0;i<8;i++) { field = obj->getField(QString("ChannelMin")); int minValue = field->getValue(i).toInt(); outMin[i]->setValue(minValue); field = obj->getField(QString("ChannelMax")); int maxValue = field->getValue(i).toInt(); outMax[i]->setValue(maxValue); if (maxValue>minValue) { outSliders[i]->setMinimum(minValue); outSliders[i]->setMaximum(maxValue); reversals[i]->setChecked(false); } else { outSliders[i]->setMinimum(maxValue); outSliders[i]->setMaximum(minValue); reversals[i]->setChecked(true); } } field = obj->getField(QString("ChannelNeutral")); for (int i=0; i<8; i++) { int value = field->getValue(i).toInt(); outSliders[i]->setValue(value); outLabels[i]->setText(QString::number(value)); } }