diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp index 3878bf3ae..7cb6508d3 100644 --- a/companion/src/eeprominterface.cpp +++ b/companion/src/eeprominterface.cpp @@ -92,12 +92,13 @@ QString getGVarString(int16_t val, bool sign) } } -RawSourceRange RawSource::getRange(const ModelData & model, const GeneralSettings & settings, bool singleprec) +RawSourceRange RawSource::getRange(const ModelData & model, const GeneralSettings & settings, unsigned int flags) { RawSourceRange result; FirmwareInterface * firmware = GetCurrentFirmware(); int board = firmware->getBoard(); + bool singleprec = (flags & RANGE_SINGLE_PRECISION); if (!singleprec && !IS_ARM(board)) { singleprec = true; @@ -266,6 +267,17 @@ RawSourceRange RawSource::getRange(const ModelData & model, const GeneralSetting if (singleprec && result.offset==-DBL_MAX) { result.offset = result.max - (127*result.step); } + + if (flags & (RANGE_DELTA_FUNCTION|RANGE_DELTA_ABS_FUNCTION)) { + if (singleprec) { + result.offset = 0; + result.min = result.step * -127; + result.max = result.step * 127; + } + else { + result.min = -result.max; + } + } break; default: @@ -274,6 +286,10 @@ RawSourceRange RawSource::getRange(const ModelData & model, const GeneralSetting break; } + if (flags & RANGE_DELTA_ABS_FUNCTION) { + result.min = 0; + } + return result; } @@ -497,9 +513,14 @@ CSFunctionFamily LogicalSwitchData::getFunctionFamily() return LS_FAMILY_VCOMP; } -bool LogicalSwitchData::isDeltaFunction() +unsigned int LogicalSwitchData::getRangeFlags() { - return (func == LS_FN_DPOS || func == LS_FN_DAPOS); + if (func == LS_FN_DPOS) + return RANGE_DELTA_FUNCTION; + else if (func == LS_FN_DAPOS) + return RANGE_DELTA_ABS_FUNCTION; + else + return 0; } QString LogicalSwitchData::funcToString() @@ -588,7 +609,7 @@ QString LogicalSwitchData::toString(const ModelData & model, const GeneralSettin else if (func == LS_FN_DPOS) result = "d(" + res + ")"; result += res; - if (func == LS_FN_APOS || func == LS_FN_VPOS || isDeltaFunction()) + if (func == LS_FN_APOS || func == LS_FN_VPOS || func == LS_FN_DPOS || func == LS_FN_DAPOS) result += " > "; else if (func == LS_FN_ANEG || func == LS_FN_VNEG) result += " < "; diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 50a0cdf85..b72376758 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -330,6 +330,10 @@ class RawSourceRange QString unit; }; +#define RANGE_SINGLE_PRECISION 1 +#define RANGE_DELTA_FUNCTION 2 +#define RANGE_DELTA_ABS_FUNCTION 4 + class GeneralSettings; class RawSource { public: @@ -358,7 +362,7 @@ class RawSource { QString toString(const ModelData & model); - RawSourceRange getRange(const ModelData & model, const GeneralSettings & settings, bool singleprec=false); + RawSourceRange getRange(const ModelData & model, const GeneralSettings & settings, unsigned int flags=0); bool operator == ( const RawSource & other) { return (this->type == other.type) && (this->index == other.index); @@ -712,7 +716,7 @@ class LogicalSwitchData { // Logical Switches data int andsw; void clear() { memset(this, 0, sizeof(LogicalSwitchData)); } CSFunctionFamily getFunctionFamily(); - bool isDeltaFunction(); + unsigned int getRangeFlags(); QString funcToString(); QString toString(const ModelData & model, const GeneralSettings & settings); }; diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index dc2f3af65..0fd1f5e28 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -139,13 +139,8 @@ void LogicalSwitchesPanel::v1Edited(int value) model.customSw[i].val1 = cswitchSource1[i]->itemData(value).toInt(); if (model.customSw[i].getFunctionFamily() == LS_FAMILY_VOFS) { RawSource source = RawSource(model.customSw[i].val1); - RawSourceRange range = source.getRange(model, generalSettings); - if (model.customSw[i].isDeltaFunction()) { - model.customSw[i].val2 = (cswitchOffset[i]->value() / range.step); - } - else { - model.customSw[i].val2 = (cswitchOffset[i]->value() - range.offset) / range.step; - } + RawSourceRange range = source.getRange(model, generalSettings, model.customSw[i].getRangeFlags()); + model.customSw[i].val2 = (cswitchOffset[i]->value() - range.offset) / range.step; setSwitchWidgetVisibility(i); } emit modified(); @@ -191,7 +186,6 @@ void LogicalSwitchesPanel::edited() int i = sender()->property("index").toInt(); int newFunc = csw[i]->itemData(csw[i]->currentIndex()).toInt(); bool chAr = (model.customSw[i].getFunctionFamily() != LogicalSwitchData(newFunc).getFunctionFamily()); - bool chDelta = (model.customSw[i].isDeltaFunction() ^ LogicalSwitchData(newFunc).isDeltaFunction()); model.customSw[i].func = newFunc; if (chAr) { if (model.customSw[i].getFunctionFamily() == LS_FAMILY_TIMER) { @@ -210,28 +204,18 @@ void LogicalSwitchesPanel::edited() model.customSw[i].andsw = 0; setSwitchWidgetVisibility(i); } - if (chDelta) { - model.customSw[i].val2 = 0; - setSwitchWidgetVisibility(i); - } RawSource source; + switch (model.customSw[i].getFunctionFamily()) { case LS_FAMILY_VOFS: { source = RawSource(model.customSw[i].val1); - RawSourceRange range = source.getRange(model, generalSettings); + RawSourceRange range = source.getRange(model, generalSettings, model.customSw[i].getRangeFlags()); double value = source.isTimeBased() ? QTimeS(cswitchTOffset[i]->time()).seconds() : cswitchOffset[i]->value(); - if (model.customSw[i].isDeltaFunction()) { - /*TODO: is this delta function value set correctly*/ - model.customSw[i].val2 = round(value/range.step); - value=model.customSw[i].val2*range.step; - } - else { - model.customSw[i].val2 = round((value-range.offset)/range.step);; - value = model.customSw[i].val2*range.step + range.offset; - } + model.customSw[i].val2 = round((value-range.offset)/range.step);; + value = model.customSw[i].val2*range.step + range.offset; if (source.isTimeBased()) cswitchTOffset[i]->setTime(QTimeS(round(value))); else @@ -296,7 +280,7 @@ void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i) unsigned int mask = 0; RawSource source = RawSource(model.customSw[i].val1); - RawSourceRange range = source.getRange(model, generalSettings); + RawSourceRange range = source.getRange(model, generalSettings, model.customSw[i].getRangeFlags()); switch (model.customSw[i].getFunctionFamily()) { @@ -307,17 +291,8 @@ void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i) cswitchOffset[i]->setSingleStep(range.step); if (source.isTimeBased()) { mask |= VALUE_TO_VISIBLE; - int maxTime; - int value; - if (model.customSw[i].isDeltaFunction()) { - /*TODO: is this delta function value set correctly*/ - maxTime = round(range.step*127); - value = round(range.step*model.customSw[i].val2); - } - else { - maxTime = round(range.max); - value = round(range.step*(model.customSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset); - } + int maxTime = round(range.max); + int value = round(range.step*model.customSw[i].val2 + range.offset); cswitchTOffset[i]->setMaximumTime(QTimeS(maxTime)); cswitchTOffset[i]->setDisplayFormat((maxTime>=3600)?"hh:mm:ss":"mm:ss"); cswitchTOffset[i]->setTime(QTimeS(value)); @@ -328,17 +303,9 @@ void LogicalSwitchesPanel::setSwitchWidgetVisibility(int i) cswitchOffset[i]->setSuffix(""); else cswitchOffset[i]->setSuffix(" " + range.unit); - if (model.customSw[i].isDeltaFunction()) { - /*TODO: is this delta function value set correctly*/ - cswitchOffset[i]->setMinimum(range.step*-127); - cswitchOffset[i]->setMaximum(range.step*127); - cswitchOffset[i]->setValue(range.step*model.customSw[i].val2); - } - else { - cswitchOffset[i]->setMinimum(range.min); - cswitchOffset[i]->setMaximum(range.max); - cswitchOffset[i]->setValue(range.step*(model.customSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset); - } + cswitchOffset[i]->setMinimum(range.min); + cswitchOffset[i]->setMaximum(range.max); + cswitchOffset[i]->setValue(range.step*(model.customSw[i].val2/* TODO+source.getRawOffset(model)*/)+range.offset); } break; case LS_FAMILY_VBOOL: diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 1e37aa5b3..8133d8d8f 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -408,7 +408,7 @@ void TelemetryCustomScreen::updateBar(int line) barsCB[line]->setCurrentIndex(index); if (index) { RawSource source = RawSource(SOURCE_TYPE_TELEMETRY, index-1); - RawSourceRange range = source.getRange(model, generalSettings, true); + RawSourceRange range = source.getRange(model, generalSettings, RANGE_SINGLE_PRECISION); int max = round((range.max - range.min) / range.step); if (int(255-screen.body.bars[line].barMax) > max) screen.body.bars[line].barMax = 255 - max; diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index e43e5038e..5f1fd33f4 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -4397,7 +4397,12 @@ void menuModelLogicalSwitchOne(uint8_t event) if (v1_val >= MIXSRC_FIRST_TELEM) { putsTelemetryChannel(CSWONE_2ND_COLUMN, y, v1_val - MIXSRC_FIRST_TELEM, convertLswTelemValue(cs), attr|LEFT); v2_max = maxTelemValue(v1_val - MIXSRC_FIRST_TELEM + 1); - v2_min = minTelemValue(v1_val - MIXSRC_FIRST_TELEM + 1); + if (cs->func == LS_FUNC_DIFFEGREATER) + v2_min = -v2_max; + else if (cs->func == LS_FUNC_ADIFFEGREATER) + v2_min = 0; + else + v2_min = minTelemValue(v1_val - MIXSRC_FIRST_TELEM + 1); INCDEC_SET_FLAG(INCDEC_REP10 | NO_INCDEC_MARKS); if (cs->v2 < v2_min || cs->v2 > v2_max) { cs->v2 = 0; @@ -4682,7 +4687,12 @@ void menuModelLogicalSwitches(uint8_t event) putsTelemetryChannel(CSW_3RD_COLUMN, y, v1_val - MIXSRC_FIRST_TELEM, convertLswTelemValue(cs), LEFT|attr2); v2_max = maxTelemValue(v1_val - MIXSRC_FIRST_TELEM + 1); #if defined(CPUARM) - v2_min = minTelemValue(v1_val - MIXSRC_FIRST_TELEM + 1); + if (cs->func == LS_FUNC_DIFFEGREATER) + v2_min = -v2_max; + else if (cs->func == LS_FUNC_ADIFFEGREATER) + v2_min = 0; + else + v2_min = minTelemValue(v1_val - MIXSRC_FIRST_TELEM + 1); if (horz == 2 && v2_max-v2_min > 1000) INCDEC_SET_FLAG(INCDEC_REP10 | NO_INCDEC_MARKS); if (cs->v2 < v2_min || cs->v2 > v2_max) {