224 |
224 |
225 if (fg < 1.002) /* Can't be too low for this */ |
225 if (fg < 1.002) /* Can't be too low for this */ |
226 fg = 1.002; |
226 fg = 1.002; |
227 |
227 |
228 double bure = ibu / ((0.1808 * Utils::sg_to_plato(og)) + (0.8192 * Utils::sg_to_plato(fg))); |
228 double bure = ibu / ((0.1808 * Utils::sg_to_plato(og)) + (0.8192 * Utils::sg_to_plato(fg))); |
229 qDebug() << "BU:RE" << bure << product->est_fg << product->fg << product->est_ibu << product->brew_fermenter_ibu; |
229 // qDebug() << "BU:RE" << bure << product->est_fg << product->fg << product->est_ibu << product->brew_fermenter_ibu; |
230 ui->est_bufguEdit->setValue(bure); |
230 ui->est_bufguEdit->setValue(bure); |
231 ui->est_bufguShow->setValue(bure); |
231 ui->est_bufguShow->setValue(bure); |
232 |
232 |
233 } |
233 } |
234 |
234 |
349 /* |
349 /* |
350 * Auto calculate the needed acid. |
350 * Auto calculate the needed acid. |
351 */ |
351 */ |
352 TpH = product->mash_ph; |
352 TpH = product->mash_ph; |
353 protonDeficit = ProtonDeficit(TpH); |
353 protonDeficit = ProtonDeficit(TpH); |
354 qDebug() << " calc_acid tgt:" << TpH << "protonDeficit:" << protonDeficit; |
354 // qDebug() << " calc_acid tgt:" << TpH << "protonDeficit:" << protonDeficit; |
355 if (protonDeficit > 0) { |
355 if (protonDeficit > 0) { |
356 frac = Utils::CalcFrac(TpH, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); |
356 frac = Utils::CalcFrac(TpH, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); |
357 Acid = protonDeficit / frac; |
357 Acid = protonDeficit / frac; |
358 Acid *= my_acids[AT].MolWt; // mg. |
358 Acid *= my_acids[AT].MolWt; // mg. |
359 Acidmg = Acid; |
359 Acidmg = Acid; |
360 Acid = Acid / my_acids[AT].AcidSG; |
360 Acid = Acid / my_acids[AT].AcidSG; |
361 Acid = round((Acid / (product->wa_acid_perc / 100.0)) * 100.0) / 100.0; |
361 Acid = round((Acid / (product->wa_acid_perc / 100.0)) * 100.0) / 100.0; |
362 qDebug() << " Mash auto Acid final old ml:" << Acid; |
362 // qDebug() << " Mash auto Acid final old ml:" << Acid; |
363 Acid = Acidmg; |
363 Acid = Acidmg; |
364 |
364 |
365 double RealSG = round(((my_acids[AT].AcidSG - 1000) * (product->wa_acid_perc / 100)) + 1000); |
365 double RealSG = round(((my_acids[AT].AcidSG - 1000) * (product->wa_acid_perc / 100)) + 1000); |
366 Acid /= RealSG; |
366 Acid /= RealSG; |
367 Acid /= my_acids[AT].AcidPrc / 100; |
367 Acid /= my_acids[AT].AcidPrc / 100; |
368 Acid = round(Acid * 100.0) / 100.0; |
368 Acid = round(Acid * 100.0) / 100.0; |
369 qDebug() << " Mash auto Acid final ml:" << Acid; |
369 // qDebug() << " Mash auto Acid final ml:" << Acid; |
370 |
370 |
371 QString w = my_acids[AT].name_en + ' ' + my_acids[AT].name_nl; |
371 QString w = my_acids[AT].name_en + ' ' + my_acids[AT].name_nl; |
372 brewing_salt_sub(w, Acid, MISC_USES_MASH); |
372 brewing_salt_sub(w, Acid, MISC_USES_MASH); |
373 ui->mw_acidvolEdit->setValue(Acid); |
373 ui->mw_acidvolEdit->setValue(Acid); |
374 |
374 |
382 * Manual adjust acid, calculate resulting pH. |
382 * Manual adjust acid, calculate resulting pH. |
383 */ |
383 */ |
384 double pHa = ph; // Mixed water pH. |
384 double pHa = ph; // Mixed water pH. |
385 double RealSG = round(((my_acids[AT].AcidSG - 1000) * (product->wa_acid_perc / 100)) + 1000); |
385 double RealSG = round(((my_acids[AT].AcidSG - 1000) * (product->wa_acid_perc / 100)) + 1000); |
386 // Then calculate the new pH with added acids and malts |
386 // Then calculate the new pH with added acids and malts |
387 qDebug() << " Mash pH:" << pHa; |
387 // qDebug() << " Mash pH:" << pHa; |
388 Acid = RealSG; |
388 Acid = RealSG; |
389 Acid *= ui->mw_acidvolEdit->value(); |
389 Acid *= ui->mw_acidvolEdit->value(); |
390 Acid *= my_acids[AT].AcidPrc / 100; |
390 Acid *= my_acids[AT].AcidPrc / 100; |
391 Acid /= my_acids[AT].MolWt; // mg; |
391 Acid /= my_acids[AT].MolWt; // mg; |
392 Acidmg = Acid; |
392 Acidmg = Acid; |
393 |
393 |
394 //find the pH where the protondeficit = protondeficit by the acid |
394 //find the pH where the protondeficit = protondeficit by the acid |
395 frac = Utils::CalcFrac(pHa, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); |
395 frac = Utils::CalcFrac(pHa, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); |
396 protonDeficit = Acid * frac; |
396 protonDeficit = Acid * frac; |
397 qDebug() << " Acid:" << Acid << "protonDeficit:" << protonDeficit << "frac:" << frac << "pH:" << pHa; |
397 // qDebug() << " Acid:" << Acid << "protonDeficit:" << protonDeficit << "frac:" << frac << "pH:" << pHa; |
398 |
398 |
399 double deltapH = 0.001; |
399 double deltapH = 0.001; |
400 double deltapd = 0.1; |
400 double deltapd = 0.1; |
401 double pd = round(ProtonDeficit(pHa) * 1000000.0) / 1000000.0; |
401 double pd = round(ProtonDeficit(pHa) * 1000000.0) / 1000000.0; |
402 int n = 0; |
402 int n = 0; |
408 pHa += deltapH; |
408 pHa += deltapH; |
409 frac = Utils::CalcFrac(pHa, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); |
409 frac = Utils::CalcFrac(pHa, my_acids[AT].pK1, my_acids[AT].pK2, my_acids[AT].pK3); |
410 protonDeficit = Acid * frac; |
410 protonDeficit = Acid * frac; |
411 pd = ProtonDeficit(pHa); |
411 pd = ProtonDeficit(pHa); |
412 } |
412 } |
413 qDebug() << " n:" << n << "pd:" << pd << "protonDeficit:" << protonDeficit << "frac:" << frac << "pHa:" << pHa; |
413 // qDebug() << " n:" << n << "pd:" << pd << "protonDeficit:" << protonDeficit << "frac:" << frac << "pHa:" << pHa; |
414 |
414 |
415 bicarbonate = wg_bicarbonate - protonDeficit * frac / liters; |
415 bicarbonate = wg_bicarbonate - protonDeficit * frac / liters; |
416 total_alkalinity = bicarbonate * 50 / 61; |
416 total_alkalinity = bicarbonate * 50 / 61; |
417 ph = pHa; |
417 ph = pHa; |
418 ui->mw_phEdit->setValue(ph); |
418 ui->mw_phEdit->setValue(ph); |
484 product->wb_chloride = chloride; |
484 product->wb_chloride = chloride; |
485 product->wb_sulfate = sulfate; |
485 product->wb_sulfate = sulfate; |
486 product->wb_ph = ph; |
486 product->wb_ph = ph; |
487 |
487 |
488 /* Mix sparge and mash waters to display the final water. */ |
488 /* Mix sparge and mash waters to display the final water. */ |
489 qDebug() << " ca" << product->wg_amount << product->sparge_volume << calcium << product->ws_calcium; |
|
490 calcium = Utils::mix(product->wg_amount, product->sparge_volume, calcium, product->ws_calcium); |
489 calcium = Utils::mix(product->wg_amount, product->sparge_volume, calcium, product->ws_calcium); |
491 magnesium = Utils::mix(product->wg_amount, product->sparge_volume, magnesium, product->ws_magnesium); |
490 magnesium = Utils::mix(product->wg_amount, product->sparge_volume, magnesium, product->ws_magnesium); |
492 sodium = Utils::mix(product->wg_amount, product->sparge_volume, sodium, product->ws_sodium); |
491 sodium = Utils::mix(product->wg_amount, product->sparge_volume, sodium, product->ws_sodium); |
493 chloride = Utils::mix(product->wg_amount, product->sparge_volume, chloride, product->ws_chloride); |
492 chloride = Utils::mix(product->wg_amount, product->sparge_volume, chloride, product->ws_chloride); |
494 sulfate = Utils::mix(product->wg_amount, product->sparge_volume, sulfate, product->ws_sulfate); |
493 sulfate = Utils::mix(product->wg_amount, product->sparge_volume, sulfate, product->ws_sulfate); |
991 void EditProduct::mw_acid_changed(double val) |
989 void EditProduct::mw_acid_changed(double val) |
992 { |
990 { |
993 if (product->calc_acid) |
991 if (product->calc_acid) |
994 return; |
992 return; |
995 |
993 |
996 qDebug() << "on_mw_acid_changed" << val; |
|
997 QString w = my_acids[product->wa_acid_name].name_en + ' ' + my_acids[product->wa_acid_name].name_nl; |
994 QString w = my_acids[product->wa_acid_name].name_en + ' ' + my_acids[product->wa_acid_name].name_nl; |
998 set_brewing_salt(w, val, MISC_USES_MASH); |
995 set_brewing_salt(w, val, MISC_USES_MASH); |
999 } |
996 } |
1000 |
997 |
1001 |
998 |
1023 } |
1020 } |
1024 |
1021 |
1025 |
1022 |
1026 void EditProduct::w2_volume_changed(double val) |
1023 void EditProduct::w2_volume_changed(double val) |
1027 { |
1024 { |
1028 qDebug() << "w2_vol_changed" << val; |
|
1029 |
|
1030 if (product->w2_total_alkalinity && product->w2_sulfate) { |
1025 if (product->w2_total_alkalinity && product->w2_sulfate) { |
1031 /* |
1026 /* |
1032 * Seems a valid water, but don't go over the total. |
1027 * Seems a valid water, but don't go over the total. |
1033 */ |
1028 */ |
1034 if (val < (product->w1_amount + product->w2_amount)) { |
1029 if (val < (product->w1_amount + product->w2_amount)) { |
1054 { |
1049 { |
1055 QSqlQuery query; |
1050 QSqlQuery query; |
1056 product->waters_ok = true; |
1051 product->waters_ok = true; |
1057 |
1052 |
1058 if (product->w1_name != "") { |
1053 if (product->w1_name != "") { |
1059 qDebug() << "check_waters 1" << product->w1_name; |
1054 // qDebug() << "check_waters 1" << product->w1_name; |
1060 query.prepare("SELECT unlimited_stock,inventory FROM inventory_waters WHERE name=:name"); |
1055 query.prepare("SELECT unlimited_stock,inventory FROM inventory_waters WHERE name=:name"); |
1061 query.bindValue(":name", product->w1_name); |
1056 query.bindValue(":name", product->w1_name); |
1062 query.exec(); |
1057 query.exec(); |
1063 if (query.first()) { |
1058 if (query.first()) { |
1064 if ((query.value("unlimited_stock").toInt() == 0) && (query.value("inventory").toDouble() < product->w1_amount)) { |
1059 if ((query.value("unlimited_stock").toInt() == 0) && (query.value("inventory").toDouble() < product->w1_amount)) { |
1067 } |
1062 } |
1068 } |
1063 } |
1069 } |
1064 } |
1070 |
1065 |
1071 if ((product->w2_name != "") && (product->w2_amount > 0)) { |
1066 if ((product->w2_name != "") && (product->w2_amount > 0)) { |
1072 qDebug() << "check_waters 2" << product->w2_name; |
1067 // qDebug() << "check_waters 2" << product->w2_name; |
1073 query.prepare("SELECT unlimited_stock,inventory FROM inventory_waters WHERE name=:name"); |
1068 query.prepare("SELECT unlimited_stock,inventory FROM inventory_waters WHERE name=:name"); |
1074 query.bindValue(":name", product->w2_name); |
1069 query.bindValue(":name", product->w2_name); |
1075 query.exec(); |
1070 query.exec(); |
1076 if (query.first()) { |
1071 if (query.first()) { |
1077 if ((query.value("unlimited_stock").toInt() == 0) && (query.value("inventory").toDouble() < product->w2_amount)) { |
1072 if ((query.value("unlimited_stock").toInt() == 0) && (query.value("inventory").toDouble() < product->w2_amount)) { |
1143 void EditProduct::w2_name_changed(int val) |
1138 void EditProduct::w2_name_changed(int val) |
1144 { |
1139 { |
1145 QSqlQuery query; |
1140 QSqlQuery query; |
1146 double hardness, ra_ppm; |
1141 double hardness, ra_ppm; |
1147 |
1142 |
1148 qDebug() << "w2_name_changed" << val; |
1143 // qDebug() << "w2_name_changed" << val; |
1149 |
1144 |
1150 if (val == 0) { // Clear water 2. |
1145 if (val == 0) { // Clear water 2. |
1151 product->w2_name = ""; |
1146 product->w2_name = ""; |
1152 product->w2_calcium = 0; |
1147 product->w2_calcium = 0; |
1153 product->w2_magnesium = 0; |
1148 product->w2_magnesium = 0; |
1164 query.exec(); |
1159 query.exec(); |
1165 query.first(); |
1160 query.first(); |
1166 for (int i = 0; i < (val - 1); i++) { |
1161 for (int i = 0; i < (val - 1); i++) { |
1167 query.next(); |
1162 query.next(); |
1168 } |
1163 } |
1169 qDebug() << "set water" << query.value(1).toString(); |
1164 // qDebug() << "set water" << query.value(1).toString(); |
1170 |
1165 |
1171 product->w2_name = query.value(1).toString(); |
1166 product->w2_name = query.value("name").toString(); |
1172 product->w2_calcium = query.value(3).toDouble(); |
1167 product->w2_calcium = query.value("calcium").toDouble(); |
1173 product->w2_magnesium = query.value(8).toDouble(); |
1168 product->w2_magnesium = query.value("magnesium").toDouble(); |
1174 product->w2_total_alkalinity = query.value(11).toDouble(); |
1169 product->w2_total_alkalinity = query.value("total_alkalinity").toDouble(); |
1175 product->w2_sodium = query.value(7).toDouble(); |
1170 product->w2_sodium = query.value("sodium").toDouble(); |
1176 product->w2_chloride = query.value(6).toDouble(); |
1171 product->w2_chloride = query.value("chloride").toDouble(); |
1177 product->w2_sulfate = query.value(5).toDouble(); |
1172 product->w2_sulfate = query.value("sulfate").toDouble(); |
1178 product->w2_ph = query.value(9).toDouble(); |
1173 product->w2_ph = query.value("ph").toDouble(); |
1179 hardness = Utils::Hardness(product->w2_calcium, product->w2_magnesium); |
1174 hardness = Utils::Hardness(product->w2_calcium, product->w2_magnesium); |
1180 ra_ppm = Utils::ResidualAlkalinity(product->w2_total_alkalinity, product->w2_calcium, product->w2_magnesium); |
1175 ra_ppm = Utils::ResidualAlkalinity(product->w2_total_alkalinity, product->w2_calcium, product->w2_magnesium); |
1181 } |
1176 } |
1182 ui->w1_volEdit->setValue(product->w1_amount); |
1177 ui->w1_volEdit->setValue(product->w1_amount); |
1183 ui->w2_volEdit->setValue(product->w2_amount); |
1178 ui->w2_volEdit->setValue(product->w2_amount); |