Added calculation tools to measure volume in the boil kettle using measured centimeters.

Mon, 16 May 2022 14:38:12 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 16 May 2022 14:38:12 +0200
changeset 212
8b84dd3579ef
parent 211
bec0386b1df1
child 213
a167ee979cac

Added calculation tools to measure volume in the boil kettle using measured centimeters.

src/EditProduct.cpp file | annotate | diff | comparison | revisions
src/EditProduct.h file | annotate | diff | comparison | revisions
src/EditProductTab9.cpp file | annotate | diff | comparison | revisions
src/Utils.cpp file | annotate | diff | comparison | revisions
src/Utils.h file | annotate | diff | comparison | revisions
--- a/src/EditProduct.cpp	Mon May 16 09:22:28 2022 +0200
+++ b/src/EditProduct.cpp	Mon May 16 14:38:12 2022 +0200
@@ -1091,9 +1091,11 @@
     connect(ui->brew_preboilphEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_preboilph_changed);
     connect(ui->brew_preboilsgEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_preboilsg_changed);
     connect(ui->brew_preboilvolEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_preboilvol_changed);
+    connect(ui->brew_preboilButton, SIGNAL(clicked()), this, SLOT(brew_preboil_button()));
     connect(ui->brew_aboilphEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_aboilph_changed);
     connect(ui->brew_aboilsgEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_aboilsg_changed);
     connect(ui->brew_aboilvolEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_aboilvol_changed);
+    connect(ui->brew_aboilButton, SIGNAL(clicked()), this, SLOT(brew_aboil_button()));
     connect(ui->brew_coolwithEdit, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &EditProduct::brew_cooling_method_changed);
     connect(ui->brew_cooltoEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_cooling_to_changed);
     connect(ui->brew_cooltimeEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_cooling_time_changed);
--- a/src/EditProduct.h	Mon May 16 09:22:28 2022 +0200
+++ b/src/EditProduct.h	Mon May 16 14:38:12 2022 +0200
@@ -151,9 +151,13 @@
     void brew_preboilph_changed(double val);
     void brew_preboilsg_changed(double val);
     void brew_preboilvol_changed(double val);
+    void brew_preboil_cm_changed(double val);
+    void brew_preboil_button();
     void brew_aboilph_changed(double val);
     void brew_aboilsg_changed(double val);
     void brew_aboilvol_changed(double val);
+    void brew_aboil_cm_changed(double val);
+    void brew_aboil_button();
     void brew_cooling_method_changed(int val);
     void brew_cooling_to_changed(double val);
     void brew_cooling_time_changed(double val);
@@ -240,6 +244,7 @@
     void updateBrewday();
     void calcEfficiencyBeforeBoil();
     void calcEfficiencyAfterBoil();
+    void brew_volume_calc(double volume, double kettle_volume, double kettle_height, double est_volume, bool aboil);
 };
 
 #endif
--- a/src/EditProductTab9.cpp	Mon May 16 09:22:28 2022 +0200
+++ b/src/EditProductTab9.cpp	Mon May 16 14:38:12 2022 +0200
@@ -120,6 +120,55 @@
 }
 
 
