feat: Support for 8s Cell Sensor such as FrSky FLVS ADV (#2302)

* first commit for FrSky 8s Lipo Sensor

FLVS Advanced transfers up to 8 cell voltages for Cels sensor

* correcting mistake made transferring local change to PR

* complementary extension of Companion telemetry simulator to enable simulation of  8 cells

* change to allow selection of cells 7 and 8 in calculated sensor with formula Cell

* (cpn) Add bin and yml conversions and basic semantic version helper

Co-authored-by: elecpower <neilh713@tpg.com.au>
This commit is contained in:
Michael
2022-09-27 20:06:26 +10:00
committed by GitHub
co-authored by elecpower
parent 513578643c
commit 73861554ec
27 changed files with 255 additions and 22 deletions
@@ -34,6 +34,7 @@
#include "output_data.h"
#include "eeprominterface.h"
#include "version.h"
#include "helpers.h"
#include <string>
@@ -1140,6 +1141,19 @@ bool convert<ModelData>::decode(const Node& node, ModelData& rhs)
node["functionSwitchStartConfig"] >> rhs.functionSwitchStartConfig;
node["functionSwitchLogicalState"] >> rhs.functionSwitchLogicalState;
node["switchNames"] >> rhs.functionSwitchNames;
// preferably perform conversions here to avoid cluttering the field decodes
if (SemanticVersion(QString(rhs.semver)) < SemanticVersion("2.8.0")) {
// Cells 7 and 8 introduced requiring Highest and Delta to be shifted + 2
for (int i = 0; i < CPN_MAX_SENSORS; i++) {
SensorData &sd = rhs.sensorData[i];
if (!sd.isEmpty() && sd.type == SensorData::TELEM_TYPE_CALCULATED &&
sd.formula == SensorData::TELEM_FORMULA_CELL && sd.index > 6)
sd.index += 2;
}
}
return true;
}
@@ -2066,6 +2066,12 @@ class SensorField: public TransformedField {
}
}
// Cells 7 and 8 introduced in v2.8 requiring Highest and Delta to be shifted + 2
if (version < 221) {
if (sensor.formula == SensorData::TELEM_FORMULA_CELL && sensor.index > 6)
sensor.index += 2;
}
qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName());
}
+2
View File
@@ -76,6 +76,8 @@ class SensorData {
TELEM_CELL_INDEX_4,
TELEM_CELL_INDEX_5,
TELEM_CELL_INDEX_6,
TELEM_CELL_INDEX_7,
TELEM_CELL_INDEX_8,
TELEM_CELL_INDEX_HIGHEST,
TELEM_CELL_INDEX_DELTA,
TELEM_CELL_INDEX_LAST = TELEM_CELL_INDEX_DELTA
+84
View File
@@ -726,3 +726,87 @@ QString Helpers::removeAccents(const QString & str)
}
return result;
}
SemanticVersion::SemanticVersion(QString vers)
{
if (!isValid(vers))
return;
QStringList strl = vers.split(".");
version.major = strl.at(0).toInt();
version.minor = strl.at(1).toInt();
if (strl.count() > 2) {
if (!strl.at(2).contains("-")) {
version.patch = strl.at(2).toInt();
} else {
QStringList ptch = strl.at(2).toLower().split("-");
version.patch = ptch.at(0).toInt();
if (ptch.at(1).left(2) == "rc") {
version.preReleaseType = PR_RC;
version.preReleaseNumber = ptch.at(1).mid(2).toInt();
} else if (ptch.at(1).left(5) == "alpha") {
version.preReleaseType = PR_ALPHA;
version.preReleaseNumber = ptch.at(1).mid(5).toInt();
} else if (ptch.at(1).left(4) == "beta") {
version.preReleaseType = PR_BETA;
version.preReleaseNumber = ptch.at(1).mid(4).toInt();
}
}
}
}
bool SemanticVersion::isValid(QString vers)
{
if (vers.trimmed().isEmpty())
return false;
QStringList strl = vers.split(".");
if (strl.count() < 2)
return false;
return true;
}
QString SemanticVersion::toString() const
{
QString ret(QString("%1.%2.%3").arg(version.major).arg(version.minor).arg(version.patch));
if (version.preReleaseType != PR_NONE) {
ret.append("-");
if (version.preReleaseType == PR_RC)
ret.append("RC");
else if (version.preReleaseType == PR_ALPHA)
ret.append("ALPHA");
else if (version.preReleaseType == PR_BETA)
ret.append("BETA");
ret.append(QString::number(version.preReleaseNumber));
}
return ret;
}
int SemanticVersion::compare(const SemanticVersion& other)
{
if (version.major != other.version.major) {
return version.major - other.version.major;
}
if (version.minor != other.version.minor) {
return version.minor - other.version.minor;
}
if (version.patch != other.version.patch) {
return version.patch - other.version.patch;
}
if (version.preReleaseType != other.version.preReleaseType) {
return version.preReleaseType - other.version.preReleaseType;
}
if (version.preReleaseNumber != other.version.preReleaseNumber) {
return version.preReleaseNumber - other.version.preReleaseNumber;
}
return 0;
}
+55
View File
@@ -240,3 +240,58 @@ private:
};
extern Stopwatch gStopwatch;
class SemanticVersion
{
public:
explicit SemanticVersion(QString vers);
~SemanticVersion() = default;;
bool isValid(const QString vers);
QString toString() const;
bool operator==(const SemanticVersion& rhs) {
return compare(rhs) == 0;
}
bool operator!=(const SemanticVersion& rhs) {
return compare(rhs) != 0;
}
bool operator>(const SemanticVersion& rhs) {
return compare(rhs) > 0;
}
bool operator>=(const SemanticVersion& rhs) {
return compare(rhs) >= 0;
}
bool operator<(const SemanticVersion& rhs) {
return compare(rhs) < 0;
}
bool operator<=(const SemanticVersion& rhs) {
return compare(rhs) <= 0;
}
private:
enum PreRelease {
PR_ALPHA = 0,
PR_BETA = 1,
PR_RC = 2,
PR_NONE = 3
};
struct Version {
int major = 0;
int minor = 1;
int patch = 0;
PreRelease preReleaseType = PR_NONE;
int preReleaseNumber = 0;
};
Version version;
int compare(const SemanticVersion& other);
};
+19 -1
View File
@@ -442,6 +442,8 @@ void TelemetrySimulator::generateTelemetryFrame()
cellValues[3] = ui->cell4->value();
cellValues[4] = ui->cell5->value();
cellValues[5] = ui->cell6->value();
cellValues[6] = ui->cell7->value();
cellValues[7] = ui->cell8->value();
generateSportPacket(buffer, ui->cells_inst->text().toInt(&ok, 0) - 1, DATA_FRAME, CELLS_FIRST_ID, flvss->setAllCells_GetNextPair(cellValues));
}
else {
@@ -547,6 +549,7 @@ void TelemetrySimulator::FlvssEmulator::encodeAllCells()
cellData1 = encodeCellPair(numCells, 0, cellFloats[0], cellFloats[1]);
if (numCells > 2) cellData2 = encodeCellPair(numCells, 2, cellFloats[2], cellFloats[3]); else cellData2 = 0;
if (numCells > 4) cellData3 = encodeCellPair(numCells, 4, cellFloats[4], cellFloats[5]); else cellData3 = 0;
if (numCells > 6) cellData4 = encodeCellPair(numCells, 6, cellFloats[6], cellFloats[7]); else cellData4 = 0;
}
void TelemetrySimulator::FlvssEmulator::splitIntoCells(double totalVolts)
@@ -564,7 +567,7 @@ void TelemetrySimulator::FlvssEmulator::splitIntoCells(double totalVolts)
numCells = numCells > MAXCELLS ? MAXCELLS : numCells; // force into valid cell count in case of input out of range
}
uint32_t TelemetrySimulator::FlvssEmulator::setAllCells_GetNextPair(double cellValues[6])
uint32_t TelemetrySimulator::FlvssEmulator::setAllCells_GetNextPair(double cellValues[MAXCELLS])
{
numCells = 0;
for (uint32_t i = 0; i < MAXCELLS; i++) {
@@ -603,6 +606,9 @@ uint32_t TelemetrySimulator::FlvssEmulator::setAllCells_GetNextPair(double cellV
case 4:
cellData = cellData3;
break;
case 6:
cellData = cellData4;
break;
}
nextCellNum += 2;
return cellData;
@@ -1198,6 +1204,10 @@ void TelemetrySimulator::on_saveTelemetryvalues_clicked()
out<<"\r\n";
out << ui -> cell6 -> text();
out<<"\r\n";
out << ui -> cell7 -> text();
out<<"\r\n";
out << ui -> cell8 -> text();
out<<"\r\n";
out << ui -> aspeed -> text();
out<<"\r\n";
out << ui -> gps_alt -> text();
@@ -1330,6 +1340,14 @@ void TelemetrySimulator::on_loadTelemetryvalues_clicked()
ns = n.toDouble();
ui -> cell6 -> setValue(ns);
n = in.readLine();
ns = n.toDouble();
ui -> cell7 -> setValue(ns);
n = in.readLine();
ns = n.toDouble();
ui -> cell8 -> setValue(ns);
n = in.readLine();
ns = n.toDouble();
ui -> aspeed -> setValue(ns);
+4 -3
View File
@@ -171,19 +171,20 @@ class TelemetrySimulator : public QWidget
class FlvssEmulator
{
public:
uint32_t setAllCells_GetNextPair(double cellValues[6]);
static const uint32_t MAXCELLS = 6;
static const uint32_t MAXCELLS = 8;
uint32_t setAllCells_GetNextPair(double cellValues[MAXCELLS]);
private:
void encodeAllCells();
void splitIntoCells(double totalVolts);
static uint32_t encodeCellPair(uint8_t cellNum, uint8_t firstCellNo, double cell1, double cell2);
double cellFloats[6];
double cellFloats[MAXCELLS];
uint32_t nextCellNum;
uint32_t numCells;
uint32_t cellData1;
uint32_t cellData2;
uint32_t cellData3;
uint32_t cellData4;
}; // FlvssEmulator
class GPSEmulator
+50
View File
@@ -2587,6 +2587,54 @@ hh:mm:ss</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QDoubleSpinBox" name="cell7">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<double>8.190000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>4.200000000000000</double>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="cell8">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="maximum">
<double>8.190000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>4.200000000000000</double>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="2">
@@ -3184,6 +3232,8 @@ Timestamp</string>
<tabstop>cell4</tabstop>
<tabstop>cell5</tabstop>
<tabstop>cell6</tabstop>
<tabstop>cell7</tabstop>
<tabstop>cell8</tabstop>
<tabstop>aspd_inst</tabstop>
<tabstop>aspeed</tabstop>
<tabstop>gpsa_inst</tabstop>
@@ -229,7 +229,7 @@ void menuModelSensor(event_t event)
case SENSOR_FIELD_PARAM2:
if (sensor->type == TELEM_TYPE_CALCULATED) {
if (sensor->formula == TELEM_FORMULA_CELL) {
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event);
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, attr, event);
break;
}
else if (sensor->formula == TELEM_FORMULA_DIST) {
@@ -243,7 +243,7 @@ void menuModelSensor(event_t event)
case SENSOR_FIELD_PARAM2:
if (sensor->type == TELEM_TYPE_CALCULATED) {
if (sensor->formula == TELEM_FORMULA_CELL) {
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event);
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, attr, event);
break;
}
else if (sensor->formula == TELEM_FORMULA_DIST) {
+1 -1
View File
@@ -308,7 +308,7 @@ class SensorEditWindow : public Page {
if (sensor->type == TELEM_TYPE_CALCULATED) {
if (sensor->formula == TELEM_FORMULA_CELL) {
new StaticText(sensorParametersWindow, grid.getLabelSlot(), STR_CELLINDEX, 0, COLOR_THEME_PRIMARY1);
new Choice(sensorParametersWindow, grid.getFieldSlot(), STR_VCELLINDEX, 0, 8, GET_SET_DEFAULT(sensor->cell.index));
new Choice(sensorParametersWindow, grid.getFieldSlot(), STR_VCELLINDEX, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, GET_SET_DEFAULT(sensor->cell.index));
}
else if (sensor->formula == TELEM_FORMULA_DIST) {
new StaticText(sensorParametersWindow, grid.getLabelSlot(), STR_ALTSENSOR, 0, COLOR_THEME_PRIMARY1);
+3
View File
@@ -94,8 +94,11 @@ enum {
TELEM_CELL_INDEX_4,
TELEM_CELL_INDEX_5,
TELEM_CELL_INDEX_6,
TELEM_CELL_INDEX_7,
TELEM_CELL_INDEX_8,
TELEM_CELL_INDEX_HIGHEST,
TELEM_CELL_INDEX_DELTA,
TELEM_CELL_INDEX_LAST = TELEM_CELL_INDEX_DELTA
};
PACK(struct CellValue
+1 -1
View File
@@ -28,7 +28,7 @@
#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading!
#define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1]
#define MAX_CELLS 6
#define MAX_CELLS 8
class TelemetryValue {
public:
+1 -1
View File
@@ -278,7 +278,7 @@
#define TR_VSENSORTYPES "自定义","运算"
#define TR_VFORMULAS "加","平均值","最小值","最大值","乘","总计值","单节电池","消耗量","距离"
#define TR_VPREC "0.--","0.0-","0.00"
#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值"
#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","7","8","最高值","差值"
#define TR_TEXT_SIZE "标准","小","较小","中等","双倍"
#define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)", "=(整体)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -296,7 +296,7 @@
#define TR_VSENSORTYPES "Vlastní","Vypočtený"
#define TR_VFORMULAS "Součet","Průměr","Min","Max","Násobení","Celkem","Článek","Spotřeba","Vzdálenost"
#define TR_VPREC "X","X.X","X.XX"
#define TR_VCELLINDEX "Nízký","1","2","3","4","5","6","Nejvíce","Delta"
#define TR_VCELLINDEX "Nízký","1","2","3","4","5","6","7","8","Nejvíce","Delta"
#define TR_SUBTRIMMODES STR_CHAR_DELTA"(pouze středy)","= (symetrický)"
#define TR_TIMER_DIR TR("Zbývající", "Zobrazit zbývající"), TR("Uplynulý", "Zobrazit uplynulý")
+1 -1
View File
@@ -278,7 +278,7 @@
#define TR_VSENSORTYPES "Tilpasset","Beregnet"
#define TR_VFORMULAS "Tillæg","Gennems.","Min","Max","Gange","Sum","Cell","Forbrug","Afstand"
#define TR_VPREC "0.--","0.0 ","0.00"
#define TR_VCELLINDEX "Lavest","1","2","3","4","5","6","Højst","Delta"
#define TR_VCELLINDEX "Lavest","1","2","3","4","5","6","7","8","Højst","Delta"
#define TR_TEXT_SIZE "Standard","Tynd","Lille","Medium","Dobbelt"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center kun)","= (symmetrisk)"
#define TR_TIMER_DIR TR("Rest", "Vis rest"), TR("Gået tid", "Vis gået tid")
+1 -1
View File
@@ -281,7 +281,7 @@
#define TR_VSENSORTYPES "Sensor","Berechnung"
#define TR_VFORMULAS "Addieren","Mittelwert","Min","Max","Multiplizier","Gesamt","Zelle","Verbrauch","Distanz"
#define TR_VPREC "0.--","0.0","0.00"
#define TR_VCELLINDEX "Niedrigst","1. Zelle","2. Zelle","3. Zelle","4. Zelle","5. Zelle","6. Zelle","Höchster","Differenz"
#define TR_VCELLINDEX "Niedrigst","1. Zelle","2. Zelle","3. Zelle","4. Zelle","5. Zelle","6. Zelle","7. Zelle","8. Zelle","Höchster","Differenz"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -278,7 +278,7 @@
#define TR_VSENSORTYPES "Custom","Calculated"
#define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Consumpt","Distance"
#define TR_VPREC "0.--","0.0 ","0.00"
#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta"
#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","7","8","Highest","Delta"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symmetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -278,7 +278,7 @@
#define TR_VSENSORTYPES "Custom","Calculado"
#define TR_VFORMULAS "Suma","Media","Min","Máx","Multipl.","Total","Cell","Consumo","Distancia"
#define TR_VPREC "0.--","0.0 ","0.00"
#define TR_VCELLINDEX "Menor","1","2","3","4","5","6","Mayor","Delta"
#define TR_VCELLINDEX "Menor","1","2","3","4","5","6","7","8","Mayor","Delta"
#define TR_TEXT_SIZE "Normal","Muy pequeño","Pequeño","Medio","Doble"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -296,7 +296,7 @@
#define TR_VSENSORTYPES "Custom","Calculated"
#define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Kulutus","Etäisyys"
#define TR_VPREC "0.--","0.0","0.00"
#define TR_VCELLINDEX "Alin","1","2","3","4","5","6","Korkein","Ero"
#define TR_VCELLINDEX "Alin","1","2","3","4","5","6","7","8","Korkein","Ero"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -299,7 +299,7 @@
#define TR_VSENSORTYPES "Perso","Calculé"
#define TR_VFORMULAS "Addition","Moyenne","Min","Max","Multipl.","Totalise","Elément","Consomm.","Distance"
#define TR_VPREC "0.--","0.0","0.00"
#define TR_VCELLINDEX "Mini.","1","2","3","4","5","6","Maxi.","Diff."
#define TR_VCELLINDEX "Mini.","1","2","3","4","5","6","7","8","Maxi.","Diff."
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -283,7 +283,7 @@
#define TR_VSENSORTYPES "Person.","Calcolato"
#define TR_VFORMULAS "Somma","Media","Min","Max","Moltipl","Totalizza","Cella","Consumo","Distanza"
#define TR_VPREC "0.--","0.0 ","0.00"
#define TR_VCELLINDEX "Minore","1","2","3","4","5","6","Maggiore","Delta"
#define TR_VCELLINDEX "Minore","1","2","3","4","5","6","7","8","Maggiore","Delta"
#define TR_TEXT_SIZE "Standard","Minusc.","Piccolo","Medio","Doppio"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Riman.", "Mostra Riman."), TR("Trasc.", "Mostra Trascorso")
+1 -1
View File
@@ -282,7 +282,7 @@
#define TR_VSENSORTYPES "Custom","Berekend"
#define TR_VFORMULAS "Optellen","Gemiddeld","Min","Max","Vermenigvuld","Totaal","Cellen","Verbruik","Afstand"
#define TR_VPREC "0.--","0.0 ","0.00"
#define TR_VCELLINDEX "Laagste","1e Cel","2e Cel","3e Cel","4e Cel","5e Cel","6e Cel","Hoogste","Delta"
#define TR_VCELLINDEX "Laagste","1e Cel","2e Cel","3e Cel","4e Cel","5e Cel","6e Cel","7e Cel","8e Cel","Hoogste","Delta"
#define TR_GYROS "GyrX","GyrY"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
+1 -1
View File
@@ -278,7 +278,7 @@
#define TR_VSENSORTYPES "Użytkownik","Obliczone"
#define TR_VFORMULAS "Dodaj","Średnie","Min","Max","Mnóż","Zliczani","Komórka","Zużycie","Zasięg"
#define TR_VPREC "0.--","0.0 ","0.00"
#define TR_VCELLINDEX "Niskie","1","2","3","4","5","6","Wysokie","Delta"
#define TR_VCELLINDEX "Niskie","1","2","3","4","5","6","7","8","Wysokie","Delta"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -276,7 +276,7 @@
#define TR_VSENSORTYPES "Custom","Calculated"
#define TR_VFORMULAS "Add","Average","Min","Max","Multiply","Totalize","Cell","Consumpt","Distance"
#define TR_VPREC "0.--","0.0 ","0.00"
#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta"
#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","7","8","Highest","Delta"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
+1 -1
View File
@@ -307,7 +307,7 @@
#define TR_VSENSORTYPES "Anpassad","Beräknad"
#define TR_VFORMULAS "Addera","Medel","Min","Max","Multipl.","Summa","Cell","Förbrukning","Sträcka"
#define TR_VPREC "0.--","0.0","0.00"
#define TR_VCELLINDEX "Lägsta","1","2","3","4","5","6","Högsta","Skillnad"
#define TR_VCELLINDEX "Lägsta","1","2","3","4","5","6","7","8","Högsta","Skillnad"
#define TR_GYROS "GyrX","GyrY"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (endast center)","= (symmetrisk)"
#define TR_TIMER_DIR TR("Återst.", "Visa återstående"), TR("Förbrukad", "Visa förbrukad")
+1 -1
View File
@@ -278,7 +278,7 @@
#define TR_VSENSORTYPES "自定義","運算"
#define TR_VFORMULAS "加","平均值","最小值","最大值","乘","總計值","單節電池","消耗量","距離"
#define TR_VPREC "0.--","0.0-","0.00"
#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值"
#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","7","8","最高值","差值"
#define TR_TEXT_SIZE "標準","小","較小","中等","雙倍"
#define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)","=(整體)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")