diff --git a/DONATIONS.txt b/DONATIONS.txt index 102ad1541..233693225 100644 --- a/DONATIONS.txt +++ b/DONATIONS.txt @@ -133,7 +133,7 @@ Eric Burdis Nigel Chippindale Michael Deasy Stephen Stough -Kenneth Lilja +Kenneth Lilja (monthly) Robert Jero Gary Bancroft Robert Cotsford @@ -386,3 +386,6 @@ Wilco Hijink Roy Nixon Lexington S Morley Daryl Dacko +Beat Zurflueh +Piotr Kundu +Kevin Berkefeld diff --git a/companion/src/comparedialog.cpp b/companion/src/comparedialog.cpp index 4b77ff9c6..78a29caba 100644 --- a/companion/src/comparedialog.cpp +++ b/companion/src/comparedialog.cpp @@ -76,7 +76,7 @@ void CompareDialog::printDiff() { te->clear(); printSetup(); - if (GetCurrentFirmware()->getCapability(FlightPhases)) { + if (GetCurrentFirmware()->getCapability(FlightModes)) { printPhases(); } printExpos(); @@ -309,7 +309,7 @@ void CompareDialog::printPhases() str.append(QString("%1").arg(getInputStr(*g_model1, i))); } str.append(""); - for (i=0; igetCapability(FlightPhases); i++) { + for (i=0; igetCapability(FlightModes); i++) { PhaseData *pd1=&g_model1->phaseData[i]; PhaseData *pd2=&g_model2->phaseData[i]; str.append(""+tr("FM")+QString("%1 ").arg(i)); @@ -346,10 +346,10 @@ void CompareDialog::printPhases() if (gvars==1) { gvarnum=GetCurrentFirmware()->getCapability(Gvars); } - if ((gvars==1 && GetCurrentFirmware()->getCapability(GvarsFlightPhases)) || GetCurrentFirmware()->getCapability(RotaryEncoders)) { + if ((gvars==1 && GetCurrentFirmware()->getCapability(GvarsFlightModes)) || GetCurrentFirmware()->getCapability(RotaryEncoders)) { str.append("
"); str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightPhases)) { + if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { str.append(QString(""); } @@ -357,7 +357,7 @@ void CompareDialog::printPhases() str.append(QString(""); } str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightPhases)) { + if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { for (i=0; iGV%1
%2").arg(i+1).arg(g_model1->gvars_names[i])); } @@ -366,13 +366,13 @@ void CompareDialog::printPhases() str.append(QString("
").arg((i==0 ? 'A': 'B'))); } str.append(""); - for (i=0; igetCapability(FlightPhases); i++) { + for (i=0; igetCapability(FlightModes); i++) { PhaseData *pd1=&g_model1->phaseData[i]; PhaseData *pd2=&g_model2->phaseData[i]; str.append("").arg(pd1->name).arg(color)); - if (GetCurrentFirmware()->getCapability(GvarsFlightPhases)) { + if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { for (k=0; kgvars[k],pd2->gvars[k]); if (pd1->gvars[k]<=1024) { @@ -411,7 +411,7 @@ void CompareDialog::printPhases() str.append(QString("").arg(getInputStr(*g_model1, i))); } str.append(""); - for (i=0; igetCapability(FlightPhases); i++) { + for (i=0; igetCapability(FlightModes); i++) { PhaseData *pd1=&g_model1->phaseData[i]; PhaseData *pd2=&g_model2->phaseData[i]; str.append("
 ").arg(gvarnum)+tr("Gvars")+"").arg(GetCurrentFirmware()->getCapability(RotaryEncoders))+tr("Rot. Enc.")+"
"+tr("Flight mode name")+"RE%1
"+tr("FM")+QString("%1 ").arg(i)); color=getColor1(pd1->name,pd2->name); str.append(QString("%1%1
"+tr("FM")+QString("%1 ").arg(i)); @@ -436,17 +436,17 @@ void CompareDialog::printPhases() } str.append("
"); - if ((gvars==1 && GetCurrentFirmware()->getCapability(GvarsFlightPhases)) || GetCurrentFirmware()->getCapability(RotaryEncoders)) { + if ((gvars==1 && GetCurrentFirmware()->getCapability(GvarsFlightModes)) || GetCurrentFirmware()->getCapability(RotaryEncoders)) { str.append("
"); str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightPhases)) { + if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { str.append(QString(""); } if (GetCurrentFirmware()->getCapability(RotaryEncoders)) { str.append(QString(""); } str.append(""); - if (GetCurrentFirmware()->getCapability(GvarsFlightPhases)) { + if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { for (i=0; iGV%1
%2").arg(i+1).arg(g_model2->gvars_names[i])); } @@ -455,13 +455,13 @@ void CompareDialog::printPhases() str.append(QString("
").arg((i==0 ? 'A': 'B'))); } str.append(""); - for (i=0; igetCapability(FlightPhases); i++) { + for (i=0; igetCapability(FlightModes); i++) { PhaseData *pd1=&g_model1->phaseData[i]; PhaseData *pd2=&g_model2->phaseData[i]; str.append("").arg(pd2->name).arg(color)); - if (GetCurrentFirmware()->getCapability(GvarsFlightPhases)) { + if (GetCurrentFirmware()->getCapability(GvarsFlightModes)) { for (k=0; kgvars[k],pd2->gvars[k]); if (pd2->gvars[k]<=1024) { @@ -569,7 +569,7 @@ void CompareDialog::printGvars() gvarnum=GetCurrentFirmware()->getCapability(Gvars); } - if (!GetCurrentFirmware()->getCapability(GvarsFlightPhases) && (gvars==1 && GetCurrentFirmware()->getCapability(Gvars))) { + if (!GetCurrentFirmware()->getCapability(GvarsFlightModes) && (gvars==1 && GetCurrentFirmware()->getCapability(Gvars))) { QString str = "
 ").arg(gvarnum)+tr("Gvars")+"").arg(GetCurrentFirmware()->getCapability(RotaryEncoders))+tr("Rot. Enc.")+"
"+tr("Flight mode name")+"RE%1
"+tr("FM")+QString("%1 ").arg(i)); color=getColor1(pd1->name,pd2->name); str.append(QString("%1
"; str.append(""); str.append(""; -} - -QString doTR(const QString s, const QString color="", bool bold=false) -{ - QString str = s; - if(bold) str = "" + str + ""; - if(!color.isEmpty()) str = "" + str + ""; - return ""; -} - -QString doTL(const QString s, const QString color="", bool bold=false) -{ - QString str = s; - if(bold) str = "" + str + ""; - if(!color.isEmpty()) str = "" + str + ""; - return ""; -} - -QString PrintDialog::fv(const QString name, const QString value) -{ - return "" + name + ": " + value + "
"; -} - -void PrintDialog::printSetup() -{ - QString str = "

"+tr("Global Variables")+"

"); @@ -653,12 +653,12 @@ void CompareDialog::printExpos() str += tr("Weight") + QString("%1").arg(getGVarString(ed->weight)).rightJustified(6, ' '); str += ed->curve.toString().replace("<", "<").replace(">", ">"); - if (GetCurrentFirmware()->getCapability(FlightPhases)) { + if (GetCurrentFirmware()->getCapability(FlightModes)) { if(ed->phases) { - if (ed->phases!=(unsigned int)(1<getCapability(FlightPhases))-1) { + if (ed->phases!=(unsigned int)(1<getCapability(FlightModes))-1) { int mask=1; int first=0; - for (int i=0; igetCapability(FlightPhases);i++) { + for (int i=0; igetCapability(FlightModes);i++) { if (!(ed->phases & mask)) { first++; } @@ -671,7 +671,7 @@ void CompareDialog::printExpos() } mask=1; first=1; - for (int j=0; jgetCapability(FlightPhases);j++) { + for (int j=0; jgetCapability(FlightModes);j++) { if (!(ed->phases & mask)) { PhaseData *pd = &g_model1->phaseData[j]; if (!first) { @@ -731,12 +731,12 @@ void CompareDialog::printExpos() str += tr("Weight") + QString("%1").arg(getGVarString(ed->weight)).rightJustified(6, ' '); str += ed->curve.toString().replace("<", "<").replace(">", ">"); - if (GetCurrentFirmware()->getCapability(FlightPhases)) { + if (GetCurrentFirmware()->getCapability(FlightModes)) { if(ed->phases) { - if (ed->phases!=(unsigned int)(1<getCapability(FlightPhases))-1) { + if (ed->phases!=(unsigned int)(1<getCapability(FlightModes))-1) { int mask=1; int first=0; - for (int i=0; igetCapability(FlightPhases);i++) { + for (int i=0; igetCapability(FlightModes);i++) { if (!(ed->phases & mask)) { first++; } @@ -749,7 +749,7 @@ void CompareDialog::printExpos() } mask=1; first=1; - for (int j=0; jgetCapability(FlightPhases);j++) { + for (int j=0; jgetCapability(FlightModes);j++) { if (!(ed->phases & mask)) { PhaseData *pd = &g_model2->phaseData[j]; if (!first) { @@ -829,12 +829,12 @@ void CompareDialog::printMixers() if (md->delayDown || md->delayUp) str += tr(" Delay(u%1:d%2)").arg(md->delayUp/scale).arg(md->delayDown/scale); if (md->speedDown || md->speedUp) str += tr(" Slow(u%1:d%2)").arg(md->speedUp/scale).arg(md->speedDown/scale); if (md->mixWarn) str += " "+tr("Warn")+QString("(%1)").arg(md->mixWarn); - if (GetCurrentFirmware()->getCapability(FlightPhases)) { + if (GetCurrentFirmware()->getCapability(FlightModes)) { if(md->phases) { - if (md->phases!=(unsigned int)(1<getCapability(FlightPhases))-1) { + if (md->phases!=(unsigned int)(1<getCapability(FlightModes))-1) { int mask=1; int first=0; - for (int i=0; igetCapability(FlightPhases);i++) { + for (int i=0; igetCapability(FlightModes);i++) { if (!(md->phases & mask)) { first++; } @@ -847,7 +847,7 @@ void CompareDialog::printMixers() } mask=1; first=1; - for (int j=0; jgetCapability(FlightPhases);j++) { + for (int j=0; jgetCapability(FlightModes);j++) { if (!(md->phases & mask)) { PhaseData *pd = &g_model1->phaseData[j]; if (!first) { @@ -908,12 +908,12 @@ void CompareDialog::printMixers() if (md->delayDown || md->delayUp) str += tr(" Delay(u%1:d%2)").arg(md->delayUp/scale).arg(md->delayDown/scale); if (md->speedDown || md->speedUp) str += tr(" Slow(u%1:d%2)").arg(md->speedUp/scale).arg(md->speedDown/scale); if (md->mixWarn) str += " "+tr("Warn")+QString("(%1)").arg(md->mixWarn); - if (GetCurrentFirmware()->getCapability(FlightPhases)) { + if (GetCurrentFirmware()->getCapability(FlightModes)) { if(md->phases) { - if (md->phases!=(unsigned int)(1<getCapability(FlightPhases))-1) { + if (md->phases!=(unsigned int)(1<getCapability(FlightModes))-1) { int mask=1; int first=0; - for (int i=0; igetCapability(FlightPhases);i++) { + for (int i=0; igetCapability(FlightModes);i++) { if (!(md->phases & mask)) { first++; } @@ -926,7 +926,7 @@ void CompareDialog::printMixers() } mask=1; first=1; - for (int j=0; jgetCapability(FlightPhases);j++) { + for (int j=0; jgetCapability(FlightModes);j++) { if (!(md->phases & mask)) { PhaseData *pd = &g_model2->phaseData[j]; if (!first) { diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index 1e3868830..b00b7c32c 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -200,8 +200,8 @@ RawSourceRange RawSource::getRange(bool singleprec) result.decimals = 1; break; case TELEMETRY_SOURCE_CONSUMPTION: - result.step = singleprec ? 20 : 1; - result.max = singleprec ? 5100 : 10000; + result.step = singleprec ? 100 : 1; + result.max = singleprec ? 25500 : 10000; break; case TELEMETRY_SOURCE_POWER: case TELEMETRY_SOURCE_POWER_MAX: @@ -272,7 +272,7 @@ QString RawSource::toString() QObject::tr("ACC"), QObject::tr("Time"), }; - static const QString virtualSwitches[] = { + static const QString logicalSwitches[] = { QObject::tr("L1"), QObject::tr("L2"), QObject::tr("L3"), QObject::tr("L4"), QObject::tr("L5"), QObject::tr("L6"), QObject::tr("L7"), QObject::tr("L8"), QObject::tr("L9"), QObject::tr("L10"), QObject::tr("L11"), QObject::tr("L12"), QObject::tr("L13"), QObject::tr("L14"), QObject::tr("L15"), QObject::tr("L16"), QObject::tr("L17"), QObject::tr("L18"), QObject::tr("L19"), QObject::tr("L20"), QObject::tr("L21"), QObject::tr("L22"), QObject::tr("L23"), QObject::tr("L24"), QObject::tr("L25"), QObject::tr("L26"), QObject::tr("L27"), QObject::tr("L28"), QObject::tr("L29"), QObject::tr("L30"), @@ -302,7 +302,7 @@ QString RawSource::toString() case SOURCE_TYPE_SWITCH: return (IS_TARANIS(GetEepromInterface()->getBoard()) ? CHECK_IN_ARRAY(switchesX9D, index) : CHECK_IN_ARRAY(switches9X, index)); case SOURCE_TYPE_CUSTOM_SWITCH: - return virtualSwitches[index]; + return logicalSwitches[index]; case SOURCE_TYPE_CYC: return QObject::tr("CYC%1").arg(index+1); case SOURCE_TYPE_PPM: @@ -349,13 +349,17 @@ QString RawSwitch::toString() SwitchUp('H'), SwitchDn('H'), }; - static const QString virtualSwitches[] = { + static const QString logicalSwitches[] = { QObject::tr("L1"), QObject::tr("L2"), QObject::tr("L3"), QObject::tr("L4"), QObject::tr("L5"), QObject::tr("L6"), QObject::tr("L7"), QObject::tr("L8"), QObject::tr("L9"), QObject::tr("L10"), QObject::tr("L11"), QObject::tr("L12"), QObject::tr("L13"), QObject::tr("L14"), QObject::tr("L15"), QObject::tr("L16"), QObject::tr("L17"), QObject::tr("L18"), QObject::tr("L19"), QObject::tr("L20"), QObject::tr("L21"), QObject::tr("L22"), QObject::tr("L23"), QObject::tr("L24"), QObject::tr("L25"), QObject::tr("L26"), QObject::tr("L27"), QObject::tr("L28"), QObject::tr("L29"), QObject::tr("L30"), QObject::tr("L31"), QObject::tr("L32") }; + static const QString flightModes[] = { + QObject::tr("FM0"), QObject::tr("FM1"), QObject::tr("FM2"), QObject::tr("FM3"), QObject::tr("FM4"), QObject::tr("FM5"), QObject::tr("FM6"), QObject::tr("FM7"), QObject::tr("FM8") + }; + static const QString multiposPots[] = { QObject::tr("S11"), QObject::tr("S12"), QObject::tr("S13"), QObject::tr("S14"), QObject::tr("S15"), QObject::tr("S16"), QObject::tr("S21"), QObject::tr("S22"), QObject::tr("S23"), QObject::tr("S24"), QObject::tr("S25"), QObject::tr("S26"), @@ -389,7 +393,7 @@ QString RawSwitch::toString() else return CHECK_IN_ARRAY(switches9X, index-1); case SWITCH_TYPE_VIRTUAL: - return CHECK_IN_ARRAY(virtualSwitches, index-1); + return CHECK_IN_ARRAY(logicalSwitches, index-1); case SWITCH_TYPE_MULTIPOS_POT: return CHECK_IN_ARRAY(multiposPots, index-1); case SWITCH_TYPE_TRIM: @@ -400,6 +404,8 @@ QString RawSwitch::toString() return QObject::tr("ON"); case SWITCH_TYPE_OFF: return QObject::tr("OFF"); + case SWITCH_TYPE_FLIGHT_MODE: + return CHECK_IN_ARRAY(flightModes, index-1); case SWITCH_TYPE_NONE: return QObject::tr("----"); case SWITCH_TYPE_TIMER_MODE: @@ -1060,7 +1066,7 @@ void ModelData::clear() moduleData[0].protocol=PPM; moduleData[1].protocol=OFF; } - for (int i=0; i 125) { @@ -689,7 +689,7 @@ t_Gruvin9xModelData_v106::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { diff --git a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h index 8886c83d1..7a763ef6a 100644 --- a/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h +++ b/companion/src/firmwares/gruvin9x/gruvin9xeeprom.h @@ -277,7 +277,7 @@ PACK(typedef struct t_Gruvin9xTimerData { t_Gruvin9xTimerData() { memset(this, 0, sizeof(t_Gruvin9xTimerData)); } }) Gruvin9xTimerData; -#define G9X_MAX_PHASES 5 +#define G9X_MAX_FLIGHT_MODES 5 #define G9X_MAX_MIXERS 32 #define G9X_MAX_EXPOS 14 #define G9X_MAX_CURVE5 8 @@ -312,7 +312,7 @@ PACK(typedef struct t_Gruvin9xModelData_v102 { Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW]; Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xSwashRingData swashR; - Gruvin9xPhaseData_v102 phaseData[G9X_MAX_PHASES]; + Gruvin9xPhaseData_v102 phaseData[G9X_MAX_FLIGHT_MODES]; Gruvin9xFrSkyData frsky; operator ModelData(); @@ -344,7 +344,7 @@ PACK(typedef struct t_Gruvin9xModelData_v103 { Gruvin9xLogicalSwitchData customSw[G9X_NUM_CSW]; Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xSwashRingData swashR; - Gruvin9xPhaseData_v102 phaseData[G9X_MAX_PHASES]; + Gruvin9xPhaseData_v102 phaseData[G9X_MAX_FLIGHT_MODES]; Gruvin9xFrSkyData frsky; operator ModelData(); @@ -377,7 +377,7 @@ PACK(typedef struct t_Gruvin9xModelData_v105 { Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xFuncSwData funcSw[G9X_NUM_FSW]; Gruvin9xSwashRingData swashR; - Gruvin9xPhaseData_v102 phaseData[G9X_MAX_PHASES]; + Gruvin9xPhaseData_v102 phaseData[G9X_MAX_FLIGHT_MODES]; int16_t subtrim[NUM_STICKS]; Gruvin9xFrSkyData frsky; @@ -409,7 +409,7 @@ PACK(typedef struct t_Gruvin9xModelData_v106 { Gruvin9xSafetySwData safetySw[G9X_NUM_CHNOUT]; Gruvin9xFuncSwData funcSw[G9X_NUM_FSW]; Gruvin9xSwashRingData swashR; - Gruvin9xPhaseData_v106 phaseData[G9X_MAX_PHASES]; + Gruvin9xPhaseData_v106 phaseData[G9X_MAX_FLIGHT_MODES]; Gruvin9xFrSkyData frsky; operator ModelData(); diff --git a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp index 6ec5f402d..c69aa61da 100644 --- a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.cpp @@ -460,7 +460,7 @@ t_Open9xGruvin9xModelData_v207::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -545,7 +545,7 @@ t_Open9xGruvin9xModelData_v208::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -634,7 +634,7 @@ t_Open9xGruvin9xModelData_v209::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -724,7 +724,7 @@ t_Open9xGruvin9xModelData_v210::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -811,7 +811,7 @@ t_Open9xGruvin9xModelData_v211::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { diff --git a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h index 214e2ef6d..5ae1d0377 100644 --- a/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h +++ b/companion/src/firmwares/opentx/open9xGruvin9xeeprom.h @@ -197,7 +197,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v207 { Open9xGruvin9xLogicalSwitchData_v207 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v208 swashR; - Open9xGruvin9xPhaseData_v207 phaseData[O9X_MAX_PHASES]; + Open9xGruvin9xPhaseData_v207 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v205 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -231,7 +231,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v208 { Open9xGruvin9xLogicalSwitchData_v207 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v208 swashR; - Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; + Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v208 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -270,7 +270,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v209 { Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v209 swashR; - Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; + Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v208 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -310,7 +310,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v210 { Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v209 swashR; - Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; + Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES]; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -348,7 +348,7 @@ PACK(typedef struct t_Open9xGruvin9xModelData_v211 { Open9xGruvin9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xGruvin9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xGruvin9xSwashRingData_v209 swashR; - Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_PHASES]; + Open9xGruvin9xPhaseData_v208 phaseData[O9X_MAX_FLIGHT_MODES]; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; diff --git a/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp b/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp index d50b42cf0..2ea5bfbe1 100644 --- a/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xSky9xeeprom.cpp @@ -767,7 +767,7 @@ t_Open9xArmModelData_v208::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -856,7 +856,7 @@ t_Open9xArmModelData_v209::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -946,7 +946,7 @@ t_Open9xArmModelData_v210::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1030,7 +1030,7 @@ t_Open9xArmModelData_v211::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1117,7 +1117,7 @@ t_Open9xArmModelData_v212::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { diff --git a/companion/src/firmwares/opentx/open9xSky9xeeprom.h b/companion/src/firmwares/opentx/open9xSky9xeeprom.h index fdb3974ee..036f9f786 100644 --- a/companion/src/firmwares/opentx/open9xSky9xeeprom.h +++ b/companion/src/firmwares/opentx/open9xSky9xeeprom.h @@ -19,7 +19,7 @@ #include "open9xStockeeprom.h" -#define O9X_ARM_MAX_PHASES 9 +#define O9X_ARM_MAX_FLIGHT_MODES 9 #define O9X_ARM_MAX_MIXERS 64 #define O9X_ARM_MAX_EXPOS 32 #define O9X_ARM_NUM_CHNOUT 32 // number of real output channels CH1-CH16 @@ -346,7 +346,7 @@ PACK(typedef struct t_Open9xArmModelData_v208 { Open9xArmLogicalSwitchData_v208 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v208 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v208 swashR; - Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; + Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES]; Open9xFrSkyData_v208 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -385,7 +385,7 @@ PACK(typedef struct t_Open9xArmModelData_v209 { Open9xArmLogicalSwitchData_v209 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v208 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v209 swashR; - Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; + Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES]; Open9xFrSkyData_v208 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -425,7 +425,7 @@ PACK(typedef struct t_Open9xArmModelData_v210 { Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v210 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v209 swashR; - Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; + Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES]; Open9xArmFrSkyData_v210 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -464,7 +464,7 @@ PACK(typedef struct t_Open9xArmModelData_v211 { Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v211 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v209 swashR; - Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_PHASES]; + Open9xArmPhaseData_v208 phaseData[O9X_ARM_MAX_FLIGHT_MODES]; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -502,7 +502,7 @@ PACK(typedef struct t_Open9xArmModelData_v212 { Open9xArmLogicalSwitchData_v210 customSw[O9X_ARM_NUM_CSW]; Open9xArmFuncSwData_v211 funcSw[O9X_ARM_NUM_FSW]; Open9xArmSwashRingData_v210 swashR; - Open9xArmPhaseData_v212 phaseData[O9X_ARM_MAX_PHASES]; + Open9xArmPhaseData_v212 phaseData[O9X_ARM_MAX_FLIGHT_MODES]; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; diff --git a/companion/src/firmwares/opentx/open9xStockeeprom.cpp b/companion/src/firmwares/opentx/open9xStockeeprom.cpp index 8c8d1abc3..e44d4fb26 100644 --- a/companion/src/firmwares/opentx/open9xStockeeprom.cpp +++ b/companion/src/firmwares/opentx/open9xStockeeprom.cpp @@ -948,7 +948,7 @@ t_Open9xModelData_v201::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1022,7 +1022,7 @@ t_Open9xModelData_v202::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1098,7 +1098,7 @@ t_Open9xModelData_v203::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1172,7 +1172,7 @@ t_Open9xModelData_v204::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1251,7 +1251,7 @@ t_Open9xModelData_v205::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1337,7 +1337,7 @@ t_Open9xModelData_v208::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1430,7 +1430,7 @@ t_Open9xModelData_v209::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1524,7 +1524,7 @@ t_Open9xModelData_v210::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { @@ -1612,7 +1612,7 @@ t_Open9xModelData_v211::operator ModelData () c9x.moduleData[0].ppmPulsePol = pulsePol; c9x.extendedLimits = extendedLimits; c9x.extendedTrims = extendedTrims; - for (int i=0; i 500) { diff --git a/companion/src/firmwares/opentx/open9xStockeeprom.h b/companion/src/firmwares/opentx/open9xStockeeprom.h index 8f121441e..41ad29c01 100644 --- a/companion/src/firmwares/opentx/open9xStockeeprom.h +++ b/companion/src/firmwares/opentx/open9xStockeeprom.h @@ -482,7 +482,7 @@ PACK(typedef struct t_Open9xTimerDataExtra { }) Open9xTimerDataExtra; #define O9X_MAX_TIMERS 2 -#define O9X_MAX_PHASES 5 +#define O9X_MAX_FLIGHT_MODES 5 #define O9X_MAX_MIXERS 32 #define O9X_MAX_EXPOS 14 #define O9X_NUM_CHNOUT 16 // number of real output channels CH1-CH16 @@ -520,7 +520,7 @@ PACK(typedef struct t_Open9xModelData_v201 { Open9xSafetySwData safetySw[O9X_NUM_CHNOUT]; Open9xFuncSwData_v201 funcSw[12]; Open9xSwashRingData_v208 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v201 frsky; operator ModelData(); @@ -551,7 +551,7 @@ PACK(typedef struct t_Open9xModelData_v202 { Open9xSafetySwData safetySw[O9X_NUM_CHNOUT]; Open9xFuncSwData_v201 funcSw[12]; Open9xSwashRingData_v208 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v202 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -584,7 +584,7 @@ PACK(typedef struct t_Open9xModelData_v203 { Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v202 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -617,7 +617,7 @@ PACK(typedef struct t_Open9xModelData_v204 { Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v204 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -650,7 +650,7 @@ PACK(typedef struct t_Open9xModelData_v205 { Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v205 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -685,7 +685,7 @@ PACK(typedef struct t_Open9xModelData_v208 { Open9xLogicalSwitchData_v208 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v208 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v208 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -724,7 +724,7 @@ PACK(typedef struct t_Open9xModelData_v209 { Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v203 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v209 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; Open9xFrSkyData_v208 frsky; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -764,7 +764,7 @@ PACK(typedef struct t_Open9xModelData_v210 { Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v209 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; @@ -802,7 +802,7 @@ PACK(typedef struct t_Open9xModelData_v211 { Open9xLogicalSwitchData_v209 customSw[O9X_NUM_CSW]; Open9xFuncSwData_v210 funcSw[O9X_NUM_FSW]; Open9xSwashRingData_v209 swashR; - Open9xPhaseData_v201 phaseData[O9X_MAX_PHASES]; + Open9xPhaseData_v201 phaseData[O9X_MAX_FLIGHT_MODES]; int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments uint8_t thrTraceSrc; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 911734919..5b0ba85b7 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -15,7 +15,7 @@ #define MAX_SWITCHES(board) (IS_TARANIS(board) ? 8 : 7) #define MAX_SWITCHES_POSITION(board) (IS_TARANIS(board) ? 22 : 9) #define MAX_ROTARY_ENCODERS(board) (board==BOARD_GRUVIN9X ? 2 : (board==BOARD_SKY9X ? 1 : 0)) -#define MAX_PHASES(board, version) (IS_ARM(board) ? 9 : (IS_DBLRAM(board, version) ? 6 : 5)) +#define MAX_FLIGHT_MODES(board, version) (IS_ARM(board) ? 9 : (IS_DBLRAM(board, version) ? 6 : 5)) #define MAX_MIXERS(board, version) (IS_ARM(board) ? 64 : 32) #define MAX_CHANNELS(board, version) (IS_ARM(board) ? 32 : 16) #define MAX_EXPOS(board, version) (IS_ARM(board) ? ((IS_TARANIS(board) && version >= 216) ? 64 : 32) : (IS_DBLRAM(board, version) ? 16 : 14)) @@ -91,6 +91,13 @@ class SwitchesConversionTable: public ConversionTable { addConversion(RawSwitch(SWITCH_TYPE_ON), val++); } + if (IS_ARM(board)) { + for (int i=1; i<=MAX_FLIGHT_MODES(board, version); i++) { + addConversion(RawSwitch(SWITCH_TYPE_FLIGHT_MODE, -i), -val+offset); + addConversion(RawSwitch(SWITCH_TYPE_FLIGHT_MODE, i), val++); + } + } + if (version < 216) { // previous "moment" switches for (int i=1; i<=MAX_SWITCHES_POSITION(board); i++) { @@ -2401,7 +2408,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne internalField.Append(new AvrCustomFunctionField(modelData.funcSw[i], board, version, variant)); } internalField.Append(new HeliField(modelData.swashRingData, board, version, variant)); - for (int i=0; igetCapability(FlightPhases); i<=GetCurrentFirmware()->getCapability(FlightPhases); i++) { + for (int i=-GetCurrentFirmware()->getCapability(FlightModes); i<=GetCurrentFirmware()->getCapability(FlightModes); i++) { if (i < 0) b->addItem(QObject::tr("!Flight mode %1").arg(-i-1), i); else if (i > 0) @@ -137,7 +137,7 @@ void populatePhasesCB(QComboBox *b, int value) else b->addItem(QObject::tr("----"), 0); } - b->setCurrentIndex(value + GetCurrentFirmware()->getCapability(FlightPhases)); + b->setCurrentIndex(value + GetCurrentFirmware()->getCapability(FlightModes)); } bool gvarsEnabled() @@ -344,7 +344,7 @@ void CurveGroup::valuesChanged() void populateGvarUseCB(QComboBox *b, unsigned int phase) { b->addItem(QObject::tr("Own value")); - for (int i=0; igetCapability(FlightPhases); i++) { + for (int i=0; igetCapability(FlightModes); i++) { if (i != (int)phase) { b->addItem(QObject::tr("Flight mode %1 value").arg(i)); } @@ -400,6 +400,13 @@ void populateSwitchCB(QComboBox *b, const RawSwitch & value, const GeneralSettin b->clear(); if (attr & POPULATE_ONOFF) { + if (IS_ARM(GetCurrentFirmware()->getBoard())) { + for (int i=-GetCurrentFirmware()->getCapability(FlightModes); i<0; i++) { + item = RawSwitch(SWITCH_TYPE_FLIGHT_MODE, i); + b->addItem(item.toString(), item.toValue()); + if (item == value) b->setCurrentIndex(b->count()-1); + } + } item = RawSwitch(SWITCH_TYPE_OFF); b->addItem(item.toString(), item.toValue()); if (item == value) b->setCurrentIndex(b->count()-1); @@ -490,6 +497,13 @@ void populateSwitchCB(QComboBox *b, const RawSwitch & value, const GeneralSettin item = RawSwitch(SWITCH_TYPE_ON); b->addItem(item.toString(), item.toValue()); if (item == value) b->setCurrentIndex(b->count()-1); + if (IS_ARM(GetCurrentFirmware()->getBoard())) { + for (int i=1; i<=GetCurrentFirmware()->getCapability(FlightModes); i++) { + item = RawSwitch(SWITCH_TYPE_FLIGHT_MODE, i); + b->addItem(item.toString(), item.toValue()); + if (item == value) b->setCurrentIndex(b->count()-1); + } + } } b->setMaxVisibleItems(10); @@ -835,7 +849,7 @@ QString getProtocol(ModelData * g_model) QString getPhasesStr(unsigned int phases, ModelData & model) { - int numphases = GetCurrentFirmware()->getCapability(FlightPhases); + int numphases = GetCurrentFirmware()->getCapability(FlightModes); if (numphases && phases) { QString str; diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 51de7cc69..c95d34d6e 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -329,8 +329,14 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) if (modified) model.funcSw[i].param = fswtchParam[i]->value(); fswtchParam[i]->setDecimals(0); fswtchParam[i]->setSingleStep(1); - fswtchParam[i]->setMinimum(-125); - fswtchParam[i]->setMaximum(125); + if (IS_ARM(GetEepromInterface()->getBoard())) { + fswtchParam[i]->setMinimum(-500); + fswtchParam[i]->setMaximum(500); + } + else { + fswtchParam[i]->setMinimum(-125); + fswtchParam[i]->setMaximum(125); + } fswtchParam[i]->setValue(model.funcSw[i].param); widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM; } diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index c1a5941dd..0d66f874a 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -29,7 +29,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G ui->sideCB->setCurrentIndex(ed->mode-1); - if (!firmware->getCapability(FlightPhases)) { + if (!firmware->getCapability(FlightModes)) { ui->label_phases->hide(); for (int i=0; i<9; i++) { lb_fp[i]->hide(); @@ -44,7 +44,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G } mask <<= 1; } - for (int i=firmware->getCapability(FlightPhases); i<9;i++) { + for (int i=firmware->getCapability(FlightModes); i<9;i++) { lb_fp[i]->hide(); cb_fp[i]->hide(); } @@ -154,11 +154,11 @@ void ExpoDialog::valuesChanged() ed->phases<<=1; } ed->phases>>=1; - if (firmware->getCapability(FlightPhases)) { + if (firmware->getCapability(FlightModes)) { int zeros=0; int ones=0; int phtemp=ed->phases; - for (int i=0; igetCapability(FlightPhases); i++) { + for (int i=0; igetCapability(FlightModes); i++) { if (phtemp & 1) { ones++; } @@ -169,7 +169,7 @@ void ExpoDialog::valuesChanged() } if (zeros==1) { phtemp=ed->phases; - for (int i=0; igetCapability(FlightPhases); i++) { + for (int i=0; igetCapability(FlightModes); i++) { if ((phtemp & 1)==0) { break; } @@ -178,7 +178,7 @@ void ExpoDialog::valuesChanged() } else if (ones==1) { phtemp=ed->phases; - for (int i=0; igetCapability(FlightPhases); i++) { + for (int i=0; igetCapability(FlightModes); i++) { if (phtemp & 1) { break; } diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index fee46f2ea..e8e93fb24 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -5,7 +5,7 @@ #include #include -FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, GeneralSettings & generalSettings, FirmwareInterface * firmware): +FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseIdx, GeneralSettings & generalSettings, FirmwareInterface * firmware): ModelPanel(parent, model, generalSettings, firmware), ui(new Ui::FlightMode), phaseIdx(phaseIdx), @@ -16,7 +16,7 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera { ui->setupUi(this); - int modesCount = firmware->getCapability(FlightPhases); + int modesCount = firmware->getCapability(FlightModes); // Phase name QRegExp rx(CHAR_FOR_NAMES_REGEX); @@ -39,7 +39,7 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera } // FadeIn / FadeOut - if (firmware->getCapability(FlightPhasesHaveFades)) { + if (firmware->getCapability(FlightModesHaveFades)) { int scale = firmware->getCapability(SlowScale); int range = firmware->getCapability(SlowRange); ui->fadeIn->setMaximum(float(range)/scale); @@ -174,12 +174,12 @@ FlightMode::FlightMode(QWidget * parent, ModelData & model, int phaseIdx, Genera update(); } -FlightMode::~FlightMode() +FlightModePanel::~FlightModePanel() { delete ui; } -void FlightMode::update() +void FlightModePanel::update() { ui->name->setText(phase.name); @@ -232,7 +232,7 @@ void FlightMode::update() } } -void FlightMode::phaseName_editingFinished() +void FlightModePanel::phaseName_editingFinished() { QLineEdit *lineEdit = qobject_cast(sender()); strcpy(phase.name, lineEdit->text().toAscii()); @@ -240,14 +240,14 @@ void FlightMode::phaseName_editingFinished() emit nameModified(); } -void FlightMode::phaseSwitch_currentIndexChanged(int index) +void FlightModePanel::phaseSwitch_currentIndexChanged(int index) { QComboBox *comboBox = qobject_cast(sender()); phase.swtch = RawSwitch(comboBox->itemData(index).toInt()); emit modified(); } -void FlightMode::phaseFadeIn_editingFinished() +void FlightModePanel::phaseFadeIn_editingFinished() { QDoubleSpinBox *spinBox = qobject_cast(sender()); int scale = firmware->getCapability(SlowScale); @@ -255,7 +255,7 @@ void FlightMode::phaseFadeIn_editingFinished() emit modified(); } -void FlightMode::phaseFadeOut_editingFinished() +void FlightModePanel::phaseFadeOut_editingFinished() { QDoubleSpinBox *spinBox = qobject_cast(sender()); int scale = firmware->getCapability(SlowScale); @@ -263,7 +263,7 @@ void FlightMode::phaseFadeOut_editingFinished() emit modified(); } -void FlightMode::trimUpdate(unsigned int trim) +void FlightModePanel::trimUpdate(unsigned int trim) { lock = true; int chn = CONVERT_MODE(trim+1)-1; @@ -283,7 +283,7 @@ void FlightMode::trimUpdate(unsigned int trim) lock = false; } -void FlightMode::phaseGVValue_editingFinished() +void FlightModePanel::phaseGVValue_editingFinished() { if (!lock) { QSpinBox *spinBox = qobject_cast(sender()); @@ -293,7 +293,7 @@ void FlightMode::phaseGVValue_editingFinished() } } -void FlightMode::GVName_editingFinished() +void FlightModePanel::GVName_editingFinished() { if (!lock) { QLineEdit *lineedit = qobject_cast(sender()); @@ -304,7 +304,7 @@ void FlightMode::GVName_editingFinished() } } -void FlightMode::GVSource_currentIndexChanged(int index) +void FlightModePanel::GVSource_currentIndexChanged(int index) { QComboBox *comboBox = qobject_cast(sender()); int gvar = comboBox->property("index").toInt(); @@ -312,7 +312,7 @@ void FlightMode::GVSource_currentIndexChanged(int index) emit modified(); } -void FlightMode::phaseGVUse_currentIndexChanged(int index) +void FlightModePanel::phaseGVUse_currentIndexChanged(int index) { if (!lock) { lock = true; @@ -330,14 +330,14 @@ void FlightMode::phaseGVUse_currentIndexChanged(int index) } } -void FlightMode::phaseGVPopupToggled(bool checked) +void FlightModePanel::phaseGVPopupToggled(bool checked) { QCheckBox *cb = qobject_cast(sender()); int gvar = cb->property("index").toInt(); model.gvars_popups[gvar] = checked; } -void FlightMode::phaseREValue_editingFinished() +void FlightModePanel::phaseREValue_editingFinished() { if (!lock) { QSpinBox *spinBox = qobject_cast(sender()); @@ -347,7 +347,7 @@ void FlightMode::phaseREValue_editingFinished() } } -void FlightMode::phaseREUse_currentIndexChanged(int index) +void FlightModePanel::phaseREUse_currentIndexChanged(int index) { if (!lock) { lock = true; @@ -365,7 +365,7 @@ void FlightMode::phaseREUse_currentIndexChanged(int index) } } -void FlightMode::phaseTrimUse_currentIndexChanged(int index) +void FlightModePanel::phaseTrimUse_currentIndexChanged(int index) { if (!lock) { QComboBox *comboBox = qobject_cast(sender()); @@ -387,7 +387,7 @@ void FlightMode::phaseTrimUse_currentIndexChanged(int index) } } -void FlightMode::phaseTrim_valueChanged() +void FlightModePanel::phaseTrim_valueChanged() { if (!lock) { QSpinBox *spinBox = qobject_cast(sender()); @@ -402,7 +402,7 @@ void FlightMode::phaseTrim_valueChanged() } } -void FlightMode::phaseTrimSlider_valueChanged() +void FlightModePanel::phaseTrimSlider_valueChanged() { if (!lock) { QSlider *slider = qobject_cast(sender()); @@ -419,14 +419,14 @@ void FlightMode::phaseTrimSlider_valueChanged() /**********************************************************/ -FlightModes::FlightModes(QWidget * parent, ModelData & model, GeneralSettings & generalSettings, FirmwareInterface * firmware): +FlightModesPanel::FlightModesPanel(QWidget * parent, ModelData & model, GeneralSettings & generalSettings, FirmwareInterface * firmware): ModelPanel(parent, model, generalSettings, firmware), - modesCount(firmware->getCapability(FlightPhases)) + modesCount(firmware->getCapability(FlightModes)) { QGridLayout * gridLayout = new QGridLayout(this); tabWidget = new QTabWidget(this); for (int i=0; isetProperty("index", i); panels << tab; connect(tab, SIGNAL(modified()), this, SLOT(onPhaseModified())); @@ -437,16 +437,16 @@ FlightModes::FlightModes(QWidget * parent, ModelData & model, GeneralSettings & connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(on_tabWidget_currentChanged(int))); } -FlightModes::~FlightModes() +FlightModesPanel::~FlightModesPanel() { } -void FlightModes::onPhaseModified() +void FlightModesPanel::onPhaseModified() { emit modified(); } -QString FlightModes::getTabName(int index) +QString FlightModesPanel::getTabName(int index) { QString result = tr("Flight Mode %1").arg(index); const char *name = model.phaseData[index].name; @@ -460,18 +460,18 @@ QString FlightModes::getTabName(int index) return result; } -void FlightModes::onPhaseNameChanged() +void FlightModesPanel::onPhaseNameChanged() { int index = sender()->property("index").toInt(); tabWidget->setTabText(index, getTabName(index)); } -void FlightModes::update() +void FlightModesPanel::update() { on_tabWidget_currentChanged(tabWidget->currentIndex()); } -void FlightModes::on_tabWidget_currentChanged(int index) +void FlightModesPanel::on_tabWidget_currentChanged(int index) { panels[index]->update(); } diff --git a/companion/src/modeledit/flightmodes.h b/companion/src/modeledit/flightmodes.h index 618040f4b..e2127ac5c 100644 --- a/companion/src/modeledit/flightmodes.h +++ b/companion/src/modeledit/flightmodes.h @@ -13,13 +13,13 @@ namespace Ui { class FlightMode; } -class FlightMode : public ModelPanel +class FlightModePanel : public ModelPanel { Q_OBJECT public: - FlightMode(QWidget *parent, ModelData &model, int modeIdx, GeneralSettings & generalSettings, FirmwareInterface * firmware); - virtual ~FlightMode(); + FlightModePanel(QWidget *parent, ModelData &model, int modeIdx, GeneralSettings & generalSettings, FirmwareInterface * firmware); + virtual ~FlightModePanel(); virtual void update(); @@ -61,13 +61,13 @@ class FlightMode : public ModelPanel }; -class FlightModes : public ModelPanel +class FlightModesPanel : public ModelPanel { Q_OBJECT public: - FlightModes(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, FirmwareInterface * firmware); - virtual ~FlightModes(); + FlightModesPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, FirmwareInterface * firmware); + virtual ~FlightModesPanel(); virtual void update(); @@ -80,7 +80,7 @@ class FlightModes : public ModelPanel int modesCount; QTabWidget *tabWidget; QString getTabName(int index); - QVector panels; + QVector panels; }; diff --git a/companion/src/modeledit/mixerdialog.cpp b/companion/src/modeledit/mixerdialog.cpp index 4423df656..c1a7fc4cb 100644 --- a/companion/src/modeledit/mixerdialog.cpp +++ b/companion/src/modeledit/mixerdialog.cpp @@ -55,7 +55,7 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, G ui->mixerName->setValidator(new QRegExpValidator(rx, this)); ui->mixerName->setText(md->name); - if (!firmware->getCapability(FlightPhases)) { + if (!firmware->getCapability(FlightModes)) { ui->label_phases->hide(); for (int i=0; i<9; i++) { lb_fp[i]->hide(); @@ -70,7 +70,7 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, G } mask <<= 1; } - for (int i=firmware->getCapability(FlightPhases); i<9;i++) { + for (int i=firmware->getCapability(FlightModes); i<9;i++) { lb_fp[i]->hide(); cb_fp[i]->hide(); } diff --git a/companion/src/modeledit/modeledit.cpp b/companion/src/modeledit/modeledit.cpp index 0bccd5512..a7c9cfbcd 100644 --- a/companion/src/modeledit/modeledit.cpp +++ b/companion/src/modeledit/modeledit.cpp @@ -29,7 +29,7 @@ ModelEdit::ModelEdit(QWidget * parent, RadioData & radioData, int modelId, Firmw SetupPanel * setupPanel = new SetupPanel(this, model, generalSettings, firmware); addTab(setupPanel, tr("Setup")); addTab(new HeliPanel(this, model, generalSettings, firmware), tr("Heli")); - addTab(new FlightModes(this, model, generalSettings, firmware), tr("Flight Modes")); + addTab(new FlightModesPanel(this, model, generalSettings, firmware), tr("Flight Modes")); addTab(new InputsPanel(this, model, generalSettings, firmware), tr("Inputs")); addTab(new MixesPanel(this, model, generalSettings, firmware), tr("Mixes")); Channels * chnPanel = new Channels(this, model, generalSettings, firmware); diff --git a/companion/src/printdialog.cpp b/companion/src/printdialog.cpp index 6c2b51bf9..e347fbd94 100644 --- a/companion/src/printdialog.cpp +++ b/companion/src/printdialog.cpp @@ -1,874 +1,873 @@ -#include "printdialog.h" -#include "ui_printdialog.h" -#include "helpers.h" -#include "eeprominterface.h" -#include -#include -#include -#include - -#if !defined WIN32 && defined __GNUC__ -#include -#endif - -#define ISIZE 200 // curve image size -#define ISIZEW 400 // curve image size - -PrintDialog::PrintDialog(QWidget *parent, FirmwareInterface * firmware, GeneralSettings *gg, ModelData *gm, QString filename) : - QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - firmware(firmware), - g_eeGeneral(gg), - g_model(gm), - printfilename(filename), - ui(new Ui::PrintDialog), - gvars(gvarsEnabled()), - gvarnum (0) -{ - if (gvars) { - gvarnum=firmware->getCapability(Gvars); - } - - ui->setupUi(this); - this->setWindowIcon(CompanionIcon("print.png")); - te = ui->textEdit; - - setWindowTitle(tr("Setup for: ") + g_model->name); - te->clear(); - QString modelname=g_model->name; - if (modelname.isEmpty()) { - curvefile5=QString("%1/curve5.png").arg(qd->tempPath()); - curvefile9=QString("%1/curve9.png").arg(qd->tempPath()); - } - else { - curvefile5=QString("%1/%2-curve5.png").arg(qd->tempPath()).arg(modelname); - curvefile9=QString("%1/%2-curve9.png").arg(qd->tempPath()).arg(modelname); - } - printSetup(); - if (gvars) { - te->append(printPhases()+"
"); - } - printInputs(); - printMixes(); - printLimits(); - printCurves(); - printGvars(); - printSwitches(); - printFSwitches(); - printFrSky(); - - te->scrollToAnchor("1"); - if (!printfilename.isEmpty()) { - printToFile(); - QTimer::singleShot(0, this, SLOT(autoClose())); - } -} - -void PrintDialog::closeEvent(QCloseEvent *event) -{ - if (printfilename.isEmpty()) { - QByteArray ba = curvefile5.toLatin1(); - char *name = ba.data(); - unlink(name); - ba = curvefile9.toLatin1(); - name = ba.data(); - unlink(name); - } -} - -PrintDialog::~PrintDialog() -{ - delete ui; -} - -QString doTC(const QString s, const QString color="", bool bold=false) -{ - QString str = s; - if(bold) str = "" + str + ""; - if(!color.isEmpty()) str = "" + str + ""; - return "
" + str + "" + str + "" + str + "
"; - str.append(QString(""); - if (!gvars) { - str.append(""); - } - str.append("

").arg((firmware->getCapability(FlightPhases) && !gvars) ? 2 : 1)); - str.append(g_model->name); - str.append(" ("); - str.append(firmware->getEepromInterface()->getName()); - str.append(")

"+tr("printed on: %1").arg(QDateTime::currentDateTime().toString(Qt::SystemLocaleShortDate))+"
"); - str.append(""); - str.append("

"+tr("General Model Settings")+"

"); - str.append(fv(tr("Name"), g_model->name)); - str.append(fv(tr("EEprom Size"), QString("%1").arg(firmware->getEepromInterface()->getSize(*g_model)))); - str.append(fv(tr("Timer1"), getTimerStr(g_model->timers[0]))); //value, mode, count up/down - str.append(fv(tr("Timer2"), getTimerStr(g_model->timers[1]))); //value, mode, count up/down - str.append(fv(tr("Protocol"), getProtocol(g_model))); //proto, numch, delay, - str.append(fv(tr("Pulse Polarity"), g_model->moduleData[0].ppmPulsePol ? "NEG" : "POS")); - str.append(fv(tr("Throttle Trim"), g_model->thrTrim ? tr("Enabled") : tr("Disabled"))); - str.append(fv(tr("Throttle Expo"), g_model->thrExpo ? tr("Enabled") : tr("Disabled"))); - // TODO str.append(fv(tr("Trim Switch"), getSWName(g_model->trimSw))); - str.append(fv(tr("Trim Increment"), getTrimInc(g_model))); - str.append(fv(tr("Center Beep"), getCenterBeep(g_model))); // specify which channels beep - str.append("
"); - str.append(printPhases()); - str.append("

"); - te->append(str); -} - -QString PrintDialog::printPhases() -{ - QString str=""; - str.append(QString(""); - str.append(""); - if (gvars) { - str.append(QString(""); - } - if (firmware->getCapability(RotaryEncoders)) { - str.append(QString(""); - } - str.append(""); - QString labels[] = { tr("Rud"), tr("Ele"), tr("Thr"), tr("Ail") }; // TODO is elsewhere for sure - for (int i=0; i<4; i++) { - GeneralSettings generalSettings = *g_eeGeneral; - str.append(QString("").arg(labels[CONVERT_MODE(i+1)-1])); - } - if (gvars) { - for (unsigned int i=0; iGV%1
%2").arg(i+1).arg(g_model->gvars_names[i])); - } - } - for (int i=0; igetCapability(RotaryEncoders); i++) { - str.append(QString("
").arg((i==0 ? 'A': 'B'))); - } - str.append(""); - - for (int i=0; igetCapability(FlightPhases); i++) { - PhaseData *pd=&g_model->phaseData[i]; - str.append("").arg(i).arg(pd->name)); - str.append(QString("").arg((qreal)pd->fadeIn/firmware->getCapability(SlowScale))); - str.append(QString("").arg((qreal)pd->fadeOut/firmware->getCapability(SlowScale))); - for (int k=0; k<4; k++) { - //TODO trim values - if (pd->trimRef[k]==-1) { - str.append(QString("").arg(pd->trim[k])); - } else { - str.append("").arg(pd->trimRef[k])); - } - } - if (gvars) { - for (unsigned int k=0; kgvars[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd->gvars[k] - 1025; - if (num>=i) num++; - str.append("").arg(num)); - } - } - } - for (int k=0; kgetCapability(RotaryEncoders); k++) { - if (pd->rotaryEncoders[k]<=1024) { - str.append(QString(""); - } - else { - int num = pd->rotaryEncoders[k] - 1025; - if (num>=i) num++; - str.append(QString("").arg(num)); - } - } - str.append(QString("").arg(pd->swtch.toString())); - str.append(""); - } - str.append("

").arg(!gvars ? 8+firmware->getCapability(RotaryEncoders) : 8+gvarnum+firmware->getCapability(RotaryEncoders))); - str.append(tr("Flight modes Settings")); - str.append("

 "); - str.append(tr("Fades")+""+tr("Trims")+"").arg(gvarnum)+tr("Gvars")+"").arg(firmware->getCapability(RotaryEncoders))+tr("Rot.Enc.")+""+tr("Switch")+"
"+tr("Flight mode name")); - str.append(""+tr("IN")+""+tr("OUT")+"%1RE%1
"+tr("FM")+QString("%1 %2%1%1%1"+tr("FM")+QString("%1%1").arg(pd->gvars[k])+""+tr("FM")+QString("%1%1").arg(pd->rotaryEncoders[k])+"")+tr("FM")+QString("%1%1
"); - return(str); -} - -void PrintDialog::printInputs() -{ - QString str = "

"; - str.append(tr("Inputs")); - str.append("

"); - int ec=0; - unsigned int lastCHN = 255; - for(int i=0; iexpoData[i]; - if(ed->mode==0) - continue; - ec++; - str.append(""); - str.append(""; - } - str += "
"); - if(lastCHN!=ed->chn) { - lastCHN=ed->chn; - str.append(""+getInputStr(*g_model, ed->chn)+""); - } - str.append(""); - - switch(ed->mode) { - case (1): - str += "<-"; - break; - case (2): - str += "->"; - break; - default: - str += "  "; - break; - }; - - str += " " + tr("Weight") + QString("(%1)").arg(getGVarString(ed->weight,true)); - - if (firmware->getCapability(VirtualInputs)) { - str += " " + tr("Source") + QString("(%1)").arg(ed->srcRaw.toString()); - if (ed->carryTrim>0) str += " " + tr("NoTrim"); - else if (ed->carryTrim<0) str += " " + RawSource(SOURCE_TYPE_TRIM, (-(ed->carryTrim)-1)).toString(); - } - if (ed->curve.value) str += " " + Qt::escape(ed->curve.toString()); - - if (firmware->getCapability(FlightPhases)) { - if(ed->phases) { - if (ed->phases!=(unsigned int)(1<getCapability(FlightPhases))-1) { - unsigned int mask=1; - bool first = true; - bool multiple = false; - QString strPhases; - for (int j=0; jgetCapability(FlightPhases);j++) { - if (!(ed->phases & mask)) { - //PhaseData *pd = &g_model->phaseData[j]; - const char * pdName = g_model->phaseData[j].name; - if (first) { - strPhases += Qt::escape(QString("%1").arg(getPhaseName(j+1,pdName))); - first = false; - } else { - strPhases += Qt::escape(QString(", %1").arg(getPhaseName(j+1, pdName))); - multiple = true; - } - } - mask <<= 1; - } - if (!strPhases.isEmpty()) { - str += " " + tr(multiple?"Flight modes":"Flight mode") + "(" + strPhases + ")"; - } - } else { - str += tr("DISABLED")+QString(" !!!"); - } - } - } - if (ed->swtch.type) str += " " + tr("Switch") + QString("(%1)").arg(ed->swtch.toString()); - if (firmware->getCapability(HasExpoNames) && ed->name[0]) str += Qt::escape(QString(" [%1]").arg(ed->name)); - str += "

"; - if (ec>0) - te->append(str); -} - - -void PrintDialog::printMixes() -{ - QString str = "

"; - str.append(tr("Mixers")); - str.append("

"); - - unsigned int lastCHN = 255; - for(int i=0; igetCapability(Mixes); i++) { - MixData *md = &g_model->mixData[i]; - if(!md->destCh || md->destCh>(unsigned int)firmware->getCapability(Outputs) ) break; - str.append(""); - str.append(""); - } - str.append("
"); - if(lastCHN!=md->destCh) { - lastCHN=md->destCh; - - QString chname = QObject::tr("CH%1").arg(lastCHN); - // TODO not nice, Qt brings a function for that, I don't remember right now - (chname.length() < 4) ? chname.append(" ") : chname.append(" "); - if (firmware->getCapability(HasChNames)) { - QString name = g_model->limitData[lastCHN-1].name; - if (!name.isEmpty()) { - name = QString("(") + name + QString(")"); - } - name.append(" "); - chname += name.left(8); - } - chname = Qt::escape(chname); - str.append(chname.replace(" ", " ")); - } - else { - str.append(" "); - } - str.append(""); - switch(md->mltpx) { - case (1): str += " *"; break; - case (2): str += " R"; break; - default: str += "  "; break; - }; - //set mixer src model if it is unset (srcRaw needs this to generate proper toString() for input source type) - if (md->srcRaw.model == 0) - md->srcRaw.model = g_model; - str += " " + md->srcRaw.toString(); - - str += " " + Qt::escape(tr("Weight(%1)").arg(getGVarString(md->weight, true))); - - QString phasesStr = getPhasesStr(md->phases, *g_model); - if (!phasesStr.isEmpty()) str += " " + Qt::escape(phasesStr); - - if (md->swtch.type != SWITCH_TYPE_NONE) { - str += " " + Qt::escape(tr("Switch(%1)").arg(md->swtch.toString())); - } - - if (md->carryTrim) { - str += " " + Qt::escape(tr("NoTrim")); - } - - if (md->noExpo) str += " " + Qt::escape(tr("No DR/Expo")); - if (md->sOffset) str += " " + Qt::escape(tr("Offset(%1)").arg(getGVarString(md->sOffset))); - if (md->curve.value) str += " " + Qt::escape(md->curve.toString()); - - - int scale = firmware->getCapability(SlowScale); - if (scale == 0) - scale = 1; - if (md->delayDown || md->delayUp) - str += Qt::escape(tr(" Delay(u%1:d%2)").arg((double)md->delayUp/scale).arg((double)md->delayDown/scale)); - if (md->speedDown || md->speedUp) - str += Qt::escape(tr(" Slow(u%1:d%2)").arg((double)md->speedUp/scale).arg((double)md->speedDown/scale)); - if (md->mixWarn) str += Qt::escape(tr(" Warn(%1)").arg(md->mixWarn)); - if (firmware->getCapability(HasMixerNames)) { - QString MixerName; - MixerName.append(md->name); - if (!MixerName.isEmpty()) { - str += " " + Qt::escape(QString("(%1)").arg(MixerName)); - } - } - str.append("

"); - te->append(str); -} - -void PrintDialog::printLimits() -{ - QString str = ""; - int numcol; - numcol=(firmware->getCapability(Outputs)+1)>17 ? 17:firmware->getCapability(Outputs)+1; - str.append(QString(""); - str.append(""); - if (firmware->getCapability(Outputs)<17) { - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - str.append(""); - if (firmware->getCapability(HasChNames)) { - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(g_model->limitData[i].name,"green")); - } - } - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); - } - str.append(""); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); - } - str.append(""); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); - } - str.append(""); - str.append(""); - for(int i=0; igetCapability(Outputs); i++) { - str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); - } - } else { - for(int i=0; i<16; i++) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - str.append(""); - if (firmware->getCapability(HasChNames)) { - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(g_model->limitData[i].name,"green")); - } - } - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); - } - str.append(""); - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); - } - str.append(""); - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); - } - str.append(""); - str.append(""); - for(int i=0; i<16; i++) { - str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); - } - str.append(""); - str.append(QString(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); - } - str.append(""); - if (firmware->getCapability(HasChNames)) { - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(g_model->limitData[i].name,"green")); - } - } - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); - } - str.append(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); - } - str.append(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); - } - str.append(""); - str.append(""); - for(int i=16; igetCapability(Outputs); i++) { - str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); - } - } - str.append(""); - str.append("

").arg(numcol)+tr("Limits")+"

 
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
 ").arg(numcol)+"
 
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
"); - str.append("
"); - te->append(str); -} - -void PrintDialog::printCurves() -{ - int i,r,g,b,c,count; - char buffer[16]; - QPen pen(Qt::black, 2, Qt::SolidLine); - - QString str = "

"; - str.append(tr("Curves")); - str.append("

"); - int numcurves=firmware->getCapability(NumCurves); - if (numcurves==0) { - numcurves=16; - } - { - QImage qi(ISIZEW+1,ISIZEW+1,QImage::Format_RGB32); - QPainter painter(&qi); - painter.setBrush(QBrush("#FFFFFF")); - painter.setPen(QColor(0,0,0)); - painter.drawRect(0,0,ISIZEW,ISIZEW); - str.append(""+QString("
").arg(curvefile5)); - for(i=0; i"); - str.append(QString("").arg(i+1)); - if(i%2) str.append(""); - } - str.append("
").arg(buffer)+tr("Curve")+QString(" %1
"); - str.append(""); - str.append(doTC(" ")); - str.append(doTC(" ")); - int numpoint=0; - for(i=0; icurves[i].count>numpoint) - numpoint=g_model->curves[i].count; - } - for(i=0; i"); - for(i=0; i"); - int curvepoints=g_model->curves[i].count; - if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) - str.append(QString("").arg(i+1)); - else - str.append(QString("").arg(i+1)); - count=0; - for(int j=0; jcurves[i].points[j].y!=0) - count++; - } - for(int j=0; jcurves[i].points[j].y),"green")); - if (j>0 && count!=0) { - if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) - painter.drawLine(ISIZEW/2+(ISIZEW*g_model->curves[i].points[j-1].x)/200,ISIZEW/2-(ISIZEW*g_model->curves[i].points[j-1].y)/200,ISIZEW/2+(ISIZEW*g_model->curves[i].points[j].x)/200,ISIZEW/2-(ISIZEW*g_model->curves[i].points[j].y)/200); - else - painter.drawLine(ISIZEW*(j-1)/(curvepoints-1),ISIZEW/2-(ISIZEW*g_model->curves[i].points[j-1].y)/200,ISIZEW*(j)/(curvepoints-1),ISIZEW/2-(ISIZEW*g_model->curves[i].points[j].y)/200); - } - } - for(int j=curvepoints; j"); - if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) { - str.append(""); - for(int j=0; jcurves[i].points[j].x),"green")); - } - for(int j=curvepoints; j"); - } - } - str.append("
").arg(buffer)+tr("Curve")+QString(" %1Y").arg(buffer)+tr("Curve")+QString(" %1Y
X
"); - str.append("
"); - painter.setPen(QColor(0,0,0)); - painter.drawLine(0,ISIZEW/2,ISIZEW,ISIZEW/2); - painter.drawLine(ISIZEW/2,0,ISIZEW/2,ISIZEW); - for(i=0; i<21; i++) { - painter.drawLine(ISIZEW/2-5,(ISIZEW*i)/(20),ISIZEW/2+5,(ISIZEW*i)/(20)); - painter.drawLine((ISIZEW*i)/(20),ISIZEW/2-5,(ISIZEW*i)/(20),ISIZEW/2+5); - } - - qi.save(curvefile5, "png",100); - - } - te->append(str); -} - -void PrintDialog::printSwitches() -{ - int sc=0; - QString str = ""; - str.append(""); - str.append("

"+tr("Logical Switches")+"

"); - - for (int i=0; igetCapability(LogicalSwitches); i++) { - if (g_model->customSw[i].func) { - str.append(""); - str.append("").arg(i+1)); - QString tstr = g_model->customSw[i].toString(*g_model); - str.append(doTL(tstr,"green")); - str.append(""); - sc++; - } - } - str.append("
"+tr("L")+QString("%1
"); - str.append("
"); - if (sc!=0) - te->append(str); -} - -void PrintDialog::printGvars() -{ - if (!firmware->getCapability(GvarsFlightPhases) && (gvars && firmware->getCapability(Gvars))) { - QString str = ""; - str.append(""); - str.append("

"+tr("Global Variables")+"

"); - PhaseData *pd=&g_model->phaseData[0]; - int width=100/gvarnum; - str.append(""); - for(unsigned int i=0; i").arg(width)+tr("GV")+QString("%1").arg(i+1)); - } - str.append(""); - str.append(""); - for(unsigned int i=0; i").arg(width)+QString("%1").arg(pd->gvars[i])); - } - str.append(""); - str.append("
"); - str.append("
"); - te->append(str); - } -} - -void PrintDialog::printFSwitches() -{ - int sc=0; - QString str = ""; - str.append(""); - str.append("

"+tr("Special Functions")+"

"); - str.append(""); - str.append(doTL(tr("Switch"), "", true)); - str.append(doTL(tr("Function"), "", true)); - str.append(doTL(tr("Parameter"), "", true)); - str.append(doTL(tr("Repeat"), "", true)); - str.append(doTL(tr("Enabled"), "", true)); - str.append(""); - for(int i=0; igetCapability(CustomFunctions); i++) { - if (g_model->funcSw[i].swtch.type!=SWITCH_TYPE_NONE) { - str.append(""); - str.append(doTL(tr("SF%1").arg(i+1),"", true)); - str.append(doTL(g_model->funcSw[i].swtch.toString(),"green")); - str.append(doTL(g_model->funcSw[i].funcToString(),"green")); - str.append(doTL(g_model->funcSw[i].paramToString(),"green")); - int index=g_model->funcSw[i].func; - if ((g_model->funcSw[i].repeatParam>0) && - (index==FuncPlaySound || index==FuncPlayHaptic || index==FuncPlayValue || index==FuncPlayPrompt || index==FuncPlayBoth || index==FuncBackgroundMusic)) { - str.append(doTL(QString("%1").arg(g_model->funcSw[i].repeatParam),"green")); - } else { - str.append(doTL( " ","green")); - } - if ((index<=FuncInstantTrim) || (index>FuncBackgroundMusicPause)) { - str.append(doTL((g_model->funcSw[i].enabled ? "ON" : "OFF"),"green")); - } else { - str.append(doTL( "---","green")); - } - str.append(""); - sc++; - } - } - str.append("
#
"); - str.append("
"); - if (sc!=0) - te->append(str); -} - -void PrintDialog::printFrSky() -{ - int tc=0; - QString str = ""; - - if (IS_TARANIS(GetEepromInterface()->getBoard())) { - str.append(""); - str.append(""); - str.append(doTC(tr("Analog"),"", true)); - str.append(doTC(tr("Range"),"", true)); - str.append(doTC(tr("Offset"),"", true)); - str.append(""); - - FrSkyData *fd=&g_model->frsky; - for (int i=0; i<2; i++) { - if (fd->channels[i].ratio!=0) { - tc++; - float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); - QString unit = " " + getFrSkyUnits(fd->channels[i].type); - str.append(""); - str.append(doTL(tr("A%1").arg(i+1), "", true)); - str.append(doTC(QString::number(ratio,10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(doTC(QString::number((fd->channels[i].offset*ratio)/255,10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(""); - } - } - - str.append(""); - str.append(""); - str.append(doTC(tr("Alarms"),"", true)); - str.append(doTC(tr("Low Alarm"),"", true)); - str.append(doTC(tr("Critical Alarm"),"", true)); - str.append(""); - str.append(""); - str.append(doTL(tr("RSSI"),"", true)); - str.append(doTC(QString::number(fd->rssiAlarms[0].value,10),"green")); - str.append(doTC(QString::number(fd->rssiAlarms[1].value,10),"green")); - str.append(""); - for (int i=0; i<2; i++) { - if (fd->channels[i].ratio!=0) { - float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); - QString unit = " " + getFrSkyUnits(fd->channels[i].type); - str.append(""); - str.append(doTL(tr("A%1").arg(i+1), "", true)); - str.append(doTC(QString::number(ratio*(fd->channels[i].alarms[0].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(doTC(QString::number(ratio*(fd->channels[i].alarms[1].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); - str.append(""); - } - } - - //TODO preferrably in new tables - str.append(""); - //str.append(""); - //str.append(""); - str.append(""); - str.append("

"+tr("Telemetry Settings")+"

"+tr("Frsky serial protocol")+""+getFrSkyProtocol(fd->usrProto)+"
"+tr("Units system")+""+getFrSkyMeasure(fd->imperial)+"
"+tr("Blades")+""+QString("%1").arg(fd->blades)+"
"); - } - else { //other boards - str.append("

"+tr("Telemetry Settings")+"

"); - str.append(" "+tr("Alarm 1")+""+tr("Alarm 2")+""); - str.append(""+tr("Analog")+""+tr("Unit")+""+tr("Scale")+""+tr("Offset")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - FrSkyData *fd=&g_model->frsky; - for (int i=0; i<2; i++) { - if (fd->channels[i].ratio!=0) { - tc++; - float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); - str.append(""+tr("A%1").arg(i+1)+""+getFrSkyUnits(fd->channels[i].type)+""+QString::number(ratio,10,(fd->channels[i].type==0 ? 1:0))+""+QString::number((fd->channels[i].offset*ratio)/255,10,(fd->channels[i].type==0 ? 1:0))+""); - str.append(""+getFrSkyAlarmType(fd->channels[i].alarms[0].level)+""); - str.append(""); - str.append((fd->channels[i].alarms[0].greater==1) ? ">" : "<"); - str.append(""+QString::number(ratio*(fd->channels[i].alarms[0].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+""); - str.append(""+getFrSkyAlarmType(fd->channels[i].alarms[1].level)+""); - str.append(""); - str.append((fd->channels[i].alarms[1].greater==1) ? ">" : "<"); - str.append(""+QString::number(ratio*(fd->channels[i].alarms[1].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+""); - } - } - str.append(""); - str.append(" "+tr("Alarm 1")+""+tr("Alarm 2")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); - str.append(""+tr("RSSI Alarm")+""); - str.append(""+getFrSkyAlarmType(fd->rssiAlarms[0].level)+"<"+QString::number(fd->rssiAlarms[0].value,10)+""); - str.append(""+getFrSkyAlarmType(fd->rssiAlarms[1].level)+"<"+QString::number(fd->rssiAlarms[1].value,10)+""); - str.append(""); - str.append(""+tr("Frsky serial protocol")+""+getFrSkyProtocol(fd->usrProto)+""); - str.append(""+tr("Units system")+""+getFrSkyMeasure(fd->imperial)+""); - str.append(""+tr("Blades")+""+fd->blades+""); - str.append(""); - } -#if 0 - if (firmware->getCapability(TelemetryBars) || (firmware->getCapability(TelemetryCSFields))) { - int cols=firmware->getCapability(TelemetryColsCSFields); - if (cols==0) cols=2; - for (int j=0; jgetCapability(TelemetryCSFields)/(4*cols); j++ ) { - if (fd->screens[j].type==0) { - if (cols==2) { - str.append(""); - } else { - str.append("
"+tr("Custom Telemetry View")+"
"); - } - for (int r=0; r<4; r++) { - str.append(""); - for (int c=0; cscreens[j].body.lines[r].source[c]!=0) - tc++; - if (cols==2) { - str.append(""); - } else { - str.append(""); - } - if (c<(cols-1)) { - if (cols==2) { - str.append(""); - } else { - str.append(""); - } - } - } - str.append(""); - } - str.append("
"+tr("Custom Telemetry View")+"
"+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+""+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+"  
"); - } else { - str.append(""); - str.append(""); - for (int i=0; i<4; i++) { - if (fd->screens[j].body.bars[i].source!=0) - tc++; - // TODO str.append(""); - } - str.append("
"+tr("Telemetry Bars")+"
"+tr("Bar Number")+""+tr("Source")+""+tr("Min")+""+tr("Max")+"
"+QString::number(i+1,10)+""+getFrSkySrc(fd->screens[j].body.bars[i].source)+""+(fd->screens[j].body.bars[i].source>0 ? QString::number(getBarValue(fd->screens[j].body.bars[i].source, fd->screens[j].body.bars[i].barMin,fd)):"----")+""+(fd->screens[j].body.bars[i].source>0 ? QString::number(getBarValue(fd->screens[j].body.bars[i].source,(255-fd->screens[j].body.bars[i].barMax),fd)) :"----")+"
"); - } - } - } -#endif - if (tc>0) - te->append(str); -} - -void PrintDialog::on_printButton_clicked() -{ - QPrinter printer; - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - QPrintDialog *dialog = new QPrintDialog(&printer, this); - dialog->setWindowTitle(tr("Print Document")); - if (dialog->exec() != QDialog::Accepted) - return; - te->print(&printer); -} - -void PrintDialog::on_printFileButton_clicked() -{ - QString fn = QFileDialog::getSaveFileName(this,tr("Select PDF output file"),QString(),tr("ODF files (*.odt);;PDF Files(*.pdf);;HTML-Files (*.htm *.html);;All Files (*)")); - if (fn.isEmpty()) - return; - if (! (fn.endsWith(".odt", Qt::CaseInsensitive) || fn.endsWith(".pdf", Qt::CaseInsensitive) || fn.endsWith(".htm", Qt::CaseInsensitive) || fn.endsWith(".html", Qt::CaseInsensitive)) ) - fn += ".pdf"; // default - if (fn.endsWith(".pdf", Qt::CaseInsensitive)) { - QPrinter printer; - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setColorMode(QPrinter::Color); - printer.setOutputFileName(fn); - te->print(&printer); - } else { - QTextDocumentWriter writer(fn); - writer.write(te->document()); - } -} - -void PrintDialog::printToFile() -{ - if (printfilename.isEmpty()) - return; - if (! (printfilename.endsWith(".odt", Qt::CaseInsensitive) || printfilename.endsWith(".pdf", Qt::CaseInsensitive) || printfilename.endsWith(".htm", Qt::CaseInsensitive) || printfilename.endsWith(".html", Qt::CaseInsensitive)) ) - printfilename += ".pdf"; // default - if (printfilename.endsWith(".pdf", Qt::CaseInsensitive)) { - QPrinter printer; - printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setColorMode(QPrinter::Color); - printer.setOutputFileName(printfilename); - te->print(&printer); - } else { - QTextDocumentWriter writer(printfilename); - writer.write(te->document()); - } -} - -void PrintDialog::autoClose() -{ - this->close(); -} +#include "printdialog.h" +#include "ui_printdialog.h" +#include "helpers.h" +#include "eeprominterface.h" +#include +#include +#include +#include + +#if !defined WIN32 && defined __GNUC__ +#include +#endif + +#define ISIZE 200 // curve image size +#define ISIZEW 400 // curve image size + +PrintDialog::PrintDialog(QWidget *parent, FirmwareInterface * firmware, GeneralSettings *gg, ModelData *gm, QString filename) : + QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + firmware(firmware), + g_eeGeneral(gg), + g_model(gm), + printfilename(filename), + ui(new Ui::PrintDialog), + gvars(gvarsEnabled()), + gvarnum (0) +{ + if (gvars) { + gvarnum=firmware->getCapability(Gvars); + } + + ui->setupUi(this); + this->setWindowIcon(CompanionIcon("print.png")); + te = ui->textEdit; + + setWindowTitle(tr("Setup for: ") + g_model->name); + te->clear(); + QString modelname=g_model->name; + if (modelname.isEmpty()) { + curvefile5=QString("%1/curve5.png").arg(qd->tempPath()); + curvefile9=QString("%1/curve9.png").arg(qd->tempPath()); + } + else { + curvefile5=QString("%1/%2-curve5.png").arg(qd->tempPath()).arg(modelname); + curvefile9=QString("%1/%2-curve9.png").arg(qd->tempPath()).arg(modelname); + } + printSetup(); + if (gvars) { + te->append(printFlightModes()+"
"); + } + printInputs(); + printMixes(); + printLimits(); + printCurves(); + printGvars(); + printSwitches(); + printFSwitches(); + printFrSky(); + + te->scrollToAnchor("1"); + if (!printfilename.isEmpty()) { + printToFile(); + QTimer::singleShot(0, this, SLOT(autoClose())); + } +} + +void PrintDialog::closeEvent(QCloseEvent *event) +{ + if (printfilename.isEmpty()) { + QByteArray ba = curvefile5.toLatin1(); + char *name = ba.data(); + unlink(name); + ba = curvefile9.toLatin1(); + name = ba.data(); + unlink(name); + } +} + +PrintDialog::~PrintDialog() +{ + delete ui; +} + +QString doTC(const QString s, const QString color="", bool bold=false) +{ + QString str = s; + if(bold) str = "" + str + ""; + if(!color.isEmpty()) str = "" + str + ""; + return "" + str + ""; +} + +QString doTR(const QString s, const QString color="", bool bold=false) +{ + QString str = s; + if(bold) str = "" + str + ""; + if(!color.isEmpty()) str = "" + str + ""; + return "" + str + ""; +} + +QString doTL(const QString s, const QString color="", bool bold=false) +{ + QString str = s; + if(bold) str = "" + str + ""; + if(!color.isEmpty()) str = "" + str + ""; + return "" + str + ""; +} + +QString PrintDialog::fv(const QString name, const QString value) +{ + return "" + name + ": " + value + "
"; +} + +void PrintDialog::printSetup() +{ + QString str = ""; + str.append(QString(""); + if (!gvars) { + str.append(""); + } + str.append("

").arg((firmware->getCapability(FlightModes) && !gvars) ? 2 : 1)); + str.append(g_model->name); + str.append(" ("); + str.append(firmware->getEepromInterface()->getName()); + str.append(")

"+tr("printed on: %1").arg(QDateTime::currentDateTime().toString(Qt::SystemLocaleShortDate))+"
"); + str.append(""); + str.append("

"+tr("General Model Settings")+"

"); + str.append(fv(tr("Name"), g_model->name)); + str.append(fv(tr("EEprom Size"), QString("%1").arg(firmware->getEepromInterface()->getSize(*g_model)))); + str.append(fv(tr("Timer1"), getTimerStr(g_model->timers[0]))); //value, mode, count up/down + str.append(fv(tr("Timer2"), getTimerStr(g_model->timers[1]))); //value, mode, count up/down + str.append(fv(tr("Protocol"), getProtocol(g_model))); //proto, numch, delay, + str.append(fv(tr("Pulse Polarity"), g_model->moduleData[0].ppmPulsePol ? "NEG" : "POS")); + str.append(fv(tr("Throttle Trim"), g_model->thrTrim ? tr("Enabled") : tr("Disabled"))); + str.append(fv(tr("Throttle Expo"), g_model->thrExpo ? tr("Enabled") : tr("Disabled"))); + // TODO str.append(fv(tr("Trim Switch"), getSWName(g_model->trimSw))); + str.append(fv(tr("Trim Increment"), getTrimInc(g_model))); + str.append(fv(tr("Center Beep"), getCenterBeep(g_model))); // specify which channels beep + str.append("
"); + str.append(printFlightModes()); + str.append("

"); + te->append(str); +} + +QString PrintDialog::printFlightModes() +{ + QString str=""; + str.append(QString(""); + str.append(""); + if (gvars) { + str.append(QString(""); + } + if (firmware->getCapability(RotaryEncoders)) { + str.append(QString(""); + } + str.append(""); + QString labels[] = { tr("Rud"), tr("Ele"), tr("Thr"), tr("Ail") }; // TODO is elsewhere for sure + for (int i=0; i<4; i++) { + GeneralSettings generalSettings = *g_eeGeneral; + str.append(QString("").arg(labels[CONVERT_MODE(i+1)-1])); + } + if (gvars) { + for (unsigned int i=0; iGV%1
%2").arg(i+1).arg(g_model->gvars_names[i])); + } + } + for (int i=0; igetCapability(RotaryEncoders); i++) { + str.append(QString("
").arg((i==0 ? 'A': 'B'))); + } + str.append(""); + for (int i=0; igetCapability(FlightModes); i++) { + PhaseData *pd=&g_model->phaseData[i]; + str.append("").arg(i).arg(pd->name)); + str.append(QString("").arg((qreal)pd->fadeIn/firmware->getCapability(SlowScale))); + str.append(QString("").arg((qreal)pd->fadeOut/firmware->getCapability(SlowScale))); + for (int k=0; k<4; k++) { + //TODO trim values + if (pd->trimRef[k]==-1) { + str.append(QString("").arg(pd->trim[k])); + } else { + str.append("").arg(pd->trimRef[k])); + } + } + if (gvars) { + for (unsigned int k=0; kgvars[k]<=1024) { + str.append(QString(""); + } + else { + int num = pd->gvars[k] - 1025; + if (num>=i) num++; + str.append("").arg(num)); + } + } + } + for (int k=0; kgetCapability(RotaryEncoders); k++) { + if (pd->rotaryEncoders[k]<=1024) { + str.append(QString(""); + } + else { + int num = pd->rotaryEncoders[k] - 1025; + if (num>=i) num++; + str.append(QString("").arg(num)); + } + } + str.append(QString("").arg(pd->swtch.toString())); + str.append(""); + } + str.append("

").arg(!gvars ? 8+firmware->getCapability(RotaryEncoders) : 8+gvarnum+firmware->getCapability(RotaryEncoders))); + str.append(tr("Flight modes")); + str.append("

 "); + str.append(tr("Fades")+""+tr("Trims")+"").arg(gvarnum)+tr("Gvars")+"").arg(firmware->getCapability(RotaryEncoders))+tr("Rot.Enc.")+""+tr("Switch")+"
"+tr("Flight mode name")); + str.append(""+tr("IN")+""+tr("OUT")+"%1RE%1
"+tr("FM")+QString("%1 %2%1%1%1"+tr("FM")+QString("%1%1").arg(pd->gvars[k])+""+tr("FM")+QString("%1%1").arg(pd->rotaryEncoders[k])+"")+tr("FM")+QString("%1%1
"); + return(str); +} + +void PrintDialog::printInputs() +{ + QString str = "

"; + str.append(tr("Inputs")); + str.append("

"); + int ec=0; + unsigned int lastCHN = 255; + for(int i=0; iexpoData[i]; + if(ed->mode==0) + continue; + ec++; + str.append(""); + str.append(""; + } + str += "
"); + if(lastCHN!=ed->chn) { + lastCHN=ed->chn; + str.append(""+getInputStr(*g_model, ed->chn)+""); + } + str.append(""); + + switch(ed->mode) { + case (1): + str += "<-"; + break; + case (2): + str += "->"; + break; + default: + str += "  "; + break; + }; + + str += " " + tr("Weight") + QString("(%1)").arg(getGVarString(ed->weight,true)); + + if (firmware->getCapability(VirtualInputs)) { + str += " " + tr("Source") + QString("(%1)").arg(ed->srcRaw.toString()); + if (ed->carryTrim>0) str += " " + tr("NoTrim"); + else if (ed->carryTrim<0) str += " " + RawSource(SOURCE_TYPE_TRIM, (-(ed->carryTrim)-1)).toString(); + } + if (ed->curve.value) str += " " + Qt::escape(ed->curve.toString()); + + if (firmware->getCapability(FlightModes)) { + if(ed->phases) { + if (ed->phases!=(unsigned int)(1<getCapability(FlightModes))-1) { + unsigned int mask=1; + bool first = true; + bool multiple = false; + QString strModes; + for (int j=0; jgetCapability(FlightModes);j++) { + if (!(ed->phases & mask)) { + //PhaseData *pd = &g_model->phaseData[j]; + const char * pdName = g_model->phaseData[j].name; + if (first) { + strModes += Qt::escape(QString("%1").arg(getPhaseName(j+1,pdName))); + first = false; + } else { + strModes += Qt::escape(QString(", %1").arg(getPhaseName(j+1, pdName))); + multiple = true; + } + } + mask <<= 1; + } + if (!strModes.isEmpty()) { + str += " " + tr(multiple?"Flight modes":"Flight mode") + "(" + strModes + ")"; + } + } else { + str += tr("DISABLED")+QString(" !!!"); + } + } + } + if (ed->swtch.type) str += " " + tr("Switch") + QString("(%1)").arg(ed->swtch.toString()); + if (firmware->getCapability(HasExpoNames) && ed->name[0]) str += Qt::escape(QString(" [%1]").arg(ed->name)); + str += "

"; + if (ec>0) + te->append(str); +} + + +void PrintDialog::printMixes() +{ + QString str = "

"; + str.append(tr("Mixers")); + str.append("

"); + + unsigned int lastCHN = 255; + for(int i=0; igetCapability(Mixes); i++) { + MixData *md = &g_model->mixData[i]; + if(!md->destCh || md->destCh>(unsigned int)firmware->getCapability(Outputs) ) break; + str.append(""); + str.append(""); + } + str.append("
"); + if(lastCHN!=md->destCh) { + lastCHN=md->destCh; + + QString chname = QObject::tr("CH%1").arg(lastCHN); + // TODO not nice, Qt brings a function for that, I don't remember right now + (chname.length() < 4) ? chname.append(" ") : chname.append(" "); + if (firmware->getCapability(HasChNames)) { + QString name = g_model->limitData[lastCHN-1].name; + if (!name.isEmpty()) { + name = QString("(") + name + QString(")"); + } + name.append(" "); + chname += name.left(8); + } + chname = Qt::escape(chname); + str.append(chname.replace(" ", " ")); + } + else { + str.append(" "); + } + str.append(""); + switch(md->mltpx) { + case (1): str += " *"; break; + case (2): str += " R"; break; + default: str += "  "; break; + }; + //set mixer src model if it is unset (srcRaw needs this to generate proper toString() for input source type) + if (md->srcRaw.model == 0) + md->srcRaw.model = g_model; + str += " " + md->srcRaw.toString(); + + str += " " + Qt::escape(tr("Weight(%1)").arg(getGVarString(md->weight, true))); + + QString phasesStr = getPhasesStr(md->phases, *g_model); + if (!phasesStr.isEmpty()) str += " " + Qt::escape(phasesStr); + + if (md->swtch.type != SWITCH_TYPE_NONE) { + str += " " + Qt::escape(tr("Switch(%1)").arg(md->swtch.toString())); + } + + if (md->carryTrim) { + str += " " + Qt::escape(tr("NoTrim")); + } + + if (md->noExpo) str += " " + Qt::escape(tr("No DR/Expo")); + if (md->sOffset) str += " " + Qt::escape(tr("Offset(%1)").arg(getGVarString(md->sOffset))); + if (md->curve.value) str += " " + Qt::escape(md->curve.toString()); + + + int scale = firmware->getCapability(SlowScale); + if (scale == 0) + scale = 1; + if (md->delayDown || md->delayUp) + str += Qt::escape(tr(" Delay(u%1:d%2)").arg((double)md->delayUp/scale).arg((double)md->delayDown/scale)); + if (md->speedDown || md->speedUp) + str += Qt::escape(tr(" Slow(u%1:d%2)").arg((double)md->speedUp/scale).arg((double)md->speedDown/scale)); + if (md->mixWarn) str += Qt::escape(tr(" Warn(%1)").arg(md->mixWarn)); + if (firmware->getCapability(HasMixerNames)) { + QString MixerName; + MixerName.append(md->name); + if (!MixerName.isEmpty()) { + str += " " + Qt::escape(QString("(%1)").arg(MixerName)); + } + } + str.append("

"); + te->append(str); +} + +void PrintDialog::printLimits() +{ + QString str = ""; + int numcol; + numcol=(firmware->getCapability(Outputs)+1)>17 ? 17:firmware->getCapability(Outputs)+1; + str.append(QString(""); + str.append(""); + if (firmware->getCapability(Outputs)<17) { + for(int i=0; igetCapability(Outputs); i++) { + str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); + } + str.append(""); + if (firmware->getCapability(HasChNames)) { + str.append(""); + for(int i=0; igetCapability(Outputs); i++) { + str.append(doTR(g_model->limitData[i].name,"green")); + } + } + str.append(""); + for(int i=0; igetCapability(Outputs); i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); + } + str.append(""); + str.append(""); + for(int i=0; igetCapability(Outputs); i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); + } + str.append(""); + str.append(""); + for(int i=0; igetCapability(Outputs); i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); + } + str.append(""); + str.append(""); + for(int i=0; igetCapability(Outputs); i++) { + str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); + } + } else { + for(int i=0; i<16; i++) { + str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); + } + str.append(""); + if (firmware->getCapability(HasChNames)) { + str.append(""); + for(int i=0; i<16; i++) { + str.append(doTR(g_model->limitData[i].name,"green")); + } + } + str.append(""); + for(int i=0; i<16; i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); + } + str.append(""); + str.append(""); + for(int i=0; i<16; i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); + } + str.append(""); + str.append(""); + for(int i=0; i<16; i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); + } + str.append(""); + str.append(""); + for(int i=0; i<16; i++) { + str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); + } + str.append(""); + str.append(QString(""); + str.append(""); + for(int i=16; igetCapability(Outputs); i++) { + str.append(doTC(tr("CH")+QString(" %1").arg(i+1,2,10,QChar('0')),"",true)); + } + str.append(""); + if (firmware->getCapability(HasChNames)) { + str.append(""); + for(int i=16; igetCapability(Outputs); i++) { + str.append(doTR(g_model->limitData[i].name,"green")); + } + } + str.append(""); + for(int i=16; igetCapability(Outputs); i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].offset/10, 'f', 1),"green")); + } + str.append(""); + str.append(""); + for(int i=16; igetCapability(Outputs); i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].min/10),"green")); + } + str.append(""); + str.append(""); + for(int i=16; igetCapability(Outputs); i++) { + str.append(doTR(QString::number((qreal)g_model->limitData[i].max/10),"green")); + } + str.append(""); + str.append(""); + for(int i=16; igetCapability(Outputs); i++) { + str.append(doTR(QString(g_model->limitData[i].revert ? tr("INV") : tr("NOR")),"green")); + } + } + str.append(""); + str.append("

").arg(numcol)+tr("Limits")+"

 
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
 ").arg(numcol)+"
 
"+tr("Name")+"
"+tr("Offset")+"
"+tr("Min")+"
"+tr("Max")+"
"+tr("Invert")+"
"); + str.append("
"); + te->append(str); +} + +void PrintDialog::printCurves() +{ + int i,r,g,b,c,count; + char buffer[16]; + QPen pen(Qt::black, 2, Qt::SolidLine); + + QString str = "

"; + str.append(tr("Curves")); + str.append("

"); + int numcurves=firmware->getCapability(NumCurves); + if (numcurves==0) { + numcurves=16; + } + { + QImage qi(ISIZEW+1,ISIZEW+1,QImage::Format_RGB32); + QPainter painter(&qi); + painter.setBrush(QBrush("#FFFFFF")); + painter.setPen(QColor(0,0,0)); + painter.drawRect(0,0,ISIZEW,ISIZEW); + str.append(""+QString("
").arg(curvefile5)); + for(i=0; i"); + str.append(QString("").arg(i+1)); + if(i%2) str.append(""); + } + str.append("
").arg(buffer)+tr("Curve")+QString(" %1
"); + str.append(""); + str.append(doTC(" ")); + str.append(doTC(" ")); + int numpoint=0; + for(i=0; icurves[i].count>numpoint) + numpoint=g_model->curves[i].count; + } + for(i=0; i"); + for(i=0; i"); + int curvepoints=g_model->curves[i].count; + if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) + str.append(QString("").arg(i+1)); + else + str.append(QString("").arg(i+1)); + count=0; + for(int j=0; jcurves[i].points[j].y!=0) + count++; + } + for(int j=0; jcurves[i].points[j].y),"green")); + if (j>0 && count!=0) { + if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) + painter.drawLine(ISIZEW/2+(ISIZEW*g_model->curves[i].points[j-1].x)/200,ISIZEW/2-(ISIZEW*g_model->curves[i].points[j-1].y)/200,ISIZEW/2+(ISIZEW*g_model->curves[i].points[j].x)/200,ISIZEW/2-(ISIZEW*g_model->curves[i].points[j].y)/200); + else + painter.drawLine(ISIZEW*(j-1)/(curvepoints-1),ISIZEW/2-(ISIZEW*g_model->curves[i].points[j-1].y)/200,ISIZEW*(j)/(curvepoints-1),ISIZEW/2-(ISIZEW*g_model->curves[i].points[j].y)/200); + } + } + for(int j=curvepoints; j"); + if (g_model->curves[i].type == CurveData::CURVE_TYPE_CUSTOM) { + str.append(""); + for(int j=0; jcurves[i].points[j].x),"green")); + } + for(int j=curvepoints; j"); + } + } + str.append("
").arg(buffer)+tr("Curve")+QString(" %1Y").arg(buffer)+tr("Curve")+QString(" %1Y
X
"); + str.append("
"); + painter.setPen(QColor(0,0,0)); + painter.drawLine(0,ISIZEW/2,ISIZEW,ISIZEW/2); + painter.drawLine(ISIZEW/2,0,ISIZEW/2,ISIZEW); + for(i=0; i<21; i++) { + painter.drawLine(ISIZEW/2-5,(ISIZEW*i)/(20),ISIZEW/2+5,(ISIZEW*i)/(20)); + painter.drawLine((ISIZEW*i)/(20),ISIZEW/2-5,(ISIZEW*i)/(20),ISIZEW/2+5); + } + + qi.save(curvefile5, "png",100); + + } + te->append(str); +} + +void PrintDialog::printSwitches() +{ + int sc=0; + QString str = ""; + str.append(""); + str.append("

"+tr("Logical Switches")+"

"); + + for (int i=0; igetCapability(LogicalSwitches); i++) { + if (g_model->customSw[i].func) { + str.append(""); + str.append("").arg(i+1)); + QString tstr = g_model->customSw[i].toString(*g_model); + str.append(doTL(tstr,"green")); + str.append(""); + sc++; + } + } + str.append("
"+tr("L")+QString("%1
"); + str.append("
"); + if (sc!=0) + te->append(str); +} + +void PrintDialog::printGvars() +{ + if (!firmware->getCapability(GvarsFlightModes) && (gvars && firmware->getCapability(Gvars))) { + QString str = ""; + str.append(""); + str.append("

"+tr("Global Variables")+"

"); + PhaseData *pd=&g_model->phaseData[0]; + int width=100/gvarnum; + str.append(""); + for(unsigned int i=0; i").arg(width)+tr("GV")+QString("%1").arg(i+1)); + } + str.append(""); + str.append(""); + for(unsigned int i=0; i").arg(width)+QString("%1").arg(pd->gvars[i])); + } + str.append(""); + str.append("
"); + str.append("
"); + te->append(str); + } +} + +void PrintDialog::printFSwitches() +{ + int sc=0; + QString str = ""; + str.append(""); + str.append("

"+tr("Special Functions")+"

"); + str.append(""); + str.append(doTL(tr("Switch"), "", true)); + str.append(doTL(tr("Function"), "", true)); + str.append(doTL(tr("Parameter"), "", true)); + str.append(doTL(tr("Repeat"), "", true)); + str.append(doTL(tr("Enabled"), "", true)); + str.append(""); + for(int i=0; igetCapability(CustomFunctions); i++) { + if (g_model->funcSw[i].swtch.type!=SWITCH_TYPE_NONE) { + str.append(""); + str.append(doTL(tr("SF%1").arg(i+1),"", true)); + str.append(doTL(g_model->funcSw[i].swtch.toString(),"green")); + str.append(doTL(g_model->funcSw[i].funcToString(),"green")); + str.append(doTL(g_model->funcSw[i].paramToString(),"green")); + int index=g_model->funcSw[i].func; + if ((g_model->funcSw[i].repeatParam>0) && + (index==FuncPlaySound || index==FuncPlayHaptic || index==FuncPlayValue || index==FuncPlayPrompt || index==FuncPlayBoth || index==FuncBackgroundMusic)) { + str.append(doTL(QString("%1").arg(g_model->funcSw[i].repeatParam),"green")); + } else { + str.append(doTL( " ","green")); + } + if ((index<=FuncInstantTrim) || (index>FuncBackgroundMusicPause)) { + str.append(doTL((g_model->funcSw[i].enabled ? "ON" : "OFF"),"green")); + } else { + str.append(doTL( "---","green")); + } + str.append(""); + sc++; + } + } + str.append("
#
"); + str.append("
"); + if (sc!=0) + te->append(str); +} + +void PrintDialog::printFrSky() +{ + int tc=0; + QString str = ""; + + if (IS_TARANIS(GetEepromInterface()->getBoard())) { + str.append(""); + str.append(""); + str.append(doTC(tr("Analog"),"", true)); + str.append(doTC(tr("Range"),"", true)); + str.append(doTC(tr("Offset"),"", true)); + str.append(""); + + FrSkyData *fd=&g_model->frsky; + for (int i=0; i<2; i++) { + if (fd->channels[i].ratio!=0) { + tc++; + float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); + QString unit = " " + getFrSkyUnits(fd->channels[i].type); + str.append(""); + str.append(doTL(tr("A%1").arg(i+1), "", true)); + str.append(doTC(QString::number(ratio,10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); + str.append(doTC(QString::number((fd->channels[i].offset*ratio)/255,10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); + str.append(""); + } + } + + str.append(""); + str.append(""); + str.append(doTC(tr("Alarms"),"", true)); + str.append(doTC(tr("Low Alarm"),"", true)); + str.append(doTC(tr("Critical Alarm"),"", true)); + str.append(""); + str.append(""); + str.append(doTL(tr("RSSI"),"", true)); + str.append(doTC(QString::number(fd->rssiAlarms[0].value,10),"green")); + str.append(doTC(QString::number(fd->rssiAlarms[1].value,10),"green")); + str.append(""); + for (int i=0; i<2; i++) { + if (fd->channels[i].ratio!=0) { + float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); + QString unit = " " + getFrSkyUnits(fd->channels[i].type); + str.append(""); + str.append(doTL(tr("A%1").arg(i+1), "", true)); + str.append(doTC(QString::number(ratio*(fd->channels[i].alarms[0].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); + str.append(doTC(QString::number(ratio*(fd->channels[i].alarms[1].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+unit, "green")); + str.append(""); + } + } + + //TODO preferrably in new tables + str.append(""); + //str.append(""); + //str.append(""); + str.append(""); + str.append("

"+tr("Telemetry Settings")+"

"+tr("Frsky serial protocol")+""+getFrSkyProtocol(fd->usrProto)+"
"+tr("Units system")+""+getFrSkyMeasure(fd->imperial)+"
"+tr("Blades")+""+QString("%1").arg(fd->blades)+"
"); + } + else { //other boards + str.append("

"+tr("Telemetry Settings")+"

"); + str.append(" "+tr("Alarm 1")+""+tr("Alarm 2")+""); + str.append(""+tr("Analog")+""+tr("Unit")+""+tr("Scale")+""+tr("Offset")+""); + str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); + str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); + FrSkyData *fd=&g_model->frsky; + for (int i=0; i<2; i++) { + if (fd->channels[i].ratio!=0) { + tc++; + float ratio=(fd->channels[i].ratio/(fd->channels[i].type==0 ?10.0:1)); + str.append(""+tr("A%1").arg(i+1)+""+getFrSkyUnits(fd->channels[i].type)+""+QString::number(ratio,10,(fd->channels[i].type==0 ? 1:0))+""+QString::number((fd->channels[i].offset*ratio)/255,10,(fd->channels[i].type==0 ? 1:0))+""); + str.append(""+getFrSkyAlarmType(fd->channels[i].alarms[0].level)+""); + str.append(""); + str.append((fd->channels[i].alarms[0].greater==1) ? ">" : "<"); + str.append(""+QString::number(ratio*(fd->channels[i].alarms[0].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+""); + str.append(""+getFrSkyAlarmType(fd->channels[i].alarms[1].level)+""); + str.append(""); + str.append((fd->channels[i].alarms[1].greater==1) ? ">" : "<"); + str.append(""+QString::number(ratio*(fd->channels[i].alarms[1].value/255.0+fd->channels[i].offset/255.0),10,(fd->channels[i].type==0 ? 1:0))+""); + } + } + str.append(""); + str.append(" "+tr("Alarm 1")+""+tr("Alarm 2")+""); + str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); + str.append(""+tr("Type")+""+tr("Condition")+""+tr("Value")+""); + str.append(""+tr("RSSI Alarm")+""); + str.append(""+getFrSkyAlarmType(fd->rssiAlarms[0].level)+"<"+QString::number(fd->rssiAlarms[0].value,10)+""); + str.append(""+getFrSkyAlarmType(fd->rssiAlarms[1].level)+"<"+QString::number(fd->rssiAlarms[1].value,10)+""); + str.append(""); + str.append(""+tr("Frsky serial protocol")+""+getFrSkyProtocol(fd->usrProto)+""); + str.append(""+tr("Units system")+""+getFrSkyMeasure(fd->imperial)+""); + str.append(""+tr("Blades")+""+fd->blades+""); + str.append(""); + } +#if 0 + if (firmware->getCapability(TelemetryBars) || (firmware->getCapability(TelemetryCSFields))) { + int cols=firmware->getCapability(TelemetryColsCSFields); + if (cols==0) cols=2; + for (int j=0; jgetCapability(TelemetryCSFields)/(4*cols); j++ ) { + if (fd->screens[j].type==0) { + if (cols==2) { + str.append(""); + } else { + str.append("
"+tr("Custom Telemetry View")+"
"); + } + for (int r=0; r<4; r++) { + str.append(""); + for (int c=0; cscreens[j].body.lines[r].source[c]!=0) + tc++; + if (cols==2) { + str.append(""); + } else { + str.append(""); + } + if (c<(cols-1)) { + if (cols==2) { + str.append(""); + } else { + str.append(""); + } + } + } + str.append(""); + } + str.append("
"+tr("Custom Telemetry View")+"
"+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+""+getFrSkySrc(fd->screens[j].body.lines[r].source[c])+"  
"); + } else { + str.append(""); + str.append(""); + for (int i=0; i<4; i++) { + if (fd->screens[j].body.bars[i].source!=0) + tc++; + // TODO str.append(""); + } + str.append("
"+tr("Telemetry Bars")+"
"+tr("Bar Number")+""+tr("Source")+""+tr("Min")+""+tr("Max")+"
"+QString::number(i+1,10)+""+getFrSkySrc(fd->screens[j].body.bars[i].source)+""+(fd->screens[j].body.bars[i].source>0 ? QString::number(getBarValue(fd->screens[j].body.bars[i].source, fd->screens[j].body.bars[i].barMin,fd)):"----")+""+(fd->screens[j].body.bars[i].source>0 ? QString::number(getBarValue(fd->screens[j].body.bars[i].source,(255-fd->screens[j].body.bars[i].barMax),fd)) :"----")+"
"); + } + } + } +#endif + if (tc>0) + te->append(str); +} + +void PrintDialog::on_printButton_clicked() +{ + QPrinter printer; + printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); + QPrintDialog *dialog = new QPrintDialog(&printer, this); + dialog->setWindowTitle(tr("Print Document")); + if (dialog->exec() != QDialog::Accepted) + return; + te->print(&printer); +} + +void PrintDialog::on_printFileButton_clicked() +{ + QString fn = QFileDialog::getSaveFileName(this,tr("Select PDF output file"),QString(),tr("ODF files (*.odt);;PDF Files(*.pdf);;HTML-Files (*.htm *.html);;All Files (*)")); + if (fn.isEmpty()) + return; + if (! (fn.endsWith(".odt", Qt::CaseInsensitive) || fn.endsWith(".pdf", Qt::CaseInsensitive) || fn.endsWith(".htm", Qt::CaseInsensitive) || fn.endsWith(".html", Qt::CaseInsensitive)) ) + fn += ".pdf"; // default + if (fn.endsWith(".pdf", Qt::CaseInsensitive)) { + QPrinter printer; + printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setColorMode(QPrinter::Color); + printer.setOutputFileName(fn); + te->print(&printer); + } else { + QTextDocumentWriter writer(fn); + writer.write(te->document()); + } +} + +void PrintDialog::printToFile() +{ + if (printfilename.isEmpty()) + return; + if (! (printfilename.endsWith(".odt", Qt::CaseInsensitive) || printfilename.endsWith(".pdf", Qt::CaseInsensitive) || printfilename.endsWith(".htm", Qt::CaseInsensitive) || printfilename.endsWith(".html", Qt::CaseInsensitive)) ) + printfilename += ".pdf"; // default + if (printfilename.endsWith(".pdf", Qt::CaseInsensitive)) { + QPrinter printer; + printer.setPageMargins(10.0,10.0,10.0,10.0,printer.Millimeter); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setColorMode(QPrinter::Color); + printer.setOutputFileName(printfilename); + te->print(&printer); + } else { + QTextDocumentWriter writer(printfilename); + writer.write(te->document()); + } +} + +void PrintDialog::autoClose() +{ + this->close(); +} diff --git a/companion/src/printdialog.h b/companion/src/printdialog.h index b0ec3da41..a6c717d7b 100644 --- a/companion/src/printdialog.h +++ b/companion/src/printdialog.h @@ -32,7 +32,7 @@ private: unsigned int gvarnum; void printSetup(); - QString printPhases(); + QString printFlightModes(); void printInputs(); void printMixes(); void printLimits(); diff --git a/companion/src/simulation/simulatordialog.cpp b/companion/src/simulation/simulatordialog.cpp index 2003abf18..761fc0c06 100644 --- a/companion/src/simulation/simulatordialog.cpp +++ b/companion/src/simulation/simulatordialog.cpp @@ -600,7 +600,7 @@ void SimulatorDialog9X::getValues() void SimulatorDialog9X::saveSwitches(void) { - qDebug() << "SimulatorDialog9X::saveSwitches()"; + // qDebug() << "SimulatorDialog9X::saveSwitches()"; switchstatus=ui->switchTHR->isChecked(); switchstatus<<=1; switchstatus+=(ui->switchRUD->isChecked()&0x1); @@ -620,7 +620,7 @@ void SimulatorDialog9X::saveSwitches(void) void SimulatorDialog9X::restoreSwitches(void) { - qDebug() << "SimulatorDialog9X::restoreSwitches()"; + // qDebug() << "SimulatorDialog9X::restoreSwitches()"; ui->switchAIL->setChecked(switchstatus & 0x1); switchstatus >>=1; ui->switchELE->setChecked(switchstatus & 0x1); @@ -705,7 +705,7 @@ void SimulatorDialogTaranis::getValues() void SimulatorDialogTaranis::saveSwitches(void) { - qDebug() << "SimulatorDialogTaranis::saveSwitches()"; + // qDebug() << "SimulatorDialogTaranis::saveSwitches()"; switchstatus=ui->switchA->value(); switchstatus<<=2; switchstatus+=ui->switchB->value(); @@ -725,7 +725,7 @@ void SimulatorDialogTaranis::saveSwitches(void) void SimulatorDialogTaranis::restoreSwitches(void) { - qDebug() << "SimulatorDialogTaranis::restoreSwitches()"; + // qDebug() << "SimulatorDialogTaranis::restoreSwitches()"; ui->switchH->setValue(switchstatus & 0x3); switchstatus>>=2; ui->switchG->setValue(switchstatus & 0x3); diff --git a/companion/src/xmlinterface.cpp b/companion/src/xmlinterface.cpp index 0c6185d96..8e1701ebe 100644 --- a/companion/src/xmlinterface.cpp +++ b/companion/src/xmlinterface.cpp @@ -155,7 +155,7 @@ void saveModel(ModelData & m, model & xm) phases xphases; phases::phase_sequence & phases_sequence (xphases.phase()); - for (int i=0; i-[on|off].wav - for (int i=0; istart, 60); switch (m_posHorz) { case 0: - CHECK_INCDEC_MODELVAR(event, timer->mode, SWSRC_FIRST, TMR_VAROFS+SWSRC_LAST-1/*--- which is OFF*/); + CHECK_INCDEC_MODELVAR(event, timer->mode, SWSRC_FIRST, TMR_VAROFS+SWSRC_LAST-1); break; case 1: CHECK_INCDEC_MODELVAR_ZERO(event, qr.quot, 59); @@ -1108,7 +1108,7 @@ void menuModelSetup(uint8_t event) s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)) { s_noHi = NO_HI_LEN; - for (uint8_t i=0; i EXPO_ONE_2ND_COLUMN-FW))) continue; @@ -1835,14 +1835,14 @@ bool isTrimModeAvailable(int mode) void menuModelFlightModesAll(uint8_t event) { - MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_FlightModesAll, 1+MAX_PHASES+1, {0, NAVIGATION_LINE_BY_LINE|(ITEM_PHASES_LAST-5), NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, 0}); + MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_FlightModesAll, 1+MAX_FLIGHT_MODES+1, {0, NAVIGATION_LINE_BY_LINE|(ITEM_PHASES_LAST-5), NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, NAVIGATION_LINE_BY_LINE|ITEM_PHASES_LAST, 0}); int8_t sub = m_posVert - 1; horzpos_t posHorz = m_posHorz; if (sub==0 && posHorz > 0) { posHorz += 5; } - if (sub=0) { + if (sub=0) { displayColumnHeader(STR_PHASES_HEADERS, posHorz); } @@ -1850,11 +1850,11 @@ void menuModelFlightModesAll(uint8_t event) uint8_t y = 1 + (i+1)*FH; uint8_t k = i+s_pgOfs; - if (k==MAX_PHASES) { + if (k==MAX_FLIGHT_MODES) { // last line available - add the "check trims" line lcd_putsLeft((LCD_LINES-1)*FH+1, STR_CHECKTRIMS); - putsFlightPhase(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, s_perout_flight_phase+1); - if (sub==MAX_PHASES && !trimsCheckTimer) { + putsFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, s_perout_flight_mode+1); + if (sub==MAX_FLIGHT_MODES && !trimsCheckTimer) { lcd_status_line(); } return; @@ -1862,7 +1862,7 @@ void menuModelFlightModesAll(uint8_t event) PhaseData *p = phaseAddress(k); - putsFlightPhase(0, y, k+1, (getFlightPhase()==k ? BOLD : 0) | ((sub==k && m_posHorz<0) ? INVERS : 0)); + putsFlightMode(0, y, k+1, (getFlightPhase()==k ? BOLD : 0) | ((sub==k && m_posHorz<0) ? INVERS : 0)); for (uint8_t j=0; j0) ? BLINK|INVERS : INVERS) : 0); @@ -1878,7 +1878,7 @@ void menuModelFlightModesAll(uint8_t event) } else { putsSwitches((5+LEN_FP_NAME)*FW+FW/2, y, p->swtch, attr); - if (active) CHECK_INCDEC_MODELSWITCH(event, p->swtch, SWSRC_FIRST, SWSRC_LAST); + if (active) CHECK_INCDEC_MODELSWITCH(event, p->swtch, SWSRC_FIRST_SHORT_LIST, SWSRC_LAST_SHORT_LIST); } break; @@ -1891,7 +1891,7 @@ void menuModelFlightModesAll(uint8_t event) putsTrimMode((4+LEN_FP_NAME)*FW+j*(5*FW/2), y, k, t, attr); if (active) { trim_t & v = p->trim[t]; - v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, 2*MAX_PHASES-1, EE_MODEL, isTrimModeAvailable); + v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); } } break; @@ -1933,7 +1933,7 @@ enum menuModelPhaseItems { void menuModelPhaseOne(uint8_t event) { PhaseData *phase = phaseAddress(s_currIdx); - putsFlightPhase(13*FW, 0, s_currIdx+1, (getFlightPhase()==s_currIdx ? BOLD : 0)); + putsFlightMode(13*FW, 0, s_currIdx+1, (getFlightPhase()==s_currIdx ? BOLD : 0)); #if defined(GVARS) && !defined(PCBSTD) static const pm_uint8_t mstate_tab_phase1[] PROGMEM = {0, 0, 0, (uint8_t)-1, 1, 1, 1, 1, 1}; @@ -1979,7 +1979,7 @@ void menuModelPhaseOne(uint8_t event) if (attr && m_posHorz==t && ((editMode>0) || p1valdiff)) { int16_t v = getRawTrimValue(s_currIdx, t); if (v < TRIM_EXTENDED_MAX) v = TRIM_EXTENDED_MAX; - v = checkIncDec(event, v, TRIM_EXTENDED_MAX, TRIM_EXTENDED_MAX+MAX_PHASES-1, EE_MODEL); + v = checkIncDec(event, v, TRIM_EXTENDED_MAX, TRIM_EXTENDED_MAX+MAX_FLIGHT_MODES-1, EE_MODEL); if (checkIncDec_Ret) { if (v == TRIM_EXTENDED_MAX) v = 0; setTrimValue(s_currIdx, t, v); @@ -2004,7 +2004,7 @@ void menuModelPhaseOne(uint8_t event) int16_t v = phaseAddress(s_currIdx)->rotaryEncoders[t]; #endif if (v < ROTARY_ENCODER_MAX) v = ROTARY_ENCODER_MAX; - v = checkIncDec(event, v, ROTARY_ENCODER_MAX, ROTARY_ENCODER_MAX+MAX_PHASES-1, EE_MODEL); + v = checkIncDec(event, v, ROTARY_ENCODER_MAX, ROTARY_ENCODER_MAX+MAX_FLIGHT_MODES-1, EE_MODEL); if (checkIncDec_Ret) { if (v == ROTARY_ENCODER_MAX) v = 0; #if ROTARY_ENCODERS > 2 @@ -2048,14 +2048,14 @@ void menuModelPhaseOne(uint8_t event) if (v > GVAR_MAX) { uint8_t p = v - GVAR_MAX - 1; if (p >= s_currIdx) p++; - putsFlightPhase(11*FW, y, p+1, posHorz==1 ? attr : 0); + putsFlightMode(11*FW, y, p+1, posHorz==1 ? attr : 0); } else { lcd_putsAtt(11*FW, y, STR_OWN, posHorz==1 ? attr : 0); } if (attr && s_currIdx>0 && posHorz==1 && (editMode>0 || p1valdiff)) { if (v < GVAR_MAX) v = GVAR_MAX; - v = checkIncDec(event, v, GVAR_MAX, GVAR_MAX+MAX_PHASES-1, EE_MODEL); + v = checkIncDec(event, v, GVAR_MAX, GVAR_MAX+MAX_FLIGHT_MODES-1, EE_MODEL); if (checkIncDec_Ret) { if (v == GVAR_MAX) v = 0; phase->gvars[idx] = v; @@ -2095,20 +2095,20 @@ void menuModelPhaseOne(uint8_t event) void menuModelFlightModesAll(uint8_t event) { - SIMPLE_MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_FlightModesAll, 1+MAX_PHASES+1); + SIMPLE_MENU(STR_MENUFLIGHTPHASES, menuTabModel, e_FlightModesAll, 1+MAX_FLIGHT_MODES+1); int8_t sub = m_posVert - 1; switch (event) { CASE_EVT_ROTARY_BREAK case EVT_KEY_FIRST(KEY_ENTER): - if (sub == MAX_PHASES) { + if (sub == MAX_FLIGHT_MODES) { s_editMode = 0; trimsCheckTimer = 200; // 2 seconds } // no break case EVT_KEY_FIRST(KEY_RIGHT): - if (sub >= 0 && sub < MAX_PHASES) { + if (sub >= 0 && sub < MAX_FLIGHT_MODES) { s_currIdx = sub; pushMenu(menuModelPhaseOne); } @@ -2116,7 +2116,7 @@ void menuModelFlightModesAll(uint8_t event) } uint8_t att; - for (uint8_t i=0; i(LCD_LINES-1)*FH+1) continue; @@ -2126,9 +2126,9 @@ void menuModelFlightModesAll(uint8_t event) att = (i==sub ? INVERS : 0); PhaseData *p = phaseAddress(i); #if ROTARY_ENCODERS > 2 - putsFlightPhase(0, y, i+1, att|CONDENSED|(getFlightPhase()==i ? BOLD : 0)); + putsFlightMode(0, y, i+1, att|CONDENSED|(getFlightPhase()==i ? BOLD : 0)); #else - putsFlightPhase(0, y, i+1, att|(getFlightPhase()==i ? BOLD : 0)); + putsFlightMode(0, y, i+1, att|(getFlightPhase()==i ? BOLD : 0)); #endif lcd_putsnAtt(4*FW+NAME_OFS, y, p->name, sizeof(p->name), ZCHAR); @@ -2153,12 +2153,12 @@ void menuModelFlightModesAll(uint8_t event) } #if defined(CPUARM) - if (s_pgOfs != MAX_PHASES-(LCD_LINES-2)) return; + if (s_pgOfs != MAX_FLIGHT_MODES-(LCD_LINES-2)) return; #endif lcd_putsLeft((LCD_LINES-1)*FH+1, STR_CHECKTRIMS); - putsFlightPhase(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, s_perout_flight_phase+1); - if (sub==MAX_PHASES && !trimsCheckTimer) { + putsFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, s_perout_flight_mode+1); + if (sub==MAX_FLIGHT_MODES && !trimsCheckTimer) { lcd_status_line(); } } @@ -2910,7 +2910,7 @@ void menuModelExpoOne(uint8_t event) putsMixerSource(7*FW+FW/2, 0, MIXSRC_Rud+ed->chn, 0); #endif - SUBMENU(STR_MENUINPUTS, EXPO_FIELD_MAX, {CASE_PCBTARANIS(0) IF_CPUARM(0) CASE_PCBTARANIS(0) CASE_PCBTARANIS((ed->srcRaw >= MIXSRC_FIRST_TELEM ? (uint8_t)0 : (uint8_t)HIDDEN_ROW)) 0, CASE_PCBTARANIS(0) CASE_9X(0) IF_CURVES(CURVE_ROWS) IF_FLIGHT_MODES((MAX_PHASES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/}); + SUBMENU(STR_MENUINPUTS, EXPO_FIELD_MAX, {CASE_PCBTARANIS(0) IF_CPUARM(0) CASE_PCBTARANIS(0) CASE_PCBTARANIS((ed->srcRaw >= MIXSRC_FIRST_TELEM ? (uint8_t)0 : (uint8_t)HIDDEN_ROW)) 0, CASE_PCBTARANIS(0) CASE_9X(0) IF_CURVES(CURVE_ROWS) IF_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/}); SET_SCROLLBAR_X(EXPO_ONE_2ND_COLUMN+10*FW); @@ -3111,11 +3111,11 @@ void menuModelMixOne(uint8_t event) #else if (m_posVert == MIX_FIELD_TRIM && md2->srcRaw > NUM_STICKS) #endif - SUBMENU_NOTITLE(MIX_FIELD_COUNT, {IF_CPUARM(0) 0, 0, 0, CASE_9X(0) IF_CURVES(0) IF_FLIGHT_MODES((MAX_PHASES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}) + SUBMENU_NOTITLE(MIX_FIELD_COUNT, {IF_CPUARM(0) 0, 0, 0, CASE_9X(0) IF_CURVES(0) IF_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}) else - SUBMENU_NOTITLE(MIX_FIELD_COUNT, {IF_CPUARM(0) 0, 0, 0, CASE_9X(1) IF_CURVES(1) IF_FLIGHT_MODES((MAX_PHASES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}); + SUBMENU_NOTITLE(MIX_FIELD_COUNT, {IF_CPUARM(0) 0, 0, 0, CASE_9X(1) IF_CURVES(1) IF_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}); #else - SUBMENU_NOTITLE(MIX_FIELD_COUNT, {IF_CPUARM(0) 0, 0, 0, CASE_9X(1) CASE_PCBTARANIS(0) IF_CURVES(1) IF_FLIGHT_MODES((MAX_PHASES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}); + SUBMENU_NOTITLE(MIX_FIELD_COUNT, {IF_CPUARM(0) 0, 0, 0, CASE_9X(1) CASE_PCBTARANIS(0) IF_CURVES(1) IF_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}); #endif #if MENU_COLUMNS > 1 @@ -3314,7 +3314,7 @@ static uint8_t s_copySrcCh; #define EXPO_LINE_WEIGHT_POS 7*FW+1 #define EXPO_LINE_EXPO_POS 11*FW #define EXPO_LINE_SWITCH_POS 11*FW+4 - #if MAX_PHASES == 6 + #if MAX_FLIGHT_MODES == 6 #define EXPO_LINE_SIDE_POS 15*FW #else #define EXPO_LINE_SIDE_POS 15*FW+2 @@ -4102,7 +4102,7 @@ void onGVARSMenu(const char *result) eeDirty(EE_MODEL); } else if (result == STR_CLEAR) { - for (int i=0; i0) ? BLINK|INVERS : INVERS) : 0); xcoord_t x = GVARS_FM_COLUMN(j-1); @@ -4170,8 +4170,8 @@ void menuModelGVars(uint8_t event) if (v > GVAR_MAX) { uint8_t p = v - GVAR_MAX - 1; if (p >= j-1) p++; - putsFlightPhase(x-15, y, p+1, attr|SMLSIZE); - vmin = GVAR_MAX+1; vmax = GVAR_MAX+MAX_PHASES-1; + putsFlightMode(x-15, y, p+1, attr|SMLSIZE); + vmin = GVAR_MAX+1; vmax = GVAR_MAX+MAX_FLIGHT_MODES-1; } else { if (abs(v) >= 100) @@ -4967,10 +4967,11 @@ void menuModelCustomFunctions(uint8_t event) { INCDEC_DECLARE_VARS(); int16_t val_displayed = CFN_PARAM(sd); - int8_t val_min = 0; #if defined(CPUARM) + int16_t val_min = 0; int16_t val_max = 255; #else + int8_t val_min = 0; uint8_t val_max = 255; #endif if (func == FUNC_SAFETY_CHANNEL) { @@ -5084,7 +5085,7 @@ void menuModelCustomFunctions(uint8_t event) switch (CFN_GVAR_MODE(sd)) { case FUNC_ADJUST_GVAR_CONSTANT: val_displayed = (int8_t)CFN_PARAM(sd); - val_min = -125; val_max = 125; + val_min = -CFN_GVAR_CST_MAX; val_max = +CFN_GVAR_CST_MAX; lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT); break; case FUNC_ADJUST_GVAR_SOURCE: diff --git a/radio/src/gui/menus.cpp b/radio/src/gui/menus.cpp index 24f3b15bb..b9453d73a 100644 --- a/radio/src/gui/menus.cpp +++ b/radio/src/gui/menus.cpp @@ -1132,7 +1132,7 @@ int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, LcdFlags attr, uint8_t { lcd_putsColumnLeft(x, y, STR_SWITCH); putsSwitches(x, y, value, attr); - if (attr) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST, SWSRC_LAST); + if (attr) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_SHORT_LIST, SWSRC_LAST_SHORT_LIST); return value; } @@ -1152,11 +1152,11 @@ int16_t gvarMenuItem(uint8_t x, uint8_t y, int16_t value, int16_t min, int16_t m s_editMode = !s_editMode; #if defined(CPUARM) if (attr & PREC1) - value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_phase)*10 : delta); + value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_mode)*10 : delta); else - value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_phase) : delta); + value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_mode) : delta); #else - value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_phase) : delta); + value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_mode) : delta); #endif eeDirty(EE_MODEL); } @@ -1500,8 +1500,8 @@ bool isSwitchAvailable(int swtch) swtch = -swtch; } - if (swtch >= SWSRC_FIRST_CSW && swtch <= SWSRC_LAST_CSW) { - LogicalSwitchData * cs = cswAddress(swtch-SWSRC_FIRST_CSW); + if (swtch >= SWSRC_FIRST_LOGICAL_SWITCH && swtch <= SWSRC_LAST_LOGICAL_SWITCH) { + LogicalSwitchData * cs = cswAddress(swtch-SWSRC_FIRST_LOGICAL_SWITCH); return (cs->func != LS_FUNC_NONE); } diff --git a/radio/src/gui/view_main.cpp b/radio/src/gui/view_main.cpp index c311706ee..480ec89b7 100644 --- a/radio/src/gui/view_main.cpp +++ b/radio/src/gui/view_main.cpp @@ -650,7 +650,7 @@ void menuMainView(uint8_t event) { // Flight Phase Name - uint8_t phase = s_perout_flight_phase; + uint8_t phase = s_perout_flight_mode; lcd_putsnAtt(PHASE_X, PHASE_Y, g_model.phaseData[phase].name, sizeof(g_model.phaseData[phase].name), ZCHAR|PHASE_FLAGS); // Model Name @@ -862,13 +862,13 @@ void menuMainView(uint8_t event) putsStrIdx(BITMAP_X+FW, BITMAP_Y+FH-1, STR_GV, s_gvar_last+1); lcd_putsnAtt(BITMAP_X+4*FW+FW/2, BITMAP_Y+FH-1, g_model.gvars[s_gvar_last].name, LEN_GVAR_NAME, ZCHAR); lcd_putsAtt(BITMAP_X+FW, BITMAP_Y+2*FH+3, PSTR("[\010]"), BOLD); - lcd_outdezAtt(BITMAP_X+5*FW+FW/2, BITMAP_Y+2*FH+3, GVAR_VALUE(s_gvar_last, s_perout_flight_phase), BOLD); + lcd_outdezAtt(BITMAP_X+5*FW+FW/2, BITMAP_Y+2*FH+3, GVAR_VALUE(s_gvar_last, s_perout_flight_mode), BOLD); #else s_warning = STR_GLOBAL_VAR; displayBox(); lcd_putsnAtt(16, 5*FH, g_model.gvars[s_gvar_last].name, LEN_GVAR_NAME, ZCHAR); lcd_putsAtt(16+7*FW, 5*FH, PSTR("[\010]"), BOLD); - lcd_outdezAtt(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last, s_perout_flight_phase), BOLD); + lcd_outdezAtt(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last, s_perout_flight_mode), BOLD); s_warning = NULL; #endif } diff --git a/radio/src/lcd.cpp b/radio/src/lcd.cpp index 24347e956..e5926f877 100644 --- a/radio/src/lcd.cpp +++ b/radio/src/lcd.cpp @@ -1020,11 +1020,16 @@ void putsSwitches(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att) lcd_putcAtt(x-2, y, '!', att); idx = -idx; } +#if defined(CPUARM) && defined(FLIGHT_MODES) + if (idx >= SWSRC_FIRST_FLIGHT_MODE) + putsStrIdx(x, y, STR_FP, idx-SWSRC_FIRST_FLIGHT_MODE, att); + else +#endif lcd_putsiAtt(x, y, STR_VSWITCHES, idx-1, att); } #if defined(FLIGHT_MODES) -void putsFlightPhase(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att) +void putsFlightMode(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att) { if (idx==0) { lcd_putsiAtt(x, y, STR_MMMINV, 0, att); return; } if (idx < 0) { lcd_putcAtt(x-2, y, '!', att); idx = -idx; } diff --git a/radio/src/lcd.h b/radio/src/lcd.h index 0952a48f4..185f5079f 100644 --- a/radio/src/lcd.h +++ b/radio/src/lcd.h @@ -178,7 +178,7 @@ void putsStrIdx(xcoord_t x, uint8_t y, const pm_char *str, uint8_t idx, LcdFlags void putsModelName(xcoord_t x, uint8_t y, char *name, uint8_t id, LcdFlags att); void putsSwitches(xcoord_t x, uint8_t y, int8_t swtch, LcdFlags att=0); void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att=0); -void putsFlightPhase(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att=0); +void putsFlightMode(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att=0); #if defined(PCBTARANIS) && !defined(BOOT) void putsCurveRef(xcoord_t x, uint8_t y, CurveRef &curve, LcdFlags att); #endif diff --git a/radio/src/lua.cpp b/radio/src/lua.cpp index 2aacda979..dd78de586 100644 --- a/radio/src/lua.cpp +++ b/radio/src/lua.cpp @@ -741,6 +741,29 @@ static int luaModelSetOutput(lua_State *L) return 0; } + +static int luaModelGetGlobalVariable(lua_State *L) +{ + int idx = luaL_checkunsigned(L, 1); + int phase = luaL_checkunsigned(L, 2); + if (phase < MAX_FLIGHT_MODES && idx < MAX_GVARS) + lua_pushinteger(L, g_model.phaseData[phase].gvars[idx]); + else + lua_pushnil(L); + return 1; +} + +static int luaModelSetGlobalVariable(lua_State *L) +{ + int idx = luaL_checkunsigned(L, 1); + int phase = luaL_checkunsigned(L, 2); + int value = luaL_checkinteger(L, 3); + if (phase < MAX_FLIGHT_MODES && idx < MAX_GVARS && value >= -GVAR_LIMIT && value <= GVAR_LIMIT) { + g_model.phaseData[phase].gvars[idx] = value; + } + return 0; +} + static int luaPopupInput(lua_State *L) { uint8_t event = luaL_checkinteger(L, 2); @@ -849,6 +872,8 @@ static const luaL_Reg modelLib[] = { { "setCustomFunction", luaModelSetCustomFunction }, { "getOutput", luaModelGetOutput }, { "setOutput", luaModelSetOutput }, + { "getGlobalVariable", luaModelGetGlobalVariable }, + { "setGlobalVariable", luaModelSetGlobalVariable }, { NULL, NULL } /* sentinel */ }; @@ -901,7 +926,7 @@ void luaInit() lua_registerint(L, "STICK_ELEVATOR", MIXSRC_Ele); lua_registerint(L, "STICK_THROTTLE", MIXSRC_Thr); lua_registerint(L, "STICK_AILERON", MIXSRC_Ail); - lua_registerint(L, "SWITCH_LAST", SWSRC_LAST_CSW); + lua_registerint(L, "SWITCH_LAST", SWSRC_LAST_LOGICAL_SWITCH); lua_registerint(L, "EVT_MENU_BREAK", EVT_KEY_BREAK(KEY_MENU)); lua_registerint(L, "EVT_PAGE_BREAK", EVT_KEY_BREAK(KEY_PAGE)); lua_registerint(L, "EVT_ENTER_BREAK", EVT_KEY_BREAK(KEY_ENTER)); diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 0d6a1bbe1..223591cdd 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -73,7 +73,7 @@ #if defined(PCBTARANIS) #define MAX_MODELS 60 #define NUM_CHNOUT 32 // number of real output channels CH1-CH32 - #define MAX_PHASES 9 + #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 #define MAX_EXPOS 64 #define NUM_LOGICAL_SWITCH 32 // number of custom switches @@ -86,7 +86,7 @@ #elif defined(CPUARM) #define MAX_MODELS 60 #define NUM_CHNOUT 32 // number of real output channels CH1-CH32 - #define MAX_PHASES 9 + #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 #define MAX_EXPOS 32 #define NUM_LOGICAL_SWITCH 32 // number of custom switches @@ -97,7 +97,7 @@ #elif defined(CPUM2560) || defined(CPUM2561) #define MAX_MODELS 30 #define NUM_CHNOUT 16 // number of real output channels CH1-CH16 - #define MAX_PHASES 6 + #define MAX_FLIGHT_MODES 6 #define MAX_MIXERS 32 #define MAX_EXPOS 16 #define NUM_LOGICAL_SWITCH 15 // number of custom switches @@ -108,7 +108,7 @@ #elif defined(CPUM128) #define MAX_MODELS 30 #define NUM_CHNOUT 16 // number of real output channels CH1-CH16 - #define MAX_PHASES 5 + #define MAX_FLIGHT_MODES 5 #define MAX_MIXERS 32 #define MAX_EXPOS 14 #define NUM_LOGICAL_SWITCH 15 // number of custom switches @@ -119,7 +119,7 @@ #else #define MAX_MODELS 16 #define NUM_CHNOUT 16 // number of real output channels CH1-CH16 - #define MAX_PHASES 5 + #define MAX_FLIGHT_MODES 5 #define MAX_MIXERS 32 #define MAX_EXPOS 14 #define NUM_LOGICAL_SWITCH 12 // number of custom switches @@ -522,9 +522,9 @@ PACK(typedef struct t_ExpoData { #define limit_min_max_t int16_t #define LIMIT_EXT_PERCENT 150 #define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) - #define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, s_perout_flight_phase)*10 : lim->max+1000) - #define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, s_perout_flight_phase)*10 : lim->min-1000) - #define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR(lim->offset, -1000, 1000, s_perout_flight_phase)*10 : lim->offset) + #define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, s_perout_flight_mode)*10 : lim->max+1000) + #define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, s_perout_flight_mode)*10 : lim->min-1000) + #define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR(lim->offset, -1000, 1000, s_perout_flight_mode)*10 : lim->offset) #define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) #define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) #define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) @@ -692,7 +692,7 @@ PACK(typedef struct t_MixData { PACK( union u_gvarint_t { struct { int8_t lo; - uint8_t hi; + uint8_t hi; } bytes_t; int16_t word; @@ -916,6 +916,7 @@ PACK(typedef struct t_CustomFnData { // Function Switches data #define CFN_GVAR_MODE(p) ((p)->all.mode) #define CFN_PARAM(p) ((p)->all.val) #define CFN_RESET(p) ((p)->active=0, (p)->clear.val1=0, (p)->clear.val2=0) +#define CFN_GVAR_CST_MAX GVAR_LIMIT #else PACK(typedef struct t_CustomFnData { PACK(union { @@ -948,6 +949,7 @@ PACK(typedef struct t_CustomFnData { #define CFN_GVAR_MODE(p) ((p)->gvar.mode) #define CFN_PARAM(p) ((p)->value) #define CFN_RESET(p) ((p)->all.active = 0, CFN_PARAM(p) = 0) +#define CFN_GVAR_CST_MAX 125 #endif enum TelemetryUnit { @@ -1244,7 +1246,7 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data #define NUM_ROTARY_ENCODERS_EXTRA 2 #define NUM_ROTARY_ENCODERS (2+NUM_ROTARY_ENCODERS_EXTRA) #define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[2]; -#define ROTARY_ENCODER_ARRAY_EXTRA int16_t rotaryEncodersExtra[MAX_PHASES][NUM_ROTARY_ENCODERS_EXTRA]; +#define ROTARY_ENCODER_ARRAY_EXTRA int16_t rotaryEncodersExtra[MAX_FLIGHT_MODES][NUM_ROTARY_ENCODERS_EXTRA]; #elif defined(CPUM2560) && ROTARY_ENCODERS <= 2 #define NUM_ROTARY_ENCODERS_EXTRA 0 #define NUM_ROTARY_ENCODERS 2 @@ -1369,8 +1371,8 @@ enum SwitchSources { SWSRC_REb, #endif - SWSRC_FIRST_CSW, - SWSRC_SW1 = SWSRC_FIRST_CSW, + SWSRC_FIRST_LOGICAL_SWITCH, + SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH, SWSRC_SW2, SWSRC_SW3, SWSRC_SW4, @@ -1382,13 +1384,24 @@ enum SwitchSources { SWSRC_SWA, SWSRC_SWB, SWSRC_SWC, - SWSRC_LAST_CSW = SWSRC_SW1+NUM_LOGICAL_SWITCH-1, + SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+NUM_LOGICAL_SWITCH-1, SWSRC_ON, + +#if defined(CPUARM) + SWSRC_FIRST_FLIGHT_MODE, + SWSRC_LAST_FLIGHT_MODE = SWSRC_FIRST_FLIGHT_MODE+MAX_FLIGHT_MODES-1, +#endif + + SWSRC_COUNT, + SWSRC_OFF = -SWSRC_ON, - SWSRC_FIRST = SWSRC_OFF, - SWSRC_LAST = SWSRC_ON + SWSRC_LAST = SWSRC_COUNT-1, + SWSRC_FIRST = -SWSRC_LAST, + + SWSRC_LAST_SHORT_LIST = SWSRC_LAST_LOGICAL_SWITCH, + SWSRC_FIRST_SHORT_LIST = -SWSRC_LAST_SHORT_LIST, }; enum MixSources { @@ -1680,7 +1693,7 @@ PACK(typedef struct t_ModelData { LogicalSwitchData customSw[NUM_LOGICAL_SWITCH]; CustomFnData funcSw[NUM_CFN]; SwashRingData swashR; - PhaseData phaseData[MAX_PHASES]; + PhaseData phaseData[MAX_FLIGHT_MODES]; AVR_FIELD(int8_t ppmFrameLength) // 0=22.5ms (10ms-30ms) 0.5ms increments uint8_t thrTraceSrc; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index fd08ea0e4..520853308 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -319,7 +319,8 @@ void per10ms() if (lightOffCounter) lightOffCounter--; if (flashCounter) flashCounter--; if (s_noHi) s_noHi--; - if (trimsCheckTimer) trimsCheckTimer --; + if (trimsCheckTimer) trimsCheckTimer--; + if (ppmInValid) ppmInValid--; #if defined(RTCLOCK) /* Update global Date/Time every 100 per10ms cycles */ @@ -768,7 +769,7 @@ int applyCurve(int x, CurveRef & curve) switch (curve.type) { case CURVE_REF_DIFF: { - int curveParam = calc100to256(GET_GVAR(curve.value, -100, 100, s_perout_flight_phase)); + int curveParam = calc100to256(GET_GVAR(curve.value, -100, 100, s_perout_flight_mode)); if (curveParam > 0 && x < 0) x = (x * (256 - curveParam)) >> 8; else if (curveParam < 0 && x > 0) @@ -777,7 +778,7 @@ int applyCurve(int x, CurveRef & curve) } case CURVE_REF_EXPO: - return expo(x, GET_GVAR(curve.value, -100, 100, s_perout_flight_phase)); + return expo(x, GET_GVAR(curve.value, -100, 100, s_perout_flight_mode)); case CURVE_REF_FUNC: switch (curve.value) { @@ -980,7 +981,7 @@ void applyExpos(int16_t *anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS) if (!EXPO_VALID(ed)) break; // end of list if (ed->chn == cur_chn) continue; - if (ed->phases & (1<phases & (1<swtch)) { #if defined(PCBTARANIS) @@ -1019,18 +1020,18 @@ void applyExpos(int16_t *anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS) if (ed->curveMode == MODE_CURVE) v = applyCurve(v, curveParam); else - v = expo(v, GET_GVAR(curveParam, -100, 100, s_perout_flight_phase)); + v = expo(v, GET_GVAR(curveParam, -100, 100, s_perout_flight_mode)); } #endif //========== WEIGHT =============== - int16_t weight = GET_GVAR(ed->weight, MIN_EXPO_WEIGHT, 100, s_perout_flight_phase); + int16_t weight = GET_GVAR(ed->weight, MIN_EXPO_WEIGHT, 100, s_perout_flight_mode); weight = calc100to256(weight); v = ((int32_t)v * weight) >> 8; #if defined(PCBTARANIS) //========== OFFSET =============== - int16_t offset = GET_GVAR(ed->offset, -100, 100, s_perout_flight_phase); + int16_t offset = GET_GVAR(ed->offset, -100, 100, s_perout_flight_mode); if (offset) v += calc100toRESX(offset); //========== TRIMS ================ @@ -1267,7 +1268,7 @@ getvalue_t getValue(uint8_t i) return 0; #endif - else if (i<=MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(s_perout_flight_phase, i-MIXSRC_TrimRud)); + else if (i<=MIXSRC_TrimAil) return calc1000toRESX((int16_t)8 * getTrimValue(s_perout_flight_mode, i-MIXSRC_TrimRud)); #if defined(PCBTARANIS) else if (i==MIXSRC_SA) return (switchState(SW_SA0) ? -1024 : (switchState(SW_SA1) ? 0 : 1024)); @@ -1278,7 +1279,7 @@ getvalue_t getValue(uint8_t i) else if (i==MIXSRC_SF) return (switchState(SW_SF0) ? -1024 : 1024); else if (i==MIXSRC_SG) return (switchState(SW_SG0) ? -1024 : (switchState(SW_SG1) ? 0 : 1024)); else if (i==MIXSRC_SH) return (switchState(SW_SH0) ? -1024 : 1024); - else if (i<=MIXSRC_LAST_LOGICAL_SWITCH) return getSwitch(SWSRC_FIRST_CSW+i-MIXSRC_FIRST_LOGICAL_SWITCH) ? 1024 : -1024; + else if (i<=MIXSRC_LAST_LOGICAL_SWITCH) return getSwitch(SWSRC_FIRST_LOGICAL_SWITCH+i-MIXSRC_FIRST_LOGICAL_SWITCH) ? 1024 : -1024; #else else if (i==MIXSRC_3POS) return (getSwitch(SW_ID0-SW_BASE+1) ? -1024 : (getSwitch(SW_ID1-SW_BASE+1) ? 0 : 1024)); // don't use switchState directly to give getSwitch possibility to hack values if needed for switch warning @@ -1293,7 +1294,7 @@ getvalue_t getValue(uint8_t i) else if (i<=MIXSRC_LAST_CH) return ex_chans[i-MIXSRC_CH1]; #if defined(GVARS) - else if (i<=MIXSRC_LAST_GVAR) return GVAR_VALUE(i-MIXSRC_GVAR1, getGVarFlightPhase(s_perout_flight_phase, i-MIXSRC_GVAR1)); + else if (i<=MIXSRC_LAST_GVAR) return GVAR_VALUE(i-MIXSRC_GVAR1, getGVarFlightPhase(s_perout_flight_mode, i-MIXSRC_GVAR1)); #endif else if (i==MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE) return g_vbat100mV; @@ -1512,9 +1513,15 @@ bool getSwitch(int8_t swtch) else if (cs_idx == SWSRC_REb) { result = REB_DOWN(); } +#endif +#if defined(CPUARM) && defined(FLIGHT_MODES) + else if (cs_idx >= SWSRC_FIRST_FLIGHT_MODE) { + uint8_t idx = cs_idx - SWSRC_FIRST_FLIGHT_MODE; + result = (idx == s_perout_flight_mode); + } #endif else { - cs_idx -= SWSRC_FIRST_CSW; + cs_idx -= SWSRC_FIRST_LOGICAL_SWITCH; GETSWITCH_RECURSIVE_TYPE mask = ((GETSWITCH_RECURSIVE_TYPE)1 << cs_idx); if (s_last_switch_used & mask) { @@ -1800,7 +1807,7 @@ int8_t getMovedSource(GET_MOVED_SOURCE_PARAMS) #if defined(FLIGHT_MODES) uint8_t getFlightPhase() { - for (uint8_t i=1; iswtch && getSwitch(phase->swtch)) { return i; @@ -1824,7 +1831,7 @@ int getTrimValue(uint8_t phase, uint8_t idx) { #if defined(PCBTARANIS) int result = 0; - for (uint8_t i=0; itrim[idx]; if (v.mode == TRIM_MODE_NONE) return; @@ -1883,7 +1890,7 @@ void setTrimValue(uint8_t phase, uint8_t idx, int trim) #if !defined(PCBTARANIS) uint8_t getTrimFlightPhase(uint8_t phase, uint8_t idx) { - for (uint8_t i=0; i 2 int16_t value; @@ -1989,7 +1996,7 @@ uint8_t s_gvar_last = 0; uint8_t getGVarFlightPhase(uint8_t phase, uint8_t idx) { - for (uint8_t i=0; i throttle trim if applicable int16_t trim = getTrimValue(phase, i); @@ -3196,7 +3203,7 @@ void evalInputs(uint8_t mode) } #endif - if (mode <= e_perout_mode_inactive_phase && isFunctionActive(FUNCTION_TRAINER+ch)) { + if (mode <= e_perout_mode_inactive_phase && isFunctionActive(FUNCTION_TRAINER+ch) && ppmInValid) { // trainer mode TrainerMix* td = &g_eeGeneral.trainer.mix[ch]; if (td->mode) { @@ -3530,14 +3537,14 @@ void evalFunctions() #if defined(GVARS) case FUNC_ADJUST_GVAR: if (CFN_GVAR_MODE(sd) == 0) { - SET_GVAR(CFN_GVAR_INDEX(sd), CFN_PARAM(sd), s_perout_flight_phase); + SET_GVAR(CFN_GVAR_INDEX(sd), CFN_PARAM(sd), s_perout_flight_mode); } else if (CFN_GVAR_MODE(sd) == 2) { - SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_PARAM(sd), s_perout_flight_phase), s_perout_flight_phase); + SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_PARAM(sd), s_perout_flight_mode), s_perout_flight_mode); } else if (CFN_GVAR_MODE(sd) == 3) { if (!(activeFnSwitches & switch_mask)) { - SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(s_perout_flight_phase, CFN_GVAR_INDEX(sd))) + (CFN_PARAM(sd) ? +1 : -1), s_perout_flight_phase); + SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(s_perout_flight_mode, CFN_GVAR_INDEX(sd))) + (CFN_PARAM(sd) ? +1 : -1), s_perout_flight_mode); } } else if (CFN_PARAM(sd) >= MIXSRC_TrimRud && CFN_PARAM(sd) <= MIXSRC_TrimAil) { @@ -3547,12 +3554,12 @@ void evalFunctions() else if (CFN_PARAM(sd) >= MIXSRC_REa && CFN_PARAM(sd) < MIXSRC_TrimRud) { int8_t scroll = rePreviousValues[CFN_PARAM(sd)-MIXSRC_REa] - (g_rotenc[CFN_PARAM(sd)-MIXSRC_REa] / ROTARY_ENCODER_GRANULARITY); if (scroll) { - SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(s_perout_flight_phase, CFN_GVAR_INDEX(sd))) + scroll, s_perout_flight_phase); + SET_GVAR(CFN_GVAR_INDEX(sd), GVAR_VALUE(CFN_GVAR_INDEX(sd), getGVarFlightPhase(s_perout_flight_mode, CFN_GVAR_INDEX(sd))) + scroll, s_perout_flight_mode); } } #endif else { - SET_GVAR(CFN_GVAR_INDEX(sd), limit((getvalue_t)-LIMIT_EXT_MAX, getValue(CFN_PARAM(sd)), (getvalue_t)LIMIT_EXT_MAX) / 10, s_perout_flight_phase); + SET_GVAR(CFN_GVAR_INDEX(sd), limit((getvalue_t)-LIMIT_EXT_MAX, getValue(CFN_PARAM(sd)), (getvalue_t)LIMIT_EXT_MAX) / 10, s_perout_flight_mode); } break; #endif @@ -3635,7 +3642,7 @@ void evalFunctions() else { #if defined(GVARS) if (CFN_FUNC(sd) == FUNC_PLAY_TRACK && param > 250) - param = GVAR_VALUE(param-251, getGVarFlightPhase(s_perout_flight_phase, param-251)); + param = GVAR_VALUE(param-251, getGVarFlightPhase(s_perout_flight_mode, param-251)); #endif PUSH_CUSTOM_PROMPT(active ? param : param+1, i+1); } @@ -3716,7 +3723,7 @@ void evalFunctions() #define HELI_ANAS_ARRAY anas #endif -uint8_t s_perout_flight_phase; +uint8_t s_perout_flight_mode; void perOut(uint8_t mode, uint8_t tick10ms) { evalInputs(mode); @@ -3821,7 +3828,11 @@ void perOut(uint8_t mode, uint8_t tick10ms) //========== PHASE && SWITCH ===== bool mixCondition = (md->phases != 0 || md->swtch); - delayval_t mixEnabled = !(md->phases & (1 << s_perout_flight_phase)) && getSwitch(md->swtch); + delayval_t mixEnabled = !(md->phases & (1 << s_perout_flight_mode)) && getSwitch(md->swtch); + + if (mixEnabled && md->srcRaw >= MIXSRC_FIRST_TRAINER && md->srcRaw <= MIXSRC_LAST_TRAINER && !ppmInValid) { + mixEnabled = 0; + } //========== VALUE =============== getvalue_t v = 0; @@ -3906,14 +3917,14 @@ void perOut(uint8_t mode, uint8_t tick10ms) if (apply_offset_and_curve) { #if !defined(PCBTARANIS) // OFFSET is now applied AFTER weight on Taranis //========== OFFSET / SOURCE =============== - int16_t offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_perout_flight_phase); + int16_t offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_perout_flight_mode); if (offset) v += calc100toRESX_16Bits(offset); #endif //========== TRIMS ================ if (!(mode & e_perout_mode_notrims)) { #if defined(PCBTARANIS) - if (!md->carryTrim) { + if (md->carryTrim == 0) { int8_t mix_trim; if (stickIndex < NUM_STICKS) mix_trim = stickIndex; @@ -3921,7 +3932,13 @@ void perOut(uint8_t mode, uint8_t tick10ms) mix_trim = virtualInputsTrims[md->srcRaw-1]; else mix_trim = -1; - if (mix_trim >= 0) v += trims[mix_trim]; + if (mix_trim >= 0) { + int16_t trim = trims[mix_trim]; + if (mix_trim == THR_STICK && g_model.throttleReversed) + v -= trim; + else + v += trim; + } } #else int8_t mix_trim = md->carryTrim; @@ -3931,13 +3948,19 @@ void perOut(uint8_t mode, uint8_t tick10ms) mix_trim = stickIndex; else mix_trim = -1; - if (mix_trim >= 0) v += trims[mix_trim]; + if (mix_trim >= 0) { + int16_t trim = trims[mix_trim]; + if (mix_trim == THR_STICK && g_model.throttleReversed) + v -= trim; + else + v += trim; + } #endif } } // saves 12 bytes code if done here and not together with weight; unknown reason - int16_t weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_perout_flight_phase); + int16_t weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_perout_flight_mode); weight = calc100to256_16Bits(weight); //========== SPEED =============== @@ -3998,7 +4021,7 @@ void perOut(uint8_t mode, uint8_t tick10ms) //========== OFFSET / AFTER =============== #if defined(PCBTARANIS) if (apply_offset_and_curve) { - int16_t offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_perout_flight_phase); + int16_t offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, s_perout_flight_mode); if (offset) dv += calc100toRESX_16Bits(offset) << 8; } #endif @@ -4011,7 +4034,7 @@ void perOut(uint8_t mode, uint8_t tick10ms) #else if (md->curveMode == MODE_DIFFERENTIAL) { // @@@2 also recalculate curveParam to a 256 basis which ease the calculation later a lot - int16_t curveParam = calc100to256(GET_GVAR(md->curveParam, -100, 100, s_perout_flight_phase)); + int16_t curveParam = calc100to256(GET_GVAR(md->curveParam, -100, 100, s_perout_flight_mode)); if (curveParam > 0 && dv < 0) dv = (dv * (256 - curveParam)) >> 8; else if (curveParam < 0 && dv > 0) @@ -4140,7 +4163,7 @@ void doMixerCalculations() #endif #define MAX_ACT 0xffff - static uint16_t fp_act[MAX_PHASES] = {0}; + static uint16_t fp_act[MAX_FLIGHT_MODES] = {0}; static uint16_t delta = 0; static ACTIVE_PHASES_TYPE s_fade_flight_phases = 0; static uint8_t s_last_phase = 255; // TODO reinit everything here when the model changes, no??? @@ -4175,10 +4198,10 @@ void doMixerCalculations() int32_t weight = 0; if (s_fade_flight_phases) { memclear(sum_chans512, sizeof(sum_chans512)); - for (uint8_t p=0; p> 4) * fp_act[p]; @@ -4187,10 +4210,10 @@ void doMixerCalculations() s_last_switch_used = 0; } assert(weight); - s_perout_flight_phase = phase; + s_perout_flight_mode = phase; } else { - s_perout_flight_phase = phase; + s_perout_flight_mode = phase; perOut(e_perout_mode_normal, tick10ms); } @@ -4522,7 +4545,7 @@ void doMixerCalculations() if (s_fade_flight_phases) { uint16_t tick_delta = delta * tick10ms; - for (uint8_t p=0; p4000 && val < 16000) // G: Prioritize reset pulse. (Needed when less than 8 incoming pulses) + if (val>4000 && val < 16000) { // G: Prioritize reset pulse. (Needed when less than 8 incoming pulses) ppmInState = 1; // triggered - else - { - if (ppmInState && ppmInState<=8) - { - if (val>800 && val<2200) // if valid pulse-width range - { - g_ppmIns[ppmInState++ - 1] = - (int16_t)(val - 1500)*(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. + } + else { + if (ppmInState>0 && ppmInState<=8) { + if (val>800 && val<2200) { // if valid pulse-width range + ppmInValid = 100; + g_ppmIns[ppmInState++ - 1] = (int16_t)(val - 1500) * (uint8_t)(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. } - else + else { ppmInState = 0; // not triggered + } } } @@ -5215,7 +5238,7 @@ void instantTrim() for (uint8_t i=0; i(TRIM_EXTENDED_MIN, (calibratedStick[i] + trims[i]) / 2, TRIM_EXTENDED_MAX); #else @@ -5279,8 +5302,8 @@ void moveTrimsToOffsets() // copy state of 3 primary to subtrim // reset all trims, except throttle (if throttle trim) for (uint8_t i=0; i800 && val<2200) // if valid pulse-width range - { - g_ppmIns[ppmInState++ - 1] = - (int16_t)(val - 1500)*(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. + if (ppmInState>0 && ppmInState<=16) { + if (val>800 && val<2200) { // if valid pulse-width range + ppmInValid = 100; + g_ppmIns[ppmInState++ - 1] = (int16_t)(val - 1500)*(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. } - else + else { ppmInState = 0; // not triggered + } } } diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 5e453d215..2a92fd74e 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -126,12 +126,13 @@ extern "C" void TIM3_IRQHandler() // We process g_ppmInsright here to make servo movement as smooth as possible // while under trainee control - if ((val>4000) && (val < 19000)) { // G: Prioritize reset pulse. (Needed when less than 16 incoming pulses) + if (val>4000 && val<19000) { // G: Prioritize reset pulse. (Needed when less than 16 incoming pulses) ppmInState = 1; // triggered } else { - if (ppmInState && (ppmInState<=16)) { - if ((val>800) && (val<2200)) { + if (ppmInState>0 && ppmInState<=16) { + if (val>800 && val<2200) { + ppmInValid = 100; g_ppmIns[ppmInState++ - 1] = (int16_t)(val - 1500)*(g_eeGeneral.PPM_Multiplier+10)/10; //+-500 != 512, but close enough. } else { diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 9336b2ea8..0f7efd6c3 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -294,9 +294,13 @@ #define TR_A3_A4_MIN #endif -#define TR_ASPD_MAX "ASp+" +#define TR_ASPD_MAX TR("ASp+", "ASpd+") -#define TR_VTELEMCHNS "---\0""Batt""Tmr1""Tmr2" TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Höjd""Varv""Tank""T1\0 ""T2\0 ""Fart""Avst""GHjd""Batt""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VFrt""ASpd""dTE\0" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "A1-\0""A2-\0" TR_A3_A4_MIN "Hjd-""Hjd+""Rpm+""T1+\0""T2+\0""Frt+""Avs+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Tid\0" +#if LCD_W >= 212 + #define TR_VTELEMCHNS "---\0 ""Batt\0""Tmr1\0""Tmr2\0" TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0 ""Rpm\0 ""Fuel\0""T1\0 ""T2\0 ""Spd\0 ""Dist\0""GAlt\0""Cell\0""Cells""Vfas\0""Curr\0""Cnsp\0""Powr\0""AccX\0""AccY\0""AccZ\0""Hdg\0 ""VSpd\0""ASpd\0""dTE\0 " TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "A1-\0 ""A2-\0 " TR_A3_A4_MIN "Alt-\0""Alt+\0""Rpm+\0""T1+\0 ""T2+\0 ""Spd+\0""Dst+\0" TR_ASPD_MAX "Cell-""Cels-""Vfas-""Curr+""Powr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0 ""Time\0" +#else + #define TR_VTELEMCHNS "---\0""Batt""Tmr1""Tmr2" TR_SWR "Tx\0 ""Rx\0 " TR_RX_BATT "A1\0 ""A2\0 " TR_A3_A4 "Alt\0""Rpm\0""Fuel""T1\0 ""T2\0 ""Spd\0""Dist""GAlt""Cell""Cels""Vfas""Curr""Cnsp""Powr""AccX""AccY""AccZ""Hdg\0""VSpd""ASpd""dTE\0" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "A1-\0""A2-\0" TR_A3_A4_MIN "Alt-""Alt+""Rpm+""T1+\0""T2+\0""Spd+""Dst+" TR_ASPD_MAX "Cel-""Cls-""Vfs-""Cur+""Pwr+" TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE TR_TELEM_RESERVE "Acc\0""Time" +#endif #define LENGTH_UNIT_IMP "ft\0" #define SPEED_UNIT_IMP "mph" @@ -415,7 +419,7 @@ #define TR_CYC_VSRCRAW "[C1]""[C2]""[C3]" #endif -#define TR_VSRCRAW "---\0""Rod\0""Hjd\0""Gas\0""Ske\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODER "MAX " TR_CYC_VSRCRAW "TrmR" "TrmH" "TrmG" "TrmS" TR_SW_VSRCRAW +#define TR_VSRCRAW "---\0""Rod\0""Hjd\0""Gas\0""Ske\0" TR_POTS_VSRCRAW TR_ROTARY_ENCODERS "MAX\0" TR_CYC_VSRCRAW "TrmR" "TrmH" "TrmG" "TrmS" TR_SW_VSRCRAW #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "Av\0""ABS""GAs""GA%""GAt" @@ -440,7 +444,6 @@ #define LEN_INDENT 1 #define INDENT_WIDTH (FW/2) - #if defined(PCBTARANIS) #define TR_ENTER "[ENTER]" #else @@ -475,7 +478,7 @@ #define TR_TTRIM TR("Gastrim", INDENT "Gastrim") #define TR_BEEPCTR TR("Cent.pip", "Centerpip") #define TR_PROTO TR(INDENT "Proto", INDENT "Protokoll") -#define TR_PPMFRAME "PPM-paket" +#define TR_PPMFRAME TR(INDENT "PPM-paket", INDENT "PPM-paket") #define TR_MS "ms" #define TR_SWITCH "Brytare" #define TR_TRIMS "Trimmar" @@ -851,7 +854,6 @@ #define TR_ABOUT_HARDWARE_3 "" #endif - #define TR_ABOUT_PARENTS_1 "Ursprungsprojekt" #define TR_ABOUT_PARENTS_2 "ersky9x (Mike Blandford)" #define TR_ABOUT_PARENTS_3 "ER9X (Erez Raviv)" @@ -874,4 +876,4 @@ #define TR_VIEW_CHANNELS "Visa Kanaler" #define TR_VIEW_NOTES "Visa Noteringars" #define TR_MODS_FORBIDDEN "Modifikationer förbjudna!" -#define TR_UNLOCKED "Olåst" +#define TR_UNLOCKED "Olåst" \ No newline at end of file