mirror of
https://github.com/opentx/opentx.git
synced 2025-07-22 15:55:26 +03:00
249 lines
7.9 KiB
C++
249 lines
7.9 KiB
C++
/*
|
|
* Copyright (C) OpenTX
|
|
*
|
|
* Based on code named
|
|
* th9x - http://code.google.com/p/th9x
|
|
* er9x - http://code.google.com/p/er9x
|
|
* gruvin9x - http://code.google.com/p/gruvin9x
|
|
*
|
|
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#include "customfunctiondata.h"
|
|
#include "eeprominterface.h"
|
|
#include "radiodata.h"
|
|
#include "radiodataconversionstate.h"
|
|
|
|
void CustomFunctionData::clear()
|
|
{
|
|
memset(reinterpret_cast<void *>(this), 0, sizeof(CustomFunctionData));
|
|
if (!getCurrentFirmware()->getCapability(SafetyChannelCustomFunction)) {
|
|
func = FuncTrainer;
|
|
}
|
|
}
|
|
|
|
bool CustomFunctionData::isEmpty() const
|
|
{
|
|
return (swtch.type == SWITCH_TYPE_NONE);
|
|
}
|
|
|
|
QString CustomFunctionData::nameToString(int index, bool globalContext) const
|
|
{
|
|
return RadioData::getElementName((globalContext ? tr("GF") : tr("SF")), index+1, 0, true);
|
|
}
|
|
|
|
QString CustomFunctionData::funcToString(const ModelData * model) const
|
|
{
|
|
if (func >= FuncOverrideCH1 && func <= FuncOverrideCH32)
|
|
return tr("Override %1").arg(RawSource(SOURCE_TYPE_CH, func).toString(model));
|
|
else if (func == FuncTrainer)
|
|
return tr("Trainer Sticks");
|
|
else if (func == FuncTrainerRUD)
|
|
return tr("Trainer RUD");
|
|
else if (func == FuncTrainerELE)
|
|
return tr("Trainer ELE");
|
|
else if (func == FuncTrainerTHR)
|
|
return tr("Trainer THR");
|
|
else if (func == FuncTrainerAIL)
|
|
return tr("Trainer AIL");
|
|
else if (func == FuncTrainerChannels)
|
|
return tr("Trainer Channels");
|
|
else if (func == FuncInstantTrim)
|
|
return tr("Instant Trim");
|
|
else if (func == FuncPlaySound)
|
|
return tr("Play Sound");
|
|
else if (func == FuncPlayHaptic)
|
|
return tr("Haptic");
|
|
else if (func == FuncReset)
|
|
return tr("Reset");
|
|
else if (func >= FuncSetTimer1 && func <= FuncSetTimer3)
|
|
return tr("Set Timer %1").arg(func-FuncSetTimer1+1);
|
|
else if (func == FuncVario)
|
|
return tr("Vario");
|
|
else if (func == FuncPlayPrompt)
|
|
return tr("Play Track");
|
|
else if (func == FuncPlayBoth)
|
|
return tr("Play Both");
|
|
else if (func == FuncPlayValue)
|
|
return tr("Play Value");
|
|
else if (func == FuncPlayScript)
|
|
return tr("Play Script");
|
|
else if (func == FuncLogs)
|
|
return tr("SD Logs");
|
|
else if (func == FuncVolume)
|
|
return tr("Volume");
|
|
else if (func == FuncBacklight)
|
|
return tr("Backlight");
|
|
else if (func == FuncScreenshot)
|
|
return tr("Screenshot");
|
|
else if (func == FuncBackgroundMusic)
|
|
return tr("Background Music");
|
|
else if (func == FuncBackgroundMusicPause)
|
|
return tr("Background Music Pause");
|
|
else if (func >= FuncAdjustGV1 && func <= FuncAdjustGVLast)
|
|
return tr("Adjust %1").arg(RawSource(SOURCE_TYPE_GVAR, func-FuncAdjustGV1).toString(model));
|
|
else if (func == FuncSetFailsafe)
|
|
return tr("Set Failsafe");
|
|
else if (func == FuncRangeCheckInternalModule)
|
|
return tr("RangeCheck Int. Module");
|
|
else if (func == FuncRangeCheckExternalModule)
|
|
return tr("RangeCheck Ext. Module");
|
|
else if (func == FuncBindInternalModule)
|
|
return tr("Bind Int. Module");
|
|
else if (func == FuncBindExternalModule)
|
|
return tr("Bind Ext. Module");
|
|
else {
|
|
return QString("???"); // Highlight unknown functions with output of question marks.(BTW should not happen that we do not know what a function is)
|
|
}
|
|
}
|
|
|
|
void CustomFunctionData::populateResetParams(const ModelData * model, QComboBox * b, unsigned int value = 0)
|
|
{
|
|
int val = 0;
|
|
Firmware * firmware = Firmware::getCurrentVariant();
|
|
|
|
b->addItem(tr("Timer1"), val++);
|
|
b->addItem(tr("Timer2"), val++);
|
|
b->addItem( tr("Timer3"), val++);
|
|
b->addItem(tr("Flight"), val++);
|
|
b->addItem(tr("Telemetry"), val++);
|
|
int reCount = firmware->getCapability(RotaryEncoders);
|
|
if (reCount == 1) {
|
|
b->addItem(tr("Rotary Encoder"), val++);
|
|
}
|
|
else if (reCount == 2) {
|
|
b->addItem(tr("REa"), val++);
|
|
b->addItem(tr("REb"), val++);
|
|
}
|
|
if (model) {
|
|
for (int i = 0; i < firmware->getCapability(Sensors); ++i) {
|
|
if (model->sensorData[i].isAvailable()) {
|
|
RawSource item = RawSource(SOURCE_TYPE_TELEMETRY, 3 * i);
|
|
b->addItem(item.toString(model), val + i);
|
|
}
|
|
}
|
|
}
|
|
b->setCurrentIndex(b->findData(value));
|
|
}
|
|
|
|
void CustomFunctionData::populatePlaySoundParams(QStringList & qs)
|
|
{
|
|
qs <<"Beep 1" << "Beep 2" << "Beep 3" << "Warn1" << "Warn2" << "Cheep" << "Ratata" << "Tick" << "Siren" << "Ring" ;
|
|
qs << "SciFi" << "Robot" << "Chirp" << "Tada" << "Crickt" << "AlmClk" ;
|
|
}
|
|
|
|
void CustomFunctionData::populateHapticParams(QStringList & qs)
|
|
{
|
|
qs << "0" << "1" << "2" << "3";
|
|
}
|
|
|
|
QString CustomFunctionData::paramToString(const ModelData * model) const
|
|
{
|
|
QStringList qs;
|
|
if (func <= FuncInstantTrim) {
|
|
return QString("%1").arg(param);
|
|
}
|
|
else if (func == FuncLogs) {
|
|
return QString("%1").arg(param/10.0) + tr("s");
|
|
}
|
|
else if (func == FuncPlaySound) {
|
|
CustomFunctionData::populatePlaySoundParams(qs);
|
|
if (param>=0 && param<(int)qs.count())
|
|
return qs.at(param);
|
|
else
|
|
return tr("<font color=red><b>Inconsistent parameter</b></font>");
|
|
}
|
|
else if (func == FuncPlayHaptic) {
|
|
CustomFunctionData::populateHapticParams(qs);
|
|
if (param>=0 && param<(int)qs.count())
|
|
return qs.at(param);
|
|
else
|
|
return tr("<font color=red><b>Inconsistent parameter</b></font>");
|
|
}
|
|
else if (func == FuncReset) {
|
|
QComboBox cb;
|
|
CustomFunctionData::populateResetParams(model, &cb);
|
|
int pos = cb.findData(param);
|
|
if (pos >= 0)
|
|
return cb.itemText(pos);
|
|
else
|
|
return tr("<font color=red><b>Inconsistent parameter</b></font>");
|
|
}
|
|
else if (func == FuncVolume || func == FuncPlayValue || func == FuncBacklight) {
|
|
RawSource item(param);
|
|
return item.toString(model);
|
|
}
|
|
else if (func == FuncPlayPrompt || func == FuncPlayBoth) {
|
|
if ( getCurrentFirmware()->getCapability(VoicesAsNumbers)) {
|
|
return QString("%1").arg(param);
|
|
}
|
|
else {
|
|
return paramarm;
|
|
}
|
|
}
|
|
else if (func >= FuncAdjustGV1 && func < FuncCount) {
|
|
switch (adjustMode) {
|
|
case FUNC_ADJUST_GVAR_CONSTANT:
|
|
return tr("Value ")+QString("%1").arg(param);
|
|
case FUNC_ADJUST_GVAR_SOURCE:
|
|
case FUNC_ADJUST_GVAR_GVAR:
|
|
return RawSource(param).toString();
|
|
case FUNC_ADJUST_GVAR_INCDEC:
|
|
float val;
|
|
QString unit;
|
|
val = param * model->gvarData[func - FuncAdjustGV1].multiplierGet();
|
|
unit = model->gvarData[func - FuncAdjustGV1].unitToString();
|
|
return QString("Increment: %1%2").arg(val).arg(unit);
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
QString CustomFunctionData::repeatToString() const
|
|
{
|
|
if (repeatParam == -1) {
|
|
return tr("played once, not during startup");
|
|
}
|
|
else if (repeatParam == 0) {
|
|
return "";
|
|
}
|
|
else {
|
|
unsigned int step = 1;
|
|
return tr("repeat(%1s)").arg(step*repeatParam);
|
|
}
|
|
}
|
|
|
|
QString CustomFunctionData::enabledToString() const
|
|
{
|
|
if ((func >= FuncOverrideCH1 && func <= FuncOverrideCH32) ||
|
|
(func >= FuncAdjustGV1 && func <= FuncAdjustGVLast) ||
|
|
(func == FuncReset) ||
|
|
(func >= FuncSetTimer1 && func <= FuncSetTimer2) ||
|
|
(func == FuncVolume) ||
|
|
(func == FuncBacklight) ||
|
|
(func <= FuncInstantTrim)) {
|
|
if (!enabled) {
|
|
return tr("DISABLED");
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
void CustomFunctionData::convert(RadioDataConversionState & cstate)
|
|
{
|
|
cstate.setComponent(tr("CFN"), 8);
|
|
cstate.setSubComp(nameToString(cstate.subCompIdx, (cstate.toModel() ? false : true)));
|
|
swtch.convert(cstate);
|
|
if (func == FuncVolume || func == FuncBacklight || func == FuncPlayValue || (func >= FuncAdjustGV1 && func <= FuncAdjustGVLast && adjustMode == 1)) {
|
|
param = RawSource(param).convert(cstate.withComponentField("PARAM")).toValue();
|
|
}
|
|
}
|