diff --git a/src/AddDeviceWizard.cpp b/src/AddDeviceWizard.cpp index 479fbc418..6bc865a02 100644 --- a/src/AddDeviceWizard.cpp +++ b/src/AddDeviceWizard.cpp @@ -1095,7 +1095,6 @@ AddFinal::AddFinal(AddDeviceWizard *parent) : QWizardPage(parent), wizard(parent QFormLayout *form2layout = new QFormLayout; form2layout->addRow(new QLabel(tr("Virtual"), this), (virtualPower=new QComboBox(this))); - form2layout->addRow(new QLabel(tr("Wheel Size"), this), (wheelSize=new QComboBox(this))); // NOTE: These must correspond to the code in RealtimeController.cpp that // post-processes inbound telemetry. @@ -1143,10 +1142,35 @@ AddFinal::AddFinal(AddDeviceWizard *parent) : QWizardPage(parent), wizard(parent virtualPower->addItem(tr("Power - Elite Supercrono Powermag (8)")); virtualPower->addItem(tr("Power - Elite Qubo Power Fluid")); - wheelSize->addItem(tr("Road/Cross (700C/622)")); // 2100mm - wheelSize->addItem(tr("Tri/TT (650C)")); // 1960mm - wheelSize->addItem(tr("Mountain (26\")")); // 1985mm - wheelSize->addItem(tr("BMX (20\")")); // 1750mm + // + // Wheel size + // + int wheelSize = appsettings->value(this, GC_WHEELSIZE, 2100).toInt(); + + rimSizeCombo = new QComboBox(); + rimSizeCombo->addItems(WheelSize::RIM_SIZES); + + tireSizeCombo = new QComboBox(); + tireSizeCombo->addItems(WheelSize::TIRE_SIZES); + + + wheelSizeEdit = new QLineEdit(QString("%1").arg(wheelSize),this); + wheelSizeEdit->setInputMask("0000"); + wheelSizeEdit->setFixedWidth(40); + + QLabel *wheelSizeUnitLabel = new QLabel(tr("mm"), this); + + QHBoxLayout *wheelSizeLayout = new QHBoxLayout(); + wheelSizeLayout->addWidget(rimSizeCombo); + wheelSizeLayout->addWidget(tireSizeCombo); + wheelSizeLayout->addWidget(wheelSizeEdit); + wheelSizeLayout->addWidget(wheelSizeUnitLabel); + + connect(rimSizeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(calcWheelSize())); + connect(tireSizeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(calcWheelSize())); + connect(wheelSizeEdit, SIGNAL(textEdited(QString)), this, SLOT(resetWheelSize())); + + form2layout->addRow(new QLabel(tr("Wheel Size"), this), wheelSizeLayout); hlayout->addLayout(form2layout); layout->addStretch(); @@ -1173,6 +1197,22 @@ AddFinal::initializePage() virtualPower->setCurrentIndex(0); } +void +AddFinal::calcWheelSize() +{ + int diameter = WheelSize::calcPerimeter(rimSizeCombo->currentIndex(), tireSizeCombo->currentIndex()); + if (diameter>0) + wheelSizeEdit->setText(QString("%1").arg(diameter)); + +} + +void +AddFinal::resetWheelSize() +{ + rimSizeCombo->setCurrentIndex(0); + tireSizeCombo->setCurrentIndex(0); +} + bool AddFinal::validatePage() { @@ -1192,15 +1232,7 @@ AddFinal::validatePage() QString(defRPM->isChecked() ? "C" : "") + QString(defKPH->isChecked() ? "S" : ""); add.postProcess = virtualPower->currentIndex(); - - switch (wheelSize->currentIndex()) { - - default: - case 0: add.wheelSize = 2100 ; break; - case 1: add.wheelSize = 1960 ; break; - case 2: add.wheelSize = 1985 ; break; - case 3: add.wheelSize = 1750 ; break; - } + add.wheelSize = wheelSizeEdit->text().toInt(); QList list = all.getList(); list.insert(0, add); diff --git a/src/AddDeviceWizard.h b/src/AddDeviceWizard.h index c5b1021ba..e88da755a 100644 --- a/src/AddDeviceWizard.h +++ b/src/AddDeviceWizard.h @@ -216,12 +216,17 @@ class AddFinal : public QWizardPage QLineEdit *name; QComboBox *virtualPower; - QComboBox *wheelSize; + QComboBox *rimSizeCombo; + QComboBox *tireSizeCombo; + QLineEdit *wheelSizeEdit; QLineEdit *port; QLineEdit *profile; QGroupBox *selectDefault; QCheckBox *defWatts, *defBPM, *defKPH, *defRPM; + private slots: + void calcWheelSize(); + }; class DeviceScanner : public QThread diff --git a/src/DeviceConfiguration.cpp b/src/DeviceConfiguration.cpp index ab8ba9c4c..ec85ee22b 100644 --- a/src/DeviceConfiguration.cpp +++ b/src/DeviceConfiguration.cpp @@ -23,6 +23,8 @@ #include "DeviceTypes.h" #include "DeviceConfiguration.h" +#define PI M_PI + // // Model for the device list, populates tie deviceList QTableView // @@ -159,3 +161,30 @@ DeviceConfigurations::writeConfig(QList Configuration) } } + +const QStringList +WheelSize::RIM_SIZES = QStringList() << "--" << "700c/29er" << "650b/27.5\"" << "650c" << "26\""; + +static const float RIM_DIAMETERS[] = {0, 622, 571, 559}; + +const QStringList +WheelSize::TIRE_SIZES = QStringList() << "--" << "20mm" << "23mm" << "25mm" << "28mm" << "1.00\"" << "1.50\"" << "1.75\"" << "1.90\"" << "1.95\"" << "2.00\"" << "2.10\"" << "2.125\""; + + // -- 20mm 23mm 25mm 28mm 1.00" 1.50" 1.75" 1.90" 1.95" 2.00" 2.10" 2.125" +static const float TIRE_DIAMETERS[] = {0, 40, 46, 50, 56, 50.8, 76.2, 88.9, 96.5, 99, 101.6, 106.7, 108}; + +int +WheelSize::calcPerimeter(int rimSizeIndex, int tireSizeIndex) +{ + // http://www.bikecalc.com/wheel_size_math + + if (rimSizeIndex>0 && rimSizeIndex<4 && tireSizeIndex<14) { + float rim = RIM_DIAMETERS[rimSizeIndex]; + float tire = TIRE_DIAMETERS[tireSizeIndex]; + + if (rim>0 && tire>0) { + return round((rim+tire) * PI); + } + } + return 0; +} diff --git a/src/DeviceConfiguration.h b/src/DeviceConfiguration.h index b980d125f..148b612c9 100644 --- a/src/DeviceConfiguration.h +++ b/src/DeviceConfiguration.h @@ -64,4 +64,14 @@ class DeviceConfigurations }; +class WheelSize +{ + public: + const static QStringList RIM_SIZES; + const static QStringList TIRE_SIZES; + + static int calcPerimeter(int rimSizeIndex, int tireSizeIndex); + +}; + #endif diff --git a/src/Pages.cpp b/src/Pages.cpp index 113f99579..0a3176a06 100644 --- a/src/Pages.cpp +++ b/src/Pages.cpp @@ -36,8 +36,6 @@ #include "OAuthDialog.h" #include "RideAutoImportConfig.h" -#define PI M_PI - // // Main Config Page - tabs for each sub-page // @@ -129,27 +127,12 @@ GeneralPage::GeneralPage(Context *context) : context(context) QLabel *wheelSizeLabel = new QLabel(tr("Wheelsize:"), this); int wheelSize = appsettings->value(this, GC_WHEELSIZE, 2100).toInt(); - wheelSizeCombo = new QComboBox(); - wheelSizeCombo->addItem(tr("--")); - wheelSizeCombo->addItem(tr("700c/29er")); - wheelSizeCombo->addItem(tr("650b/27.5\"")); - wheelSizeCombo->addItem(tr("650c")); - wheelSizeCombo->addItem(tr("26\"")); + rimSizeCombo = new QComboBox(); + rimSizeCombo->addItems(WheelSize::RIM_SIZES); tireSizeCombo = new QComboBox(); - tireSizeCombo->addItem(tr("--")); - tireSizeCombo->addItem(tr("20mm")); - tireSizeCombo->addItem(tr("23mm")); - tireSizeCombo->addItem(tr("25mm")); - tireSizeCombo->addItem(tr("28mm")); - tireSizeCombo->addItem(tr("1.00\"")); - tireSizeCombo->addItem(tr("1.50\"")); - tireSizeCombo->addItem(tr("1.75\"")); - tireSizeCombo->addItem(tr("1.90\"")); - tireSizeCombo->addItem(tr("1.95\"")); - tireSizeCombo->addItem(tr("2.00\"")); - tireSizeCombo->addItem(tr("2.10\"")); - tireSizeCombo->addItem(tr("2.125\"")); + tireSizeCombo->addItems(WheelSize::TIRE_SIZES); + wheelSizeEdit = new QLineEdit(QString("%1").arg(wheelSize),this); wheelSizeEdit->setInputMask("0000"); @@ -158,13 +141,14 @@ GeneralPage::GeneralPage(Context *context) : context(context) QLabel *wheelSizeUnitLabel = new QLabel(tr("mm"), this); QHBoxLayout *wheelSizeLayout = new QHBoxLayout(); - wheelSizeLayout->addWidget(wheelSizeCombo); + wheelSizeLayout->addWidget(rimSizeCombo); wheelSizeLayout->addWidget(tireSizeCombo); wheelSizeLayout->addWidget(wheelSizeEdit); wheelSizeLayout->addWidget(wheelSizeUnitLabel); - connect(wheelSizeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(calcWheelSize())); + connect(rimSizeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(calcWheelSize())); connect(tireSizeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(calcWheelSize())); + connect(wheelSizeEdit, SIGNAL(textEdited(QString)), this, SLOT(resetWheelSize())); configLayout->addWidget(wheelSizeLabel, 2,0, Qt::AlignRight); configLayout->addLayout(wheelSizeLayout, 2,1, Qt::AlignLeft); @@ -281,70 +265,16 @@ GeneralPage::GeneralPage(Context *context) : context(context) void GeneralPage::calcWheelSize() { - if (wheelSizeCombo->currentIndex()>0) { - float rim = 0; - switch (wheelSizeCombo->currentIndex()) { - case 1: // 700c/29er - rim = 622; - break; - case 2: // 650b/27.5" - rim = 584; - break; - case 3: // 650c - rim = 571; - break; - case 4: // 26" - rim = 559; - break; - default: - break; - } - float tire = 0; - switch (tireSizeCombo->currentIndex()) { - case 1: // 20mm - tire = 40; - break; - case 2: // 23mm - tire = 46; - break; - case 3: // 25mm - tire = 50; - break; - case 4: // 28mm - tire = 56; - break; - case 5: // 1.00" - tire = 50.8; - break; - case 6: // 1.50" - tire = 76.2; - break; - case 7: // 1.75" - tire = 88.9; - break; - case 8: // 1.90" - tire = 96.5; - break; - case 9: // 1.95" - tire = 99; - break; - case 10: // 2.00" - tire = 101.6; - break; - case 11: // 2.10" - tire = 106.7; - break; - case 12: // 2.125" - tire = 108; - break; - default: - break; - } - - if (rim>0 && tire>0) - wheelSizeEdit->setText(QString("%1").arg(int((rim+tire) * PI))); - } + int diameter = WheelSize::calcPerimeter(rimSizeCombo->currentIndex(), tireSizeCombo->currentIndex()); + if (diameter>0) + wheelSizeEdit->setText(QString("%1").arg(diameter)); +} +void +GeneralPage::resetWheelSize() +{ + rimSizeCombo->setCurrentIndex(0); + tireSizeCombo->setCurrentIndex(0); } void diff --git a/src/Pages.h b/src/Pages.h index 68ab4a08c..6889adb78 100644 --- a/src/Pages.h +++ b/src/Pages.h @@ -77,7 +77,7 @@ class GeneralPage : public QWidget QComboBox *langCombo; QComboBox *unitCombo; QComboBox *crankLengthCombo; - QComboBox *wheelSizeCombo; + QComboBox *rimSizeCombo; QComboBox *tireSizeCombo; QComboBox *wbalForm; QCheckBox *garminSmartRecord; @@ -105,6 +105,7 @@ class GeneralPage : public QWidget private slots: void calcWheelSize(); + void resetWheelSize(); }; class RiderPage : public QWidget