+void EditProduct::brew_volume_calc(double volume, double kettle_volume, double kettle_height, double est_volume, bool aboil)
+{
+    double k_cm;
+
+    if (volume > 0)
+        k_cm = Utils::kettle_cm(volume, kettle_volume, kettle_height);
+    else
+        k_cm = Utils::kettle_cm(est_volume, kettle_volume, kettle_height);
+
+    QDialog* dialog = new QDialog(this);
+    dialog->resize(320, 110);
+    QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
+    buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
+    buttonBox->setGeometry(QRect(40, 65, 240, 32));
+    buttonBox->setLayoutDirection(Qt::LeftToRight);
+    buttonBox->setOrientation(Qt::Horizontal);
+    buttonBox->setStandardButtons(QDialogButtonBox::Ok);
+    buttonBox->setCenterButtons(true);
+
+    QLabel *cmLabel = new QLabel(dialog);
+    cmLabel->setObjectName(QString::fromUtf8("cmLabel"));
+    cmLabel->setText(tr("Distance from top:"));
+    cmLabel->setGeometry(QRect(10, 20, 141, 20));
+    cmLabel->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+
+    QDoubleSpinBox *cmEdit = new QDoubleSpinBox(dialog);
+    cmEdit->setObjectName(QString::fromUtf8("cmEdit"));
+    cmEdit->setGeometry(QRect(160, 20, 121, 24));
+    cmEdit->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+    cmEdit->setAccelerated(true);
+    cmEdit->setDecimals(1);
+    cmEdit->setSuffix(tr(" cm"));
+    cmEdit->setMaximum(kettle_height * 100);
+    cmEdit->setSingleStep(0.1);
+    cmEdit->setValue(k_cm);
+
+    if (aboil)
+	connect(cmEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_aboil_cm_changed);
+    else
+	connect(cmEdit, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &EditProduct::brew_preboil_cm_changed);
+    connect(buttonBox, SIGNAL(rejected()), dialog, SLOT(reject()));
+    connect(buttonBox, SIGNAL(accepted()), dialog, SLOT(accept()));
+
+    dialog->setModal(true);
+    dialog->exec();
+    disconnect(cmEdit, nullptr, nullptr, nullptr);
+}
+
+
 void EditProduct::brew_preboilph_changed(double val)
 {
     if (product->brew_preboil_ph == 0) {
@@ -185,6 +234,23 @@
 }
 
 
+void EditProduct::brew_preboil_cm_changed(double val)
+{
+    double vol = Utils::kettle_vol(val, product->eq_kettle_volume, product->eq_kettle_height);
+    product->brew_preboil_volume = vol;
+    const QSignalBlocker blocker1(ui->brew_preboilvolEdit);
+    ui->brew_preboilvolEdit->setValue(vol);
+    is_changed();
+    calcEfficiencyBeforeBoil();
+}
+
+
+void EditProduct::brew_preboil_button()
+{
+    brew_volume_calc(product->brew_preboil_volume, product->eq_kettle_volume, product->eq_kettle_height, product->boil_size * 1.04, false);
+}
+
+
 void EditProduct::brew_aboilph_changed(double val)
 {
     if (product->brew_aboil_ph == 0) {
@@ -252,6 +318,23 @@
 }
 
 
+void EditProduct::brew_aboil_cm_changed(double val)
+{
+    double vol = Utils::kettle_vol(val, product->eq_kettle_volume, product->eq_kettle_height);
+    product->brew_aboil_volume = vol;
+    const QSignalBlocker blocker1(ui->brew_aboilvolEdit);
+    ui->brew_aboilvolEdit->setValue(vol);
+    is_changed();
+    calcEfficiencyAfterBoil();
+}
+
+
+void EditProduct::brew_aboil_button()
+{
+    brew_volume_calc(product->brew_aboil_volume, product->eq_kettle_volume, product->eq_kettle_height, product->batch_size * 1.04, true);
+}
+
+
 void EditProduct::brew_cooling_method_changed(int val)
 {
     product->brew_cooling_method = val;
--- a/src/Utils.cpp	Mon May 16 09:22:28 2022 +0200
+++ b/src/Utils.cpp	Mon May 16 14:38:12 2022 +0200
@@ -524,3 +524,19 @@
 }
 
 
+double Utils::kettle_cm(double volume, double kettle_volume, double kettle_height)
+{
+    if ((volume > 0) && (kettle_volume > 0) && (volume <= kettle_volume))
+	return round(100 * ((1 - volume / kettle_volume) * kettle_height) * 10.0) / 10.0;
+    return 0;
+}
+
+
+double Utils::kettle_vol(double cm, double kettle_volume, double kettle_height)
+{
+    if ((cm >= 0) && (kettle_volume > 0) && (cm <= (kettle_height * 100)))
+	return round(((kettle_height - (cm / 100)) / kettle_height) * kettle_volume * 10.0) / 10.0;
+    return 0;
+}
+
+
--- a/src/Utils.h	Mon May 16 09:22:28 2022 +0200
+++ b/src/Utils.h	Mon May 16 14:38:12 2022 +0200
@@ -37,6 +37,8 @@
     double hopFlavourContribution(double bt, double vol, int use, double amount);
     double hopAromaContribution(double bt, double vol, int use, double amount);
     QString hours_to_string(int hours);
+    double kettle_cm(double volume, double kettle_volume, double kettle_height);
+    double kettle_vol(double cm, double kettle_volume, double kettle_height);
 
     /**
      * @brief Map SRM color to RGB and return as QColor.

mercurial